A fast, native, local-first screenshot workspace for macOS.
Capture a region or window, stitch a scrolling page, annotate inline, pin the result, and get back to work.
SnapSail 是一款原生 macOS 截图工具,支持区域截图、窗口截图、滚动长截图、即时标注、钉图、自定义快捷键以及中英文界面。截图在本机处理,不依赖后端服务。
Most screenshot tasks should take seconds, not a trip through an editor and a stack of dialogs. SnapSail keeps the whole flow in one lightweight native workspace:
- Trigger a shortcut.
- Draw or adjust the selection.
- Annotate without leaving the overlay.
- Copy, download, pin, or start a scrolling capture.
The app is built with Swift and AppKit, stores history locally, and does not require an account or backend.
| Area | What it does |
|---|---|
| Region capture | Drag, move, resize, and nudge a precise selection across connected displays. |
| Window capture | Select one or multiple windows, with optional native window shadow. |
| Scrolling capture | Stitch overlapping frames into a long image while rejecting stationary duplicate frames. |
| Inline annotation | Rectangle, ellipse, line, arrow, pen, pixelation, text, numbered markers, and highlight. |
| Clipboard and download | Copy finishes without writing a file; Download saves directly to the configured folder without another dialog. |
| Pin on screen | Keep a screenshot floating above other windows, drag it anywhere, and adjust opacity with Option-scroll. |
| Capture history | Keep the latest 20 screenshots locally, open them again, or clear the history from the app. |
| Custom shortcuts | Record custom shortcuts, including standalone F1–F20 keys. |
| Multi-display support | Create and interact with selection overlays on every connected display. |
| Bilingual UI | Switch between English and Simplified Chinese without restarting the app. |
| Local-first privacy | Screenshots, preferences, and history remain on your Mac. |
SnapSail is an active open-source project. The repository currently provides source code and a local build script. A notarized downloadable binary and Mac App Store release are not available yet.
- macOS 12 Monterey or later
- Xcode 14 or later, or a compatible Swift 5.7+ toolchain
- Screen Recording permission in System Settings → Privacy & Security → Screen Recording
The app uses only Apple frameworks and Swift Package Manager; there are no third-party runtime dependencies.
Clone the repository:
git clone https://github.com/YidaHu/SnapSail.git
cd SnapSailBuild the command-line Swift package:
swift buildBuild the packaged macOS application:
zsh Scripts/build-app.shThe app bundle is written to:
build/SnapSail.app
Launch the packaged app:
zsh Scripts/run-app.shOn first launch, grant Screen Recording permission when macOS asks. If SnapSail was already running when permission changed, quit and relaunch it.
The default shortcuts are:
| Action | Default shortcut |
|---|---|
| Capture Area | Command–Shift–2 |
| Capture Window | Command–Shift–3 |
| Scrolling Capture | Command–Shift–4 |
For an area capture:
- Press
Command–Shift–2. - Drag to create a selection.
- Drag inside the selection to move it, use the handles to resize it, or use the arrow keys for one-point nudges. Hold Shift while nudging to move ten points.
- Choose an annotation tool if needed.
- Use Copy and Finish to place the image on the clipboard, Download to save it directly to the configured folder, or Pin to keep it on screen.
- Press
Command–Shift–4or choose Scrolling Capture from the menu bar. - Select only the content area that actually scrolls. Avoid browser chrome, fixed sidebars, and floating controls when possible.
- Scroll downward slowly and steadily.
- Watch the live preview and choose Finish when the required content is captured.
SnapSail compares adjacent frames, appends only new rows, and ignores effectively stationary frames. If the page contains large animations or sticky elements, pause on stable content and continue more slowly.
- Rectangle and ellipse outlines
- Straight line and arrow
- Freehand pen
- Source-based pixelation
- Text labels
- Numbered markers
- Semi-transparent highlight
- Undo and redo
Annotations are rendered at the captured image's native pixel dimensions, so Retina screenshots stay sharp.
Open the SnapSail menu-bar icon and choose Settings….
- Launch SnapSail automatically at login using the macOS Login Items service
- Play a completion sound
- Show capture notifications
- Keep or disable local capture history
- Switch between English and Simplified Chinese
- Include native window shadows
- Configure automatic clipboard/file behavior for non-explicit capture flows
Explicit overlay actions remain deterministic: Copy and Finish only copies, while Download only writes to the configured folder.
- PNG or JPEG
- JPEG quality
- Filename prefix
- Download folder
If a filename already exists, SnapSail appends -2, -3, and so on instead of overwriting it.
Click a shortcut capsule and press a new combination. Press Escape to cancel recording, or Delete/Backspace to restore the default. Standalone function keys F1–F20 are supported; depending on your keyboard settings, you may need to hold Fn when pressing the physical key.
- Drag anywhere on a pinned image to move it.
- Double-click a pinned image to close it.
- Right-click and choose Close Pinned Image.
- Hold Option while scrolling over the image to adjust opacity.
SnapSail does not upload screenshots or analytics.
| Data | Location |
|---|---|
| Capture history | ~/Library/Application Support/SnapSail/History/ |
| Preferences and shortcuts | macOS UserDefaults for com.yidahu.snapsail |
| Downloaded screenshots | The folder selected in Settings → Export |
| Clipboard image | The macOS system pasteboard |
History is limited to the latest 20 PNG files. Disabling history stops new history writes; Clear History removes the existing local history files.
SnapSail separates reusable capture logic from AppKit UI:
SnapSail/
├── Sources/
│ ├── SnapSail/ # AppKit application, overlays, menu bar, settings
│ └── SnapSailCore/ # Geometry, stitching, annotations, shortcuts, rendering
├── Tests/SnapSailCoreTests/ # XCTest regression suite
├── Resources/Info.plist # App metadata and permission description
├── Scripts/build-app.sh # Release app packaging and stable local signing
├── Scripts/run-app.sh # Build-and-launch helper
└── Package.swift # Swift Package Manager manifest
Important components:
CaptureCoordinatorowns capture workflows and output actions.SelectionOverlayControllercreates one native overlay per display.ScrollCaptureControllerschedules frames and updates the long-image preview.VerticalFrameMatcherandScrollStitcherdetect overlap and append new rows.InlineAnnotationRasterizerrenders annotations into the exported image.LaunchAtLoginControllerreads and updates the native macOS Login Items state.AppPreferencespersists capture, export, language, and shortcut settings.
Run the full suite:
swift test -j 1Build and verify the Release app:
zsh Scripts/build-app.sh
plutil -lint build/SnapSail.app/Contents/Info.plist
codesign --verify --deep --strict --verbose=2 build/SnapSail.appThe tests cover capture geometry, multi-display overlay coordinates, selection behavior, shortcuts, annotation rendering, pixelation preview, window shadows, scrolling-frame matching, long-image stitching, history retention, localization, and copy/download semantics.
- Quit SnapSail completely.
- Open System Settings → Privacy & Security → Screen Recording.
- Enable the exact SnapSail build you are launching.
- Relaunch
build/SnapSail.app.
macOS associates privacy permission with the app's code-signing identity. Scripts/build-app.sh uses a persistent local signing identity when available so rebuilding does not create a different permission identity every time.
Check System Settings → Keyboard. If the top-row keys control brightness or media, use Fn–F1 or enable “Use F1, F2, etc. keys as standard function keys.” Also verify that another app has not registered the same global shortcut.
Select a smaller content-only region, remove animated/sticky content from the selection, and scroll more slowly. SnapSail intentionally rejects ambiguous or stationary frames instead of silently adding repeated content.
Open Settings → Export and inspect Save folder. The Download action writes there immediately and does not open a save panel.
- Signed and notarized release downloads
- Improved automatic handling of sticky headers during scrolling capture
- More annotation styling controls
- Optional history thumbnails and search
- Accessibility and localization refinements
Roadmap items are directional, not release commitments. Issues and focused pull requests are welcome.
- Fork the repository and create a focused branch.
- Add or update a regression test before changing behavior.
- Run
swift test -j 1and the Release build checks. - Keep capture logic in
SnapSailCorewhen it does not require AppKit UI. - Open a pull request describing the user-visible behavior and verification performed.
For bugs, include your macOS version, display arrangement, exact capture mode, reproduction steps, and whether the issue appears in the preview, exported image, or both.
SnapSail is available under the MIT License.
Built by YidaHu. Product story: yidahu.top/projects/snapsail.