Migrating to v0.25¶
v0.25 ships two user-facing CLI additions — burrow dev and contrib/selfupdate — plus a scaffold-template change that swaps Air for burrow dev. Library code is API-compatible with v0.24.
For the full list of changes, see the v0.25 changelog.
TL;DR — library code keeps working¶
No source change is required to compile against v0.25. Run go get -u github.com/oliverandrich/burrow, go mod tidy, and your build is green.
The two migration items below only apply if:
- You scaffolded your project with an older
burrow new(Air-based dev loop), or - You want to adopt
contrib/selfupdatefor in-app updates.
Scaffold migration: Air → burrow dev¶
The new project scaffold no longer ships .air.toml or pins air in .mise.toml. The dev loop is now go tool burrow dev, which watches the project, rebuilds Tailwind CSS sequentially, and restarts the app — all in one process.
If your project was generated by an older burrow new and you want to adopt the new flow:
# 1. Remove Air from the project.
rm .air.toml
sed -i '' '/"go:github.com\/air-verse\/air"/d' .mise.toml
mise uninstall go:github.com/air-verse/air
# 2. Rename your dev secrets file.
mv .dev-keys .env
# 3. Update .gitignore.
sed -i '' 's/\.dev-keys/.env/' .gitignore
# 4. Update .mise.toml: drop the ensure-dev-keys task, simplify dev,
# and add the new init-env step to setup.
In .mise.toml, replace your [tasks.dev] and [tasks.setup] with:
[tasks.dev]
description = "Run the development server: live reload + Tailwind --watch co-process. Auto-generates .env on first run."
run = "go tool burrow dev"
[tasks.setup]
description = "Bootstrap the project: install pinned tools, fetch deps, generate .env, install git hooks"
run = '''
#!/usr/bin/env bash
set -euo pipefail
echo "==> mise install"
mise install
echo "==> go mod tidy"
go mod tidy
echo "==> burrow dev --init-env"
go tool burrow dev --init-env
if [ -d .git ]; then
if command -v pre-commit >/dev/null 2>&1; then
echo "==> pre-commit install"
pre-commit install
else
echo "==> pre-commit not on PATH — skipping git hooks" >&2
fi
else
echo "==> no .git/ — skipping git hooks"
fi
'''
Verify with mise run dev — you should see burrow dev: app started … and a watcher line. Edit a .go or .html file and the app restarts; the running process and Tailwind both come down cleanly on Ctrl-C.
See Tailwind CSS guide and the burrow dev CLI reference for the full surface and flag list.
Tip:
mise run devandburrow devboth auto-generate.envon first run if it's missing. After the migration, delete the old.dev-keysand letburrow dev --init-env(or your firstmise run dev) write the new file.
Adopting contrib/selfupdate¶
Add two imports and one app registration in cmd/<app>/main.go:
import (
"github.com/oliverandrich/burrow"
"github.com/oliverandrich/burrow/contrib/selfupdate"
)
// `var version = "dev"` is set to a real value by goreleaser via
// `-ldflags="-X main.version=..."`.
var version = "dev"
func main() {
srv := burrow.NewServer(
// ... your existing apps ...
selfupdate.New(
selfupdate.WithRepo("me", "myapp"),
selfupdate.WithHost("github.com"),
selfupdate.WithCurrentVersion(version),
),
)
srv.Run()
}
Public-API access only — no tokens. Works against GitHub, Codeberg, and any Forgejo instance.
The defaults match the burrow scaffold's .goreleaser.yaml asset layout. If your project ships differently-named archives or the binary inside the archive doesn't match the repo name, see contrib/selfupdate for WithAssetPattern, WithAssetMatcher, and WithBinaryName.
After registration the binary gains: