Playground
The fastest way to understand Duckstring is to watch it run. The Playground is an in-browser simulation of the orchestration model: build a graph of Ponds and Ripples, send triggers, and watch freshness propagate. It runs entirely client-side — no install, no backend, no sign-up.
It uses the same state machine as the real runtime (the Python engine is a behaviour-for-behaviour port of the playground's reference implementation), so what you see is exactly how a deployed pipeline behaves — just with simulated work instead of real transforms.
What you can do
The playground opens with the demo pipeline from the Quickstart already loaded — transactions and products feeding sales, feeding reports — so you can start triggering immediately.
- Send triggers. Select a Pond and send a Tap (pull once), Pulse (push once), Wave (standing pull), or Tide (standing push with a staleness bound). Watch demand tokens flow upstream and runs cascade back down.
- Edit the topology. Add and delete Ponds, link them as Sources and Sinks, and add Ripples inside a Pond with their own parent links — the same graph you'd otherwise declare in code and
pond.toml. - Tune the work. Set each Ripple's duration (and a variability factor) to model fast and slow transforms, then watch where the bottleneck forms.
- Add Windows. Give an Inlet a recurring availability window and see how a downstream Wave throttles to it.
- Control time. Pause, change the simulation speed, and read the event console and trace chart to follow exactly what fired and why.
Things worth trying
A few experiments that show off behaviour you won't get from a scheduler:
- Wave vs. the bottleneck. Start a Wave on the terminal Pond. Every Ripple settles into a cadence set by the slowest Ripple upstream — nothing runs faster than its consumer can use, with no rate limits configured anywhere.
- Tap, twice. Send one Tap and watch it propagate upstream; the upstream Ponds re-arm as it runs. Send a second Tap and notice it's supplied almost immediately — the pull model pre-positions fresh data for the next request.
- Tide vs. Wave. Put a 10-second Tide on the Outlet, then swap it for a Wave with a 10-second Window on the Inlets. Same once-per-10s outcome — but the Window pins when the run happens to when the source data is actually available.
- Overlapping runs. Make the pipeline longer than the trigger interval and watch multiple runs in flight at once. There is no concurrency cap; completions clock the cascade.
When the behaviour starts to make sense, Theory explains the rules behind it — and the Quickstart gets the real thing running on your machine in a few minutes.