Android 0.32: cards, games, events, Today, the small-web directory and hello links #186

Closed
paulhitt wants to merge 0 commits from release/android-0-32 into main
paulhitt commented 2026-10-05 09:46:10 +00:00 (Migrated from gitlab.com)

What 0.32 adds

The same six features as iOS 0.32.0, byte for byte on the wire (SPEC §6.31 to §6.35 and §8.12 in flamenet-e2e, docs/spec-0-32). Everything between people travels as an ordinary sealed message; the Today file is one public file from the home relay.

  1. Stickers and cards in FlameNet's art: every shipped sticker pack loads, including the new FlameNet pack with the same PNGs as iOS, and cards in the nine flamenet.io designs, which can be sealed until a day.
  2. Games in 1:1 chats (chess, checkers, reversi, tic-tac-toe) in a new :games module with its own tests and the shared games-v1 vectors. Boards start from the attach row.
  3. Events with RSVPs, folded by the revision and answer rules in §6.32; "Add to calendar" uses ACTION_INSERT and reads nothing.
  4. A Today tab beside Messages, fetched from the home relay with no credentials and verified against pinned keys, kept on the phone and shown offline under "From " with the reason underneath.
  5. The small-web directory, shipped in the app, searchable on the phone; sending a site sends the URL and its title only.
  6. Hello links on the address card, in the scanners and from a flamenetmessenger://hi#... link, which fills in Home's add screen and sends nothing until confirmed.

Stories (owner request): take a story down for everyone (§6.35), edit its caption, and the feed shows the whole picture.

Also from the review rounds: parental controls hide Today and the directory; sign-out and a wipe clear the Today file and weather picks, and a Today answer arriving after them is dropped; every scanner binds by fnid; tic-tac-toe keeps its cells in place for the second player; a game invitation is announced and counts as unread, a move does not; cards, events and games keep the chat's timer; after the test pass, an offline start opens a stored account from the phone and lets the relay catch up.

Bug fixes included:

  • Incoming edits, pins and reactions are applied; a poll path dropped them.
  • A snoozed chat holds every notification, not only a game's.
  • A photo, voice note or file (1:1 or group) that reached nobody is queued and leaves pending once it goes.
  • "Delete for me" works off the record and writes nothing.
  • Link previews show on incoming messages.
  • 1:1 threads are backed up under the user id, as the iPhone does.
  • Home's add screen gets the scanned address, not template text.
  • Card, event, poll and story secondary text reads in the dark theme.
  • Which envelopes wake the other phone and which go silently is pinned by tests and listed in PARITY.md.

Version 0.32, versionCode 32.

How it was tested

All local; the only relays were started on 127.0.0.1. LiveShapesTest (it reaches production) was left out, as always.

  • Every JVM suite at the release tip with the CI change, vectors from a fresh clone of flamenet-e2e at d07ed14, the way CI will run it: engine 817, client 522 (24 skipped live tests), obfs4 75, games 15 (1 deep test skipped by default), app 1150 (debug and release variants). 2579 tests, 0 failures, and CI's floor check passes.
  • Shared vectors through the app's own code: content kinds 24 of 24 written and 132 of 132 read; hello links 37 of 37 and scans 18 of 18; Today sample, sequence and If-None-Match cases; the extended backup payload set 3 of 3; games-v1 4 of 4 with the deep perft counts.
  • The app engines against iOS: 77 of 77 (interop-swift-kotlin.mjs).
  • As the peer in the iOS end-to-end run: every kind agreed in both directions.
  • Emulator smoke on a local relay (pixel_7, API 35, light and dark): Today with data and offline, the directory, sealed and open cards, a chess board turned round, a tall photo story. All passed; the one wording gap it found ("From " offline) is fixed in the tip.

CI changes in this branch

