Skip to content

Repository files navigation

Scrozz logo

Scrozz

A screenshot tool for macOS, Windows, and Linux — free, open source, and cross-platform from its first commit rather than as a later port.

License: GPL-3.0 Platform: macOS, Windows, Linux Built with Rust CI status Donate

🚧 Early, and honest about it

Scrozz is alpha software. Downloadable test builds are available from GitHub Releases, but no version should be relied on for daily work yet.

On macOS it takes real screenshots today, from the menu bar and the command line. On Windows and Linux there is substantial, compiling, CI-tested implementation — but no human has yet sat down and used Scrozz as an application on either. Until someone has, this README will not call them supported. The status table below is exact about which is which.


What it is

Scrozz captures your screen and puts the result somewhere useful — on the clipboard, in a file, or dragged straight into whatever app you are already working in.

The part that makes it unusual is not the capture. It is that the cross-platform core existed in the first commit, before any platform was finished. macOS-first-then-port is how tools quietly become macOS-only: platform assumptions get baked into the core long before anyone notices. So all three backends compile on every push, and the interface is rendered and pixel-diffed on all three in CI — the reasoning is in docs/decisions.md (D3) and the machinery in docs/platforms.md.

macOS is polished first because it is the maintainer's daily driver, and dogfooding is what actually gets an app finished.

Status

Read this as a map of what is proven, not what is planned.

Verification levels

  • Works — implemented, and used by a human on real hardware.
  • 🟡 Implemented, not confirmed by hand — real code against the real platform API, covered by automated tests. On Windows and Linux that means it compiles for the target, links, and passes the suite on that platform's CI runner — nobody has run it as an app.
  • 🟠 Partial — some of the pieces exist; the feature does not yet stand up end to end.
  • Not started — types and contracts only, or nothing at all.
  • 🚫 Not available, by design — the platform genuinely cannot, and Scrozz says so rather than failing silently (D8).
Area macOS Windows Linux Notes
Screen / display capture 🟡 🟡 ScreenCaptureKit · Windows.Graphics.Capture · X11 + desktop portal
Window & region capture 🟡 🟡 Wayland cannot enumerate windows; the portal picker is used instead
Save, clipboard, encoding 🟡 🟡 Shared, platform-agnostic code — one implementation, tested everywhere
Menu-bar / tray app 🟡 🟡 One cross-platform tray item; only the macOS one has been run by a person
Global hotkeys 🟡 🟠 Works where the desktop allows it. Wayland cannot grab keys, so Scrozz refuses and hands you the exact compositor config line to bind the CLI instead (D11)
Recent Captures Overlay 🟡 The macOS overlay has reviewed native lifecycle proof and an atomic first-card reveal barrier; the unified build still awaits final hands-on confirmation. GNOME/Wayland cannot position overlays at all — the adaptation is D31
Drag-out to another app 🟡 Native macOS drag is hands-on verified; Windows delayed rendering is implemented but still needs native testing; Linux remains open
Pinned captures 🟡 🟡 🟠 Pin, lock, opacity, zoom and persistence are implemented; native focus and window-manager behavior still need the full platform matrix
Text recognition (OCR) 🟡 🟡 Local only: Vision · packaged Windows.Media.Ocr / portable Tesseract · Linux Tesseract. The portable Windows ZIP includes Tesseract, its runtime DLLs, and English data; Linux uses host packages. Missing requested language data produces an actionable error
Barcode and QR reading A pure-Rust decoder on every platform, with Vision used for macOS symbologies it already covers. Payloads are returned verbatim and never followed
Sensitive-information review 🟡 🟡 🟡 Deterministic local detectors identify possible emails, payment cards, network addresses, phone numbers, token-bearing URLs and likely keys. Findings contain no recognized text, stay unselected until review, and become ordinary secure Redact annotations only after explicit acceptance of the current image revision
Capture history 🟡 🟡 🟡 Persistence, retention, restore/delete/filter UI and editable annotation documents are implemented; aggregate hands-on validation is in progress
Private sharing 🟡 🟡 🟡 Optional BYO S3/R2/B2/MinIO upload; automated signing, encryption and loopback transport tests pass, but no provider has been confirmed by hand
Command-line interface 🟡 🟡 Every capture the app can take, headlessly (D11)
Annotation editor 🟡 🟡 🟡 Full editor UI, history, crop, zoom, Smart Frame, arrows, text, secure Redact and revision-safe copy/save/drag are implemented; final aggregate and platform validation remain
Screen recording 🟠 🟠 🟠 Native recording engines and editor playback exist; macOS editor/export corrections and Windows/Linux runtime closure remain active
Scrolling capture 🟡 🟡 🟡 Vertical and horizontal stitching, sticky-chrome removal, progress, cancellation and partial salvage are wired end to end. macOS synthesizes target-bound gestures; Windows and X11 have native drivers awaiting real-desktop smoke, while Wayland is deliberately manual
Beautification 🟡 🟡 🟡 Smart Frame, automatic backgrounds, exact output sizes, custom presets and revision-safe export are integrated; hands-on aggregate validation remains
BYO sharing 🟠 🟠 🟠 S3-compatible upload core exists; provider settings, credential-vault integration, history metadata and release packaging are active work

