Add Appshots capture, queue integration, and iOS presentation - #216
Merged
Conversation
This was referenced Aug 23, 2026
gaelcado
force-pushed
the
publish/appshots
branch
from
September 9, 2026 18:32
0e2f1bb to
d31c59c
Compare
gaelcado
force-pushed
the
publish/appshots
branch
2 times, most recently
from
September 11, 2026 00:15
21e7ab3 to
f0f7a83
Compare
Capture application windows on macOS and Linux, stage source-labelled cards, and preserve Appshot context through attachment upload and queue editing. Add dedicated keyboard-accessible settings, bounded native capture and enrichment, stable queue thumbnails, and native iOS presentation.
gaelcado
force-pushed
the
publish/appshots
branch
from
September 11, 2026 00:31
f0f7a83 to
ab51c3f
Compare
gaelcado
marked this pull request as ready for review
September 11, 2026 09:27
This was referenced Sep 11, 2026
wingleeio
approved these changes
Sep 12, 2026
wingleeio
left a comment
Contributor
There was a problem hiding this comment.
Looks good after integrating current main. Resolved the shared image dependency and migrated Appshot/queue previews to the zoomable viewer, including transcript focus restoration. All 895 UI tests pass locally, covering staging, queue context preservation, capture bounds and keyboard setup; the generated capture sound matches the committed asset. I also inspected rendered Linux layouts. Live macOS permission/Space behavior and physical remote-device delivery were not exercised here.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add Appshots: capture another application's window with a global shortcut, then review and send the capture from Zeron. Each Appshot pairs a screenshot with its application/window identity and optional accessibility context. Capturing stages a draft; sending remains an explicit user action.
User experience
Screenshots
Native desktop and iPhone simulator frames using neutral fixture content. These demonstrate presentation, not live capture or physical remote delivery. Light desktop exports omit the macOS compositor backdrop; the offline iOS host disables Send now.
Desktop composer and queue
Distinct Appshot cards in the transcript
Dedicated Appshots settings
iPhone transcript and compact queue
iPhone queued-image gallery
Desktop light and narrow layouts
chat light 1100
chat light 700
chat light 390
chat light 320
transcript narrow 390
Settings and keyboard states
settings light 1100
settings dark 600
settings enabled keyboard
settings last session
settings recording
Loading and unavailable images
transcript transfer states
Additional iPhone states
ios portrait
ios landscape
ios lightbox
ios queue actions
Platform behavior
Capture checks viewer focus before starting any backend. X11 also checks the native active-window PID to cover focus changes caused by hotkey grabs; an isolated X11 probe verified own-PID rejection and external-PID allowance. Windows capture is outside this contribution. Portal cancellation ends the operation; once a portal request begins, failure does not silently trigger a native X11 capture.
Data flow and resource limits
Capture belongs to the viewer's desktop UI. The existing attachment upload and host acknowledgement flow moves screenshot files to the session host before submission; structured context references the resulting image paths. Local and remote sessions use the same existing transport. No RPC or persistent schema migration is introduced.
Optional accessibility collection has an overall budget. Linux races enrichment against its deadline; macOS applies the remaining timeout to each queried AX element. Native image dimensions are bounded before fallback acquisition, checked again before encoding, and encoded size is checked before copying into Rust.
Visible queue thumbnails have a bounded lifecycle separate from the full-image cache, preventing cache eviction from causing repeated full-image downloads. Offscreen rows do not eagerly load previews. Full images load when opened, and failed previews retry on user activation. The iOS context parser bounds input/work and rejects ambiguous associations and DTD/entity declarations.
Validation
The PR is one commit,
ab51c3fbe1fa2c21bd629160c2f5adb871d4882d, based on upstream7ca4b15c6b1953a9649e6966c236eed632b8d7e7(v0.2.60). The macOS UI suite and application check passed with the final review fixes. Linux validation includes the same fixes on the existing v0.2.59 test snapshot, before the upstream version-only bump. The iOS results are from the earlier validation; no iOS source changed in the final review fixes. Fresh CI must validate the published revision.Focused coverage includes XML-invalid character sanitization through queue restoration and presentation parsing, capture rejection while any viewer window is focused, identity rejection, accessibility deadlines, native capture bounds, context/image association, queue preservation, bounded thumbnails, and keyboard setup. Twenty native fixture frames cover desktop light/dark and narrow layouts, settings and transfer states, plus iPhone portrait/landscape, image preview, gallery and queue actions. The fixtures use neutral content and do not prove live capture or remote delivery.
The earlier whole-workspace run reported four failures, three reproduced on upstream. The isolated engine shutdown test passed on the final-review rerun; the whole-workspace suite has not been rerun. Existing upstream formatting differences remain. Passing focused suites do not establish a clean whole-workspace gate.
Before marking ready
Closes #198
Integration order
This contribution is the first of the current three-PR sequence and remains independent on
main.main, preserving Appshot playback while resolving the overlapping sound registry.mainand preserve both Appshot staging and onboarding/projectless composer visibility.A local merge simulation of the current PR heads found that no ordering is conflict-free, so the later branches require these explicit rebases rather than being merged unchanged.