CLI tool
KartikLabhshetwar/better-shot avatar
KartikLabhshetwar/better-shot

BetterShot: a native macOS capture deck that replaces CleanShot X

Screenshot, screen recording, and video editor for macOS. Native SwiftUI app with capture deck, 75+ customizable shortcuts, URL scheme automation, and self-hosted cloud sharing. Open-source alternative to CleanShot X and Loom.

2,364 stars141 forksSwiftNOASSERTION

At a glance

What is it?
A SwiftUI screenshot, scrolling capture and screen recording app with a 3D-shot video editor, URL scheme automation and self-hosted R2 sharing, built for macOS 26 and later.
Who is it for?
BetterShot is at its best when you want capture and editing to stay on your own Mac, with no account and no vendor holding the uploads. The scrolling capture engine, the URL scheme and the annotation model that survives crop and rotate are the three parts that separate it from a screenshot utility, and the repository shows real engineering in the Makefile's pipefail handling and the vendored dependencies.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly Swift, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 7, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One cask, then a permission tour

The install path is a single Homebrew command, and the README is direct about the constraint that matters before anything else: macOS 26 or later. If you would rather not use Homebrew, it points at the Releases page for `.dmg` builds in both architectures, then says to drag the app into Applications and open it. A short tour walks through permissions on first launch.

bash
brew install --cask bettershot

Three permissions show up in the README's own table: Screen and System Audio Recording for captures and system audio, Accessibility for global shortcuts, and Input Monitoring for cursor effects and shortcut overlays. That last one deserves a second look, and the README makes a point of it: plain typing is never recorded. It is still the broadest of the three, and it exists for cosmetics, so declining it is a reasonable trade if you do not restyle your cursor. The project states that no account, subscription or cloud service is required, and the topic list agrees, naming privacy and self-hosting rather than any hosted backend.

The capture deck and the shortcuts that matter

The distinguishing idea here is what the release notes call the capture deck, a compact surface that opens on `⌘⇧2` and holds capture and recording controls, rather than a menubar item you configure once. The default bindings are short enough to learn in a day.

The README's shortcut table maps region capture to `⌘⇧4`, previous-region recapture to `⌘⇧1`, fullscreen to `⌘⇧3`, the capture and recording bar to `⌘⇧2`, recording options to `⌘⇧5`, OCR to `⌘⇧O` and the color picker to `⌘⇧C`. The repository description claims more than 75 customizable shortcuts in total, with extra actions such as Capture Region and Pin or Edit Clipboard Image starting unassigned, which is the right default.

The detail that says this was designed by someone who takes a lot of screenshots is the recapture behavior. Your last area opens already selected, so Return recaptures it and dragging its edges resizes it. That single affordance removes the most common friction in any screenshot tool, and the selector is configurable: Settings has a Capture as soon as I let go toggle deciding whether mouse release fires the capture or leaves the area adjustable for confirmation.

The floating preview then offers Copy, Save, Pin, Edit and Share, and the README is careful about the difference. Copy puts the image on the clipboard and exports no file at all. Save writes to your configured folder, and later saves from the editor update that same file. Export asks for a new destination. New installs also save every normal screenshot to that folder, Desktop by default, which you can switch off if you would rather captures stay private until you choose.

Scrolling capture, and the release note worth reading

Scrolling capture is the feature that most separates BetterShot from a plain region screenshot, and the release history around it is unusually honest. Version 0.5.7 says the 0.5.5 stitching engine shipped without any way to start it, then credits a contributor by name for adding the trigger, the compact bar that shows the stitched size, and the Stop action that sends the result to the normal preview.

The workflow has three entry points: Scrolling Capture in the menu bar, Scroll in the capture bar, or a shortcut you assign yourself. You drag over the scrollable content and scroll down through it, or click Auto Scroll and let the app drive, which needs Accessibility. Fixed headers and moving scrollbars are left out of the joins, content that fades in during the scroll is captured fully drawn, and a capture stops on its own at 30,000 pixels. If a join is missed, the README says to scroll back up a little and continue, which is an honest admission that stitching is reliable rather than perfect.

Automation is treated as a first-class path. The README says any capture can be triggered from Shortcuts, Raycast or the terminal through URL actions, and 0.5.7 records that scrolling capture has its own URL action which also stops an in-progress capture when triggered again. That makes the scheme safe to bind to a key rather than only to a menu, although the README does not print the URL strings, so the scheme table is where you look them up.

A video editor that goes past cuts and zooms

The recording half is where BetterShot stops being a screenshot tool. It records a display, window or adjustable area with optional system audio, microphone, camera and teleprompter, and the compact recording bar can pause, restart or discard without leaving the capture. Restart and Discard ask for confirmation in a native macOS dialog, with Cancel keeping the recording, which is the detail a recorder gets right or gets wrong.

The editor is the ambitious part. Beyond cutting clips and changing speed from 0.25x to 8x, it offers zooms, transitions, captions and blur or pixelate masks, then adds layout modes for combining screen and camera: Camera Bubble, Overlap, Side-by-Side, Presenter, Camera Only and Screen Only. Cursor restyling comes with Recorded, Arrow, Dark, Light and Dot options plus size, smoothing, click effects and idle hiding.

Then there are 3D shots, described as eight camera moves, five drifting angles, Auto Scene, depth blur and keyframed Bezier curves. Keyframed curves are what separate this from a template-based editor, and depth blur is the effect most associated with current product demo videos. Export is MP4 or MOV at 30 or 60 fps.

