Skip to main content
Version: 0.4.x

Service Catalog

The W'xOps Service Catalog is a searchable, filterable registry of every service, API, database, team, and document in your organization. It reads Backstage-compatible YAML from your gitops-infra repository — no database, no plugin, no catalog server.

How It Works

  • The portal reads all YAML files from service-catalog/ on first request and caches for 5 minutes.
  • A Gitea push webhook calls /api/v1/webhooks/catalog/refresh to invalidate immediately on every push to gitops-infra.
  • Search runs in-browser with FlexSearch — no round-trip per keystroke.

Entity Types

KindWhat it represents
ComponentA service, library, or batch job
APIAn OpenAPI, gRPC, or async API spec
ResourceA database, object store, queue, or Vault path
SystemA product made up of related components
GroupA team or organization unit
UserA team member
LocationA pointer to a directory of entity files
TemplateA scaffold template entry
DocumentAn RFC, ADR, or Runbook

Entity File Format

Entities follow the Backstage backstage.io/v1alpha1 schema. The portal extends it with wxops.cloud/ annotations.

Component example

apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-api
description: |
Handles payment processing for checkout flows.
annotations:
wxops.cloud/scaffold-template: go-grpc-service
wxops.cloud/scaffold-date: "2025-06-10"
wxops.cloud/gitea-repo: wxops/payment-api
wxops.cloud/vault-path: wxops/payment-api/dev
wxops.cloud/lifecycle: development
spec:
type: service
lifecycle: development
owner: group:wxops/rocket-team
system: payments
providesApis:
- payment-api-v1
dependsOn:
- resource:payment-db
- component:identity-service

API example

apiVersion: backstage.io/v1alpha1
kind: API
metadata:
name: payment-api-v1
annotations:
wxops.cloud/gitea-repo: wxops/payment-api
wxops.cloud/openapi-path: api/openapi.yaml
spec:
type: openapi
lifecycle: development
owner: group:wxops/rocket-team
system: payments
definition: |
openapi: "3.0.0"
info:
title: Payment API
version: "1.0.0"
paths: {}

Resource example

apiVersion: backstage.io/v1alpha1
kind: Resource
metadata:
name: payment-db
annotations:
wxops.cloud/vault-path: wxops/payment-api/dev
spec:
type: database
lifecycle: development
owner: group:wxops/rocket-team
system: payments
dependsOn:
- component:payment-api

Entity Detail Page

Each entity has a detail page with:

CardContent
OverviewDescription, owner, lifecycle, system, type
RelationsDependencies, provides, consumes (graph)
Scaffold infoTemplate used, date scaffolded, gitops-infra commit
CI/CDLatest workflow runs and image tags per branch
Cluster statusArgoCD sync status, health, deployed revision (per env)
ActivityRecent PRs, promotions, config changes (role-gated)
DocsLinked RFC/ADR/Runbook rendered as Markdown
PromotionLifecycle transition panel (role-gated)
OpenAPIInteractive Swagger UI (for API kind)
ConfigEditable overlay config (platform team only)

Lifecycle States

LifecycleWho can setMeaning
experimentalAny developerProof-of-concept, may be removed
developmentDeveloper (via promotion panel)Active development, dev overlay exists
stagingplatform-team or {team}:ManagersStaging overlay promoted, RC image tagged
productionplatform-team or {team}:ManagersProduction overlay promoted, stable image
deprecatedPlatform teamRetained for reference, not running

The portal enforces lifecycle gating — non-manager developers cannot promote past experimental.

Catalog Directory Layout

gitops-infra/
└── service-catalog/
├── groups/
│ └── rocket-team.yaml
├── users/
│ └── alice.yaml
├── systems/
│ └── payments.yaml
└── components/
├── payment-api/
│ ├── component.yaml
│ ├── api.yaml
│ └── resource-db.yaml
└── identity-service/
└── component.yaml

Subdirectory layout is convention — the portal reads all *.yaml files recursively and recognizes entities by their kind: field.