You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A macOS menu bar screenshot and annotation tool. Capture any region, window, or full screen, annotate with 8 drawing tools, then save to file, copy to clipboard, or pin as a floating overlay.
Features
Capture modes
Mode
Shortcut
Description
Area
Ctrl+Shift+4
Click-drag to select any region
Screen
Ctrl+Shift+3
Full-screen capture, opens editor immediately
Window
Ctrl+Shift+5
Click any window to capture it
Scrolling
Ctrl+Shift+6
Select a region, auto-scrolls and stitches a long screenshot
OCR
Ctrl+Shift+7
Select a region, recognize text via macOS Vision, copy to clipboard
Repeat Last
Ctrl+Shift+R
Repeat the previous capture
Annotation tools
Tool
Key
Description
Rectangle
R
Outlined or filled rectangle
Ellipse
O
Outlined or filled ellipse
Line
L
Straight line with endpoint handles
Arrow
A
Arrow with filled, open, double, or no arrowhead
Pen
P
Freehand drawing
Blur
B
Pixelated blur to redact content
Text
T
Click to place a text label
Step
N
Numbered callout circles (auto-increments)
Export options
Save to file — PNG or JPEG, to a configurable folder with date-based filenames
Copy to clipboard — with optional Retina (2×) resolution
Pin — float the annotated image as a transparent always-on-top overlay
Requirements
macOS 12 or later
Screen Recording permission (requested on first capture)
Development
All commands run from the app/ directory.
# Install dependencies
npm install
# Development (Vite on :1420 + Tauri hot reload)
npm run tauri dev
# Type-check the frontend
npm run check
npm run check:watch
# Production build (.dmg)
npm run tauri build
Run tests
cd app/src-tauri
cargo test --lib
Architecture
macOS menu bar / global shortcuts
↓
Rust backend (Tauri 2)
↕ invoke() / events
Webview (SvelteKit + Svelte 5)
The app runs as a persistent menu bar agent (LSUIElement = true). Windows are created on demand and hidden on close rather than destroyed, so the process stays alive.
Process flow: Capture → Edit → Export
Tray menu or hotkey → open_capture_cmd → spawns the /capture overlay window (full screen, decorations off, always on top)
Before the overlay appears, a background screenshot is taken and stored in CaptureStore so the overlay can render a frozen background instantly
User selects a region → crop_and_store crops and saves the result in CaptureStore
open_editor_cmd opens the editor window; it calls consume_capture_result() to drain the store
Editor renders the image on a Konva.js canvas; annotations are pushed into appStore
Save / Copy / Pin calls Rust export commands
Scrolling capture flow
User selects a region in the capture overlay and clicks "Start Scrolling Capture"
start_scroll_capture_cmd stores the physical-pixel region, closes the overlay, and opens a small floating pill window
The pill calls start_auto_scroll_capture_cmd, which spawns a background thread that:
Posts CGEventCreateScrollWheelEvent2 scroll events every 300 ms (auto-scrolls the content under the cursor)
Captures a frame of the stored region after each scroll
Deduplicates consecutive identical frames
Emits scroll-frame-added events to update the frame counter in the pill
User presses Space or clicks Stop → stop_scroll_capture_cmd sets an AtomicBool flag → loop exits → scroll-capture-done event fires
stitch_scroll_frames aligns and merges all frames using overlap detection → result stored → editor opens
Frontend state
Svelte 5 runes ($state, $derived) in stores.svelte.ts: