Back to blog
2026-08-01 Thijs Creemers

Release: v1.0.0-beta-4 — the sample module now has a table


A bugfix release, and the bug is one you would have hit within your first five minutes.

1.0.0-beta-3 generated migrations that were never applied. The sample module bb quickstart creates had no database table — and the run reported 8/8 Done while doing it. If you tried Wagoe yesterday and something did not add up, this is the release to try again with.

Fixed: scaffolded migrations were never applied

The scaffolder wrote 001_create_tasks.sql. Migratus discovers <id>-<name>.up.sql, so the file sat on disk and was never seen:

$ ls migrations/
001_create_tasks.sql

$ bb migrate status
Applied migrations: 0
Pending migrations: 0

Step 7 of bb quickstart reported Done, because running zero migrations succeeds. That is the worst kind of failure: a green check over nothing.

Fixing the filename exposed two more problems in the same function. Migration ids were always 001 — the counter scanned resources/migrations while the scaffolder writes to migrations/, and it parsed ids with Integer/parseInt, which overflows on the 14-digit timestamps every other migration uses. Ids are now UTC timestamps that step forward on collision, and every migration gets a matching .down.sql so it can be rolled back. wagoe scaffold field had the identical defect.

Fixed: bb doctor passed configs the application cannot load

bb doctor exists to catch configuration mistakes, and bb doctor --ci is a CI gate. Both exited 0 on a config that cannot boot — an unparseable config.edn, or :active misspelled as :actve. Every check inspected an empty map, found nothing to complain about, and reported a pass. Nine green checks over a project that fails at startup with No active database configured.

Fixed: install.sh now supports Fedora and RHEL

Previously "Unsupported OS" with no path forward. Nothing in the installer was genuinely Debian-specific, so this cost a detection branch and a dnf hint; /etc/redhat-release covers RHEL, Rocky, Alma and CentOS Stream too.

which also joins the prerequisite check. Babashka’s own installer calls it, and minimal Fedora images do not ship it, so the run died as ./install: line 155: which: command not found — a third-party script’s error about a tool you never chose.

Added: a production build path

A generated project could only be started from an editor-connected REPL. There was no -main, no :run, no uberjar and no Dockerfile, so it could not be containerised or supervised.

clojure -M:run          # foreground start, no REPL
clojure -T:build uber   # target/<project>-0.1.0.jar
docker build -t myapp . # two-stage, non-root

Shutdown is graceful: a container stop drains the HTTP server and closes the connection pool instead of being killed mid-request.

Added: bb db:seed

Previously advertised in bb.edn and printed "not yet implemented". Seed files are EDN — a map of table to rows, or a vector of [table rows] pairs when insert order matters:

{:tasks [{:title "Try the admin UI" :done false}]}

Inserts run in one transaction, and seeding refuses to run outside a development environment unless you pass --force.

Changed: the quickstart said things that did not work

The published quickstart told newcomers to run clojure -M:repl-clj and export WAG_ENV="development". Neither works in a generated project: that alias exists only in the framework monorepo, and there is no conf/development profile. An undeclared alias does not error — it drops you into a REPL with none of your project’s dependencies, which is a confusing way to start.

Version alignment

All 29 artifacts bumped to 1.0.0-beta-4 to maintain lockstep versioning.

Upgrade

Re-run the installer to pick up the latest release:

curl -fsSL https://get.wagoe.org | bash

Existing projects: bump the com.wagoe/* versions in deps.edn. Projects generated with beta-3 have a migration named 001_create_tasks.sql that was never applied — rename it to <timestamp>-create-tasks.up.sql, or delete it and re-scaffold the module.