Admin panel (orbit)
The admin panel has moved out of the framework core and into orbit — a
separate, pluggable Go module (github.com/jcsvwinston/orbit) that versions
and ships independently of Nucleus. The framework core no longer contains a
built-in admin panel.
Why the extraction
Bundling a React + TypeScript SPA inside the framework binary required every Nucleus application to carry the admin's transitive dependencies whether or not the app used the panel. Extracting it into a dedicated module lets the core stay lightweight and lets the admin evolve on its own schedule, with its own release tags.
Integrating orbit into your app
orbit is a Nucleus extension module distributed as a separate Go module at
github.com/jcsvwinston/orbit. Add it to your project with:
go get github.com/jcsvwinston/orbit@latest
orbit's current tagged release is v1.2.0 (pin @v1.2.0 for reproducible
builds). Since its v1.0.0 the public surfaces (the root module and the
datasource contract) are frozen for the life of v1.x, enforced by a
contract-freeze test in the orbit repo.
Mount it with the standard .Mount() call in main.go:
package main
import (
"github.com/jcsvwinston/nucleus/pkg/nucleus"
"github.com/jcsvwinston/orbit"
)
func main() {
nucleus.New().
FromConfigFile("nucleus.yml").
Mount(orbit.Module(orbit.Config{Prefix: "/admin"})).
Start()
}
orbit is not part of the github.com/jcsvwinston/nucleus module and versions
independently. The cluster-telemetry subsystem ships as sibling modules
(github.com/jcsvwinston/orbit/proto, github.com/jcsvwinston/orbit/agent,
github.com/jcsvwinston/orbit/server); most applications only need the root
orbit module for the admin panel.
What orbit provides
- Login page with light/dark theme support.
- Model browser — every registered model becomes a list view with search, filtering, ordering and pagination.
- CRUD UI with form generation from
db:andvalidate:tags. - Bulk actions with per-row error reporting.
- Import / export — CSV, JSON, SQL, with validation on import.
- Audit log — every CRUD operation is recorded.
- System pulse — Go runtime, DB pool, feature flags, jobs, outbox, cluster nodes.
- Health dashboard — DB / Redis / mail connectivity.
- Migration view — applied vs. pending, with diff hints.
- Job queue inspector — Asynq runtime details.
- File storage browser — works against the configured
pkg/storagebackend. - Live traffic inspection — HTTP, SQL, sessions.
- Email stats and deployment info.
Configuration
All orbit configuration lives under modules.orbit.* in nucleus.yml. The
admin_* family of config keys that existed in earlier releases has been
removed from the framework core (see
docs/reference/CONFIG_KEY_REGISTRY.md);
consult orbit's own documentation for its configuration schema.
Authorization and RBAC
The Casbin RBAC enforcer is a core framework feature, not an orbit feature.
Configure it with the rbac_policy_file key:
rbac_policy_file: ./rbac_policy.csv
The legacy admin_rbac_policy_file alias was removed in v0.12.0
(DEP-2026-004): rbac_policy_file is the only key. Renaming it in your
configuration is the entire migration (MA-2026-004).
The enforcer is available to all application code (including orbit) through
the Runtime.Authorizer() accessor.
Registering models
Model registration is a core framework concern. Register a model with the application's model registry so that orbit (and other tools) can discover it:
a.Models.Register(&Article{})
App.RegisterModel is the stable method on pkg/app.App.
Multi-tenancy
When multitenant.enabled: true is set, orbit respects the tenant context
provided by the framework's request-scope resolver.
Effective-config inspection
The GET /_/config HTTP endpoint that previously shipped with the admin
subsystem has been removed from the framework core. Use
nucleus config print --effective from the CLI for effective merged
configuration inspection:
nucleus config print --effective --config nucleus.yml
See CLI overview → Effective config for the full flag reference.