What 🟡 rests on, precisely. Three automated layers, described in full in docs/platforms.md: every target type-checks from a single machine; every push builds, links and tests on real macOS, Windows and Linux runners; and the interface is rendered headlessly and pixel-diffed on all three, which is why "does it look right on Windows" is not an unanswered question. What none of that can prove is behaviour in a live desktop session — whether the overlay steals focus mid-sentence, whether a hotkey survives a lock screen, whether a permission dialog says something a person can act on. That is a real gap, it is stated in docs/platforms.md as layer 4, and it is why Windows and Linux are not called supported here.

The road from 🟡 to ✅ runs through that layer 4: real desktop sessions on each platform, a person driving the app, and the rough edges that only a live session reveals fixed one at a time. The plan, the four layers, and the honest account of where the asymmetry sits are all in docs/platforms.md.

Using it today (macOS)

You will need Rust 1.98 or newer. Full Xcode is optional — it is used only to compile the layered macOS 26 app icon, and the build skips that step cleanly without it.

git clone https://github.com/thatcube/scrozz.git
cd scrozz
tools/dev.sh build
# builds, signs, installs /Applications/Scrozz.app, and opens it

The bundle is not a convenience. macOS attaches Screen & System Audio Recording access to a bundle identity, so a bare binary run from a terminal has the grant land on the terminal instead. Scrozz does not request access at launch. The first capture that needs it explains why before macOS asks; if direct access is not granted, supported Window and Screen captures can use Apple's limited content picker instead. The picker replaces Scrozz's custom selector and cannot provide custom Area, All Displays, unattended global capture, or system-audio recording.

Scrozz then lives in the menu bar. It is invisible at rest by design (D27) — the captures appear, the app does not.

Version numbers

Scrozz follows Plozz's CalVer model: the user-facing version is the unpadded build date YYYY.M.D, so a build made on August 27, 2026 is 2026.8.27 and its release tag is v2026.8.27. Same-day builds share that version and are distinguished by the separate numeric build number.

Downloadable test builds use tags such as v2026.9.2-alpha.1. GitHub marks them as prereleases, excludes them from Latest, and publishes a normal macOS drag-to-Applications DMG, Windows packages, a Linux AppDir archive, and SHA256SUMS after the tagged release workflow succeeds. Alpha builds may break compatibility and should not be treated as stable. Unsigned platform artifacts clearly say so; macOS downloads need Developer ID signing/notarization configured in the repository before Gatekeeper provides the normal install flow.

Recording interaction overlays are opt-in. record.highlight-clicks and record.show-keystrokes trigger Input Monitoring only when a recording starts; keystrokes default to record.keystroke-scope=modifiers-only. The all mode can expose typed content and is presented with an explicit privacy warning. Scrozz retains only display-ready labels in memory for an open editor session, never in history, logs, or event sidecars.

The camera is opt-in in the same way. record.camera is off by default, device enumeration never opens a camera, and the camera is only started by an explicit Preview in Settings or by a recording that asked for one. Composition — anchor, size, shape, mirror, border, shadow, and the presenter switch — stays adjustable while a recording runs, and is the only recording preference that does.

From the command line

The CLI is not a wrapper around the app; it is the same capability, headless, and it is a stable contract (D11). It is also how Scrozz gets hotkeys on compositors that refuse to provide them.

tools/dev.sh run -- list displays
tools/dev.sh run -- list windows
tools/dev.sh run -- list cameras
tools/dev.sh run -- capture --display primary -o shot.png
tools/dev.sh run -- capture --region 0,0,1200,800 --json
tools/dev.sh run -- record --camera --camera-shape circle
tools/dev.sh run -- record --camera --presenter
tools/dev.sh run -- ocr shot.png
tools/dev.sh run -- settings get
tools/dev.sh run -- --help

