rename snaggle

This commit is contained in:
Alex E. Tafoya
2026-09-18 07:17:34 -05:00
parent fcb8d5b721
commit 0f52b9cc35
51 changed files with 1150 additions and 92 deletions
+53 -8
View File
@@ -1,11 +1,11 @@
# GreenshotMac
# Snaggle
A native, Apple-silicon macOS screenshot tool modelled on [Greenshot](https://github.com/greenshot/greenshot)
for Windows. Written in Swift with AppKit, SwiftUI and ScreenCaptureKit — no Mono, no Wine,
no .NET runtime.
The original C# sources are kept in `reference-greenshot/` purely as the behavioural reference
for the port. GreenshotMac is a rewrite, not a transpile: Greenshot's Win32 foundations
for the port. Snaggle is a rewrite, not a transpile: Greenshot's Win32 foundations
(GDI+, WinForms, `RegisterHotKey`, the shell tray API) have no direct macOS counterparts.
## Requirements
@@ -17,9 +17,9 @@ for the port. GreenshotMac is a rewrite, not a transpile: Greenshot's Win32 foun
## Building
```bash
open GreenshotMac.xcodeproj # then ⌘R
open Snaggle.xcodeproj # then ⌘R
# or
xcodebuild -project GreenshotMac.xcodeproj -scheme GreenshotMac -configuration Release build
xcodebuild -project Snaggle.xcodeproj -scheme Snaggle -configuration Release build
```
The target is configured for ad-hoc signing (`CODE_SIGN_IDENTITY = "-"`) so it builds without a
@@ -30,9 +30,43 @@ again after some rebuilds.
On first launch macOS asks for **Screen Recording** permission
(System Settings › Privacy & Security › Screen Recording). Nothing can be captured until it is granted.
## Installing (for people downloading a release)
Snaggle is ad-hoc signed rather than notarised, because notarisation requires a paid Apple
Developer account. It runs perfectly well; macOS just asks you to confirm it once.
1. Drag **Snaggle** to Applications and open it. macOS will refuse the first time, saying the
developer cannot be verified.
2. Open **System Settings → Privacy & Security**, scroll to Security, and click **Open Anyway**
next to the message about Snaggle.
Control-clicking an app and choosing Open no longer bypasses Gatekeeper — Apple removed that
shortcut in macOS 15. If you prefer the terminal, `xattr -dr com.apple.quarantine
/Applications/Snaggle.app` does the same job in one step.
Snaggle then needs **Screen Recording** permission (System Settings → Privacy & Security →
Screen Recording). Grant it, then quit and reopen the app — macOS only hands the permission to
a freshly launched process.
Snaggle lives in the menu bar, not the Dock: look for the viewfinder icon.
## Building a release
```bash
./scripts/release.sh # ad-hoc signed, builds build/Snaggle.dmg
./scripts/release.sh --developer-id # Developer ID + notarisation (paid account)
```
The DMG contains the app, an Applications symlink and `INSTALL.txt`. For the notarised path,
set your team ID in `scripts/ExportOptions.plist` and store a notary credential profile first.
The app icon is generated, not hand-drawn: edit the colours or shapes in
`scripts/make_appicon.py` and run `python3 scripts/make_appicon.py` to rewrite every size in
`Snaggle/Resources/Assets.xcassets/AppIcon.appiconset`.
## Using it
GreenshotMac is a menu bar app (`LSUIElement`), so it has no Dock icon. The camera icon in the
Snaggle is a menu bar app (`LSUIElement`), so it has no Dock icon. The camera icon in the
menu bar holds every command.
Default global hotkeys — Greenshot's PrintScreen-based defaults don't exist on a Mac keyboard,
@@ -91,7 +125,7 @@ Supported variables: `${capturetime}`, `${now}`, `${title}`, `${appname}`, `${us
## How the port maps onto Greenshot
| Greenshot (Windows) | GreenshotMac |
| Greenshot (Windows) | Snaggle |
| --- | --- |
| `MainForm` + tray icon | `StatusMenuController` (`NSStatusItem`) |
| `CaptureForm` | `CaptureOverlay` (one borderless window per display) |
@@ -112,6 +146,17 @@ the speech-bubble and SVG/emoji containers, `.gst` templates, and Greenshot's la
The destination layer is a single `switch` in `Destinations.swift`, so adding an upload target is
a small, self-contained change.
## Licence
## Licence and attribution
Greenshot is GPL-3.0; this port keeps the same licence.
Snaggle is a derivative work of [Greenshot](https://github.com/greenshot/greenshot)
(Copyright © 2007-2026 Thomas Braun, Jens Klingen, Robin Krom), reimplemented in Swift for
macOS, and is released under the **GNU General Public License v3.0** — the full text is in
[`LICENSE`](LICENSE).
That means anyone may use, study, modify and redistribute Snaggle, including commercially,
provided the source stays available under the same licence. If you distribute a built copy of
Snaggle, you must also make this source available to whoever receives it.
"Greenshot" is a trademark of the Greenshot project and is used here only to describe Snaggle's
origin. Snaggle is not affiliated with or endorsed by the Greenshot project, and it does not use
their name, logo or branding for itself.