Two promises in the README shape how you use the app. Original captures and source movies are never modified, and both editors support undo, redo and native full screen. For an editor that rewrites the same file on repeated saves, that is the correct behavior to demand, and the screenshots side extends it further: crop, rotate and flip happen without losing editable annotations.

R2 sharing and the cloud you do not have to use

Sharing is the one place where the self-hosted framing gets concrete. Instead of an account and a vendor bucket, BetterShot can share to your own Cloudflare R2 bucket with one click, and the topic list names cloudflare-r2 directly rather than leaving you to infer it.

That design works because the rest of the app needs no backend. Screenshots, recordings and share links all live in a local Media Gallery, and Copy, Save, Pin, Edit and Share are reachable from the same floating preview rather than from separate menus. Captures are also named once, when they are taken, and every later action reuses that name, with templates such as `standup-{date}-{counter:3}` configurable under Settings.

The privacy argument is structural rather than a policy promise. If you never connect an R2 bucket, nothing leaves the machine. If you do, the destination is one you pay for and one you can audit. The README also states that plain typing is never recorded under Input Monitoring, which is the kind of specific claim worth checking against your own threat model rather than accepting on faith.

Framing is handled locally too. Captures can be framed on a wallpaper, soft gradient or any custom color with padding, rounded corners and shadow, and the defaults for new captures live under Settings, so a consistent look does not require re-styling every screenshot by hand.

What the repository shows, and one contradiction

The tree looks like a real macOS application project rather than a wrapper. There is `BetterShot.xcodeproj/`, a `project.yml` for XcodeGen, `Resources/`, `Sources/`, `Tests/`, a `Vendor/` directory, a `bettershot-landing/` site, `docs/`, `scripts/`, `version.json` and a `Makefile`. There is also `AGENTS.md`, `CLAUDE.md` and `skills-lock.json`, which is the current habit for repositories that keep agent instructions in the tree.

The `Makefile` is the most interesting file to read because of its comments. It opens by explaining that recipes pipe xcodebuild into tail and grep, that a shell pipeline reports the last command's status, and that without pipefail a failed build exits zero and looks green. It then notes that macOS ships Make 3.81, which ignores `.SHELLFLAGS`, so pipefail has to go on the shell itself.

make
SHELL := /bin/bash -o pipefail

The target list is short and each one carries a comment saying what it does:

bash
make build
make release
make test
make ship

`make ship` is the signed release path, covering build, sign, notarize and DMG for both architectures, while `make dmg` is the unsigned one for local testing. The version and build number are read out of `version.json` with python, which keeps the changelog and the binary from drifting apart.

There is one contradiction worth resolving yourself. The README badge says BSD 3-Clause and the tree contains a LICENSE file, but the repository's machine-readable license field is NOASSERTION. For a project whose selling point is not requiring an account, the license is worth reading directly rather than trusting the badge. On activity, the last push was 2026-09-27 and v0.5.8 shipped the same day, so this is a version line that still moves, with 5 open issues against 2,345 stars.

The release notes are also candid about removals. Version 0.5.8 deleted Notch Mode along with its shelf, quick editor, capture gestures and bundled dependencies, consolidating on the floating capture deck, and simplified region capture to the app's own selector by dropping the native option. Read the changelog before upgrading if you relied on any of that.

Editorial conclusion

BetterShot is at its best when you want capture and editing to stay on your own Mac, with no account and no vendor holding the uploads. The scrolling capture engine, the URL scheme and the annotation model that survives crop and rotate are the three parts that separate it from a screenshot utility, and the repository shows real engineering in the Makefile's pipefail handling and the vendored dependencies. Where it is thinner is provenance: the license badge in the README and the machine-readable license field disagree. Start with the brew cask, grant Accessibility only if you want the global shortcuts, and read the release notes before upgrading, because 0.5.8 removed Notch Mode along with its shelf and gestures.

Frequently asked questions

Is BetterShot a free replacement for CleanShot X?

It positions itself that way, covering screenshots, scrolling capture, screen recording and editing with no account or subscription. The trade is platform: BetterShot requires macOS 26 or later, so it is not an option on older machines or on Windows.

What permissions does BetterShot need on macOS?

The README lists Screen and System Audio Recording for captures and system audio, Accessibility for global shortcuts, and Input Monitoring for cursor effects and shortcut overlays. Input Monitoring is only needed for cosmetics, and the project states that plain typing is never recorded.

How does BetterShot scrolling capture handle sticky headers?

Fixed headers and moving scrollbars are left out of the joins, and a capture stops on its own at 30,000 pixels. If a join is missed, the README says to scroll back up slightly and continue, so the feature is reliable rather than perfect.

Does BetterShot send screenshots to a cloud service?

No service is required. Sharing is optional and goes to a Cloudflare R2 bucket you supply yourself, with one click, so nothing leaves the machine unless you connect storage.

Which macOS versions does BetterShot support?

macOS 26 or later, according to both the README badge and the install section. That floor is the first thing to check, since the app will not run on an older system at all.

Official sources

  1. Issues
  2. KartikLabhshetwar/better-shot on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/kartiklabhshetwar-better-shot.svg)](https://hysenlabs.com/projects/kartiklabhshetwar-better-shot)