<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.wxops.cloud/release-notes</id>
    <title>W'xOps Blog</title>
    <updated>2026-07-15T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.wxops.cloud/release-notes"/>
    <subtitle>W'xOps Blog</subtitle>
    <icon>https://docs.wxops.cloud/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[W'xOps Portal v0.4.1 — Darlane Sync Improvements & CLI Download Proxy]]></title>
        <id>https://docs.wxops.cloud/release-notes/v0-4-1-release</id>
        <link href="https://docs.wxops.cloud/release-notes/v0-4-1-release"/>
        <updated>2026-07-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[v0.4.1 fixes the darlane sync delete bug, adds a max-debounce cap for large file bursts, kubectl retry on pod restarts, graceful SIGINT shutdown, and an authenticated CLI binary download proxy so developers never need direct Gitea access.
]]></summary>
        <content type="html"><![CDATA[<p>v0.4.1 is a focused patch on top of the Darlane + CLI release from v0.4.0. It
addresses the most-reported developer pain point (<code>darlane sync</code> silently ignoring
deleted files), hardens the sync session against pod restarts, and adds an
authenticated CLI download proxy through the portal so developers never need
direct Gitea credentials.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wxops-darlane-sync--delete-propagation-fix"><code>wxops darlane sync</code> — Delete Propagation Fix<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#wxops-darlane-sync--delete-propagation-fix" class="hash-link" aria-label="Direct link to wxops-darlane-sync--delete-propagation-fix" title="Direct link to wxops-darlane-sync--delete-propagation-fix" translate="no">​</a></h2>
<p>The biggest change in this release: when you deleted a file locally during a
<code>darlane sync</code> session, the file persisted in the pod indefinitely. The watcher
only handled <code>Write</code>, <code>Create</code>, and <code>Rename</code> events — <code>Remove</code> was silently
dropped.</p>
<p><strong>Now:</strong> deletes are tracked in a separate map and flushed to the pod as a
<code>kubectl exec rm -rf</code> call on the next debounce tick. Delete flushes always run
<em>before</em> create/write flushes, so a file that's deleted and immediately recreated
lands in the pod in the correct order.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">✗  deleted 2 file(s): old_handler.go, old_util.go</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">↑  synced  1 file(s): handler.go</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-full-sync-on-startup">Initial Full Sync on Startup<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#initial-full-sync-on-startup" class="hash-link" aria-label="Direct link to Initial Full Sync on Startup" title="Direct link to Initial Full Sync on Startup" translate="no">​</a></h2>
<p><code>darlane sync</code> now performs a full sync of all non-excluded files immediately
after the watcher starts. This means the pod is always in a clean state from the
moment the session begins — no more "why doesn't the pod have my latest code?"
on a fresh debug session.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wxops darlane </span><span class="token function" style="color:rgb(80, 250, 123)">sync</span><span class="token plain"> payment-api</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># → initial sync: 14 file(s)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># watching  ./src  →  tenant-wxops/payment-api-darlane:/app</span><br></div></code></pre></div></div>
<p>Suppress with <code>--no-initial-sync</code> if you want the old behaviour.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="max-debounce-cap-2-s">Max-Debounce Cap (2 s)<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#max-debounce-cap-2-s" class="hash-link" aria-label="Direct link to Max-Debounce Cap (2 s)" title="Direct link to Max-Debounce Cap (2 s)" translate="no">​</a></h2>
<p>The old debounce reset on every event. During a <code>git checkout</code> or a build
emitting hundreds of files, the timer kept resetting and nothing flushed until
the burst was completely done — sometimes 10–30 seconds of no syncs.</p>
<p>The debounce now has a 2-second hard cap: even if events are still arriving,
the flush fires at the 2-second mark. Large file bursts get their first sync
in ≤ 2 s, not after the burst finishes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubectl-retry">kubectl Retry<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#kubectl-retry" class="hash-link" aria-label="Direct link to kubectl Retry" title="Direct link to kubectl Retry" translate="no">​</a></h2>
<p>Pods restart during development. Both sync and delete calls now retry up to
3 times with a 2-second delay between attempts:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">⚠  pod not ready, retrying (1/3)…</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">⚠  pod not ready, retrying (2/3)…</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">↑  synced  3 file(s): main.go, handler.go, util.go</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="graceful-sigint--sigterm">Graceful SIGINT / SIGTERM<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#graceful-sigint--sigterm" class="hash-link" aria-label="Direct link to Graceful SIGINT / SIGTERM" title="Direct link to Graceful SIGINT / SIGTERM" translate="no">​</a></h2>
<p><code>Ctrl-C</code> now flushes any pending batch before exiting instead of dropping it:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">^C</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">stopped.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli-download-proxy">CLI Download Proxy<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#cli-download-proxy" class="hash-link" aria-label="Direct link to CLI Download Proxy" title="Direct link to CLI Download Proxy" translate="no">​</a></h2>
<p>Developers previously needed direct Gitea access to download the <code>wxops</code> binary.
v0.4.1 adds an authenticated download endpoint to the portal backend:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">GET /api/v1/cli/download/:platform</span><br></div></code></pre></div></div>
<p>The endpoint calls the Gitea releases API with the portal's service-account token
and streams the latest binary back to your authenticated session. The CLI download
card on the overview page now links directly to this endpoint — no Gitea credentials
required.</p>
<p>Supported platforms: <code>linux-amd64</code>, <code>linux-arm64</code>, <code>darwin-amd64</code>, <code>darwin-arm64</code>,
<code>windows-amd64</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nginx-cookie-buffer-fix">nginx Cookie Buffer Fix<a href="https://docs.wxops.cloud/release-notes/v0-4-1-release#nginx-cookie-buffer-fix" class="hash-link" aria-label="Direct link to nginx Cookie Buffer Fix" title="Direct link to nginx Cookie Buffer Fix" translate="no">​</a></h2>
<p>A <code>502 upstream sent too big header</code> error on <code>/auth/callback</code> in Kubernetes
deployments was traced to nginx's default 4 kB proxy buffer being too small for
the AES-256-GCM Pinniped session cookie (id_token + access_token + refresh_token
≈ 3–4 kB). Fixed by adding <code>proxy_buffer_size 32k</code> to the <code>/auth/</code> location block.</p>
<p>Also fixed: the <code>Secure</code> cookie flag is now set correctly from the
<code>X-Forwarded-Proto</code> header rather than hardcoded, so production HTTPS deployments
behind an Ingress controller work without config changes.</p>
<p>See the full <a class="" href="https://docs.wxops.cloud/docs/concepts/architecture">Architecture docs</a> or browse the <a class="" href="https://docs.wxops.cloud/docs/catalog/service-catalog">Service Catalog guide</a> to get started with v0.4.1.</p>]]></content>
        <author>
            <name>Xeus Nguyen</name>
            <uri>https://wiki.xeusnguyen.xyz</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="CLI" term="CLI"/>
        <category label="Darlane" term="Darlane"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[W'xOps Portal v0.4.0 — Darlane & wxops CLI]]></title>
        <id>https://docs.wxops.cloud/release-notes/v0-4-0-release</id>
        <link href="https://docs.wxops.cloud/release-notes/v0-4-0-release"/>
        <updated>2026-07-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[v0.4.0 ships Darlane — on-demand parallel debug pods configurable through the portal's Promotion panel — and the wxops CLI for catalog browsing, service debugging, and live file sync into running pods without direct Kubernetes credentials.
]]></summary>
        <content type="html"><![CDATA[<p>Darlane brings on-demand parallel debug pods to every deployed service — no scaffold
changes, no kubectl juggling. Configure the pod through the portal's Promotion panel,
then use the <code>wxops</code> CLI to browse the catalog, pull up the exact debug commands for
any service, or stream local file changes directly into the running pod.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="darlane--per-environment-parallel-debug-pods-headline-feature">Darlane — Per-Environment Parallel Debug Pods <em>(headline feature)</em><a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#darlane--per-environment-parallel-debug-pods-headline-feature" class="hash-link" aria-label="Direct link to darlane--per-environment-parallel-debug-pods-headline-feature" title="Direct link to darlane--per-environment-parallel-debug-pods-headline-feature" translate="no">​</a></h3>
<p>A new class of developer capability: ephemeral debug pods that run in parallel with
the real workload, scoped to a single environment, and fully governed by the same
GitOps pipeline as every other config change.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-a-darlane-pod-gives-you">What a Darlane pod gives you<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#what-a-darlane-pod-gives-you" class="hash-link" aria-label="Direct link to What a Darlane pod gives you" title="Direct link to What a Darlane pod gives you" translate="no">​</a></h4>
<ul>
<li class=""><strong>Scale up on demand</strong> — <code>replicas: 0</code> means zero cost at rest; scale to <code>1</code> when
you need it and back to <code>0</code> when done</li>
<li class=""><strong>Exec into your actual runtime</strong> — with the real env vars, secrets, and service mesh
present (no local simulation)</li>
<li class=""><strong>File-sync from local</strong> — stream changes from your workstation directly into the pod
volume; the pod's hot-reload picks them up without a redeploy</li>
<li class=""><strong>Mirror live traffic</strong> — via Mirrord; your local process receives real cluster traffic
without re-routing production</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-overlay-driven-not-scaffold-time">Architecture: overlay-driven, not scaffold-time<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#architecture-overlay-driven-not-scaffold-time" class="hash-link" aria-label="Direct link to Architecture: overlay-driven, not scaffold-time" title="Direct link to Architecture: overlay-driven, not scaffold-time" translate="no">​</a></h4>
<p>Darlane config lives in the overlay <code>kustomization.yaml</code> as a JSON 6902 <code>op: add</code>
patch targeting <code>spec.parameters.darlane</code> on the <code>XTenantApp</code> resource:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Minimal patch written by the portal to overlays/dev/kustomization.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">op</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> add</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> /spec/parameters/darlane</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ttl</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 4h</span><br></div></code></pre></div></div>
<p>Dev overlays are committed directly to <code>main</code>. Staging and production overlays open
a PR with the <code>portal-managed</code> label for platform-team review.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="promotion-panel-enable-darlane-wizard">Promotion panel: Enable Darlane wizard<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#promotion-panel-enable-darlane-wizard" class="hash-link" aria-label="Direct link to Promotion panel: Enable Darlane wizard" title="Direct link to Promotion panel: Enable Darlane wizard" translate="no">​</a></h4>
<p>The <strong>Darlane</strong> button appears on each environment row once the overlay exists.</p>
<table><thead><tr><th>Setting</th><th>Notes</th></tr></thead><tbody><tr><td>Replicas</td><td>Default 0 (scaled down at rest)</td></tr><tr><td>Start command</td><td>Free text + preset buttons (uvicorn, flask, air, node — all default port 8080)</td></tr><tr><td>File sync</td><td>Toggle + mount path + "Seed volume from pod image" checkbox</td></tr><tr><td>TTL</td><td>1h / 2h / 4h (default) / 8h / 12h / 24h</td></tr><tr><td>Env overrides</td><td>Key/value rows injected only into the Darlane pod — for feature flags</td></tr><tr><td>Traffic weight</td><td>0–100% of ingress traffic routed to the pod (ingress-enabled apps only)</td></tr><tr><td>Sticky session</td><td>Cookie name, SameSite, Secure flag (enabled when <code>trafficWeight &gt; 0</code>)</td></tr><tr><td>Header routing</td><td>Route a specific HTTP header to the pod; works with <code>trafficWeight: 0</code></td></tr><tr><td>Production gate</td><td><code>productionOverride</code> confirmation checkbox (managers and platform-team only)</td></tr></tbody></table>
<p>Step 2 shows a diff-aware YAML preview labeled <code>+ added</code> / <code>~ changed</code> / <code>− removed</code>
when reconfiguring an existing Darlane block.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="inline-debug-commands">Inline debug commands<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#inline-debug-commands" class="hash-link" aria-label="Direct link to Inline debug commands" title="Direct link to Inline debug commands" translate="no">​</a></h4>
<p>When Darlane is enabled, the portal shows copy-paste commands:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Exec</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-it</span><span class="token plain"> deployment/</span><span class="token operator">&lt;</span><span class="token plain">app</span><span class="token operator">&gt;</span><span class="token plain">-darlane -- </span><span class="token function" style="color:rgb(80, 250, 123)">bash</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Port-forward</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> port-forward deployment/</span><span class="token operator">&lt;</span><span class="token plain">app</span><span class="token operator">&gt;</span><span class="token plain">-darlane </span><span class="token number">8080</span><span class="token plain">:8080</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Traffic mirror (Mirrord)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mirrord </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--target</span><span class="token plain"> deployment/</span><span class="token operator">&lt;</span><span class="token plain">app</span><span class="token operator">&gt;</span><span class="token plain">-darlane --target-namespace </span><span class="token operator">&lt;</span><span class="token plain">namespace</span><span class="token operator">&gt;</span><span class="token plain"> -- </span><span class="token operator">&lt;</span><span class="token plain">cmd</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># File sync (wxops CLI)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">wxops darlane </span><span class="token function" style="color:rgb(80, 250, 123)">sync</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">app</span><span class="token operator">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">wxops darlane </span><span class="token function" style="color:rgb(80, 250, 123)">sync</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">app</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--local</span><span class="token plain"> ./src </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--remote</span><span class="token plain"> /app/src</span><br></div></code></pre></div></div>
<p>Deployment naming follows the XTenantApp composition convention:
<code>dev</code> → <code>{appName}-darlane</code>, <code>staging</code> → <code>{appName}-staging-darlane</code>, <code>production</code> → <code>{appName}-production-darlane</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="permission-model">Permission model<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#permission-model" class="hash-link" aria-label="Direct link to Permission model" title="Direct link to Permission model" translate="no">​</a></h4>
<table><thead><tr><th>Environment</th><th>Who can enable</th></tr></thead><tbody><tr><td><code>dev</code></td><td>Any member of the owning team</td></tr><tr><td><code>staging</code></td><td><code>{org}:Managers</code> sub-group or <code>platform-team</code></td></tr><tr><td><code>production</code></td><td><code>{org}:Managers</code> sub-group or <code>platform-team</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="wxops-cli-headline-feature"><code>wxops</code> CLI <em>(headline feature)</em><a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#wxops-cli-headline-feature" class="hash-link" aria-label="Direct link to wxops-cli-headline-feature" title="Direct link to wxops-cli-headline-feature" translate="no">​</a></h3>
<p>A standalone terminal client for the portal — the same REST API as the browser,
without opening a browser.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Linux amd64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-L</span><span class="token plain"> https://</span><span class="token operator">&lt;</span><span class="token plain">portal-host</span><span class="token operator">&gt;</span><span class="token plain">/api/v1/cli/download/linux/amd64 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> /usr/local/bin/wxops </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">chmod</span><span class="token plain"> +x /usr/local/bin/wxops</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># macOS arm64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-L</span><span class="token plain"> https://</span><span class="token operator">&lt;</span><span class="token plain">portal-host</span><span class="token operator">&gt;</span><span class="token plain">/api/v1/cli/download/darwin/arm64 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> /usr/local/bin/wxops </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">chmod</span><span class="token plain"> +x /usr/local/bin/wxops</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Or build locally from the repo root</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">make</span><span class="token plain"> cli-install</span><br></div></code></pre></div></div>
<p>Available targets: <code>linux-amd64</code>, <code>linux-arm64</code>, <code>darwin-amd64</code>, <code>darwin-arm64</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="commands">Commands<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" translate="no">​</a></h4>
<p><strong><code>wxops login</code></strong> — PKCE browser flow. Saves the session token to
<code>~/.wxops/credentials.json</code>. For CI, set <code>WXOPS_PORTAL_URL</code> + <code>WXOPS_TOKEN</code> env
vars instead — <code>WXOPS_TOKEN</code> takes precedence over the credentials file.</p>
<p><strong><code>wxops catalog list</code></strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">wxops catalog list [--kind Component] [--lifecycle production]</span><br></div></code></pre></div></div>
<p>Tabwriter output across all entity kinds. Filter by kind and/or lifecycle.</p>
<p><strong><code>wxops catalog get &lt;kind&gt; &lt;name&gt;</code></strong></p>
<p>Full details for a single entity — name, lifecycle, owner, type, description, source.</p>
<p><strong><code>wxops debug &lt;service&gt; [--env dev|staging|production]</code></strong></p>
<p>Resolves the entity, shows per-environment Darlane state, and prints ready-to-run
<code>kubectl</code>, <code>mirrord</code>, and <code>wxops darlane sync</code> commands:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$ wxops debug payment-api</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Darlane debug  payment-api</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Namespace       tenant-wxops</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Deployment      payment-api-darlane</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Lifecycle       production</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Darlane status</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  dev          ✓  enabled</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  staging      ·  overlay exists — Darlane not enabled</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  production   —  no overlay</span><br></div></code></pre></div></div>
<p><strong><code>wxops darlane sync &lt;app&gt;</code></strong></p>
<p>Watches a local directory with <code>fsnotify</code>, debounces rapid changes, and streams
a <code>tar</code> archive into the Darlane pod using <code>kubectl exec … tar xf -</code>.</p>
<table><thead><tr><th>Flag</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>--local</code></td><td><code>.</code></td><td>Local directory to watch</td></tr><tr><td><code>--remote</code></td><td><code>/app</code></td><td>Target path inside the pod</td></tr><tr><td><code>--env</code></td><td><code>dev</code></td><td>Target environment</td></tr><tr><td><code>--exclude</code></td><td>—</td><td>Glob patterns to ignore</td></tr><tr><td><code>--debounce</code></td><td><code>300ms</code></td><td>Wait after last change before syncing</td></tr><tr><td><code>--namespace</code></td><td>derived</td><td>Override the K8s namespace</td></tr><tr><td><code>--deployment</code></td><td>derived</td><td>Override the deployment name</td></tr></tbody></table>
<p><strong><code>wxops version</code></strong> — prints <code>wxops version v0.4.0</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli-download-card--overview-dashboard">CLI Download Card — Overview Dashboard<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#cli-download-card--overview-dashboard" class="hash-link" aria-label="Direct link to CLI Download Card — Overview Dashboard" title="Direct link to CLI Download Card — Overview Dashboard" translate="no">​</a></h3>
<p>The portal Overview page now includes a compact CLI download card in the right-hand
sticky column (below the Identity panel). It lists download links for all platform
targets and links to the CLI documentation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#upgrade-notes" class="hash-link" aria-label="Direct link to Upgrade Notes" title="Direct link to Upgrade Notes" translate="no">​</a></h2>
<p>No database migrations. No new required environment variables.</p>
<p>The <code>wxops</code> CLI binary is released alongside the portal image. Existing sessions
are fully compatible — users who have already authenticated can re-login with v0.4.0
and the credentials file is reused.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://docs.wxops.cloud/release-notes/v0-4-0-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/darlane/overview">Darlane reference</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/cli/overview">CLI reference</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/concepts/architecture">Architecture</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/getting-started/deployment">Deployment guide</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/getting-started/environment-variables">Environment variables</a></li>
</ul>]]></content>
        <author>
            <name>Xeus Nguyen</name>
            <uri>https://wiki.xeusnguyen.xyz</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Darlane" term="Darlane"/>
        <category label="CLI" term="CLI"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[W'xOps Portal v0.3.0 — Platform Visibility & Lifecycle Promotion UI]]></title>
        <id>https://docs.wxops.cloud/release-notes/v0-3-0-release</id>
        <link href="https://docs.wxops.cloud/release-notes/v0-3-0-release"/>
        <updated>2026-07-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[v0.3.0 is the largest release since v0.2.0. Full-text catalog search, command palette (Ctrl+K), Dracula dark mode, per-environment image version cards, and a complete UI-driven promotion workflow that replaces the removed ArgoCD webhook.
]]></summary>
        <content type="html"><![CDATA[<p>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.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="catalog-search--filtering">Catalog Search &amp; Filtering<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#catalog-search--filtering" class="hash-link" aria-label="Direct link to Catalog Search &amp; Filtering" title="Direct link to Catalog Search &amp; Filtering" translate="no">​</a></h3>
<p>The catalog is now fully searchable and filterable without a page reload.</p>
<ul>
<li class=""><strong>Full-text search</strong> — <code>?search=</code> matches name, title, description, and tags across all
entities. Powered by in-process filtering on the backend's cached entity slice.</li>
<li class=""><strong>Owner filter</strong> — <code>?owner=rocket-team</code> returns entities owned by a team.</li>
<li class=""><strong>Kind filter pills</strong> — All / System / Component / API / Resource / Group / Doc tabs.</li>
<li class=""><strong>Lifecycle tabs client-side</strong> — the full entity dataset is fetched once, then lifecycle
tabs filter in-browser. Tab counts are always accurate with no pagination mismatch.</li>
<li class=""><strong>Cache invalidation webhook</strong> — <code>POST /api/v1/webhooks/catalog/refresh</code> (Bearer token)
flushes the in-memory cache immediately. Wire to the <code>gitops-infra</code> Gitea push webhook
to make new catalog commits visible instantly instead of waiting up to 5 minutes.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="global-command-palette-ctrlk--cmdk">Global Command Palette (Ctrl+K / Cmd+K)<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#global-command-palette-ctrlk--cmdk" class="hash-link" aria-label="Direct link to Global Command Palette (Ctrl+K / Cmd+K)" title="Direct link to Global Command Palette (Ctrl+K / Cmd+K)" translate="no">​</a></h3>
<p>Find any entity without leaving the keyboard.</p>
<ul>
<li class="">FlexSearch <code>Document</code> index built in-browser on first open (prefix tokenization for instant
partial matches), 5-min TTL matching the backend cache</li>
<li class="">Searches name, title, description, and tags across all entity kinds simultaneously</li>
<li class="">Keyboard navigation: ↑↓ to move, Enter to navigate, Esc to dismiss</li>
<li class="">Kind color badges and lifecycle hints on each result row</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="session-notifications">Session Notifications<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#session-notifications" class="hash-link" aria-label="Direct link to Session Notifications" title="Direct link to Session Notifications" translate="no">​</a></h3>
<p>The bell icon in the top bar surfaces portal activity during your session.</p>
<ul>
<li class="">Fires on: project scaffolded, project imported, entity registered (PR opened)</li>
<li class="">Background poll every 3 minutes detects catalog merges by comparing entity count to your
session baseline → shows "Catalog updated: N new entries"</li>
<li class="">Backed by <code>sessionStorage</code> — cleared automatically when the tab or session ends</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dracula-inspired-dark-mode">Dracula-Inspired Dark Mode<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#dracula-inspired-dark-mode" class="hash-link" aria-label="Direct link to Dracula-Inspired Dark Mode" title="Direct link to Dracula-Inspired Dark Mode" translate="no">​</a></h3>
<p>Dark theme overhauled to reduce eye strain during extended use.</p>
<ul>
<li class="">Background: <code>#282a36</code>-tone (L=0.20 — not near-black, has visible depth)</li>
<li class="">Accent: lavender purple <code>#bd93f9</code>-tone for all interactive elements</li>
<li class="">Muted text: Dracula comment color <code>#6272a4</code> (blue-purple instead of flat gray)</li>
<li class="">Foreground: warm off-white <code>#f8f8f2</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="environment-version-row">Environment Version Row<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#environment-version-row" class="hash-link" aria-label="Direct link to Environment Version Row" title="Direct link to Environment Version Row" translate="no">​</a></h3>
<p>Each Component detail page now shows the latest image tag deployed per environment.</p>
<ul>
<li class="">Three-column card: <strong>Dev</strong> (blue) / <strong>Staging</strong> (amber) / <strong>Production</strong> (green)</li>
<li class="">Dev tags shown as <code>dev-…-{sha7}</code> (abbreviated); staging/production shown in full</li>
<li class="">Relative timestamps: "today / yesterday / 5d ago / 2mo ago"</li>
<li class="">Card hides when no tags exist — no empty-state noise</li>
<li class="">New endpoint: <code>GET /api/v1/catalog/entities/:kind/:name/versions</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lifecycle-promotion-ui-headline-feature">Lifecycle Promotion UI <em>(headline feature)</em><a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#lifecycle-promotion-ui-headline-feature" class="hash-link" aria-label="Direct link to lifecycle-promotion-ui-headline-feature" title="Direct link to lifecycle-promotion-ui-headline-feature" translate="no">​</a></h3>
<p>Full lifecycle promotion is now UI-driven, replacing the removed ArgoCD webhook.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-lifecycle-model">New lifecycle model<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#new-lifecycle-model" class="hash-link" aria-label="Direct link to New lifecycle model" title="Direct link to New lifecycle model" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">experimental ──► development ──► staging ──► production</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">     │                                            │</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">     └────────────── deprecated ─────────────────┘</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong><code>experimental</code></strong> = catalog entity only; no overlay, no deployment</li>
<li class=""><strong><code>development</code></strong> = dev overlay on <code>gitops-infra</code> main; dev image tag present</li>
<li class=""><strong><code>staging</code></strong> = staging overlay merged; <code>v*-rc*</code> image tag present</li>
<li class=""><strong><code>production</code></strong> = production overlay merged; <code>v*</code> release tag present</li>
<li class=""><strong><code>deprecated</code></strong> = locked; removal PR open for platform-team review</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="scaffold-breaking-change">Scaffold breaking change<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#scaffold-breaking-change" class="hash-link" aria-label="Direct link to Scaffold breaking change" title="Direct link to Scaffold breaking change" translate="no">​</a></h4>
<p>The scaffold <strong>no longer generates <code>overlays/dev/</code></strong>. The infra PR now contains base
manifests only. Developers create the dev overlay through the Promotion panel when ready.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="promotion-panel--two-step-flow">Promotion panel — two-step flow<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#promotion-panel--two-step-flow" class="hash-link" aria-label="Direct link to Promotion panel — two-step flow" title="Direct link to Promotion panel — two-step flow" translate="no">​</a></h4>
<p><strong>Step A — Create overlay PR:</strong></p>
<ol>
<li class="">Developer clicks "Create overlay" on the target environment row</li>
<li class="">Inline config form expands: replicas, ingress host, CPU/memory limits (all optional)</li>
<li class="">Portal opens a PR in <code>gitops-infra</code> titled <code>[Promote] {team}/{app} → {env}</code></li>
<li class="">Platform-team reviews and merges</li>
</ol>
<p><strong>Step B — Confirm lifecycle:</strong></p>
<ol>
<li class="">Panel detects overlay on <code>main</code> and shows "Confirm"</li>
<li class="">One click updates the catalog lifecycle</li>
</ol>
<p>If a promotion PR is already open, the row shows "PR #N pending" — preventing duplicates.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="permission-matrix">Permission matrix<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#permission-matrix" class="hash-link" aria-label="Direct link to Permission matrix" title="Direct link to Permission matrix" translate="no">​</a></h4>
<table><thead><tr><th>Transition</th><th>Who can trigger</th></tr></thead><tbody><tr><td>experimental → development</td><td>Any team member, Managers, platform-team</td></tr><tr><td>development → staging</td><td>Managers or platform-team only</td></tr><tr><td>staging → production</td><td>Managers or platform-team only</td></tr><tr><td>Deprecation</td><td>Managers or platform-team only</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-endpoints">New endpoints<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#new-endpoints" class="hash-link" aria-label="Direct link to New endpoints" title="Direct link to New endpoints" translate="no">​</a></h4>
<table><thead><tr><th>Method</th><th>Path</th><th>Description</th></tr></thead><tbody><tr><td><code>GET</code></td><td><code>/api/v1/catalog/entities/:kind/:name/promostatus</code></td><td>Overlay existence, open PRs, tags per env</td></tr><tr><td><code>POST</code></td><td><code>/api/v1/catalog/entities/:kind/:name/promote</code></td><td><code>action: create-overlay</code> or <code>confirm</code></td></tr><tr><td><code>POST</code></td><td><code>/api/v1/catalog/entities/:kind/:name/deprecate</code></td><td>Deprecate with reason, open removal PR</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="removed">Removed<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#removed" class="hash-link" aria-label="Direct link to Removed" title="Direct link to Removed" translate="no">​</a></h4>
<table><thead><tr><th>Method</th><th>Path</th><th>Reason</th></tr></thead><tbody><tr><td><code>POST</code></td><td><code>/api/v1/webhooks/promote/:kind/:name</code></td><td>Replaced by UI-driven promotion</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="team-ownership-view">Team Ownership View<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#team-ownership-view" class="hash-link" aria-label="Direct link to Team Ownership View" title="Direct link to Team Ownership View" translate="no">​</a></h3>
<p>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.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="doc-entity-improvements">Doc Entity Improvements<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#doc-entity-improvements" class="hash-link" aria-label="Direct link to Doc Entity Improvements" title="Direct link to Doc Entity Improvements" translate="no">​</a></h3>
<ul>
<li class=""><strong>Direct commit to <code>main</code></strong> — Doc entities are committed directly to <code>gitops-infra/catalog/</code>; cache is invalidated immediately.</li>
<li class=""><strong>Author-only draft visibility</strong> — <code>spec.draft: true</code> hides a Doc from everyone except the author and <code>platform-team</code>.</li>
<li class=""><strong><code>docStatus</code> editing</strong> — segmented control: <code>proposed</code> / <code>under-review</code> / <code>accepted</code> / <code>deprecated</code> / <code>superseded</code>.</li>
<li class=""><strong><code>relatedTo</code> editing</strong> — Doc entities can now link to Components, APIs, and Resources.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-changes">Breaking Changes<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Scaffold no longer generates <code>overlays/dev/</code></strong> — projects scaffolded after this release
start at <code>experimental</code>. Use the Promotion panel to create the dev overlay.</p>
<blockquote>
<p><em>Existing projects:</em> already have <code>overlays/dev/</code> committed. Use the Promotion panel's
<strong>Confirm</strong> button to reconcile the lifecycle.</p>
</blockquote>
</li>
<li class="">
<p><strong><code>POST /api/v1/webhooks/promote/:kind/:name</code> removed</strong> — remove any ArgoCD notification
or CI script calling this endpoint. Promotion is now portal UI-driven.</p>
</li>
<li class="">
<p><strong>Lifecycle removed from edit panel</strong> — use the Promotion panel instead.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#upgrade-notes" class="hash-link" aria-label="Direct link to Upgrade Notes" title="Direct link to Upgrade Notes" translate="no">​</a></h2>
<p>No database migrations. No new required environment variables.</p>
<p><strong>Optional — cache invalidation webhook</strong> (recommended):</p>
<p>In Gitea → <code>gitops-infra</code> repo → Settings → Webhooks → Add:</p>
<ul>
<li class="">URL: <code>https://&lt;portal-host&gt;/api/v1/webhooks/catalog/refresh</code></li>
<li class="">Method: POST</li>
<li class="">Authorization: <code>Bearer &lt;WEBHOOK_TOKEN&gt;</code></li>
<li class="">Trigger: Push events</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://docs.wxops.cloud/release-notes/v0-3-0-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/concepts/architecture">Architecture</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/getting-started/environment-variables">Environment variables</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/getting-started/deployment">Deployment guide</a></li>
</ul>]]></content>
        <author>
            <name>Xeus Nguyen</name>
            <uri>https://wiki.xeusnguyen.xyz</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Catalog" term="Catalog"/>
        <category label="Platform Engineering" term="Platform Engineering"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[W'xOps Portal v0.2.0 — Golden-Path Scaffolding & Developer Experience]]></title>
        <id>https://docs.wxops.cloud/release-notes/v0-2-0-release</id>
        <link href="https://docs.wxops.cloud/release-notes/v0-2-0-release"/>
        <updated>2026-06-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[v0.2.0 ships full end-to-end project creation: a four-step wizard generates XTenantApp manifests, Vault secrets, Kustomize overlays, ArgoCD Image Updater CRs, and catalog entities in one shot. Adds CI/CD visibility, edit-config wizard, and activity feed.
]]></summary>
        <content type="html"><![CDATA[<p>The first release where the portal can create and manage a full service lifecycle
end-to-end: a developer fills in a wizard, the portal commits XTenantApp +
XTenantDatabase + ExternalSecrets + Kustomize overlays + catalog entities to
<code>gitops-infra</code>, ArgoCD and Crossplane provision everything, and the entity detail
page shows live CI status, releases, packages, and activity.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="golden-path-scaffolding">Golden-path scaffolding<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#golden-path-scaffolding" class="hash-link" aria-label="Direct link to Golden-path scaffolding" title="Direct link to Golden-path scaffolding" translate="no">​</a></h3>
<p><strong>Project creation wizard</strong></p>
<p>Four-step wizard — template selection → runtime config → platform features →
review and create. Each step is independently navigable; the final step shows a
per-step progress screen with timing as the portal commits files and creates
resources.</p>
<p><strong>Template system</strong></p>
<p>Templates live in <code>gitops-infra</code> under a configurable directory. Each template
carries a <code>template.yaml</code> that declares <code>metadata</code>, <code>defaults</code>, and <code>recommends</code>
so the wizard can pre-populate fields and suggest optional features. Runtimes
(language, version, package manager) are selectable per template.</p>
<p><strong>Manifest generation</strong></p>
<p>The portal generates and commits:</p>
<ul>
<li class=""><code>tenants-apps/{team}/{app}/base/</code> — <code>xtenant-app.yaml</code>, <code>xtenant-database.yaml</code>
(when database enabled), <code>external-secret-*.yaml</code>, catalog entity files</li>
<li class=""><code>tenants-apps/{team}/{app}/overlays/dev/</code> — <code>kustomization.yaml</code>,
<code>image-transformer.yaml</code>, <code>patch-xtenant-app.yaml</code></li>
<li class=""><code>tenants/{team}/{app}.yaml</code> — ArgoCD Image Updater CR</li>
</ul>
<p><strong>ArgoCD Image Updater integration</strong></p>
<p><code>image-transformer.yaml</code> is required for Kustomize to reach <code>spec/parameters/image</code>
on the XTenantApp CRD (Kustomize only natively substitutes images in standard
Deployment/StatefulSet specs). The generated <code>kustomization.yaml</code> intentionally
has no <code>images:</code> block — Image Updater adds it on first build. A static block
would be overwritten on every reconcile, resetting the tag to <code>latest</code>.</p>
<p>The Image Updater CR is committed to <code>tenants/{team}/{appName}.yaml</code>
(not inside <code>tenants-apps/</code>) with <code>metadata.name: {appName}</code> for a clean
ArgoCD control-plane view.</p>
<p><strong>Overlay patch correctness</strong></p>
<p><code>patch-xtenant-app.yaml</code> contains only env-specific overrides (replicas,
resources, ingress, secretsFrom). <code>appName</code>, <code>namespace</code>, and <code>image</code> use
<code>omitempty</code> so they are absent from the patch and inherit from base — previously
empty string values were overriding the base and breaking the deployed config.</p>
<p><strong>Git-flow branching and branch protection</strong></p>
<p>Scaffolded repos have three branches: <code>develop</code> (default, direct push allowed),
<code>staging</code> and <code>main</code> (PR required; main has a CI bot whitelist). CI bot identity
(<code>GITEA_BOT_USERNAME</code> / <code>GITEA_BOT_EMAIL</code>) is injected into scaffolded CI files.</p>
<p><strong>Vault and ExternalSecret</strong></p>
<p>The portal writes a Vault KV secret at <code>secret/{team}/{app}</code> (create/update only —
never reads or deletes) and generates ExternalSecret manifests that reference it.
Existence of the Gitea repo and gitops config is checked before any Vault write.</p>
<p><strong>Import existing repos</strong></p>
<p>Register an existing Gitea project into the catalog without re-scaffolding. The
import wizard lists all org repos, auto-fills the entity YAML, and commits catalog
entity files to <code>gitops-infra</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="config-management-via-pr">Config management via PR<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#config-management-via-pr" class="hash-link" aria-label="Direct link to Config management via PR" title="Direct link to Config management via PR" translate="no">​</a></h3>
<p><strong>Edit-config wizard</strong></p>
<p>Update XTenantApp platform features (replicas, resources, ingress, secrets,
probes, rollout strategy) through a three-step diff-review UI:</p>
<ol>
<li class="">Edit form with YAML preview</li>
<li class="">Review — structured summary of changes</li>
<li class="">Success — "what was updated" checklist and PR status</li>
</ol>
<p>The form matches the scaffold wizard's visual language: <code>rounded-xl border</code> cards,
<code>lg:grid-cols-2</code> equal columns, pill step badges, nav buttons outside the grid.</p>
<p><strong><code>templateId</code> preserved on update</strong></p>
<p>Updating a project's config previously cleared <code>templateId</code> from the XTenantApp
manifest — the backend rebuilt the manifest from the request struct without that
field. <code>templateId</code> is now echoed back from the frontend and threaded through the
backend rebuild.</p>
<p><strong>Gitops PR URL security</strong></p>
<p><code>gitops-infra</code> PR URLs are not included in any API response. Activity feed and
success panels show titles and status only.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cicd-and-release-visibility">CI/CD and release visibility<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#cicd-and-release-visibility" class="hash-link" aria-label="Direct link to CI/CD and release visibility" title="Direct link to CI/CD and release visibility" translate="no">​</a></h3>
<p>Each catalog Component entity (with a <code>gitea/source-location</code> annotation) now
shows three live-data cards pulled from the Gitea API:</p>
<p><strong>CI/CD status card</strong></p>
<p>Latest Gitea Actions workflow runs with status badges (passed / failed / running),
workflow name, branch, and relative time. Auto-refreshes every 30 seconds.</p>
<p><strong>Releases card</strong></p>
<p>Git releases and container images from the Gitea Package Registry. Shows version
timeline, pre-release badge, release notes preview, image tags with pull command.</p>
<p><strong>Packages card</strong></p>
<p>Dependency tracking from the repo's manifest files: <code>go.mod</code>, <code>package.json</code>,
<code>requirements.txt</code>, <code>pyproject.toml</code>. Shows direct vs. dev dependencies per
ecosystem. Single fetch on mount (deps don't change often enough to poll).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="activity-feed">Activity feed<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#activity-feed" class="hash-link" aria-label="Direct link to Activity feed" title="Direct link to Activity feed" translate="no">​</a></h3>
<p>Two-tier loading: five most-recent portal-managed PRs load immediately; "Show all"
expands to a full paginated view. Filtered by the <code>portal-managed</code> Gitea label so
only portal-created PRs appear. Role-scoped: tenant teams see only their own team's
activity.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lifecycle-webhook">Lifecycle webhook<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#lifecycle-webhook" class="hash-link" aria-label="Direct link to Lifecycle webhook" title="Direct link to Lifecycle webhook" translate="no">​</a></h3>
<p>The lifecycle sync CI workflow lives in <code>gitops-infra</code> (not in the scaffolded
project). It fires on push to <code>main</code> when
<code>tenants-apps/**/overlays/dev/kustomization.yaml</code> changes — Image Updater's
write-back after a successful build triggers the webhook, which promotes the
entity lifecycle to <code>development</code>.</p>
<p>Team managers (<code>{orgName}:{teamName}:Managers</code>) can promote lifecycle stages
alongside <code>platform-team</code>. <code>PORTAL_EXTERNAL_URL</code> has been removed; CI uses
<code>PORTAL_URL</code> from Gitea repository secrets on <code>gitops-infra</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-views">Cluster views<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#cluster-views" class="hash-link" aria-label="Direct link to Cluster views" title="Direct link to Cluster views" translate="no">​</a></h3>
<p><strong>Namespace listing from Pinniped groups</strong></p>
<p><code>GET /api/v1/clusters/:id/namespaces</code> previously called the K8s namespaces
endpoint, which returns everything (cluster-admin) or 403 (everyone else). Namespaces
are now derived from the user's Pinniped group membership: Gitea OIDC groups arrive
as <code>orgName:teamName</code>, mapping to <code>tenant-{orgName}</code>. Platform-team users fall
through to the K8s API.</p>
<p><strong>Identity card reload button</strong></p>
<p>Reload re-fetches the Pinniped WhoAmI, refreshes namespace listing, and triggers
a full refresh of pods and deployments — no browser reload required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#upgrade-notes" class="hash-link" aria-label="Direct link to Upgrade Notes" title="Direct link to Upgrade Notes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-environment-variables">New environment variables<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#new-environment-variables" class="hash-link" aria-label="Direct link to New environment variables" title="Direct link to New environment variables" translate="no">​</a></h3>
<table><thead><tr><th>Variable</th><th>Required</th><th>Default</th><th>Notes</th></tr></thead><tbody><tr><td><code>GITEA_TEMPLATE_OWNER</code></td><td>No</td><td><em>(GITEA_CATALOG_OWNER)</em></td><td>Org owning the scaffold template repo</td></tr><tr><td><code>GITEA_TEMPLATE_REPO</code></td><td>No</td><td><code>scaffold-templates</code></td><td>Repo containing scaffold templates</td></tr><tr><td><code>GITEA_BOT_USERNAME</code></td><td>No</td><td>—</td><td>CI bot username — added to main branch push whitelist</td></tr><tr><td><code>GITEA_BOT_EMAIL</code></td><td>No</td><td>—</td><td>CI bot email — substituted into scaffold template CI files</td></tr><tr><td><code>VAULT_ADDR</code></td><td>No</td><td>—</td><td>Vault server URL. When empty, Vault write is skipped silently.</td></tr><tr><td><code>VAULT_TOKEN</code></td><td>No</td><td>—</td><td>Short-lived token with <code>wxops-portal</code> policy.</td></tr><tr><td><code>VAULT_KV_MOUNT</code></td><td>No</td><td><code>secret</code></td><td>KV v2 mount. Secrets written to <code>{mount}/{team}/{appName}</code>.</td></tr><tr><td><code>WEBHOOK_TOKEN</code></td><td>No</td><td>—</td><td>Shared secret for lifecycle webhook.</td></tr><tr><td><code>DEV_BYPASS_AUTH</code></td><td>No</td><td><code>false</code></td><td>Skip OIDC — auto-login as <code>dev / platform-team</code>. Local dev only.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="portal_external_url-removed"><code>PORTAL_EXTERNAL_URL</code> removed<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#portal_external_url-removed" class="hash-link" aria-label="Direct link to portal_external_url-removed" title="Direct link to portal_external_url-removed" translate="no">​</a></h3>
<p>Rename the secret used by the Gitea CI runner: <code>PORTAL_EXTERNAL_URL</code> → <code>PORTAL_URL</code>
(Gitea repository secret on <code>gitops-infra</code>). The webhook token secret name is unchanged.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="namespace-rbac">Namespace RBAC<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#namespace-rbac" class="hash-link" aria-label="Direct link to Namespace RBAC" title="Direct link to Namespace RBAC" translate="no">​</a></h3>
<p>Ensure ClusterRoleBindings on spoke clusters use the full <code>orgName:teamName</code> string
as the subject (not plain <code>teamName</code>). Tenant namespaces must be named <code>tenant-{orgName}</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-image-updater">ArgoCD Image Updater<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#argocd-image-updater" class="hash-link" aria-label="Direct link to ArgoCD Image Updater" title="Direct link to ArgoCD Image Updater" translate="no">​</a></h3>
<p>Remove any static <code>images:</code> block from existing overlay <code>kustomization.yaml</code> files
before enabling Image Updater — the two will fight over the tag value on every reconcile.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://docs.wxops.cloud/release-notes/v0-2-0-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/concepts/architecture">Architecture</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/scaffolding/git-flow">Golden-path git flow</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/getting-started/environment-variables">Environment variables</a></li>
</ul>]]></content>
        <author>
            <name>Xeus Nguyen</name>
            <uri>https://wiki.xeusnguyen.xyz</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Scaffold" term="Scaffold"/>
        <category label="Catalog" term="Catalog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[W'xOps Portal v0.1.0 — Identity & Service Catalog]]></title>
        <id>https://docs.wxops.cloud/release-notes/v0-1-0-release</id>
        <link href="https://docs.wxops.cloud/release-notes/v0-1-0-release"/>
        <updated>2026-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The first published release of W'xOps Portal ships Phase 1 (Pinniped SSO, multi-cluster token exchange, kubeconfig download) and Phase 2 (Backstage-compatible service catalog with Gitea source and Mermaid relationship graphs).
]]></summary>
        <content type="html"><![CDATA[<p>The first published image of <strong>W'xOps Portal</strong> — a multi-cluster Kubernetes management
portal built around Pinniped Supervisor single sign-on. It ships Phase 1 (Identity &amp;
Multi-Cluster Access) and Phase 2 (Service Catalog) as complete, production-ready features.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-included">What's included<a href="https://docs.wxops.cloud/release-notes/v0-1-0-release#whats-included" class="hash-link" aria-label="Direct link to What's included" title="Direct link to What's included" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-1--identity--multi-cluster-access">Phase 1 — Identity &amp; Multi-Cluster Access<a href="https://docs.wxops.cloud/release-notes/v0-1-0-release#phase-1--identity--multi-cluster-access" class="hash-link" aria-label="Direct link to Phase 1 — Identity &amp; Multi-Cluster Access" title="Direct link to Phase 1 — Identity &amp; Multi-Cluster Access" translate="no">​</a></h3>
<p>One login covers every spoke cluster. No per-cluster popups, no credential duplication.</p>
<ul>
<li class=""><strong>Pinniped Supervisor OIDC with PKCE</strong> — the portal federates to any upstream
IdP (Dex, Gitea OAuth2, LDAP, SAML) via the Supervisor FederationDomain.</li>
<li class=""><strong>RFC 8693 token exchange</strong> — the Supervisor id_token is exchanged for a
short-lived audience-scoped token per spoke cluster.</li>
<li class=""><strong>Pinniped Concierge mTLS certs</strong> — <code>TokenCredentialRequest</code> issues 15-minute
client certificates; the portal caches them to avoid redundant requests.</li>
<li class=""><strong>Cluster registry</strong> — clusters are registered via K8s Secrets in production
(<code>wxops.cloud/kind=cluster</code> label) or a local <code>clusters.json</code> for development.</li>
<li class=""><strong>Kubeconfig download</strong> — users can download a ready-to-use kubeconfig that
calls the portal as a Pinniped exec-credential plugin.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-2--service-catalog">Phase 2 — Service Catalog<a href="https://docs.wxops.cloud/release-notes/v0-1-0-release#phase-2--service-catalog" class="hash-link" aria-label="Direct link to Phase 2 — Service Catalog" title="Direct link to Phase 2 — Service Catalog" translate="no">​</a></h3>
<p>Browse every platform service, API, and infrastructure dependency from one place.</p>
<ul>
<li class=""><strong>Backstage-compatible entity parser</strong> — reads <code>catalog-info.yaml</code> files for
kinds: Component, API, System, Group, and Resource.</li>
<li class=""><strong>Gitea source</strong> — catalog entities are fetched from a read-only Gitea
repository (<code>gitops-infra/catalog/</code>). A local filesystem reader is available
for development and testing.</li>
<li class=""><strong>5-minute TTL cache</strong> — double-checked locking prevents thundering-herd
refreshes under load.</li>
<li class=""><strong>System relationship graph</strong> — each System entity renders a Mermaid diagram
showing how its components, APIs, and resources connect.</li>
<li class=""><strong>Entity detail page</strong> — links to runbooks, RFCs, and ADRs are grouped and
surfaced directly on the entity page.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="container">Container<a href="https://docs.wxops.cloud/release-notes/v0-1-0-release#container" class="hash-link" aria-label="Direct link to Container" title="Direct link to Container" translate="no">​</a></h3>
<ul>
<li class=""><strong>Single Docker image</strong> — nginx, Go backend, and Next.js run together under
supervisord. The Kubernetes Ingress is the only external entry point.</li>
<li class=""><strong>Port layout</strong> — nginx on <code>:80</code> (public); Go backend on <code>:8080</code> (internal);
Next.js on <code>:3000</code> (internal).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://docs.wxops.cloud/release-notes/v0-1-0-release#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<table><thead><tr><th>Phase</th><th>Goal</th></tr></thead><tbody><tr><td>3</td><td>Service Graph + Project Scaffold — form → <code>ProjectClaim</code> → ArgoCD → Crossplane</td></tr><tr><td>4</td><td>CLI — <code>wxops</code> binary usable in CI/CD pipelines</td></tr><tr><td>5</td><td>Platform Intelligence — cost attribution, compliance, aggregate health</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://docs.wxops.cloud/release-notes/v0-1-0-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/concepts/architecture">Architecture &amp; auth flow</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/getting-started/environment-variables">Environment variables</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/platform/cluster-registry">Cluster registry</a></li>
<li class=""><a class="" href="https://docs.wxops.cloud/docs/catalog/service-catalog">Service catalog</a></li>
</ul>]]></content>
        <author>
            <name>Xeus Nguyen</name>
            <uri>https://wiki.xeusnguyen.xyz</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Platform Engineering" term="Platform Engineering"/>
    </entry>
</feed>