Grove v1.3.0
Release date: 2026-03-03
What's new
🔥 Built-in hot reload — grove dev
Grove now ships a first-class hot-reload watcher. No Air, no .air.toml, no external tools required.
grove devOn every .go save Grove rebuilds the binary and restarts the process automatically. A 50 ms debounce window collapses burst saves into a single rebuild, and newly created subdirectories are watched at runtime without restarting the watcher. Spec files (*_spec.go) and the tests directory are always excluded so a test save never triggers an application rebuild.
Configure via the optional [dev] section in grove.toml:
[dev]
root = "."
bin = ".grove/tmp/app"
build_cmd = "go build -o .grove/tmp/app ./cmd/api/"
watch_dirs = ["."]
exclude = [".grove", "vendor", "node_modules", "tests"]
extensions = [".go"]
debounce_ms = 50All fields are optional — grove dev works out of the box with zero configuration.
🧪 Built-in test watch mode — grove test -w
Watch mode for tests is now built directly into Grove via gest's native -w flag. No Air or external watcher needed.
grove test -w # re-run all specs on every save
grove test -wc # watch mode + coverage reportPressing Ctrl+C stops cleanly without printing a spurious failure message. Grove's own banner lines from gest are filtered so the terminal output stays clean and consistent.
🏗️ grove make:resource now includes migration
grove make:resource <Name> now scaffolds model + migration + controller + DTO in one shot — equivalent to grove make:model <Name> -r. Previously the migration had to be generated manually as a second step.
grove make:resource Post
# Creates:
# internal/models/post.go
# migrations/..._create_posts_table.sql
# internal/controllers/post-controller.go
# internal/dto/post-dto.go🔤 Automatic name singularization
All generator commands now automatically singularize the entity name before generating files. You can pass the name in any form and Grove will always produce consistent, correct output.
| Input | Resolved name | File | Table |
|---|---|---|---|
Post
| Post
| post.go
| posts
|
Posts
| Post
| post.go
| posts
|
books
| Book
| book.go
| books
|
BlogPost
| BlogPost
| blog_post.go
| blog_posts
|
order_items
| OrderItem
| order_item.go
| order_items
|
Applies to: make:model, make:controller, make:dto, make:resource.
🎨 Improved terminal output
Build and watcher output now uses coloured badges and context-aware line colouring throughout:
BUILDING/RE-BUILDING/APP RESTARTED— coloured background badges- Build errors — fully red lines prefixed with
×for quick scanning - Package headers (
# module/pkg) — dimmed gray so errors stand out GROVE DEVstartup header — shows watched extensions, directories, debounce window and binary path- Consistent styling applied to both
grove buildandgrove dev
🆕 grove --version / grove -v
grove -v
grove --versionPrints the Grove logo and version string without running any command.
🔁 grove serve renamed to grove dev:air
grove serve has been replaced by grove dev:air for a more consistent command layout alongside grove dev.
# before
grove serve
# after
grove dev:airBehaviour is unchanged: uses Air for hot-reload if installed, falls back to go run ./cmd/api/main.go otherwise.
Bug fixes & polish
grove test -w:Ctrl+Cno longer prints "one or more specs failed" — exits cleanly with "Watch stopped."grove dev:air: now suggestsgrove devas a zero-dependency alternative when Air is not found.- Help banner and per-command
--helpoutput updated across all commands to reflect the new features. - README, docs site and Contributors page updated to v1.3.0.
Upgrade
go install github.com/caiolandgraf/grove@latest
grove -v # → v1.3.0Breaking changes
grove serveno longer exists. Usegrove dev:airinstead.
Full Changelog: v1.2.4...v1.3.0