| Crates.io | zim-studio |
| lib.rs | zim-studio |
| version | 1.3.1 |
| created_at | 2025-07-07 03:35:54.315034+00 |
| updated_at | 2025-09-24 02:48:04.044607+00 |
| description | A Terminal-Based Audio Project Scaffold and Metadata System |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1740680 |
| size | 2,539,456 |
A Zettelkasten Information System for Music Production with Integrated Audio Player
Implemented in Rust and Ratatui with optional nvim plugin support.


ZIM Studio provides three main functions:
*.flac and *.wav (so far)The sidecar format is YAML embedded in markdown, providing both structured metadata and free-form notes. The YAML contains facts about the track while the markdown enables long-form notes, links to inspiration, TODO checklists, etc.
See example sidecar file for a complete example.
The motivation for creating zim is twofold:
# Install with full features (includes audio player)
cargo install zim-studio
# Install minimal version without audio player (scaffold and metadata only)
cargo install zim-studio --no-default-features
If you use neovim (untested with regular vim) you may want to try the nvim plugin.

# Initialize ZIM with your music projects directory
zim init ~/Music/Projects
# Create a new project
zim new "My Greatest Hits"
# Creates: ~/Music/Projects/my_greatest_hits/
# Navigate to your project and add some audio files
cd ~/Music/Projects/my_greatest_hits
cp ~/Desktop/track1.flac masters/
cp ~/Desktop/track2.wav masters/
# Generate sidecar metadata files
zim update .
# Creates: masters/track1.flac.md, masters/track2.wav.md
# Edit the generated sidecar files to add your notes
$EDITOR masters/track1.flac.md
# Validate all YAML frontmatter
zim lint .
# View/edit global configuration
zim config view
zim config edit
When you create a new project with zim new, it generates:
my_greatest_hits/
├── .gitignore # Ignores audio/video files
├── README.md # Project overview
├── masters/ # Final mastered tracks
├── mixes/ # Mix versions
├── sources/ # Raw recordings, samples
├── edits/ # Edited/comped audio
├── bounced/ # Bounced/rendered audio (stems, etc)
└── project/ # DAW project files
├── live/ # Ableton Live
├── reaper/ # Reaper
├── bitwig/ # Bitwig Studio
└── renoise/ # Renoise
zim update generates a .md sidecar for each audio file with:
The YAML is designed to be both human-editable and scriptable for automation. See the example sidecar for what this looks like in practice.
ZIM automatically infers tags from filenames using configurable pattern mappings. Default mappings include:
ES-9 → eurorack, modular → eurorackdrum → drums, bass → bass, synth → synthloop → loop, kick → drums, snare → drumsvocal → vocals, vox → vocalsableton → ableton-live, reaper → reaperTo customize tag mappings, edit ~/.config/zim/config.toml:
[tag_mappings]
"ES-9" = "eurorack"
"my-pattern" = "my-tag"
"field-rec" = "field-recording"
Note: If you have an existing config file, the default tag mappings will still work automatically - no migration needed!
ZIM can embed metadata directly into WAV files using INFO LIST chunks. This metadata includes UUIDs for unique identification and lineage tracking across your DAW workflows.
zim tag add - Tag a copy of the fileCreates a new WAV file with _tagged suffix containing embedded metadata. The original file remains unchanged.
# Tag a WAV file (creates kick_tagged.wav)
zim tag add kick.wav
# Specify project explicitly (otherwise auto-detected from .zimignore)
zim tag add kick.wav --project "my-album"
zim tag edit - Tag in-placeUpdates the original WAV file directly with embedded metadata. Creates a backup in /tmp by default.
# Update metadata in the original file
zim tag edit kick.wav
# Skip backup creation (use with caution)
zim tag edit kick.wav --no-backup
zim tag derive - Create derived file with lineageCreates a new WAV file that tracks its relationship to the source file. Perfect for tracking exports, bounces, and transformations.
# Create a derived file (e.g., after processing in a DAW)
zim tag derive original.wav processed.wav --transform "eq+compress"
# Common transform types: excerpt, mix, master, bounce, process
zim tag derive full_take.wav intro_only.wav --transform "excerpt"
zim tag info - Read embedded metadataDisplays any ZIM metadata embedded in a WAV file.
# Check if a WAV file has metadata
zim tag info some_file.wav
Each tagged WAV file contains:
zim updateThe zim update command automatically tags any untagged WAV files it encounters, embedding metadata directly into the files. The UUID is also included in the generated markdown sidecar files for cross-referencing.
# Recursively process directory, auto-tagging WAV files
zim update .
Note: If you have an existing config file, the default tag mappings will still work automatically - no migration needed!
Add to your shell configuration:
# Bash (~/.bashrc)
source <(zim completions bash)
# Zsh (~/.zshrc)
source <(zim completions zsh)
# Fish (~/.config/fish/config.fish)
zim completions fish | source
# PowerShell ($PROFILE)
zim completions powershell | Out-String | Invoke-Expression
# Run all checks locally (matches CI)
make ci
# Individual commands
make fmt # Format code
make clippy # Run lints
make test # Run tests
make check # Check compilation
The optional audio player provides a fast, keyboard-driven interface for browsing, auditioning, and editing audio samples directly from the terminal.
# Launch with no file (opens browser)
zim player
# Launch with a specific audio file
zim player path/to/audio.wav

The player interface consists of:
[space] - Play/Pause toggle[←] - Seek backward 5 seconds[→] - Seek forward 5 seconds[Shift+←] - Jump backward 20% (great for long recordings)[Shift+→] - Jump forward 20% (great for long recordings)[i] - Set mark in at current position[o] - Set mark out at current position[x] - Clear all marks[l] - Toggle loop playback of marked selection[/] - Open file browser[e] - Edit sidecar metadata in external editor ($EDITOR)[s] - Save/export (full file or marked selection)[q] - Quit player
The built-in file browser searches through your audio files using their sidecar .md metadata:
/ to open the browser[↑/↓] or [j/k] to navigate files/ again to show search overlay[Enter] or [Esc] to hide search and return to file list[Enter] on a file to load it[Esc] to close browserNote: The browser displays audio files but searches their .md sidecar content. For example, if you have kick.wav with kick.wav.md containing "punchy 808 style", searching for "808" will find this file.

The mark feature lets you select a portion of the audio:
[i] at the desired start point[o] at the desired end point[l] to loop the selection continuously[3.5s]
When saving ([s]), the save dialog provides:
[↑/↓] and [Enter][Tab] to switch between directory list and filename.wav (even from FLAC sources)Example auto-generated filenames:
original_edit.wavoriginal_edit_2.wav, original_edit_3.wav, etc.[IMAGE: Close-up of LED indicators showing different levels]
The stereo LED indicators show real-time audio levels:
[l] to loop your selection before saving# Mix with equal volume
zim play drums.wav bass.wav vocals.wav
# Mix with custom gains (0.0-2.0 range)
zim play drums.wav bass.wav vocals.wav --gains 0.8,1.2,0.6
See mixing guide for detailed examples.md sidecar files exist (run zim update)MIT