deck
Deck patch language for tish and rust. Used by deckard and chuggie
- BPM
- 195
- GRADE
- SS
- LEVEL
- 7
- RELEASES
- 6
- YEARS
- 2026–2026
- spacedevin/deck
- npm @spacedevin/deck
- npm @spacedevin/deck-player
- npm @spacedevin/deck-synths
- cargo deckfile
Published Before Dinner
The first npm publish, the first crates.io publish and the first tagged release all happened on August 3, 2026, the day I started it. @spacedevin/deck went out at 0.1.0 and was at 1.2.1 by the end of the day, and deckfile hit crates.io in the same stretch.
The first fix had nothing to do with music. The release pipeline ran with a token that couldn't yank, and CI just spat out a bare 403. So I made it say the yank scope was missing instead. After months on the tish monorepo, I really wanted release failures to tell me what went wrong.
v1.3.0 the next day exposed the conformance corpus from the crate, so anyone writing a .deck parser can test against the same fixtures the reference parser uses. v1.4.1 in mid August ran the language suite properly.
Music You Can Diff
I wanted to write music in a text file. Not MIDI, which is binary and unreadable in a pull request, but something I could type, version and stream. So on August 3, 2026 I made deck: a tiny text language for writing music, plus the packages that play it.
A .deck file declares a version, a bpm and tracks. Each track names a generator, sets its shape, and lists notes as pitch, offset, duration and velocity, one per line. The first example uses a gameBoyDmg generator with a 25 percent duty pulse.
It ships as npm packages and a Rust crate. @spacedevin/deck is the language, deck-synths the sound sources, deck-player the playback, and deckfile the Rust implementation, so the same file parses the same way in JavaScript and native code. I needed both: chuggie needed music on a Game Boy Advance, and deckard.lol needed it in a browser across four collaborative decks in real time. I called it "streamable super midi."
before this
- Wavy2024synth instruments and MIDI