https://agentrouter.org/register?aff=iHLj Laravel-inspired web framework for Go. Convention over configuration, clear structure, and a pleasant DX.
Repository: github.com/CodeSyncr/nimbus
Nimbus v1.0.0 is the first release with a stable core under Semantic Versioning: we avoid breaking changes to the packages listed below; when unavoidable, we prefer deprecation for one minor release before a major bump.
These packages are intended as stable building blocks for applications:
router, http, middleware, validation, config, session, auth, database, lucid, queue, mail, errors, schedule, locale, health, metrics, logger, cache, encryption, resource, notification, hash, container, view, and the Nimbus CLI (cmd/nimbus).
plugins/telescope— Debugging dashboard; many panels are still placeholders. Treat as preview; UI and internal APIs may evolve in minor releases until called out as stable in release notes.- Integration-style plugins (
plugins/ai, Scout, Socialite, etc.) — Pin versions in production; follow release notes for breaking changes until each plugin is explicitly marked stable. studio— Optional tooling; not part of the core stability promise.
- OAuth / first-party API tokens (Laravel Sanctum/Passport-class) — Not shipped in v1; plan your own bearer tokens or wait for a future release (see
CHANGELOG.md).
- Go 1.26+ (see
go.mod). CI usesgo-version-file: go.mod.
Release checklist: V1_RELEASE.md · History: CHANGELOG.md
- Router – Express-style routes with
:paramplaceholders, route groups, and middleware - Context – Request/response helpers:
JSON(),Param(),Redirect() - Config – Environment-based config (
.env+config/) - Middleware – Global and per-route middleware (Logger, Recover, CORS)
- Error pages – Built-in, content-negotiated 404/500 pages: a styled HTML page for browsers and structured JSON for API clients (based on the
Acceptheader), with a trackingerror_id. Override viarouter.Fallbackand custom handlers. - Validation – Struct validation with go-playground/validator
- Database – GORM-based models with
database.Model(ID, timestamps), migrations support - CLI –
nimbus new,make:model,make:migration(Ace-style)
├── app/
│ ├── controllers/
│ ├── models/
│ └── middleware/
├── bin/ # Server boot (bin/server.go)
├── config/
├── database/
│ └── migrations/
├── start/ # Routes, kernel (optional)
├── public/
├── main.go
├── go.mod
└── .env
From the nimbus repo directory:
cd /path/to/nimbus
go install ./cmd/nimbusIf you get zsh: command not found: nimbus, add Go’s bin directory to your PATH. For zsh, run once:
echo 'export PATH="$HOME/go/bin:$PATH"' >> ~/.zshrc && source ~/.zshrcThen run nimbus again. You can also run your app without the CLI: go run main.go (no hot reload) or go run github.com/air-verse/air@v1.52.3 (hot reload).
Hot reload: nimbus serve runs air via go run, so you don’t install anything extra. The first run may download air once; after that, edits to .go and .nimbus files restart the app automatically. No need to add air to your app’s go.mod or run go mod tidy for it. Press Ctrl+C to stop the server; it shuts down gracefully and releases the port.
nimbus new myapp
cd myapp
go mod tidy
nimbus serveServer runs at http://localhost:3333. You can also run go run main.go directly.
If you see reading ../go.mod: no such file or directory when running nimbus serve: your app’s go.mod has replace github.com/CodeSyncr/nimbus => ../, which points at the parent directory. If the app lives outside the nimbus repo (e.g. as a sibling), change it to:
replace github.com/CodeSyncr/nimbus => ../nimbusSo the path after => is the directory that contains the nimbus go.mod.
If you see missing go.sum entry for module providing package ... (imported by github.com/CodeSyncr/nimbus/...): your app’s go.sum is missing transitive dependencies from the local nimbus module. From your app directory run:
go mod tidyThen run nimbus serve again.
package main
import (
"github.com/CodeSyncr/nimbus"
"github.com/CodeSyncr/nimbus/http"
"github.com/CodeSyncr/nimbus/middleware"
)
func main() {
app := nimbus.New()
app.Router.Use(middleware.Logger(), middleware.Recover())
app.Router.Get("/", func(c *http.Context) error {
return c.JSON(http.StatusOK, map[string]string{"hello": "nimbus"})
})
app.Router.Get("/users/:id", func(c *http.Context) error {
return c.JSON(http.StatusOK, map[string]string{"id": c.Param("id")})
})
// Route groups
api := app.Router.Group("/api")
api.Get("/posts", listPosts)
api.Post("/posts", createPost)
_ = app.Run()
}Set PORT, APP_ENV, APP_NAME, DB_DRIVER, DB_DSN in .env. Config is loaded via config.Load() in nimbus.New().
import "github.com/CodeSyncr/nimbus/database"
// Connect (e.g. in bin/server.go)
db, _ := database.Connect(config.Database.Driver, config.Database.DSN)
// Model (embed database.Model)
type User struct {
database.Model
Name string
Email string
}
db.AutoMigrate(&User{})Run migrations from your app root:
nimbus db:migrateOr directly: go run . migrate. Migrations use a Laravel-inspired schema builder. Create one with:
nimbus make:migration create_usersThen add the new migration to database/migrations/registry.go. Each migration runs once; already-run migrations are tracked in schema_migrations and shown as skipped on subsequent runs.
import "github.com/CodeSyncr/nimbus/validation"
type CreateUserRequest struct {
Name string `validate:"required,min=2"`
Email string `validate:"required,email"`
}
func createUser(c *http.Context) error {
var req CreateUserRequest
if err := validation.ValidateRequestJSON(c.Request.Body, &req); err != nil {
return c.JSON(http.StatusUnprocessableEntity, map[string]any{"errors": err})
}
// ...
}Put templates in a views/ folder with the .nimbus extension. Use c.View("name", data) to render in a Laravel-inspired workflow.
Syntax (Edge-aligned):
| Nimbus | Description |
|---|---|
{{ variable }} |
Output, HTML-escaped |
{{{ variable }}} |
Output, unescaped (for rich content) |
{{-- comment --}} |
Comment (stripped from output) |
@if(cond) … @elseif(cond) … @else … @endif |
Conditionals |
@each(items) … @endeach |
Loop; use {{ . }} for current item |
@each(post in posts) … @endeach |
Loop with named var; use {{ $post }} |
@layout('layout') |
Wrap with layout; layout uses {{ .embed }} or {{ .content }} |
{{ .csrfField }} |
CSRF hidden input (auto-injected when Shield enabled) |
@dump(posts) |
Debug: pretty-print variable (or @dump(state) for all) |
@card() … @end |
Component: views/components/card.nimbus becomes @card() |
Components: Create views/components/card.nimbus; use @card() … @end in templates. Render the main slot with {{{ .slots.main }}} (Edge-style).
Example: views/home.nimbus
@layout('layout')
<h2>Hello, {{ name }}!</h2>
@if(.items)
@each(items)
<li>{{ . }}</li>
@endeach
@else
<p>No items.</p>
@endif
In your handler:
return c.View("home", map[string]any{"name": "Guest", "title": "Home", "items": []string{"A", "B"}})Views are loaded from the views/ directory by default. Change with view.SetRoot("custom/views") in main.go.
| Plugin | Description | Docs |
|---|---|---|
| Drive | File storage (fs, S3, GCS, R2, Spaces, Supabase) | README |
| Transmit | SSE for real-time server-to-client push | README |
| Package | Description | Docs |
|---|---|---|
| Queue | Background jobs (sync, Redis, database, SQS, Kafka) | README |
| Plugin | Description | Docs |
|---|---|---|
| Horizon | Queue dashboard, metrics, failed jobs (Redis) | README |
| Pulse | Lightweight request / app metrics middleware | plugins/pulse |
| Reverb | WebSocket channel broadcasting (optional Redis fan-out) | README |
| AI | AI integration (OpenAI, Ollama, Anthropic, etc.) | README |
| Inertia | Inertia.js for Vue/React/Svelte SPAs | README |
| Telescope | Debugging and introspection dashboard | README |
| MCP | Model Context Protocol for AI clients | README |
| Unpoly | Progressive enhancement and partial page updates | nimbus plugin install unpoly |
Redis is used by Queue (QUEUE_DRIVER=redis), Transmit (TRANSMIT_TRANSPORT=redis), Horizon (failed jobs + live queue depths), and Reverb (multi-instance WebSocket fan-out). Set REDIS_URL=redis://localhost:6379 in .env when using these features.
| Command | Description |
|---|---|
nimbus new <name> |
Create a new Nimbus app |
nimbus serve |
Run the app from the app root |
nimbus db:migrate |
Run database migrations |
nimbus db:rollback |
Rollback the last migration |
nimbus make:model <Name> |
Scaffold a model |
nimbus make:migration <name> |
Scaffold a migration |
nimbus queue:work |
Run the queue worker (processes background jobs) |
nimbus plugin install <name> / nimbus plugin:install <name> |
Install a plugin (horizon, reverb, telescope, inertia, ai, mcp, …) |
-
Push to GitHub (repo must be public for
go get):git remote add origin https://github.com/CodeSyncr/nimbus.git # if not already set git push -u origin main -
Tag a version (so users can pin versions):
git tag v1.0.0 git push origin v1.0.0
-
Install CLI (others can install from the repo):
go install github.com/CodeSyncr/nimbus/cmd/nimbus@latest
-
Use in another project:
go get github.com/CodeSyncr/nimbus@v1.0.0
After the first fetch, the module appears on pkg.go.dev automatically.
MIT