.e2e-ref moves to flamenet-e2e d07ed14 (docs/spec-0-32). Between the old pin and this one, the only existing vector file that changed is backup-payload-v1.json, which gains cards, events and games; the rest are new. unit-tests and vectors-head export FLAMENET_CONTENT_KINDS_VECTORS, FLAMENET_TODAY_VECTORS and FLAMENET_HELLO_LINK_VECTORS, and the pre-flight check names them. vectors-head also runs the three loader classes, which live in :client and :app.

Before this can go green

  • Push flamenet-e2e docs/spec-0-32 first. The pinned commit has to exist on gitlab.com before unit-tests can check it out.
  • vectors-head (advisory) stays red until the spec branch is merged to e2e main.
  • Merge this before the iOS MR: iOS's parity-scrub reads Android main and fails until Android knows the 0.32 kinds.

Not done

  • No Play, F-Droid or APK release.
  • The production Today signing key does not exist yet. TodayKeys.PRODUCTION is empty, so a release build refuses every Today file until the key is made and added. The development key is in debug builds only.
  • The relay serving /today.json and /hi is not deployed; that needs the owner.
  • App Links for hello links are later work.

For the reviewer

  • 64 commits before the CI change, including merges of the feature branches and two test-only branches (the shared-vector loaders, and the shell peer that drove the iOS end-to-end run).
  • Off-the-record threads keep every new piece of state in memory only, and the vault and backup encoders carry the new fields.

Generated with Claude Code

