<?xml version="1.0" encoding="utf-8"?>
<!--
  appcast.xml — what Sparkle reads when someone presses "Check for Updates".

  ⚠️ HAND-EDITED, by a person, in this repo. `scripts/release.sh` in the app
  repo PRINTS a ready-made <item> at the end of every release and never writes
  this file, on purpose: this is the file that decides what gets installed on
  other people's Macs, and a script that edits it as a side effect of a build
  can hand a wrong build to everyone while nobody is reading the output.

  IT IS THE SECOND OF TWO EDITS. `updates.json` is the first — it is what the
  Home band reads to ANNOUNCE a release. This is what Sparkle reads to INSTALL
  one. They must move in the same push. If updates.json advertises build 14 and
  this file still says 13, every copy of Grapha shows "0.1.9 is out", the user
  presses Update, and Sparkle answers "You're up to date." The app contradicts
  itself and the release is unreachable.

  Two attributes are easy to swap and impossible to notice:

    sparkle:version              the BUILD NUMBER (CFBundleVersion, e.g. 13).
                                 Sparkle compares this against the running app's
                                 build number. This is the one that decides
                                 whether an update exists.
    sparkle:shortVersionString   the marketing version (e.g. 0.1.8). Shown to
                                 the user. Compared against nothing.

  Put "0.1.9" in sparkle:version and it is compared against "14"; the update is
  simply never offered, and nothing anywhere reports a problem.

  The enclosure's sparkle:edSignature is taken over the exact .dmg that was
  uploaded to the GitHub release. Sparkle verifies the bytes it downloads
  against it, using the public key baked into Grapha-Info.plist
  (SUPublicEDKey = Oc3YkDtBWoq4ACJglFMCu+KEFPXCSp//uRvLf7I8D/w=). Sign a
  different copy of the file and every client rejects the update.

  An appcast with no <item> is valid and simply means "no update available".
-->
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
  <channel>
    <title>Grapha</title>
    <link>https://grapha.ai/appcast.xml</link>
    <description>Updates for Grapha, a native macOS notes app.</description>
    <language>en</language>

    <item>
      <title>Grapha 0.1.14</title>
      <pubDate>Fri, 21 Aug 2026 21:36:48 -0400</pubDate>
      <sparkle:version>19</sparkle:version>
      <sparkle:shortVersionString>0.1.14</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        When an agent edits two paragraphs or bullets next to each other, the review now marks just the words that changed, instead of striking both whole and reprinting them almost identically underneath.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.14/Grapha-0.1.14.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="nkYOOO7jMgP/Rzja87dzZf+sHfEr0SM9LeugHvKOEnaWvkdmVDQZpFT7kuWAcQV/hKriH5UqITzYTK8EzeB+Cw==" length="33457916" />
    </item>

    <item>
      <title>Grapha 0.1.13</title>
      <pubDate>Mon, 17 Aug 2026 08:17:15 -0700</pubDate>
      <sparkle:version>18</sparkle:version>
      <sparkle:shortVersionString>0.1.13</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        A quieter corner on diagrams and HTML blocks: the button that opens
        them full screen is now just its icon, and hovering it still tells you
        what it does.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.13/Grapha-0.1.13.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="+xCZIrHH53YiwivIQlK4C7fTEKUrs0v7y+c+CnME1NOGFIiztXp9q09Xe2EQEdmbsPjvGLM1joN+nHAX/JryAw==" length="33457571" />
    </item>

    <item>
      <title>Grapha 0.1.12</title>
      <pubDate>Sun, 16 Aug 2026 20:25:46 -0700</pubDate>
      <sparkle:version>17</sparkle:version>
      <sparkle:shortVersionString>0.1.12</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        Diagrams open full screen now &#8212; hover one and press Open to zoom
        and pan it &#8212; pasted diagrams draw straight away, the bottom bar
        counts your words, and an agent no longer misses a comment you add
        while it is already working.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.12/Grapha-0.1.12.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="rJLt8rdbn1e8GNRT05PXO+u47kp8QiOx7rsYk6GQwW0HZBXEw2st8WbmS7gRoVFZeBEmflnBzzcdF5GrXs6WCw==" length="33457662" />
    </item>
    <item>
      <title>Grapha 0.1.11</title>
      <pubDate>Fri, 14 Aug 2026 13:34:01 -0400</pubDate>
      <sparkle:version>16</sparkle:version>
      <sparkle:shortVersionString>0.1.11</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        The swoosh when a note is deleted is back no matter which interaction
        sound you use, and the bottom bar's labels no longer select like text.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.11/Grapha-0.1.11.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="BBsvtuB+76Ds9Zs/K7BGfoeLNNM+Nn1hGR8uo/SZgEPPw+IeDBSqXg5Z3C5nTZnc0gZlYfoekwttAW+OG9lJDA==" length="33449663" />
    </item>

    <!--
      0.1.10 (build 15) — the first release that reaches anyone already on
      0.1.9 as an in-place update rather than a drag to Applications.

      It shipped on 2026-08-12 and this entry was added on 2026-08-14, two days
      late: the release was published and neither feed was moved, so for two
      days updates.json still announced 0.1.6 and this file still offered 14.
      Nothing contradicted itself, because the two were stale in the same
      direction — the quiet failure of the three listed at the top of this file,
      not the loud one. The signature below is over the published asset (sha256
      0b612bc3b9ba4286836c8e43d664a3e3a6523da576431dde637dfda0733ba26f),
      downloaded from the release rather than rebuilt, signed here, and verified
      against the SUPublicEDKey in Grapha-Info.plist before being pasted in.
    -->
    <item>
      <title>Grapha 0.1.10</title>
      <pubDate>Tue, 11 Aug 2026 22:13:11 -0400</pubDate>
      <sparkle:version>15</sparkle:version>
      <sparkle:shortVersionString>0.1.10</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        The glow around a working agent is much quieter, coming back to Grapha
        from another app no longer scrolls the page under you, and the bottom
        bar stays on top where it belongs. A web address you type gets https on
        its own.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.10/Grapha-0.1.10.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="mXLrHU/7yBOOa8YwlbpZwtH3mY3geoLX3cx0I1u21lkguUTsrDrE5ZyW8ZJMAlLueNqwEWgMTOww3Sey0cMmBg==" length="33425679" />
    </item>

    <!--
      0.1.9 (build 14) — the FIRST release Sparkle can actually install, and
      also the last one nobody can install this way. Every copy in anyone's
      hands today is 0.1.8 or earlier and has no updater in it at all, so this
      release still reaches people as a manual drag to Applications. From 0.1.9
      onwards, pressing Update installs in place.
    -->
    <item>
      <title>Grapha 0.1.9</title>
      <pubDate>Sun, 09 Aug 2026 23:27:12 -0400</pubDate>
      <sparkle:version>14</sparkle:version>
      <sparkle:shortVersionString>0.1.9</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        Grapha updates itself from now on — press Update and the new version
        installs in place, no dragging to Applications. You can also pick which
        model each coding agent uses, choose the font and size new notes start
        at, and the animation between Home and a doc is smooth again.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.9/Grapha-0.1.9.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="h2iCv3UBQ9Uoy2/6w2yM4LGD4Zw75W6yXrfE/JJ0eLtBZAY+l3klqv2ngCNIQ0pu0MZ7s6c4VuoekFphe6XgCg==" length="33424098" />
    </item>

    <!--
      0.1.8 (build 13) is listed for completeness, and it is INERT.

      It shipped on 2026-08-08, before Sparkle was added to the app, so no copy
      of Grapha in anyone's hands can read this file yet — every installed 0.1.8
      has no updater in it at all, and will keep getting its news from
      updates.json and the download page. The first release Sparkle can actually
      install is the NEXT one.

      It is listed anyway because it is true: this is the current release, and
      the signature below is over the published bytes
      (sha256 d6149a96d889dbe234539e5526c928a8be6a7338aca4e34f9f48f1651e0d2fb5),
      verified byte-identical to the asset GitHub is serving before it was
      signed. A feed that says "the newest Grapha is 0.1.8, build 13" is the
      honest state of the world; an empty one would have been honest too, and
      this one additionally lets release-live.sh prove the file is being served
      before the first release that depends on it.
    -->
    <item>
      <title>Grapha 0.1.8</title>
      <pubDate>Sat, 08 Aug 2026 20:31:02 -0400</pubDate>
      <sparkle:version>13</sparkle:version>
      <sparkle:shortVersionString>0.1.8</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>15.0</sparkle:minimumSystemVersion>
      <description><![CDATA[
        A chart waits for real data now instead of drawing made-up numbers, and
        it tells you on itself when an agent is working on it. Code blocks have
        a copy button, and pressing Enter in Find jumps to the match.
      ]]></description>
      <enclosure url="https://github.com/princeharshan/grapha-site/releases/download/v0.1.8/Grapha-0.1.8.dmg"
                 type="application/octet-stream"
                 sparkle:edSignature="QsigA5dSf5TR5Fgp8103orNB/z5KiJx4jRaCrUsi0KaB/LHSo00iQlXJg+MlDD4wSQfQDD1phk+4z/qGBqheDQ==" length="32390813" />
    </item>
  </channel>
</rss>
