github caiolandgraf/grove v1.3.0
Grove v1.3.0 — Built-in hot reload, test watch mode & name singularizatio

latest releases: v1.5.5, v1.5.4, v1.5.3...
one month ago

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 dev

On 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 = 50

All 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 report

Pressing 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 DEV startup header — shows watched extensions, directories, debounce window and binary path
  • Consistent styling applied to both grove build and grove dev

🆕 grove --version / grove -v

grove -v
grove --version

Prints 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:air

Behaviour 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+C no longer prints "one or more specs failed" — exits cleanly with "Watch stopped."
  • grove dev:air: now suggests grove dev as a zero-dependency alternative when Air is not found.
  • Help banner and per-command --help output 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.0

Breaking changes

  • grove serve no longer exists. Use grove dev:air instead.

Full Changelog: v1.2.4...v1.3.0

Don't miss a new grove release

NewReleases is sending notifications on new releases.