Service Catalog¶
A simple, open source service catalog for teams who don't want the complexity of Backstage.
Problem¶
- Backstage is too complex (requires dedicated team, TypeScript expertise)
- Commercial alternatives (Port, Cortex, OpsLevel) are SaaS-only and expensive
- No simple self-hosted option exists
Solution¶
A lightweight service catalog that:
- Reads
catalog-info.yamlfrom git repos (GitHub, GitLab, Forgejo) - Allows manual entries for non-git services (SaaS tools, external APIs)
- Tracks dependencies between services
- Links to docs, dashboards, runbooks
- Single binary deployment
Tech Stack¶
- Backend: Go
- Frontend: HTMX + minimal CSS
- Database: SQLite (default) or PostgreSQL
- Deployment: Single binary / Docker image
Features (MVP)¶
| Feature | Description |
|---|---|
| Service list | Searchable list of all services |
| Dependency graph | Visualize who calls what |
| Ownership | Team/owner assignment |
| Links | Docs, repo, dashboard, runbook URLs |
| Tags | Tech stack, lifecycle stage |
| Git sync | Auto-import from repos |
| Manual entries | Add services not in git |
Architecture¶
The service catalog runs in Kubernetes and watches configured git repos for service metadata.
App Configuration (ConfigMap)¶
apiVersion: v1
kind: ConfigMap
metadata:
name: service-catalog-config
namespace: service-catalog
data:
config.yaml: |
sources:
- url: https://github.com/minnova-io/oracle
branch: main
file: catalog.yaml
- url: https://github.com/minnova-io/infra
branch: main
file: catalog.yaml
- url: https://github.com/minnova-io/niobe
branch: main
file: catalog.yaml
sync:
interval: 5m
database:
driver: postgres # or sqlite
dsn: ${DATABASE_URL}
Entity Types¶
The catalog supports different entity types:
| Type | Description |
|---|---|
service |
Backend services, APIs, applications |
resource |
Databases, caches, queues, storage |
api |
External APIs (Stripe, Twilio, etc.) |
library |
Shared libraries, packages |
website |
Frontend apps, marketing sites |
Catalog Metadata (in each repo)¶
Each repo contains a catalog.yaml file with one or more entities:
# catalog.yaml
name: oracle
type: service
description: Internal AI assistant
owner: platform-team
tags:
- go
- ai
- internal
lifecycle: production # development | staging | production | deprecated
dependencies:
- service:postgres
- service:user-api
- resource:redis
- api:openai
links:
docs: https://knowledge-base.minnova.io/projects/oracle
dashboard: https://grafana.minnova.io/d/oracle
---
name: oracle-worker
type: service
description: Background job processor for Oracle
owner: platform-team
dependencies:
- service:oracle
- resource:redis
# infra repo - catalog.yaml
name: postgres
type: resource
description: Primary PostgreSQL database
owner: platform-team
tags:
- database
- postgresql
---
name: redis
type: resource
description: Redis cache and queue
owner: platform-team
Dependency References¶
Dependencies use the format type:name and resolve across all repos:
dependencies:
- service:postgres # links to postgres service
- resource:s3-bucket # links to s3-bucket resource
- api:stripe # links to stripe api (or shows as external)
The catalog loads all configured repos into one unified view - repo boundaries don't matter for references.
Future Features¶
- Health status (ping endpoints)
- Tech radar integration
- Scorecards (production readiness checks)
- API documentation rendering
- MkDocs integration (render docs inline)
- OIDC authentication
- RBAC for editing
Why Open Source¶
There's a gap in the OSS community for a simple service catalog. This could help small-medium teams who need visibility into their services without enterprise complexity.
Status¶
Planning - Not started yet