The open-source internal developer platform that ships as a single binary.
π Documentation Β Β·Β π Releases Β Β·Β π Report a Bug Β Β·Β β¨ Request a Feature
Gantry is a self-hostable internal developer platform (IDP) β a lightweight alternative to Backstage that runs as a single Go binary with no external dependencies. It gives engineering teams a unified service catalog, self-service actions, GitOps-native configuration management, and a plugin ecosystem without the operational overhead.
| Gantry | Backstage | |
|---|---|---|
| Setup time | ~5 minutes | Hours to days |
| Runtime dependencies | None β single binary | Node.js, PostgreSQL, often Kubernetes |
| Hosting | Any server or Docker | Kubernetes recommended |
| Embedded database | SQLite, zero config | External DB required |
| GitOps apply | gantry apply built-in |
YAML ingestion via plugins |
- Service Catalog β Typed, validated, and searchable entities for every service, API, team, and infrastructure component in your org
- Self-Service Actions β Schema-driven forms so developers can trigger deployments or run workflows without opening a ticket
- Plugin Ecosystem β First-party integrations for Kubernetes, GitHub, ArgoCD, Status Monitor, and Microsoft Teams
- GitOps Native β Manage your catalog as YAML with
gantry apply; diff, review, and roll back like code - Full-Text Search β Find any entity in milliseconds via SQLite FTS5 β no Elasticsearch required
- Single Binary β CGO-free Go binary with an embedded React frontend, SQLite database, and all assets baked in
- API Keys & JWT Auth β Browser sessions + Bearer token auth for CLI and automation; GitHub OAuth SSO optional
- Audit Log β Every write operation is captured with before/after state and source IP
- Prometheus Metrics β Built-in
/metricsendpoint, no extra instrumentation needed
curl -fsSL https://raw.githubusercontent.com/go2engle/gantry/main/install.sh | sh
gantry servedocker run -p 8080:8080 ghcr.io/go2engle/gantry:latestgit clone https://github.com/Go2Engle/Gantry.git && cd Gantry
make build
bin/gantry serve --devOpen http://localhost:8080 β default login: admin / changeme
Full installation options: GantryIDP.dev/docs/getting-started/installation
The gantry binary is both server and client β think kubectl but for your developer platform.
# Start the server
gantry serve
gantry serve --port 9090 --dev
gantry serve --admin-password mysecret
# Apply entities from YAML β GitOps style
gantry apply -f services.yaml
gantry apply -f ./catalog/
# Query the catalog
gantry get services
gantry get Service payments-api -o yaml
gantry describe Service payments-api
# Check version / manage installation
gantry version
gantry upgrade
gantry uninstallAll options can be set via environment variable, CLI flag, or a YAML config file.
| Env Var | Flag | Default | Description |
|---|---|---|---|
GANTRY_PORT |
--port |
8080 |
HTTP listen port |
GANTRY_DB |
--db |
./data/gantry.db |
SQLite path or postgres:// URL |
GANTRY_DEV |
--dev |
false |
Permissive CORS + verbose logging |
GANTRY_ADMIN_PASSWORD |
--admin-password |
changeme |
Initial admin password |
GANTRY_JWT_SECRET |
β | auto-generated | JWT signing secret |
GANTRY_DATA_DIR |
β | ./data |
Data directory |
GANTRY_ENCRYPTION_KEY |
β | auto-generated | AES-256-GCM key for plugin secrets |
Full configuration reference: GantryIDP.dev/docs/getting-started/configuration
Auth uses Authorization: Bearer <token> for CLI/API clients, or an HttpOnly session cookie for browsers.
# Authenticate
curl -X POST localhost:8080/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"changeme"}'
# Create a catalog entity
curl -X POST localhost:8080/api/v1/entities \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"kind": "Service",
"metadata": { "name": "payments-api", "title": "Payments API", "owner": "team-payments" },
"spec": { "type": "backend", "lifecycle": "production" }
}'
# Search the catalog
curl "localhost:8080/api/v1/search?q=payments" -H "Authorization: Bearer $TOKEN"Full endpoint reference
| Method | Path | Description |
|---|---|---|
GET |
/healthz |
Health check |
GET |
/readyz |
Readiness check |
GET |
/metrics |
Prometheus metrics |
POST |
/api/v1/auth/login |
Login, returns JWT |
POST |
/api/v1/auth/logout |
Clear session cookie |
GET |
/api/v1/auth/me |
Current user info |
GET |
/api/v1/apikeys |
List API keys |
POST |
/api/v1/apikeys |
Create a scoped API key |
DELETE |
/api/v1/apikeys/{id} |
Revoke an API key |
GET |
/api/v1/entities |
List all entities |
GET |
/api/v1/entities/{kind} |
List by kind |
GET |
/api/v1/entities/{kind}/{name} |
Get entity |
POST |
/api/v1/entities |
Create entity |
PUT |
/api/v1/entities/{kind}/{name} |
Update entity |
DELETE |
/api/v1/entities/{kind}/{name} |
Delete entity |
GET |
/api/v1/search?q= |
Full-text search |
GET |
/api/v1/schemas/{kind} |
JSON Schema for a kind |
GET |
/api/v1/plugins |
List plugins and enabled state |
POST |
/api/v1/actions/{name}/execute |
Execute an action |
GET |
/api/v1/actions/{name}/runs |
List action runs |
GET |
/api/v1/audit |
Audit log |
GET |
/api/v1/graph/{kind}/{name} |
Entity dependency graph |
GET |
/api/v1/ws |
WebSocket (real-time events) |
Full API documentation: GantryIDP.dev/docs/api
Prerequisites: Go 1.22+, Node.js 18+, npm
# Recommended: live reload for both backend and frontend
go install github.com/air-verse/air@latest
make dev-watch
# β Backend auto-rebuilds on .go changes (air)
# β Frontend hot-reloads at http://localhost:3000 (Vite HMR)
# Or run them separately:
bin/gantry serve --dev # Go server on :8080
cd web && npm run dev # Vite dev server on :3000
# Tests & checks
go test ./...
cd web && npx tsc --noEmit
golangci-lint run ./...Contributing guide: GantryIDP.dev/docs/contributing
Apache 2.0 β see LICENSE.
If Gantry is useful to you, give it a β β it helps others find it.