<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Postbin Ultra changelog</title>
    <link>https://mpjhorner.github.io/PostbinUltra/changelog/</link>
    <description>Releases of Postbin Ultra. Latest: v2.0.0.</description>
    <language>en</language>
    <lastBuildDate>Wed, 29 Apr 2026 13:19:26 GMT</lastBuildDate>
    <item>
      <title>v2.0.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v2.0.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v2.0.0</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<p>Postbin Ultra is now a native desktop app. The web UI and the CLI binary have been removed.</p>
<h3 id="breaking"><a class="anchor" href="#breaking" aria-label="Anchor">#</a>Breaking</h3>
<ul>
<li>The <code>postbin-ultra</code> CLI binary is gone. Install <a href="https://github.com/MPJHorner/PostbinUltra/releases/latest" rel="noopener noreferrer"><code>postbin-ultra-desktop</code></a> (renamed <code>PostbinUltra</code> on disk).</li>
<li>The web UI server and its <code>/api/*</code> JSON / SSE endpoints are removed. Use the desktop app to inspect captures.</li>
<li>The <code>serve_web_ui</code> and <code>ui_port</code> settings fields are dropped from <code>settings.json</code>. Existing files with these keys load cleanly — unknown keys are silently ignored.</li>
<li>The <code>--no-ui</code>, <code>--ui-port</code>, <code>--no-cli</code>, <code>--update</code>, <code>-p</code>, <code>-u</code> CLI flags are gone with the binary. All knobs live in Settings now.</li>
<li>The release artefact name changed from <code>postbin-ultra-&lt;target&gt;.tar.gz</code> to <code>PostbinUltra-&lt;version&gt;-&lt;target&gt;.{dmg,tar.gz,zip}</code>.</li>
</ul>
<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li><strong>Forward + replay history.</strong> Every forwarded request stores the full upstream response (status, headers, body, latency) on the captured request. Replay re-fires through the current forward target and appends a new outcome to the attempt history. The Forwarded tab shows a table of attempts; click any row to inspect that specific outcome.</li>
<li><strong>JSON tree view</strong> with collapsible objects/arrays and <strong>Expand all / Collapse all</strong> controls in the body toolbar.</li>
<li><strong>Method-chip filter row</strong> alongside the text filter — toggle GET / POST / PUT / PATCH / DELETE / OPTIONS / HEAD / OTHER independently.</li>
<li><strong>Bundled fonts</strong>: Inter (UI) + JetBrains Mono (code), so the app looks identical on every platform out of the box.</li>
<li><strong>macOS custom title strip</strong> — solid black, &quot;Postbin Ultra&quot; centred in white, traffic lights on top. Native title text is hidden via <code>with_fullsize_content_view</code>.</li>
<li><strong>Compact list rows</strong> (38 px tall) — method badge, truncated path with ellipsis, right-aligned <code>time-ago</code> over <code>size</code>. Live time-ago refresh while the list is visible.</li>
<li><strong>Sample requests script</strong> — <code>make sample</code> (or <code>./scripts/sample-requests.sh</code>) fires 25 realistic-looking HTTP requests at the running app for visual + manual testing.</li>
<li><strong>Forward pill</strong> in the top bar shows the upstream host with <code>↗</code> accent when on, &quot;off&quot;/&quot;not set&quot; otherwise. Click → opens Settings → Forward. Shift-click → toggles enabled without leaving the main view.</li>
</ul>
<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li>The settings dialog is now tabbed (Capture / Forward / Appearance / Advanced) at a fixed 560 × 460 size. Theme cards are pinned tiles, custom 18 px checkboxes with a heavy border + accent fill + white tick, painted close icon (no font fallback tofu).</li>
<li>The macOS dock label is now <code>PostbinUltra</code>, not <code>postbin-ultra-desktop</code>.</li>
<li>App identifier moved from <code>dev.heyjodie.postbin-ultra</code> to <code>co.uk.matthorner.postbin-ultra</code>.</li>
</ul>
<h3 id="removed"><a class="anchor" href="#removed" aria-label="Anchor">#</a>Removed</h3>
<ul>
<li>The CLI binary (<code>postbin-ultra</code>)</li>
<li>The embedded web UI (<code>crates/postbin-ultra/ui/</code>)</li>
<li>The JSON API (<code>/api/requests</code>, <code>/api/forward</code>, …) and SSE stream (<code>/api/stream</code>)</li>
<li><code>output.rs</code> (terminal printer), <code>entrypoint.rs</code> (CLI runtime), <code>cli.rs</code> (clap config)</li>
<li><code>crates/postbin-ultra</code> <code>[[bin]]</code> target — the crate is now lib-only</li>
</ul>
<h3 id="migration"><a class="anchor" href="#migration" aria-label="Anchor">#</a>Migration</h3>
<ul>
<li>Replace any <code>postbin-ultra ...</code> invocations with launching the desktop app</li>
<li>If you scripted against the JSON API, capture in the desktop app and use the <strong>Log file</strong> setting to get NDJSON output instead</li>
<li>Old <code>settings.json</code> files still load — the dropped fields are silently ignored</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v1.1.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v1.1.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v1.1.0</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li>A native macOS desktop app, <code>PostbinUltra.app</code>. The <code>.app</code> bundle and <code>.dmg</code> ship alongside the existing CLI binaries on every release. Drag it into Applications, double-click to launch. The capture server still runs on port <code>9000</code> so existing webhook clients keep working unchanged.</li>
<li>A native rendering pipeline built on egui. The desktop window renders captures, headers, query, raw HTTP, and a Body tab with <code>Auto</code>, <code>Pretty</code>, <code>Raw</code>, and <code>Hex</code> formatters. Nothing is served over HTTP; nothing in JavaScript; the live UI is pure Rust with sub-100ms startup and a ~10 MB binary.</li>
<li>An in-app Settings panel that covers every CLI flag: capture port, bind address, buffer size, max body size, forward URL and timeout, forward TLS skip, log file path, theme (System / Dark / Light), and update-check toggle. Settings persist to <code>~/Library/Application Support/PostbinUltra/settings.json</code> (and the equivalent on Linux / Windows).</li>
<li>Live capture port reconfiguration. Change the port in Settings and the listener rebinds immediately, no app restart.</li>
<li>Keyboard shortcuts in the desktop app: <code>j</code> / <code>k</code> next / previous request, <code>g</code> newest, <code>1</code>-<code>4</code> switch tabs, <code>p</code> pause, <code>Shift+X</code> clear, <code>t</code> cycle theme, <code>,</code> open Settings.</li>
</ul>
<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li>The repository is now a Cargo workspace. The CLI lives at <code>crates/postbin-ultra/</code>, the desktop app at <code>crates/postbin-ultra-desktop/</code>, and the icon generator at <code>tools/icon-gen/</code>. The CLI behavior is unchanged.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v1.0.2</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v1.0.2</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v1.0.2</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li>Locked in the mobile UX with integration tests covering the hamburger menu, the master/detail navigation, the phone-only CSS breakpoint, and the desktop guard rails. The behavior is unchanged from 1.0.1; this release only ensures it can&#39;t silently regress.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v1.0.1</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v1.0.1</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v1.0.1</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li>The mobile top bar now collapses to a single menu button (<code>≡</code>) that opens a full-screen sheet containing Forward, Pause / Resume, Toggle theme, Keyboard shortcuts, and Clear all captures. Each item shows the live state (proxy URL, paused / streaming, dark / light) so a glance is enough. Tap the close button or the dim backdrop to dismiss. Desktop is unchanged.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v1.0.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v1.0.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v1.0.0</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li>A first-class mobile experience. The web UI now uses a master/detail layout on phones: tap a captured request to slide its detail in, tap Back (or <code>Esc</code>) to return to the list. Tabs scroll horizontally, dialogs go near-full-width, and form inputs use 16px text so iOS Safari does not auto-zoom on focus.</li>
<li>Safe-area inset handling for iPhone notches and home indicators, plus a <code>theme-color</code> meta so the system status bar matches the active theme.</li>
</ul>
<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li>The desktop layout is unchanged. All mobile work is gated behind viewport breakpoints; existing keyboard shortcuts, the two-pane desktop layout, and every API surface remain identical.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.6.1</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.6.1</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.6.1</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li>When proxy mode is on, the Replay tab&#39;s URL field is prefilled with the upstream that proxy is currently pointing at (path and query joined the same way the proxy does), so a one-click replay sends the captured request straight to the same backend. Edit the URL to send anywhere else.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.6.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.6.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.6.0</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li>A &quot;Forward&quot; chip in the top bar shows the current proxy upstream and opens a small dialog to enable, edit, or disable proxy mode at runtime — no restart needed.</li>
<li><code>--log-file PATH</code> appends every captured request to a file as one JSON object per line (NDJSON). Useful when pairing with <code>--forward</code> so an AI assistant or other tool can follow the live traffic.</li>
<li>HTTP API: <code>GET</code>, <code>PUT</code>, and <code>DELETE</code> on <code>/api/forward</code> for managing proxy mode programmatically.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.5.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.5.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.5.0</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li><code>--forward URL</code> turns Postbin Ultra into a transparent proxy. Each captured request is relayed to the upstream URL with method, path, query, headers, and body intact, and the upstream&#39;s response is returned to the original caller.</li>
<li><code>--forward-timeout</code> (default 30 seconds) and <code>--forward-insecure</code> (skip TLS verification, dev only).</li>
<li>Hop-by-hop headers are stripped, <code>X-Forwarded-{For,Host,Proto}</code> are added, and truncated bodies are refused with a clear 502 instead of being silently corrupted.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.4.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.4.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.4.0</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li>A &quot;Shortcuts&quot; button in the top bar opens the keyboard help dialog.</li>
<li>Bottom-right &quot;Copy&quot; buttons on the Body, Headers, and Query panes (JSON is copied pretty-printed).</li>
</ul>
<h3 id="changed"><a class="anchor" href="#changed" aria-label="Anchor">#</a>Changed</h3>
<ul>
<li><code>Clear all</code> now uses <code>Shift + X</code> instead of bare <code>c</code>, so <code>Cmd/Ctrl + C</code> always copies text.</li>
<li>Modifier keys (<code>Cmd</code>, <code>Ctrl</code>, <code>Alt</code>) are never intercepted by any shortcut.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.3.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.3.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.3.0</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li>A small toolbar above the JSON body view with &quot;Collapse all&quot; and &quot;Expand all&quot; controls. Per-node toggles still work; the default stays fully expanded.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.2.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.2.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.2.0</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<h3 id="added"><a class="anchor" href="#added" aria-label="Anchor">#</a>Added</h3>
<ul>
<li><code>--update</code> downloads the latest release from GitHub and replaces the running binary in place.</li>
<li>A silent startup check warns when a newer release is available. Offline machines or any other failure path stay silent.</li>
<li><code>--no-update-check</code> opts out of the startup check.</li>
</ul>
]]></description>
    </item>
    <item>
      <title>v0.1.0</title>
      <link>https://mpjhorner.github.io/PostbinUltra/changelog/#v0.1.0</link>
      <guid isPermaLink="true">https://mpjhorner.github.io/PostbinUltra/changelog/#v0.1.0</guid>
      <pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[<p>Initial release. Capture every HTTP request on a local port, view it in the terminal and a live web UI, replay from the browser.</p>
]]></description>
    </item>
  </channel>
</rss>
