Skip to content

Add Appshots capture, queue integration, and iOS presentation - #216

Merged
wingleeio merged 2 commits into
zeronsh:mainfrom
gaelcado:publish/appshots
Sep 13, 2026
Merged

Add Appshots capture, queue integration, and iOS presentation#216
wingleeio merged 2 commits into
zeronsh:mainfrom
gaelcado:publish/appshots

Conversation

@gaelcado

@gaelcado gaelcado commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

  • Dedicated settings: Settings → Appshots contains enablement, the configurable global shortcut, destination policy, capture sound, and platform-specific permission status. Controls support keyboard navigation and activation, accessible names/state, and visible focus.
  • Capture and review: Invoke the shortcut while another application is focused. Zeron captures before taking focus and stages the result in the chosen composer. Cards show the window preview, source application and title, with full-image preview and removal before sending. Invoking the shortcut within Zeron does nothing.
  • Transcript: Sent Appshots retain distinct source-labelled cards instead of becoming anonymous image attachments. Loading and unavailable states retain source information. Accessibility context is hidden from displayed message text.
  • Queue: Image previews use compact cropped thumbnails and an additional-image count. Ghost actions and modifier hints occupy stable slots. Narrow layouts reduce the visible thumbnail count. Editing, failed sends and draft restoration preserve screenshot/context associations.
  • iOS: Received Appshots render as a horizontal strip of source-labelled cards with full-image previews. Queue rows expose a gallery for additional images and touch-sized edit/send/menu controls. Editing a queued message preserves its original Appshot context and attachment references.

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

Desktop composer and queue

Distinct Appshot cards in the transcript

Distinct Appshot cards in the transcript

Dedicated Appshots settings

Dedicated Appshots settings

iPhone transcript and compact queue

iPhone transcript and compact queue

iPhone queued-image gallery

iPhone queued-image gallery

Desktop light and narrow layouts

chat light 1100

chat light 1100

chat light 700

chat light 700

chat light 390

chat light 390

chat light 320

chat light 320

transcript narrow 390

transcript narrow 390
Settings and keyboard states

settings light 1100

settings light 1100

settings dark 600

settings dark 600

settings enabled keyboard

settings enabled keyboard

settings last session

settings last session

settings recording

settings recording
Loading and unavailable images

transcript transfer states

transcript transfer states
Additional iPhone states

ios portrait

ios portrait

ios landscape

ios landscape

ios lightbox

ios lightbox

ios queue actions

ios queue actions

Platform behavior

Platform Capture Optional application text
macOS ScreenCaptureKit with a bounded CoreGraphics fallback; Screen Recording permission required Accessibility permission; source window retained before asynchronous capture
Linux X11 Native active-window capture or a compatible window-target portal AT-SPI only when native window, process and retained accessibility identity agree
Linux Wayland Compatible screenshot portal advertising a window target; selection may be required Omitted until the captured native target can be verified
iOS Displays desktop captures through the existing attachment transport Preserves received context; does not capture other applications

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 upstream 7ca4b15c6b1953a9649e6966c236eed632b8d7e7 (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.

Check Result
macOS UI suite 831 passed
Native Linux UI suite 851 passed (v0.2.59 test snapshot)
macOS and Linux application checks Passed
iOS unit suite 107 passed
iOS Appshots UI flow Passed
Whitespace check Passed

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

  • Review fresh CI on the actual PR revision.
  • Complete live macOS permission/focus/Space checks, interactive Linux portal checks, VoiceOver, and physical remote-device delivery validation.
  • Keep the earlier whole-workspace failures accounted for; one passing isolated shutdown rerun does not establish a clean whole-workspace gate.

Closes #198

Integration order

This contribution is the first of the current three-PR sequence and remains independent on main.

  1. Merge Add Appshots capture, queue integration, and iOS presentation #216 first after its review and required validation.
  2. Rebase Add a configurable Zeron sound signature #320 onto the resulting main, preserving Appshot playback while resolving the overlapping sound registry.
  3. After Add a configurable Zeron sound signature #320 lands, rebase Add a guided first-run onboarding journey #322 onto the resulting main and 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.

@gaelcado gaelcado changed the title Add Appshots for staged application context Add desktop Appshots with queue-safe delivery and iOS presentation Sep 11, 2026
@gaelcado gaelcado changed the title Add desktop Appshots with queue-safe delivery and iOS presentation Add Appshots capture, queue integration, and iOS presentation Sep 11, 2026
@gaelcado
gaelcado force-pushed the publish/appshots branch 2 times, most recently from 21e7ab3 to f0f7a83 Compare September 11, 2026 00:15
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
gaelcado marked this pull request as ready for review September 11, 2026 09:27

@wingleeio wingleeio left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@wingleeio
wingleeio merged commit 0a80fc1 into zeronsh:main Sep 13, 2026
9 checks passed
@gaelcado
gaelcado deleted the publish/appshots branch September 13, 2026 10:25
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.

Add Appshots to Zeron

3 participants