Skip to content

feat(captures): list annotations and replays in the Captures pane - #1673

Merged
kitlangton merged 3 commits into
devfrom
captures-every-kind
Nov 13, 2026
Merged

kitlangton merged 3 commits into
devfrom
captures-every-kind

Conversation

@kitlangton

@kitlangton kitlangton commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator

The Captures pane now lists Annotate's annotations and replays, not just the Lab's screenshots and recordings.
Annotate captures used to exist only in the captures folder. Now they show in the same list, newest first, and open in the same editor.

❌ Before

  1. Captures listed only what the Screenshots lab saved. An annotation or replay from Annotate never showed up ❌, so after its card closed, the folder was the only way back.
  2. The pane's Copy showed its check before the clipboard write ran ❌, even when the write then failed.

✅ After

  1. Every *.scrawl bundle from the last 30 days lists as "Annotation · 0:18" with its first keyframe, its words, and its age. If retention removed the movie, the row says "Annotation · Video expired". Clicking a row opens the movie with its timed words in the editor, or the keyframe when the movie is gone. Copy copies it the way Annotate does, and Trash moves the whole bundle. Search also matches the app and the session it was sent to.
  2. Copy shows its check only after the clipboard has the capture. If the write fails, it plays the error tone instead.
- entries = captures::list(q)                         ; the Lab's index only
+ entries = merged(captures::list(q), annotations::list(q))   ; + bundles in the captures folder
+ annotations: scan *.scrawl on a thread, ≤ every 5 s while the pane shows,
+              skip names older than 30 days, re-read only changed scrawl.json
- copied = id; spawn(copy)
+ spawn(copy -> Ok ? COPIED = id : error tone)

📊 Proof

Case Before After
Annotation made 20 min ago ❌ not listed ✅ "Annotation · 0:18" row
Annotation whose movie expired ❌ not listed ✅ "Video expired", opens its keyframe
Search "hex" (the session it went to) ❌ nothing ✅ matches
Copy fails ❌ check shown ✅ error tone, no check

Kit's real captures folder: 1,498 bundles, all of them parse with the new reader. 1,256 fall in the 30-day window, and the first scan reads 48 MB of scrawl.json on its own thread.

Captures pane, before and after (the fixture gains an annotation row):

captures before captures after

New tests: bundle names give their time for both Hex and Scrawl names; the list keeps only bundles in the window and with a manifest, newest first, with their words, app, destination, picture and expired movie; search matches; a rescan reads the same. They weren't run against the old code.

👀 Read: src/history/annotations.rs. The bundles are the record, so there's no new index to keep in sync. Replays are written as ordinary bundles with no marker, so they list as annotations too. Restore Last Capture still doesn't survive a quit, on purpose: its cards are an in-memory "just captured" stack holding decoded images, and persisting them would mean a second store that mirrors this list plus decoding work at launch. After a relaunch, this pane is the way back. The rest is routine.

🔍 Found in a UX audit of captures · no user reports · golden: rune-captures from the Linux check

Checks run
  • cargo nextest run history::annotations history::captures i18n rune_ui::captures screenshot_thumbnail: 63 passed

  • cargo clippy --all-targets -D warnings: clean

  • Check Linux (full suite, goldens from its golden-actual): test job passed. Its nix job fails only on onboarding_kit::stories::motion_gate::the_first_run_moves_cleanly, which fails the same way on other branches (scrub-fixtures), so this change didn't cause it

@kitlangton
kitlangton merged commit 71cdbd4 into dev Nov 13, 2026
4 checks passed
@kitlangton
kitlangton deleted the captures-every-kind branch November 13, 2026 03:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant