<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>LogStitch Changelog</title>
    <link>https://logstitch.app/changelog/</link>
    <atom:link href="https://logstitch.app/changelog.xml" rel="self" type="application/rss+xml" />
    <description>Release notes for LogStitch, the native macOS app for reading AWS Lambda invocations from CloudWatch.</description>
    <language>en-us</language>
    <lastBuildDate>Thu, 27 Aug 2026 12:00:00 +0000</lastBuildDate>
    <generator>LogStitch website</generator>
    <image>
      <url>https://logstitch.app/assets/LogStitch-icon.png</url>
      <title>LogStitch Changelog</title>
      <link>https://logstitch.app/changelog/</link>
    </image>

    <item>
      <title>LogStitch v1.4.1 — Jira and GitHub connection fix, project-aware Create Issue, p99 memory line</title>
      <link>https://logstitch.app/changelog/#v1-4-1</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-4-1</guid>
      <pubDate>Thu, 27 Aug 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>A crash fix for <strong>Jira and GitHub</strong> connections, a <strong>Create Issue</strong> form that asks Jira what the project actually accepts, and a <strong>Memory Analysis</strong> chart you can read at a glance.</p>

        <h3>Jira &amp; GitHub</h3>
        <ul>
          <li>Connecting a Jira or GitHub account <strong>crashed LogStitch</strong> instead of opening the browser — the OAuth client IDs stopped reaching the build in v1.3.3 and never came back. Fixed, and a missing client ID now surfaces as a readable message rather than taking the app down.</li>
          <li>The <strong>Create Issue</strong> form is now driven by the project's own create metadata: issue types come from the selected project instead of a global list, priority options come from the project's scheme instead of five hardcoded values, and the priority and labels pickers are hidden entirely for projects that don't have those fields. A required field the form can't fill is called out <em>before</em> you write the issue.</li>
          <li>Rejections now say what happened — <code>Jira authentication failed: Unexpected response (400)</code> has been replaced by the API's own explanation, and a rejected request no longer burns a token refresh retrying something guaranteed to fail.</li>
        </ul>

        <h3>Memory Analysis</h3>
        <ul>
          <li>The utilization chart gains a <strong>p99 memory line</strong> alongside p50 and p95, so the worst case is a shape you can see rather than a number in the table below.</li>
          <li>The chart now grows to fill the tab instead of sitting at a fixed height above dead space, config-change and right-size labels stay inside the plot instead of being clipped at the edges, and the shading was reworked so every legend swatch maps to exactly one thing on the plot.</li>
          <li>The hover tooltip no longer loses its date header to the top edge, and the staleness chip no longer reports <strong>No local data</strong> for a function that is fully synced.</li>
        </ul>

        <h3>Window &amp; layout</h3>
        <ul>
          <li>The main window <strong>stops resizing itself</strong> when you open or close a profile — one size, restored at launch, changed only when you drag it.</li>
          <li>The <strong>compact/expanded</strong> choice for the function and invocation lists is remembered across launches and stays in step across open profile tabs, instead of resetting to compact every time.</li>
        </ul>

        <h3>Reliability</h3>
        <ul>
          <li>The <strong>configuration-change badge</strong> kept its flag but lost its before/after values on the next routine sync, so the popover could only say the values were unavailable. Memory, timeout and runtime changes now hold onto what they changed <em>from</em>, and a migration clears the badges that can no longer show a diff.</li>
          <li>The <strong>storage capacity banner</strong> now clears the moment you resolve it — raising the size limit in Settings, purging, or compacting — instead of staying on screen until the next relaunch.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-4-1">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.4 — Hidden functions, MCP setup for any client, instant JSON search</title>
      <link>https://logstitch.app/changelog/#v1-4</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-4</guid>
      <pubDate>Fri, 21 Aug 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p><strong>Hidden functions</strong> quiet down large accounts, the MCP settings pane now sets up any of ten clients, and a database pass takes JSON field search from roughly 47 seconds to under a tenth of a second.</p>

        <h3>Hidden functions</h3>
        <ul>
          <li><strong>Hide</strong> any Lambda from the Function Navigator's context menu, or <strong>Hide these N</strong> straight from a filtered search, so a 60-function account can read like a 6-function one. Hiding is a view preference rather than a state change — hidden functions keep syncing, keep ingesting, and keep counting toward every analytics and cost rollup.</li>
          <li>Reveal them inline from the header's <strong>N of M functions</strong> pill, or bulk-unhide from the <strong>Manage Hidden</strong> sheet, which flags any hidden function that is still syncing so it can't burn API calls unnoticed.</li>
          <li>Every hide is undoable from a toast that also restores pins to their original order, and global search keeps returning hidden functions with a badge — so a search never comes up empty for a function you know exists.</li>
        </ul>

        <h3>MCP setup for any client</h3>
        <ul>
          <li>The settings tab is now <strong>MCP Server</strong>, with a client picker covering Claude Code, Claude Desktop, Cursor, VS Code, Codex CLI, Zed, LM Studio, Windsurf and more — each with its own setup steps, a copyable config snippet, and <strong>Reveal in Finder</strong> wherever the config path actually resolves.</li>
          <li><strong>Test Connection</strong> puts a real <code>tools/list</code> through to the server and reports refused, timed out, and unexpected responses separately, so a failed setup tells you what failed.</li>
          <li>Changing <strong>Server Port</strong> now updates the endpoint row and every snippet as you type, instead of quietly keeping the old port until you pressed Return.</li>
        </ul>

        <h3>Profiles</h3>
        <ul>
          <li><strong>Scan for New Profiles…</strong> now sits in the Profiles menu and the <strong>+</strong> toolbar menu, replacing an unlabelled toolbar button that read as a generic refresh — and results list only what is genuinely new or changed, with a real empty state when there is nothing to import.</li>
        </ul>

        <h3>Performance</h3>
        <ul>
          <li>Searching a JSON field for a specific value — a request id, an order id — dropped from roughly <strong>47 seconds to under a tenth of a second</strong> on a large database.</li>
          <li>LogStitch no longer animates while it is minimized or sitting behind another window, which had been quietly burning CPU in the background.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-4">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.3.4 — Request flow map, keyboard navigation</title>
      <link>https://logstitch.app/changelog/#v1-3-4</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-3-4</guid>
      <pubDate>Tue, 28 Jul 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>The <strong>Correlated Request Detail</strong> view is rebuilt around a <strong>flow map</strong> of the whole request, and the invocation list now navigates from the keyboard.</p>

        <h3>The stitched request view</h3>
        <ul>
          <li>Follow a request across every function it touched on a <strong>flow map</strong> — each hop shows duration with its cold-start share, retries, cost, and peak memory, under a plain-English verdict naming where it broke. Functions that were expected to run but never did appear as <strong>ghost hops</strong>, and inferred orderings are drawn dashed so they're never mistaken for proven causality.</li>
          <li>The view now presents <strong>full-bleed</strong> over the invocation list and detail pane instead of in a fixed 800×600 dialog, so the flow map, stream, and line reader all get real width.</li>
          <li>Click any line to open it in the <strong>inspector</strong>, pivot the whole chain on a JSON field from its context menu, or copy a <strong>Markdown summary</strong> or the visible log lines to the clipboard — the copied report names every active filter, so its scope is never overstated.</li>
        </ul>

        <h3>Keyboard navigation</h3>
        <ul>
          <li>Move through invocations with the <strong>up and down arrow keys</strong> — each one loads as you land on it, no Return needed. Click a row or tab to the list to hand it focus; the arrows keep driving the function navigator otherwise.</li>
        </ul>

        <h3>Reliability</h3>
        <ul>
          <li>Chain filters on indexed fields no longer empty the stream, and a report generated with a function filter applied now gives the request's real start time rather than the first visible hop's.</li>
          <li>Reopening a chain after switching invocations no longer re-presents the previous request.</li>
          <li>Log lines can no longer collide on identity — which could drop a row from the stream or scroll to the wrong one.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-3-4">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.3.3 — Direct download, one-time license, automatic updates</title>
      <link>https://logstitch.app/changelog/#v1-3-3</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-3-3</guid>
      <pubDate>Sat, 27 Jun 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>LogStitch is now available as a <strong>direct download</strong> outside the Mac App Store — a 14-day free trial that keeps working offline, a one-time perpetual license, and built-in automatic updates.</p>

        <h3>Direct download</h3>
        <ul>
          <li>Download LogStitch directly from <strong>logstitch.app</strong> with a <strong>14-day free trial</strong> that keeps working offline after the first launch — no Mac App Store required.</li>
        </ul>

        <h3>One-time license</h3>
        <ul>
          <li>Unlock with a one-time license — <strong>Personal ($49)</strong> covers up to 3 Macs, <strong>Commercial ($99)</strong> up to 5. Activate by pasting your key or clicking the link in your purchase email, and use <strong>Deactivate This Mac</strong> to free a seat when you move to a new machine.</li>
        </ul>

        <h3>Automatic updates</h3>
        <ul>
          <li>The direct build keeps itself current — new releases install automatically, with a <strong>Check for Updates…</strong> menu item to check on demand.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-3-3">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.3.2 — Sharper pattern detection across JSON loggers and profiles</title>
      <link>https://logstitch.app/changelog/#v1-3-2</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-3-2</guid>
      <pubDate>Wed, 24 Jun 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>Sharper pattern detection — stack traces from JSON-logging functions are now recognized, and pattern sets stay consistent for Lambdas that appear under more than one AWS profile.</p>

        <h3>Pattern detection</h3>
        <ul>
          <li>Functions whose structured loggers emit the stack as a <strong>JSON array</strong> now have their stack traces extracted and grouped, instead of being reported as &quot;no stack trace&quot; despite carrying a valid trace.</li>
          <li>Running pattern detection on a Lambda that exists under <strong>multiple AWS profiles</strong> now resolves to one consistent function record, so you no longer see duplicate pattern sets split across profiles.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-3-2">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.3.1 — Caught vs. uncaught errors, stateless MCP transport</title>
      <link>https://logstitch.app/changelog/#v1-3-1</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-3-1</guid>
      <pubDate>Wed, 17 Jun 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>LogStitch now tells the difference between errors that <strong>crashed</strong> your function and errors it <strong>handled and logged</strong> — surfaced across the function list, Overview, and details — plus a more reliable MCP connection that no longer stalls on long syncs, and a round of fixes.</p>

        <h3>Errors you can trust</h3>
        <ul>
          <li>The function list, <strong>Overview</strong>, and function details now split a function's errors into <strong>uncaught</strong> failures (the function crashed) and <strong>caught</strong> application errors (handled and logged). CloudWatch only ever reported the uncaught ones, so a function whose errors were all handled used to show a clean health dot while hundreds of real errors sat invisible — the health dot now keys on the uncaught rate, so &quot;noisy but working&quot; reads yellow and &quot;actually down&quot; reads red.</li>
          <li>A new <strong>Error Class</strong> filter (<strong>Uncaught</strong> / <strong>Caught</strong> / <strong>Unclassified</strong>) narrows the invocation list to exactly the kind of error you're chasing, and the selection is remembered in saved filter presets.</li>
          <li>Throttled invocations now appear as their own amber chip on each function row, separate from the error badge — infrastructure rejections are no longer mistaken for application errors.</li>
        </ul>

        <h3>MCP</h3>
        <ul>
          <li>The MCP server moved to the stateless Streamable HTTP transport, so long-running <code>sync_function</code> calls no longer stall when the connection goes idle mid-fetch — results return on the same connection with keep-alive heartbeats while the work runs. Existing <code>type: sse</code> configs must re-copy the connection snippet as <code>type: http</code>.</li>
          <li><code>get_function_stats</code> and <code>get_errors</code> now expose the same caught vs. uncaught breakdown, so Claude can reason about whether a function is failing or just chatty.</li>
        </ul>

        <h3>Reliability</h3>
        <ul>
          <li>The error-level log filter no longer shows an empty list on the first click.</li>
          <li>Per-row tooltips are back.</li>
          <li>Operational-status filters now apply correctly.</li>
          <li>The <strong>Functions</strong> sidebar section now stays visible.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-3-1">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.3 — Live metrics from CloudWatch, staleness chips, MCP freshness</title>
      <link>https://logstitch.app/changelog/#v1-3</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-3</guid>
      <pubDate>Mon, 15 Jun 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>CloudWatch is now the live source for the numbers you see first — the <strong>Overview</strong> cards and function-list counts paint within ~500ms instead of waiting on local ingestion — plus staleness chips that tell you when local data has fallen behind, and freshness metadata on the MCP tools.</p>

        <h3>Live metrics from CloudWatch</h3>
        <ul>
          <li>The <strong>Overview</strong> tab now paints from CloudWatch within ~500ms instead of waiting for the local invocation table to fill — Duration Trend, Error Rate, Projected Cost, Invocation Volume, and Cold Starts all draw from CloudWatch first, with local data filling in only what CloudWatch can't derive.</li>
          <li>Function-list rows now show live invocation counts, error counts, and a health dot from CloudWatch over the last <strong>7 days</strong>, replacing the all-time local aggregates that went stale the moment background sync paused — the <strong>most errors</strong> and <strong>most data</strong> sort orders use the live numbers too.</li>
        </ul>

        <h3>Know when your data is stale</h3>
        <ul>
          <li>A staleness chip now appears on the <strong>Overview</strong> tab and every drilldown — <strong>Duration</strong>, <strong>Cold Starts</strong>, <strong>Memory</strong>, <strong>Cost</strong>, <strong>Error Rate</strong>, and <strong>Invocation Volume</strong> — whenever the local data behind a card lags the window you're viewing; tap it to sync the last 7 days and it clears itself when the fetch finishes.</li>
          <li>Selecting a function from the list now auto-syncs it when its data is stale, so the cards have usually caught up by the time you land on the <strong>Overview</strong> tab — a per-function cooldown keeps rapid clicks from burning CloudWatch quota.</li>
        </ul>

        <h3>MCP</h3>
        <ul>
          <li><code>list_functions</code> now reports live 7-day invocation and error counts plus health from CloudWatch, merged with your local data, and tags each function with its <code>data_source</code> (<code>cloudwatch_live</code>, <code>local_sqlite</code>, or <code>hybrid</code>) — pass <code>skip_live</code> to bypass the AWS call.</li>
          <li><code>list_functions</code> and <code>get_function_stats</code> now include freshness metadata — how much local history actually backs the numbers — so Claude can reason about how complete an answer is.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-3">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.2 — Syncs that survive navigation, background-sync reliability</title>
      <link>https://logstitch.app/changelog/#v1-2</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-2</guid>
      <pubDate>Tue, 09 Jun 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>Syncs that survive navigation — on-demand fetches now run independently of the screen that started them and stream new invocations into the list live — plus a cluster of background-sync reliability fixes.</p>

        <h3>Syncs that survive navigation</h3>
        <ul>
          <li>On-demand log syncs now run independently of the screen that started them — navigate away from the <strong>Invocations</strong> tab or switch to another function and the fetch keeps running, then picks up exactly where it left off when you come back.</li>
          <li>Newly synced invocations appear in the list as each page lands — whether from an on-demand or background sync — without resetting your scroll position or dropping the invocation you had selected; counts and sparklines tick up live.</li>
          <li>Cancelling a sync now keeps every page already fetched instead of discarding the whole run, so the next sync resumes from where you stopped rather than re-fetching from scratch.</li>
        </ul>

        <h3>Reliability</h3>
        <ul>
          <li>Background and on-demand syncs no longer fetch the same function at the same time — background defers to an in-flight on-demand sync and resumes on a later cycle.</li>
          <li>Fixed background sync silently stalling on actively-running functions — showing &quot;0 events&quot; cycle after cycle — when AWS's reported stream timestamps lagged behind freshly ingested events.</li>
          <li>Background sync now honors your configured interval after a catch-up finishes, instead of immediately re-firing a redundant cycle.</li>
          <li>A sync that fails mid-flight (e.g. a dropped connection) now clears its spinner and surfaces the error, instead of spinning forever and blocking every later sync with &quot;already in progress.&quot;</li>
        </ul>

        <h3>MCP</h3>
        <ul>
          <li>The <strong>Claude Integration</strong> settings now list every available MCP tool, so you can see what Claude Code can do before enabling the local server.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-2">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.1 — Async retries, smarter correlation, faster drill-downs</title>
      <link>https://logstitch.app/changelog/#v1-1</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-1</guid>
      <pubDate>Fri, 05 Jun 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>Async-retry awareness, smarter correlation, and faster drill-downs from charts into the invocations that drive them.</p>

        <h3>Async retries are now first-class</h3>
        <ul>
          <li>Lambda async invocations (EventBridge, SNS, S3, etc.) retry failed attempts and reuse the same request ID — previously each retry quietly overwrote the earlier one and its logs, so a failure followed by a successful retry looked like a plain success.</li>
          <li>Every attempt is now persisted as a distinct invocation, with its own status, duration, and full log lines.</li>
          <li>A compact retry marker on every multi-attempt invocation in the list, mirroring the cold-start indicator.</li>
          <li>Click the <strong>Attempt N/M</strong> badge in the detail view to jump between sibling attempts, with status and duration shown per attempt.</li>
          <li>MCP <code>get_invocation_logs</code> returns every attempt's logs, with cumulative size budgeting so high-retry requests never blow the response.</li>
        </ul>

        <h3>Smarter correlation across profiles</h3>
        <ul>
          <li>The same execution synced under two LogStitch profiles no longer appears &quot;correlated&quot; with a duplicate of itself — correlated views collapse rows by logical identity (function, region, request ID, timestamp).</li>
          <li>Two new filters in the Invocations popover: <strong>Correlation</strong> (All / Correlated / Standalone) and <strong>Attempts</strong> (All / Multiple / Single).</li>
          <li>The correlated-invocations popover now anchors correctly to its button and no longer clips the &quot;View in Timeline&quot; action.</li>
        </ul>

        <h3>Faster drill-downs from charts</h3>
        <ul>
          <li><strong>View Invocations</strong> shortcut on the Error Rate and Cold Starts cards (and their full-size views) opens the Invocations list pre-filtered to exactly the rows the chart represents, in the same time window.</li>
          <li>Opening a larger graph from an <strong>Overview</strong> card carries the Overview tab's selected window with it, instead of resetting to each report's default.</li>
          <li>Opening a report from the <strong>Invocations</strong> tab's Analytics Reports popover scopes it to the time range you're already looking at.</li>
        </ul>

        <h3>Reliability</h3>
        <ul>
          <li>Patterns tab no longer falsely marks every pattern as Resolved after a large sync backlog — the incremental refresh now drains the full backlog before classifying lifecycle.</li>
          <li>Inline guidance on the SSO profile screens explaining the IPv4-only access portal URL vs. the Dual-stack URL, so the first sign-in doesn't fail on a confusing OIDC error.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-1">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

    <item>
      <title>LogStitch v1.0 — Initial release</title>
      <link>https://logstitch.app/changelog/#v1-0</link>
      <guid isPermaLink="true">https://logstitch.app/changelog/#v1-0</guid>
      <pubDate>Fri, 01 May 2026 12:00:00 +0000</pubDate>
      <description><![CDATA[
        <p>The first public release of <strong>LogStitch</strong> — a native macOS app that reads CloudWatch logs, groups them into AWS Lambda invocations by request ID, and runs entirely on your machine.</p>

        <h3>Stitching engine</h3>
        <ul>
          <li>Groups CloudWatch log lines into AWS Lambda invocations by request ID.</li>
          <li>Cold-start detection, init duration, and billed duration surfaced inline on every invocation.</li>
          <li>Auto-parses JSON log lines into a navigable, collapsible tree.</li>
        </ul>

        <h3>Cross-account &amp; cross-region</h3>
        <ul>
          <li>Unlimited AWS profiles via the standard <code>~/.aws/config</code>, including SSO and IAM role assumption.</li>
          <li>Correlates a single request across functions, accounts, and regions.</li>
          <li>No additional CloudWatch cross-account observability setup required.</li>
        </ul>

        <h3>Pattern &amp; anomaly detection</h3>
        <ul>
          <li>Auto-clusters similar error messages into named patterns.</li>
          <li>Tracks pattern frequency, first-seen, last-seen, and runtime impact.</li>
          <li>Z-score anomaly scoring on duration, error rate, cold-start rate, and projected cost.</li>
        </ul>

        <h3>Cost &amp; performance analytics</h3>
        <ul>
          <li>Per-function memory, duration p50/p95/p99, error rate, and cost trends.</li>
          <li>Cost projection and memory-tuning suggestions.</li>
          <li>24h, 7d, and 30d windows — re-query for free after the initial fetch.</li>
        </ul>

        <h3>MCP server for Claude &amp; AI tools</h3>
        <ul>
          <li>Local Model Context Protocol server bound to <code>127.0.0.1</code> only (configurable port, default <code>47821</code>) — never exposed to the network.</li>
          <li>Works with Claude Code and any MCP-aware client that can reach a local server. Claude Desktop is not supported because its custom connectors route through Anthropic's servers.</li>
          <li>20+ tools including <code>search_logs</code>, <code>get_invocation_logs</code>, <code>get_patterns_summary</code>, <code>get_cost_projection</code>, <code>get_correlated_invocations</code>, and <code>run_pattern_detection</code>.</li>
          <li>Your AWS credentials never leave the macOS Keychain.</li>
        </ul>

        <h3>Issue-tracker integrations</h3>
        <ul>
          <li>Link error patterns to Jira issues and GitHub issues/PRs.</li>
          <li>OAuth handled by auth.logstitch.app so no client secrets ship inside the app binary.</li>
        </ul>

        <h3>Local-first privacy</h3>
        <ul>
          <li>All logs cached in a local SQLite database on your machine.</li>
          <li>No LogStitch cloud, no telemetry, no account required.</li>
          <li>Works offline after the initial fetch.</li>
        </ul>

        <h3>Platform</h3>
        <ul>
          <li>Native macOS app built on AppKit.</li>
          <li>Universal binary — runs on Intel and Apple Silicon Macs. macOS 26.1 or later.</li>
          <li>Distributed via the Mac App Store.</li>
          <li>Free 14-day trial. $49 Personal for personal projects, $99 Business for commercial use at work. One-time purchase.</li>
        </ul>

        <p><a href="https://logstitch.app/changelog/#v1-0">Read on logstitch.app →</a></p>
      ]]></description>
    </item>

  </channel>
</rss>