Private sharing is a source-level optional feature and is enabled in distributed Scrozz binaries. It adds no account or Scrozz service, and uploads only to the S3-compatible endpoint you configure.

export SCROZZ_S3_BUCKET=my-captures
export SCROZZ_S3_ACCESS_KEY_ID=...
export SCROZZ_S3_SECRET_ACCESS_KEY=...
cargo run -p scrozz --features cloud -- share shot.png

AWS S3, Cloudflare R2, Backblaze B2 and MinIO presets are built in. Expiring private links, client-side password encryption, provider-compatible object organization and lifecycle deletion, tags where supported, and custom domains are documented in docs/private-sharing.md. The Settings window stores non-secret provider policy in its versioned settings document and puts credentials or an optional default share password only in macOS Keychain, Windows Credential Manager, or Linux Secret Service. Environment, credential command, and stdin sources remain available to scripts; secrets are never command-line values or plaintext settings.

Commands that are not built yet say so and exit with a distinct status rather than pretending — history, for instance, currently reports that it is not implemented. Exit codes are part of the contract, so scripts can tell "no such window" apart from "not implemented" apart from "permission denied".

Capture from the development binary may be refused on macOS because its grant belongs to the terminal rather than to Scrozz. That refusal is deliberate and tells you exactly which setting to change; the packaged app owns the just-in-time permission and Apple-picker flow described above.

Camera access is likewise requested only after an explicit Preview camera or recording action. Scrozz remembers the stable device identifier and composition preferences, never a native device handle. The recording HUD keeps an in-app privacy indicator visible while the camera is active and releases the device as soon as preview or recording stops.

Contributing & development

One script runs everything CI runs, with the same flags:

tools/dev.sh            # the full command list
tools/dev.sh check      # type-check for this machine
tools/dev.sh lint       # clippy, warnings denied
tools/dev.sh test       # the test suite
tools/dev.sh build      # on macOS: build, sign, install, and relaunch Scrozz
tools/dev.sh platforms  # type-check macOS + Windows + Linux, from any of them
tools/dev.sh golden     # headless golden-image tests
tools/dev.sh lock       # refresh Cargo.lock after manifest changes, no build
tools/dev.sh update     # intentionally update dependency versions, no build
tools/dev.sh smoke      # build + smoke-test one release binary under one lease
tools/dev.sh package    # build + package one release binary under one lease
tools/dev.sh ci         # everything, in CI's order — the answer before pushing

On macOS, a successful tools/dev.sh build replaces the canonical /Applications/Scrozz.app, stops only the process running from that exact bundle, and opens the new build. Tests, checks, packaging, and CI never launch the app. Set SCROZZ_BUILD_NO_LAUNCH=1 for an explicit install-only build.

Local build commands run through a two-slot Cargo pool. The lease keeps parallel worktrees from writing the same target directory at once, while the fixed slot count prevents every branch from retaining another full dependency graph. When a slot changes worktrees, the wrapper removes only workspace-package artifacts under the lease so stable Cargo cannot reuse a same-hash local artifact from another checkout; registry dependencies remain warm. Set SCROZZ_CARGO_POOL_ROOT to move the pool to another local filesystem, or SCROZZ_CARGO_POOL_SLOTS to change the concurrency bound. Do not put the pool on SMB/NFS, and do not point concurrent raw cargo commands at one shared CARGO_TARGET_DIR; use tools/dev.sh or tools/cargo-pool.sh so the lease covers the entire command.

tools/dev.sh platforms is the one worth knowing about: it type-checks the Windows and Linux code against the genuine API surface without a Windows or Linux machine, which turns most cross-platform mistakes into a compile error on your own laptop instead of a CI round trip days later.

Before writing platform code, read docs/platforms.md — particularly the recorded gotchas, several of which are APIs that return success while doing nothing at all.

The documentation is the design. Decisions are binding and written down before implementation:

Document What it is
docs/decisions.md Every architectural decision (D1–D31), with the reasoning and what it rules out
docs/platforms.md The cross-platform strategy, the four verification layers, and what Windows and Linux still need
docs/private-sharing.md BYO object-storage setup, credential boundaries, expiry and encrypted viewer behavior
docs/feature-audit.md The authoritative feature inventory, per-platform feasibility, and the backlog
docs/research/ The research the decisions were made from
AI_DISCLOSURE.md How Scrozz is built, and what it does not do
TRADEMARK.md What you may do with the name

