Skip to content

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:

  1. You scaffolded your project with an older burrow new (Air-based dev loop), or
  2. You want to adopt contrib/selfupdate for 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 dev and burrow dev both auto-generate .env on first run if it's missing. After the migration, delete the old .dev-keys and let burrow dev --init-env (or your first mise 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:

myapp update              # apply latest update
myapp update --check      # report whether an update is available
myapp update --to v1.2.3  # pin to a specific tag (rollback)