Experimental TypeScript livecoding runtime for pattern-based music. Inspired by TidalCycles and Strudel.
  • TypeScript 91.8%
  • MDX 5.3%
  • JavaScript 2.4%
  • Shell 0.3%
  • CSS 0.1%
Find a file
2026-06-08 22:22:12 +02:00
.forgejo/workflows Add Forgejo workflow runner labels 2026-06-08 22:22:12 +02:00
.github/workflows fix: use repo-specific ARC runner name 2026-04-05 07:25:21 +02:00
bin Audit remediation P0: build hygiene, safety fixes, type cleanup 2026-03-16 20:03:26 +01:00
docs Audit remediation P0: build hygiene, safety fixes, type cleanup 2026-03-16 20:03:26 +01:00
examples Audit remediation: parity tests, expanded kit, mondo, noise, tidal translator 2026-03-14 18:12:05 +01:00
packages feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
reference Add 60+ tests: audio verification, DSL, scheduler, mini parser, negative fixtures 2026-03-15 15:03:24 +01:00
scripts feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
site feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
site-examples feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
.gitignore feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
.gitleaks.toml Initial commit: Tussel v0.1.0 baseline before audit fixes 2026-03-14 05:05:41 +01:00
agent.md Initial commit: Tussel v0.1.0 baseline before audit fixes 2026-03-14 05:05:41 +01:00
biome.json feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
CLAUDE.md Audit remediation P0: build hygiene, safety fixes, type cleanup 2026-03-16 20:03:26 +01:00
global.d.ts Initial commit: Tussel v0.1.0 baseline before audit fixes 2026-03-14 05:05:41 +01:00
lefthook.yml Audit remediation P0: build hygiene, safety fixes, type cleanup 2026-03-16 20:03:26 +01:00
LICENSE Add README, LICENSE (MIT), mark as experimental 2026-03-16 20:20:36 +01:00
package.json feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
PLAN.md Initial commit: Tussel v0.1.0 baseline before audit fixes 2026-03-14 05:05:41 +01:00
pnpm-lock.yaml feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
pnpm-workspace.yaml feature/github pages site (#1) 2026-03-17 02:44:02 +01:00
README.md Add README, LICENSE (MIT), mark as experimental 2026-03-16 20:20:36 +01:00
screenshot-example.png Switch build job to self-hosted ARC runner 2026-04-05 07:02:45 +02:00
screenshot-landing.png Switch build job to self-hosted ARC runner 2026-04-05 07:02:45 +02:00
tsconfig.json Initial commit: Tussel v0.1.0 baseline before audit fixes 2026-03-14 05:05:41 +01:00
tsconfig.package-build.json Audit remediation P0: build hygiene, safety fixes, type cleanup 2026-03-16 20:03:26 +01:00
tussel-reference-parity-backbone.md Audit remediation: parity tests, expanded kit, mondo, noise, tidal translator 2026-03-14 18:12:05 +01:00
tussel-v1-plan-local-daemon-structural-ts-and-example-driven-docs.md Initial commit: Tussel v0.1.0 baseline before audit fixes 2026-03-14 05:05:41 +01:00
vitest.config.ts Audit remediation: parity tests, expanded kit, mondo, noise, tidal translator 2026-03-14 18:12:05 +01:00

Tussel

This project is experimental and under active development. APIs will change without notice. Do not use in production.

Tussel is a local-first TypeScript livecoding runtime for pattern-based music, inspired by TidalCycles and Strudel. It runs as a terminal daemon — no browser required.

Status

Work in progress. This is an early-stage experiment. Expect:

  • Breaking changes on every commit
  • Missing features and incomplete implementations
  • Bugs, rough edges, and undocumented behavior
  • No stability guarantees whatsoever

If you're looking for a production-ready livecoding environment, use Strudel or TidalCycles instead.

What it does

Tussel takes pattern expressions like:

s("bd sd [hh hh] cp").fast(2).gain(0.8)

and renders them to audio in real time from your terminal. It supports:

  • Mini notation — Tidal-style pattern strings ("bd [sd sd] hh")
  • Pattern transformsfast, slow, rev, jux, every, sometimes, and 80+ more
  • Signal modulationsine, saw, rand, perlin as continuous control signals
  • Effects — delay, reverb, filters, distortion, phaser, FM synthesis
  • MIDI/OSC output — send patterns to external synths and software
  • Hot reload — edit your scene file, hear changes immediately
  • Offline rendering — export patterns to WAV files

Architecture

pnpm monorepo with 9 packages:

Package Purpose
@tussel/core Pattern query engine and transforms
@tussel/dsl PatternBuilder / SignalBuilder API
@tussel/audio Web Audio rendering, samples, effects
@tussel/ir Expression node types, structured logger
@tussel/mini Mini notation parser
@tussel/runtime Scene compilation, daemon, Tidal/Strudel adapters
@tussel/cli CLI entry point
@tussel/parity Audio comparison tests against Strudel reference
@tussel/testkit Shared test utilities

Getting started

Requires Node.js >= 20 and pnpm.

pnpm install
pnpm check        # lint + typecheck + test

Run a scene:

./bin/tussel run examples/basic.scene.ts

Acknowledgments

Tussel is a clean-room reimplementation. It does not share code with Tidal or Strudel, but it would not exist without the ideas pioneered by Alex McLean and the TidalCycles/Strudel communities. The pattern language design, mini notation syntax, and many method names originate from their work.

License

MIT