Dippin is a domain-specific language for writing AI pipeline workflows. It replaces Graphviz DOT as the authoring format for Tracker pipelines, giving prompts, shell scripts, model configuration, and conditional branching their own syntax instead of cramming everything into escaped string attributes.
Install
go install github.com/2389-research/dippin-lang/cmd/dippin@latest
Verify:
dippin help
Migrate an existing DOT pipeline:
dippin migrate --output pipeline.dip pipeline.dot
dippin validate-migration pipeline.dot pipeline.dip
What it does
A real language for pipeline authoring. Workflows are .dip files with indentation-based structure. Agent nodes get typed model: and provider: fields. Prompts and shell commands are multiline blocks — no escaping, no quoting. Conditions use when ctx.outcome == "fail" instead of opaque string attributes.
39 diagnostic codes. Validation catches structural problems (missing start node, unreachable nodes, duplicate edges) and semantic issues (unknown model names, unbounded retries, tool commands with no timeout). Error messages follow the Rust compiler convention — source location, explanation, and suggested fix.
Migration from DOT. dippin migrate converts existing DOT pipelines to .dip format. dippin validate-migration checks structural parity between the original and converted file so nothing gets lost in translation.
Analysis tooling. dippin simulate dry-runs the execution graph without calling LLMs. dippin cost estimates per-run spend by model and provider. dippin coverage checks edge reachability. dippin doctor rolls lint, coverage, and cost into a letter grade. dippin unused finds dead-branch nodes and estimates wasted cost.
Subgraph composition. A subgraph node embeds one workflow inside another by referencing a separate .dip file with ref: and passing data via params:. The child workflow is self-contained — you can lint, format, and cost it independently. The toolchain keeps subgraphs opaque: the parent gets its own lint pass, the child gets its own. When the shared pattern changes, you update one file and every workflow that references it picks up the change. See our blog post for the full design rationale.
Editor support. An LSP server (dippin lsp) provides real-time diagnostics, hover tooltips, go-to-definition, and autocomplete. A VS Code extension adds syntax highlighting, comment toggling, and indentation-aware folding.
Try it in your browser
The Dippin Playground runs the full toolchain in WebAssembly — lint, parse, and format workflows without installing anything.
Tutorials
The Dippin blog has guides for every part of the toolchain:
- Getting Started with Dippin — first workflow in under 5 minutes
- Scenario Testing with .test.json — deterministic tests for non-deterministic pipelines
- Migrating from DOT to Dippin — step-by-step migration with parity verification
- CI Integration — GitHub Actions with lint, test, and format
- Editor Setup: LSP, VS Code, and Tree-sitter — diagnostics and highlighting in your editor
- Multi-line Prompts Without Escaping — indentation-based blocks for clean prompts
- Conditional Edges — routing pipelines with
when - Cost Estimation — know your spend before you run
How it works
Everything compiles to an intermediate representation (ir.Workflow). The parser is an indentation-aware lexer feeding a recursive-descent parser. From there, each command reads the IR and does its thing — the validator checks structure, the linter checks semantics, the formatter pretty-prints, and the DOT exporter generates Graphviz output for visualization. Packages import ir but not each other.
DOT remains the visualization target. dippin export-dot generates DOT for Graphviz rendering. Dippin handles authoring; DOT handles drawing.
Requirements
- Go 1.21+
- For visualization: Graphviz (
dotcommand)
