---
title: "Dippin"
description: "A domain-specific language for authoring AI pipeline workflows — typed syntax for prompts, models, and branching that DOT can't express."
canonical_url: "https://2389.ai/products/dippin-lang/"
last_updated: "2026-04-03T13:50:29-05:00"
doc_version: "1.0"
date: 2026-04-03
product_type: "Tool"
status: "Alpha"
tags: ["dsl", "pipeline", "go", "cli", "language", "lsp", "dot", "agents", "tracker"]
---

# Dippin

> A domain-specific language for authoring AI pipeline workflows — typed syntax for prompts, models, and branching that DOT can't express.


Dippin is a domain-specific language for writing AI pipeline workflows. It replaces Graphviz DOT as the authoring format for [Tracker](/products/tracker/) pipelines, giving prompts, shell scripts, model configuration, and conditional branching their own syntax instead of cramming everything into escaped string attributes.

## Install

```bash
go install github.com/2389-research/dippin-lang/cmd/dippin@latest
```

Verify:

```bash
dippin help
```

Migrate an existing DOT pipeline:

```bash
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](/posts/why-we-built-a-language-for-ai-pipelines/#subgraph-composition) 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](https://2389-research.github.io/dippin-lang/playground.html) runs the full toolchain in WebAssembly — lint, parse, and format workflows without installing anything.

## Tutorials

The [Dippin blog](https://2389-research.github.io/dippin-lang/blog/index.html) has guides for every part of the toolchain:

- [Getting Started with Dippin](https://2389-research.github.io/dippin-lang/blog/getting-started.html) — first workflow in under 5 minutes
- [Scenario Testing with .test.json](https://2389-research.github.io/dippin-lang/blog/scenario-testing.html) — deterministic tests for non-deterministic pipelines
- [Migrating from DOT to Dippin](https://2389-research.github.io/dippin-lang/blog/migrating-from-dot.html) — step-by-step migration with parity verification
- [CI Integration](https://2389-research.github.io/dippin-lang/blog/ci-integration.html) — GitHub Actions with lint, test, and format
- [Editor Setup: LSP, VS Code, and Tree-sitter](https://2389-research.github.io/dippin-lang/blog/editor-setup.html) — diagnostics and highlighting in your editor
- [Multi-line Prompts Without Escaping](https://2389-research.github.io/dippin-lang/blog/multi-line-prompts.html) — indentation-based blocks for clean prompts
- [Conditional Edges](https://2389-research.github.io/dippin-lang/blog/conditional-edges.html) — routing pipelines with `when`
- [Cost Estimation](https://2389-research.github.io/dippin-lang/blog/cost-estimation.html) — 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 (`dot` command)


## Sitemap

Parent: [Products](https://2389.ai/products/index.md)

Related pages in this section:

- [Skills Marketplace](https://2389.ai/products/skills-marketplace/index.md)
- [Mammoth](https://2389.ai/products/mammoth/index.md)
- [BotBoard](https://2389.ai/products/botboard/index.md)
- [Smasher](https://2389.ai/products/smasher/index.md)
- [Jeff](https://2389.ai/products/jeff/index.md)
- [Mux](https://2389.ai/products/mux/index.md)
- [ISH](https://2389.ai/products/ish/index.md)
- [Coven](https://2389.ai/products/coven/index.md)
- [Soloclaw](https://2389.ai/products/soloclaw/index.md)
- [ccvault](https://2389.ai/products/ccvault/index.md)


Site index: [llms.txt](https://2389.ai/llms.txt) · [sitemap.md](https://2389.ai/sitemap.md) · [HTML](https://2389.ai/products/dippin-lang/)
