Code is the instrument.

pulse.city is a web studio for making algorithmic music with Strudel — a JavaScript port of TidalCycles. An AI agent composes, evolves, and explains the code in real time. Everything you hear is a live pattern you can edit.

Two kinds of documentation
This site — /docs

Product-level: what pulse.city is, how it fits together, architecture, the agent skills spec, roadmap. Long-form, linkable.

In-studio panel — F1

Task-focused: Strudel reference, pattern library with audio preview, livecoding techniques, prompt recipes for the AI. Opens as a side drawer, stays out of your way.

Pre-alpha

pulse.city is in active development for the Ipê Village 2026 pop-up city. Expect rough edges, breaking changes, and experimental features. Server-side AI is shared across visitors — rate limits apply. Code is AGPL-3.0; any public deployment must share source.

Core concepts

Two surfaces, one scheduler

Studio is where you livecode — editor first, AI as diff-based copilot, optional AUTO toggle for 30s mutations. Radio is the always-on broadcast, where the AI composes solo. Both feed the same audio scheduler, so listening on Radio and editing on Studio share one clock.

Live from radio

The /radio page broadcasts whatever the AI is currently composing. Open Studio while Radio is live and the editor auto-tunes to the playing pattern. Your first edit forks the stream locally.

Diff-based chat

When the AI suggests a code change, it's shown as a diff with Listen / Keep / Reject actions. You preview before committing — same flow as Cursor, scoped to Strudel patterns.

DJ deck for intent

Press Cmd+J. Pick genre, key, BPM, energy. The deck builds a structured prompt so the composer AI hits the vibe you want without you describing it in prose.

What is Strudel?

Strudel is a JavaScript live-coding environment for music. It ports the TidalCycles pattern language to the browser — you describe events as mini-notation strings and chain effects as method calls. The result is compact, readable, and hot-swappable: re-evaluating a pattern mid-playback keeps the beat.

$: s("bd*4").bank('RolandTR909').gain(.9)
$: s("~ cp ~ cp").bank('RolandTR909').gain(.5)
$: s("hh*8").gain(perlin.range(.2,.45))
$: note("<c2 c2 eb2 g1>").struct("x(5,8)")
  .s('sawtooth').decay(.15).lpf(800).gain(.5)

Four lines, a full house track. pulse.city wraps Strudel in a studio so you can iterate with an AI companion rather than alone at a blank editor.

Legal

pulse.city is AGPL-3.0-or-later, same as upstream Strudel. Any public deployment must share source. AI-generated music is documented as CC0 — public domain. Samples follow the license of the source pack.