<h2 id="what-032-adds">What 0.32 adds</h2> <p>The same six features as iOS 0.32.0, byte for byte on the wire (SPEC §6.31 to §6.35 and §8.12 in flamenet-e2e, docs/spec-0-32). Everything between people travels as an ordinary sealed message; the Today file is one public file from the home relay.</p> <ol type="1"> <li>Stickers and cards in FlameNet's art: every shipped sticker pack loads, including the new FlameNet pack with the same PNGs as iOS, and cards in the nine flamenet.io designs, which can be sealed until a day.</li> <li>Games in 1:1 chats (chess, checkers, reversi, tic-tac-toe) in a new <code>:games</code> module with its own tests and the shared games-v1 vectors. Boards start from the attach row.</li> <li>Events with RSVPs, folded by the revision and answer rules in §6.32; "Add to calendar" uses ACTION_INSERT and reads nothing.</li> <li>A Today tab beside Messages, fetched from the home relay with no credentials and verified against pinned keys, kept on the phone and shown offline under "From <date>" with the reason underneath.</li> <li>The small-web directory, shipped in the app, searchable on the phone; sending a site sends the URL and its title only.</li> <li>Hello links on the address card, in the scanners and from a <code>flamenetmessenger://hi#...</code> link, which fills in Home's add screen and sends nothing until confirmed.</li> </ol> <p>Stories (owner request): take a story down for everyone (§6.35), edit its caption, and the feed shows the whole picture.</p> <p>Also from the review rounds: parental controls hide Today and the directory; sign-out and a wipe clear the Today file and weather picks, and a Today answer arriving after them is dropped; every scanner binds by fnid; tic-tac-toe keeps its cells in place for the second player; a game invitation is announced and counts as unread, a move does not; cards, events and games keep the chat's timer; after the test pass, an offline start opens a stored account from the phone and lets the relay catch up.</p> <p>Bug fixes included:</p> <ul> <li>Incoming edits, pins and reactions are applied; a poll path dropped them.</li> <li>A snoozed chat holds every notification, not only a game's.</li> <li>A photo, voice note or file (1:1 or group) that reached nobody is queued and leaves pending once it goes.</li> <li>"Delete for me" works off the record and writes nothing.</li> <li>Link previews show on incoming messages.</li> <li>1:1 threads are backed up under the user id, as the iPhone does.</li> <li>Home's add screen gets the scanned address, not template text.</li> <li>Card, event, poll and story secondary text reads in the dark theme.</li> <li>Which envelopes wake the other phone and which go silently is pinned by tests and listed in PARITY.md.</li> </ul> <p>Version 0.32, versionCode 32.</p> <h2 id="how-it-was-tested">How it was tested</h2> <p>All local; the only relays were started on 127.0.0.1. LiveShapesTest (it reaches production) was left out, as always.</p> <ul> <li>Every JVM suite at the release tip with the CI change, vectors from a fresh clone of flamenet-e2e at d07ed14, the way CI will run it: engine 817, client 522 (24 skipped live tests), obfs4 75, games 15 (1 deep test skipped by default), app 1150 (debug and release variants). 2579 tests, 0 failures, and CI's floor check passes.</li> <li>Shared vectors through the app's own code: content kinds 24 of 24 written and 132 of 132 read; hello links 37 of 37 and scans 18 of 18; Today sample, sequence and If-None-Match cases; the extended backup payload set 3 of 3; games-v1 4 of 4 with the deep perft counts.</li> <li>The app engines against iOS: 77 of 77 (<code>interop-swift-kotlin.mjs</code>).</li> <li>As the peer in the iOS end-to-end run: every kind agreed in both directions.</li> <li>Emulator smoke on a local relay (pixel_7, API 35, light and dark): Today with data and offline, the directory, sealed and open cards, a chess board turned round, a tall photo story. All passed; the one wording gap it found ("From <date>" offline) is fixed in the tip.</li> </ul> <h2 id="ci-changes-in-this-branch">CI changes in this branch</h2> <p><code>.e2e-ref</code> moves to flamenet-e2e d07ed14 (docs/spec-0-32). Between the old pin and this one, the only existing vector file that changed is backup-payload-v1.json, which gains cards, events and games; the rest are new. <code>unit-tests</code> and <code>vectors-head</code> export FLAMENET_CONTENT_KINDS_VECTORS, FLAMENET_TODAY_VECTORS and FLAMENET_HELLO_LINK_VECTORS, and the pre-flight check names them. <code>vectors-head</code> also runs the three loader classes, which live in <code>:client</code> and <code>:app</code>.</p> <h2 id="before-this-can-go-green">Before this can go green</h2> <ul> <li>Push flamenet-e2e docs/spec-0-32 first. The pinned commit has to exist on gitlab.com before <code>unit-tests</code> can check it out.</li> <li><code>vectors-head</code> (advisory) stays red until the spec branch is merged to e2e main.</li> <li>Merge this before the iOS MR: iOS's <code>parity-scrub</code> reads Android main and fails until Android knows the 0.32 kinds.</li> </ul> <h2 id="not-done">Not done</h2> <ul> <li>No Play, F-Droid or APK release.</li> <li>The production Today signing key does not exist yet. <code>TodayKeys.PRODUCTION</code> is empty, so a release build refuses every Today file until the key is made and added. The development key is in debug builds only.</li> <li>The relay serving <code>/today.json</code> and <code>/hi</code> is not deployed; that needs the owner.</li> <li>App Links for hello links are later work.</li> </ul> <h2 id="for-the-reviewer">For the reviewer</h2> <ul> <li>64 commits before the CI change, including merges of the feature branches and two test-only branches (the shared-vector loaders, and the shell peer that drove the iOS end-to-end run).</li> <li>Off-the-record threads keep every new piece of state in memory only, and the vault and backup encoders carry the new fields.</li> </ul> <p>Generated with <a href="https://claude.com/claude-code">Claude Code</a></p>
paulhitt commented 2026-10-05 09:46:10 +00:00 (Migrated from gitlab.com)

assigned to @paulhitt

assigned to @paulhitt

Superseded by #191, which is this branch merged into main with its 26 conflict hunks resolved, four compile defects fixed and CI moved to Gitea Actions. Merged as 416f2d84.

Superseded by #191, which is this branch merged into main with its 26 conflict hunks resolved, four compile defects fixed and CI moved to Gitea Actions. Merged as 416f2d84.
extant2000git closed this pull request 2026-10-14 15:12:59 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.