Skip to main content

W'xOps Portal v0.3.0 — Platform Visibility & Lifecycle Promotion UI

Xeus Nguyen
Platform Engineer

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-team returns 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 webhookPOST /api/v1/webhooks/catalog/refresh (Bearer token) flushes the in-memory cache immediately. Wire to the gitops-infra Gitea 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 Document index 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 deployment
  • development = dev overlay on gitops-infra main; dev image tag present
  • staging = staging overlay merged; v*-rc* image tag present
  • production = production overlay merged; v* release tag present
  • deprecated = 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:

  1. Developer clicks "Create overlay" on the target environment row
  2. Inline config form expands: replicas, ingress host, CPU/memory limits (all optional)
  3. Portal opens a PR in gitops-infra titled [Promote] {team}/{app} → {env}
  4. Platform-team reviews and merges

Step B — Confirm lifecycle:

  1. Panel detects overlay on main and shows "Confirm"
  2. One click updates the catalog lifecycle

If a promotion PR is already open, the row shows "PR #N pending" — preventing duplicates.

Permission matrix

TransitionWho can trigger
experimental → developmentAny team member, Managers, platform-team
development → stagingManagers or platform-team only
staging → productionManagers or platform-team only
DeprecationManagers or platform-team only

New endpoints

MethodPathDescription
GET/api/v1/catalog/entities/:kind/:name/promostatusOverlay existence, open PRs, tags per env
POST/api/v1/catalog/entities/:kind/:name/promoteaction: create-overlay or confirm
POST/api/v1/catalog/entities/:kind/:name/deprecateDeprecate with reason, open removal PR

Removed

MethodPathReason
POST/api/v1/webhooks/promote/:kind/:nameReplaced 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 to gitops-infra/catalog/; cache is invalidated immediately.
  • Author-only draft visibilityspec.draft: true hides a Doc from everyone except the author and platform-team.
  • docStatus editing — segmented control: proposed / under-review / accepted / deprecated / superseded.
  • relatedTo editing — Doc entities can now link to Components, APIs, and Resources.

Breaking Changes

  1. Scaffold no longer generates overlays/dev/ — projects scaffolded after this release start at experimental. 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.

  2. POST /api/v1/webhooks/promote/:kind/:name removed — remove any ArgoCD notification or CI script calling this endpoint. Promotion is now portal UI-driven.

  3. 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

Resources