// setup guide
From zero to one nab.
Nab captures a region or your text selection and drops a clean link onto your clipboard. Hosted links work the moment you install, bring your own bucket only if you want to.
Install
Download the .dmg, open it, and drag Nab onto the Applications folder in the window that appears. Requires macOS 13+, Apple Silicon or Intel (universal build).
Nab is an open-source indie app signed without a paid Apple Developer account, so the first launch trips Gatekeeper. This is expected, to get past it:
- Right-click (or Control-click) Nab in Applications and choose Open, then confirm in the dialog.
- If macOS still blocks it, open System Settings → Privacy & Security and click Open Anyway.
You only do this once. After that a scissors icon ✂ lives in your menubar (no dock icon) and the onboarding window walks you through the rest.
Grant permissions
macOS asks for two permissions. Both live in System Settings → Privacy & Security:
- Screen Recording: required to capture a region.
- Accessibility: required for the global double-⌘ / double-⌃ gestures and reading your text selection.
Capture from the menubar works without Accessibility, you only need it for the keyboard gestures.
Pick where links live
By default, Nab hosts your links, nothing to set up. Prefer full control over where your captures live and how long links last? Connect your own bucket instead.
Nab-hosted (default)
Capture and share right away, no account, no bucket, nothing to configure. Hosted links expire after 30 days.
Self-host (optional)
Point Nab at any S3-compatible bucket in Settings → Storage. Links to your own bucket last as long as the object does. Cloudflare R2 is the recommended path (zero egress, generous free tier), or try a local MinIO bucket with no account at all.
Option A: Cloudflare R2
Create a bucket, then an R2 API token scoped to it (Object Read & Write). In Settings → Storage, choose R2 and fill in:
Endpoint https://<ACCOUNT_ID>.r2.cloudflarestorage.com
Bucket shots
Region auto
Access Key ID <token access key>
Secret Key <token secret>
Public base https://<your-r2-public-domain> (optional)
Path-style ONEnable the bucket's r2.dev public URL or a custom domain so the shared links resolve, and set that as the Public base.
Option B: Local MinIO (no account)
brew install minio/stable/minio minio/stable/mc
# start a local S3 server
MINIO_ROOT_USER=nab MINIO_ROOT_PASSWORD=nab12345 \
minio server ~/.nab-minio --address :9000 --console-address :9001
# create a public-read bucket
mc alias set nabdev http://localhost:9000 nab nab12345
mc mb nabdev/shots
mc anonymous set download nabdev/shotsThen in Settings → Storage click Load local dev config (MinIO). The status dot turns green when you're ready.
Capture & share
- tap ⌘ twice: capture a region → link copied to your clipboard.
- tap ⌃ twice: share the current text selection → link copied.
- hold ⌥ + tap ⌘ twice: capture a region → saved to your folder instead of uploaded. Pick the folder in Settings → Capture.
- menubar ✂: same actions plus Settings, anytime.
The link previews inline the moment you paste it into Discord or Slack, no extra steps.
Tune the gesture timing, toast position, naming, and more in Settings. Every upload is logged locally under History, re-copy, open, or delete.
Troubleshooting
- Gesture does nothing, grant Accessibility, then toggle the shortcut off/on. The app re-arms the tap within a couple seconds of being trusted.
- Link returns 403, only relevant when self-hosting: the bucket object isn't public. Enable public read (R2 public domain, or mc anonymous set download).
- Upload failed toast, if self-hosting, check the endpoint, credentials, and that the bucket exists.