W'xOps Portal v0.3.0 — Platform Visibility & Lifecycle Promotion UI
The largest release since v0.2.0. Makes the platform fully observable — every service's deployment state, image tags, and lifecycle are visible at a glance — and introduces a complete UI-driven promotion workflow that replaces the removed ArgoCD webhook.
What's New
Catalog Search & Filtering
The catalog is now fully searchable and filterable without a page reload.
- Full-text search —
?search=matches name, title, description, and tags across all entities. Powered by in-process filtering on the backend's cached entity slice. - Owner filter —
?owner=rocket-teamreturns entities owned by a team. - Kind filter pills — All / System / Component / API / Resource / Group / Doc tabs.
- Lifecycle tabs client-side — the full entity dataset is fetched once, then lifecycle tabs filter in-browser. Tab counts are always accurate with no pagination mismatch.
- Cache invalidation webhook —
POST /api/v1/webhooks/catalog/refresh(Bearer token) flushes the in-memory cache immediately. Wire to thegitops-infraGitea push webhook to make new catalog commits visible instantly instead of waiting up to 5 minutes.
Global Command Palette (Ctrl+K / Cmd+K)
Find any entity without leaving the keyboard.
- FlexSearch
Documentindex built in-browser on first open (prefix tokenization for instant partial matches), 5-min TTL matching the backend cache - Searches name, title, description, and tags across all entity kinds simultaneously
- Keyboard navigation: ↑↓ to move, Enter to navigate, Esc to dismiss
- Kind color badges and lifecycle hints on each result row
Session Notifications
The bell icon in the top bar surfaces portal activity during your session.
- Fires on: project scaffolded, project imported, entity registered (PR opened)
- Background poll every 3 minutes detects catalog merges by comparing entity count to your session baseline → shows "Catalog updated: N new entries"
- Backed by
sessionStorage— cleared automatically when the tab or session ends
Dracula-Inspired Dark Mode
Dark theme overhauled to reduce eye strain during extended use.
- Background:
#282a36-tone (L=0.20 — not near-black, has visible depth) - Accent: lavender purple
#bd93f9-tone for all interactive elements - Muted text: Dracula comment color
#6272a4(blue-purple instead of flat gray) - Foreground: warm off-white
#f8f8f2
Environment Version Row
Each Component detail page now shows the latest image tag deployed per environment.
- Three-column card: Dev (blue) / Staging (amber) / Production (green)
- Dev tags shown as
dev-…-{sha7}(abbreviated); staging/production shown in full - Relative timestamps: "today / yesterday / 5d ago / 2mo ago"
- Card hides when no tags exist — no empty-state noise
- New endpoint:
GET /api/v1/catalog/entities/:kind/:name/versions
Lifecycle Promotion UI (headline feature)
Full lifecycle promotion is now UI-driven, replacing the removed ArgoCD webhook.
New lifecycle model
experimental ──► development ──► staging ──► production
│ │
└────────────── deprecated ─────────────────┘
experimental= catalog entity only; no overlay, no deploymentdevelopment= dev overlay ongitops-inframain; dev image tag presentstaging= staging overlay merged;v*-rc*image tag presentproduction= production overlay merged;v*release tag presentdeprecated= locked; removal PR open for platform-team review
Scaffold breaking change
The scaffold no longer generates overlays/dev/. The infra PR now contains base
manifests only. Developers create the dev overlay through the Promotion panel when ready.
Promotion panel — two-step flow
Step A — Create overlay PR:
- Developer clicks "Create overlay" on the target environment row
- Inline config form expands: replicas, ingress host, CPU/memory limits (all optional)
- Portal opens a PR in
gitops-infratitled[Promote] {team}/{app} → {env} - Platform-team reviews and merges
Step B — Confirm lifecycle:
- Panel detects overlay on
mainand shows "Confirm" - One click updates the catalog lifecycle
If a promotion PR is already open, the row shows "PR #N pending" — preventing duplicates.
Permission matrix
| Transition | Who can trigger |
|---|---|
| experimental → development | Any team member, Managers, platform-team |
| development → staging | Managers or platform-team only |
| staging → production | Managers or platform-team only |
| Deprecation | Managers or platform-team only |
New endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v1/catalog/entities/:kind/:name/promostatus | Overlay existence, open PRs, tags per env |
POST | /api/v1/catalog/entities/:kind/:name/promote | action: create-overlay or confirm |
POST | /api/v1/catalog/entities/:kind/:name/deprecate | Deprecate with reason, open removal PR |
Removed
| Method | Path | Reason |
|---|---|---|
POST | /api/v1/webhooks/promote/:kind/:name | Replaced by UI-driven promotion |
Team Ownership View
The Group detail page now shows the full picture of what a team owns and depends on: APIs, Resources, and external APIs consumed by the team's components.
Doc Entity Improvements
- Direct commit to
main— Doc entities are committed directly togitops-infra/catalog/; cache is invalidated immediately. - Author-only draft visibility —
spec.draft: truehides a Doc from everyone except the author andplatform-team. docStatusediting — segmented control:proposed/under-review/accepted/deprecated/superseded.relatedToediting — Doc entities can now link to Components, APIs, and Resources.
Breaking Changes
-
Scaffold no longer generates
overlays/dev/— projects scaffolded after this release start atexperimental. Use the Promotion panel to create the dev overlay.Existing projects: already have
overlays/dev/committed. Use the Promotion panel's Confirm button to reconcile the lifecycle. -
POST /api/v1/webhooks/promote/:kind/:nameremoved — remove any ArgoCD notification or CI script calling this endpoint. Promotion is now portal UI-driven. -
Lifecycle removed from edit panel — use the Promotion panel instead.
Upgrade Notes
No database migrations. No new required environment variables.
Optional — cache invalidation webhook (recommended):
In Gitea → gitops-infra repo → Settings → Webhooks → Add:
- URL:
https://<portal-host>/api/v1/webhooks/catalog/refresh - Method: POST
- Authorization:
Bearer <WEBHOOK_TOKEN> - Trigger: Push events