If you are changing behaviour, the decision record is the place to start. If a decision is wrong, say so and change it there first — that is what it is for.

Built with AI assistance, not powered by AI

A screenshot tool sees your screen, including things you never meant to share. That earns a direct answer rather than a marketing adjective, so:

Scrozz contains no generative AI. No language model, nothing generated: it does not describe or summarise what you capture. It has no telemetry, analytics, account, sign-in, or Scrozz server. Text recognition and sensitive-information suggestions run on device, through the recogniser built into your operating system or a Tesseract installation on your machine. A capture leaves the machine only when you explicitly use the optional sharing feature, and then it goes only to the S3-compatible storage you configured.

You can check that rather than believe it: the source default build compiles no HTTP client. Distributed packages deliberately build with --features cloud, which adds optional ureq networking for authenticated object-storage requests; redirects and ambient proxies are disabled. Cargo.lock lists optional dependencies either way, so verify the boundary with cargo tree -p scrozz --no-default-features.

Coding agents did assist with implementation. Brandon Moore conceived Scrozz, researched it, designed the product and its visual identity, made every architectural decision, tested the results, branded it, and maintains it; agents wrote code against decisions that were already made, and built the automated checks that prove that code does what it claims. That arrangement was written down as D5 before most of the code existed, alongside D25, which exists for the blunt reason that an agent cannot see — so every product image is generated by a headless harness and diffed by the build, rather than trusted.

The full version, including how to verify each claim, is in AI_DISCLOSURE.md.

Origins

Scrozz began as a study rather than as code, and the repository's own history shows it: the first commits are a feature audit, four research reports, and the decision record — architecture, licensing, platform strategy and interaction design were argued out and written down before the workspace existed at all. Concept and research preceded implementation. How long they preceded it is not recorded anywhere in this repository, so this README does not guess.

The first code lands afterwards, and the ordering is deliberate: the cross-platform verification harness before the capture backends, the platform backends before the interface, the interface before the app. The commit titled "Scrozz takes its first real screenshot" comes only once all of that is standing. Everything since has been macOS polish and cross-platform groundwork.

The whole design argument — including the decisions that were made, reversed, and corrected along the way — is preserved in docs/decisions.md. None of it was reconstructed after the fact.

Who makes Scrozz

Brandon Moore — founder, product designer, researcher, and maintainer. Scrozz is his: the idea, the research, the architecture, the visual identity and icon, the testing, and the decisions about what ships. Every commit in this repository is authored by him, which you can confirm with git shortlog -sne.

Contributions are welcome. The design decisions in docs/decisions.md are binding, and the fastest way to get a change merged is to say which decision it serves — or which one it means to revisit.

Reporting bugs & requesting features

Please open an issue. Your operating system and version, your desktop environment on Linux, and what you expected to happen all help a great deal.

Screenshots often contain more than you intend — check yours before attaching it, and never paste credentials or tokens into an issue.

Donate

Scrozz is free and open source, with no paid features, no paywall, and no ads. If it turns out to be useful to you and you would like to chip in toward its upkeep, donations are welcome and genuinely appreciated. Anything is plenty, and not donating is completely fine.

Donate via GitHub Sponsors — one-time or recurring.

Licence & trademark

GPL-3.0, with a store-distribution exception © 2026 Brandon Moore.

The licence covers the code, and the freedom to use, change, and sell it is the point. It does not cover the name: "Scrozz" and the Scrozz logo are trademarks, so a modified version needs a different name. The reasoning, and exactly what you may do without asking, is in TRADEMARK.md.

Other products named anywhere in docs/ are the trademarks of their owners, referred to descriptively for comparison only (D24).

The family

Scrozz is one of a set of free, open-source apps by Brandon Moore. Same principles throughout: your data stays yours, nothing is monetised, and nothing is hidden behind an account.

App What it does
Hozz Apple Health, exported to storage you own
Mozz Your music, wherever it lives
Plozz Movies & TV on Apple TV, iPhone & iPad
Twozz Twitch on Apple TV, with real emotes
Scrozz Screenshots that go where you need them — you are here

More open source

Hozz        Mozz        Plozz        Scrozz        Twozz

Brandon Moore

About

Native screenshot app for MacOS, Linux, and Windows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages