Terminal music workstation
A DAW in your terminal, dawg.
Chat with an agent to build loops. Watch every note land on a piano roll that scrolls above your prompt. Open another window and pick up another instrument.
$ curl -fsSL https://dawg.sh/install | shQuickstartSource on GitHubMIT · Bun 1.3.14+
bass · ▶ 96 BPM · dusty basement funk opus-5.5 · gateway · rev 7 · ● synced ↻ ══▒▒▒══════███═════════════════════════════════▒▒▒══════▒▒▒▒▒▒══════▒▒▒══════ ╻ ▒▒▒ ┃ ┃ ┃ ┈ ┈┃┈ ┈ ┈ ┈ ┈ ▒▒▒ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈┃┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈▒┃▒┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ▒▒▒ ███ ▒┃▒ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┃ ┈ ┈ ┈ ┈ ┈ ┃ ┈ ┈▒▒▒┈┃┈ ┈ ┈ ┈ ┈ ┈ ┈ ▓▓▓ ┃ ┃ ▒▒▒ ┃ ┈ ┈ ┈▓▓▓┈ ┈ ┈ ▒▒▒ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┃ ┈ ┈ ┈ ┈ ┈ ┃ ┈ ┈▒▒▒┈┃┈ ┈ ┈ ┈ ┈ ┈ ┈ ┃ ┃ ┃ ▒▒▒ ┃ ┃ ┃ ┃ ┃ ┃ ┃ 2 ──▒▒▒███─────────────────────────────────▒▒▒─────────▒▒▒───▒┃▒▒▒▒──────────── ┃ ┃ ▒┃▒ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ▒▒▒ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈┃┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈▒▒▒┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ▒▒▒ ███ ▒▒▒ ▶ ━━━━━━━━━━━━━━━━━━━━━╎━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━▒▒▒━━━━━━━━━━━━━━━ ▫ ╎ ┈ ┈ ┈ ┈ ┈ ┈ ▫ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ ┈ C3 C4 ◆ Am7 and G pads on keys, reverb 0.3 ✓ keys reverb 0.3 · rev 6→7 · ^z undo ╭─ STEER ───────────────────────────────────────────────── opus-5.5 · gateway ─╮│ › describe a change — “add a walking bass in A minor” │╰─ enter send · ^j newline · ^q queue · ^z undo · ^o log ──────────────────────╯
site/scripts/record-demo.ts. The agent turns are scripted; every tool call goes through dawg’s own validation and score operations.Make a loop the way you’d describe it
Ask for a groove
Type what you want to hear. A streaming agent writes it with typed tools; each call is checked, dry-run against the score and committed as its own revision. Esc stops a turn and keeps what landed. Ctrl-Z takes any of it back.
Watch it on the highway
Notes stream down a piano roll toward the hit line, sustains stretch across beats, and drums get a lane per voice. The prompt stays live underneath, so you can steer while the loop plays.
Open a window, get a player
Every terminal window on a session shares one song and one transport. Each new window takes the next instrument, so three windows on a three-track song bring back drums, bass and keys.
Local first, your own models
The session is a folder in your project. Direct commands, playback and rendering work offline with no account. Bring an AI Gateway key, or use the Claude, Codex or Devin subscription you already pay for through xcb.
Three windows, one band
Run dawg in a project and the first window starts dawgd, a local daemon that is the only writer for that session. Every window after it joins the same song: play in one and they all play, edit in one and they all redraw. Each plain dawg takes the first track no other window has, and a window beyond the last track gets a fresh draft track.
Kill a window, or the daemon, and nothing is lost. The next window reclaims the session from the atomic snapshot on disk. If the daemon can’t start, windows fall back to a file lock.
What happens when you hit Enter
Plain commands run locally
tempo 96,pattern hat every 0.5,reverb 0.3 0.7and the rest of the command language never leave your machine.Everything else goes to the agent
It gets a compact brief of the song, capped at 12 KiB, and edits only through typed tools: tracks, notes, drums, effects, automation.
Each tool call is checked three times
The tool’s own argument checks, the planner’s bounded validator and a dry run of the score reducer. A call that fails goes back to the model as a diagnostic.
Accepted calls become revisions
Each one is committed separately and broadcast to every window, with a card in the activity strip and an undo that drops exactly that change.
In the box
Drum kit
Kick, rim, snare, clap, hats and tom, written hit by hit or as patterns. A track named drums gets the kit.
Filter, delay, reverb
Per-track low-pass filter, tempo-synced ping-pong delay and a Freeverb-style reverb send, with automation lanes.
Gapless playback
One long-lived ffplay or SoX player. Edits, tempo changes and seeks swap the loop in place without a restart.
Undo and redo
Every edit, typed or agent-made, is a revision in the shared session log. Undo from any window.
Named sessions
Songs name themselves from what you play. /rename, /fork into night drive 2, /resume later.
Crash recovery
dawgd, one small local daemon per session, owns the score and transport. A crashed daemon is reclaimed by the next window.
Deterministic renders
dawg render out.wav writes the session without starting audio. The same score gives the same bytes, and prints the sha256.
Themes and motion
Default, high-contrast and mono themes, a static reduced-motion mode, and NO_COLOR respected.
Install
dawg runs on Bun 1.3.14 or newer. The script installs Bun if it’s missing, downloads the latest release tarball from GitHub, checks it against the release’s SHA256SUMS and installs it with bun add -g.
Release tarball with Bun
$ bun add -g https://github.com/hraness/dawg/releases/download/v0.2.0/hraness-dawg-0.2.0.tgzEach release ships the tarball, SHA256SUMS and a build provenance attestation.
From source
$ git clone https://github.com/hraness/dawg.git
$ cd dawg
$ bun install --frozen-lockfile
$ bun run dawgFor sound, install ffplay (from FFmpeg) or SoX; on macOS dawg falls back to afplay. Then run dawg in any folder and see the quickstart.
Questions
- Do I need an account?
- No. The session lives in .dawg/ in your project, and typed commands such as tempo 96, hit kick at 0 or reverb 0.3 work offline. You only need a provider for the agent.
- Which models does the agent use?
- opus-5.5 or sol-6.1 through Vercel AI Gateway, switched with /model. dawg login creates a gateway key with the Vercel CLI, or dawg login --xcb routes turns through a Claude, Codex or Devin subscription with xcb.
- Where does the sound come from?
- A built-in deterministic synthesizer. Playback streams into ffplay or SoX play, or afplay on macOS. dawg auth status shows which one it found. DAWG_AUDIO=0 runs silent.
- Can the agent wreck my song?
- Every tool call is validated and dry-run before it commits, and a call planned against an old revision is rejected or replayed only when nothing it touches has changed. Each accepted call is one revision, so undo removes exactly that change.
- Is it on npm?
- Not yet. Install with the script or from the GitHub Release tarball until a trusted publisher is configured for @hraness/dawg.
- What does it cost?
- dawg is free and MIT licensed. Agent turns are billed by your gateway account or count against your own subscription.