Skip to main content
Version: Next

Examples

These pages give you complete, copy-ready release setups. You get one page per ecosystem and one per delivery target. Each page shows the config, the scripts its stages run, and the terminal output of a real run.

Every dispat transcript comes from a real run against a throwaway repository, with only timestamps and durations normalized. Lines printed by your own commands, like npm, docker, or butler, come directly from those tools. Your output will look different.

You do not need a monorepo to start. One folder, one package, one publish is a valid setup. Growing into a graph later is additive, so you avoid restructuring and keep your already published versions as baselines.

This matters because a repository holding one deliverable rarely stops there. A game gains a landing page, a docs site, an SDK, and a server, while a library gains a CLI and a demo. Each addition becomes one more block in the same file rather than another release script nobody maintains.

Read A single package to see the smallest form. Then read A game, from one package to many to walk through the growth step by step.

Check Concepts if a term is new. It defines all of them in a few minutes of reading. Read One repository or many to decide your shape before you commit to it.

Read one page, then one more. Start with An npm monorepo whatever you build. It is the shortest complete setup and the best first read, because every other page uses the same four pieces with different commands.

After that, go to the page for your own ecosystem below. Read Adopting dispat second instead if you are bringing dispat to a repository that already ships versions.

Ecosystem by ecosystem

These pages cover one package manager each. They include a config you can copy, the scripts its stages run, and a real run.

ExampleWhat it covers
An npm monorepoPackage scripts, a build and a publish, versions from commits.
A pnpm workspaceworkspace: ranges, the shared lock file, and pnpm publish mid-release.
A Go module workspaceTag-driven versions, the replace link bracket, and why tagFormat matters.
A Cargo workspacepath dependencies, [patch.crates-io] links, and workspace inheritance.
A Python monorepopyproject.toml and requirements*.txt reconciled in one pass.
Maven modulespom.xml, ${property} skips, and parent-managed versions.
A Gradle library and its version cataloglibs.versions.toml, version.ref, and literal coordinates.
.NET packagesdotnet pack, project references, and central package management.
Composer packagesVersions from tags, and a composer.json with no version field.
Ruby gemsGemspecs, Gemfiles, and the VERSION constant a writer will not touch.
A Flutter app and its packagespubspec.yaml, the +N build number, and dependency_overrides.
An iOS app and a CocoaPods libraryInfo.plist, project.pbxproj, Podfiles and podspecs.
An Android appGradle, a monotonic versionCode, and a bundle on the GitHub release.
A Docker image chainImages depending on images, where a build needs its base published.

Game development

ExampleWhat it covers
A game, from one package to manyOne game today; a landing page, docs, an SDK and a server later. Godot and Unity.
Publishing to Steamsteamcmd, depots, and release channels mapped onto Steam branches.
Publishing to itch.iobutler, one channel per platform, and the version players see.

Shipping artifacts

ExampleWhat it covers
Cross-platform binariesFour targets, checksums, and assets attached to the GitHub release.
Helm charts that follow the imageappVersion and image tags written by the run that pushed the image.
A site deployed from the releaseA docs or marketing site published during the run, with a CI-only guard.

Shaping the repository

The pages above focus on one ecosystem each. The pages below cover the repository around them. They apply to your setup whatever you build.

ExampleWhat it covers
A single package, no monorepodispat on a repository with one thing in it, and what changes when it grows.
Adopting dispatDeriving the graph and the starting versions from the manifests, in a new repository or one that already ships.
Keeping configuration beside the codeSpace and package config files in their own folders, and .dispatexclude.
npm and Docker in one graphTwo ecosystems, one graph: the mixed case dispat was built for.
Registry login, once per spaceThe login slot: one authentication per space, whatever the registry.

Which example covers my manifest

dispat reads and writes thirty-five manifest formats. You will find every one of them worked through on these pages.

ManifestExample
package.jsonnpm, pnpm
go.modGo
Cargo.tomlRust
pyproject.toml, requirements*.txtPython
composer.jsonPHP
pom.xmlMaven
*.csproj, *.fsproj, *.vbproj, *.nuspec, Directory.Packages.props, packages.config.NET
pubspec.yamlFlutter and Dart
Gemfile, *.gemspecRuby
Podfile, *.podspec, Info.plist, project.pbxprojApple
AndroidManifest.xml, build.gradle, build.gradle.ktsAndroid, Gradle
libs.versions.tomlGradle
Dockerfile, Containerfile, compose.yamlDocker
Packages/manifest.json, ProjectSettings/ProjectSettings.assetUnity
project.godot, plugin.cfg, export_presets.cfgGodot
*.uproject, *.uplugin, Config/DefaultGame.ini, Config/DefaultEngine.iniUnreal
game.project, project.json, gem.jsonGames

You might have a version that lives outside these formats, like a Helm Chart.yaml, a README install line, or a plain text file. The replace strategy handles those. Read the Helm page to see it worked through.

The pages under Editing the monorepo provide the other half of the worked examples. They show the commands that change files across many packages between releases.

Read shared versions to see how a release behaves once it covers more than one package. Check dispat in CI for the CI side.