Quicksave is a tiny Swift-only macOS menu-bar app for saving the current clipboard into a local inbox and, optionally, appending the same capture into an Obsidian daily note.
The core flow is intentionally small:
Option + Csaves the current clipboard.Option + Wopens a minimal note box for context on the latest capture.Option + Dretries appending the latest capture to Obsidian.- Captures are saved as normal files, not a database or opaque blob store.
- No screen recording, OCR, browser extension, Accessibility scraping, or clipboard polling is used.
Default inbox:
~/Quicksave Inbox
Supported clipboard content:
- Plain text and URLs ->
.txt - HTML/RTF text with links ->
.md - Images ->
.png - Direct PDF pasteboard data ->
.pdf - Copied Finder files and folders -> copied into the inbox with a timestamp prefix
- Explicit notes ->
.note.txtsidecars
Example inbox:
~/Quicksave Inbox/
2026-05-09T06-41-26.266Z.txt
2026-05-09T06-41-26.266Z.note.txt
2026-05-09T06-42-10.101Z.md
2026-05-09T06-43-03.512Z.png
2026-05-09T06-44-12.900Z-source-file.pdf
Requirements:
- macOS 13 or newer
- Xcode or Xcode Command Line Tools
- Swift 6-compatible toolchain
- Obsidian installed if you want daily-note appends
Build from source:
git clone https://github.com/snbafana/quicksave.git
cd quicksave
swift test
./scripts/build-dmg.shThe DMG is written to:
dist/Mac-Quicksave.dmg
Open the DMG and drag Mac Quicksave.app into /Applications.
This is currently an unsigned local build. If macOS blocks first launch, right-click Mac Quicksave.app in Finder and choose Open.
Install the companion CLI:
./scripts/install-cli.shBy default, the CLI is installed to:
~/.local/bin/quicksave
Make sure ~/.local/bin is on your shell PATH:
export PATH="$HOME/.local/bin:$PATH"Confirm the install:
quicksave config showThe menu-bar app and CLI share config through the com.snbafana.quicksave defaults domain.
Default config:
inbox=~/Quicksave Inbox
obsidian_vault=~/Documents/Obsidian-Vault
obsidian_daily_notes=~/Documents/Obsidian-Vault/Zettelkatsen
obsidian_daily_template=~/Documents/Obsidian-Vault/Templates/Daily Note.md
Set the config from the CLI:
quicksave config set \
--inbox ~/Quicksave\ Inbox \
--vault ~/Documents/Obsidian-Vault \
--daily-notes-dir ~/Documents/Obsidian-Vault/Zettelkatsen \
--daily-template ~/Documents/Obsidian-Vault/Templates/Daily\ Note.mdInspect it:
quicksave config show
quicksave obsidian todayReset only the Obsidian paths to defaults:
quicksave config reset-obsidianYou can also configure paths from the menu-bar app:
Choose Inbox...Choose Vault...Choose Daily Notes...Choose Daily Template...Reset Obsidian Config
Menu shortcuts:
Save->Option + CNote->Option + WObsidian->Option + DOpen Inbox->Option + OChoose Inbox...->Option + ,
Typical workflow:
- Copy text, an image, a PDF, or a file.
- Press
Option + C. - Quicksave writes a simple file into the inbox.
- Quicksave appends that capture into today’s Obsidian daily note.
- Press
Option + Wto add context; that note is saved as a sidecar and appended under the related capture.
The note popup is a centered minimal glass text box. It wraps across lines; press Command + Enter to save, or Escape to cancel.
Quicksave writes to the configured daily-note directory using MM-DD-YYYY.md names.
Default daily-note target:
~/Documents/Obsidian-Vault/Zettelkatsen/MM-DD-YYYY.md
Default template:
~/Documents/Obsidian-Vault/Templates/Daily Note.md
If today’s note does not exist, Quicksave renders the configured template and creates the note before appending. It first tries the Obsidian CLI:
obsidian create path=Zettelkatsen/05-09-2026.md content="<rendered template>" openIf that fails, Quicksave writes the rendered template directly so captures still land.
Quicksave does not use obsidian daily:path as the source of truth, because that can point to a different Daily Notes plugin location than the configured capture folder.
Append format:
- 12:30 PM
> copied text
- optional context noteRich text links are preserved when the clipboard exposes HTML/RTF:
- 12:30 PM
> Read [example](https://example.com) nowImages are copied into the vault media folder and embedded with Obsidian wikilinks:
- 12:30 PM
![[image.png]]Image files are stored in the configured vault at Visuals/Media, matching Obsidian's local attachment convention.
Files are copied beside the daily note and linked:
- 12:30 PM
[document.pdf](quicksave-assets/document.pdf)No ## Quicksave heading is inserted. Captures append directly into the daily note.
Append a specific capture:
quicksave obsidian append \
--capture ~/Quicksave\ Inbox/2026-05-09T06-41-26.266Z.txt \
--note "why this mattered"Append the newest inbox capture:
quicksave obsidian append-latestPrint today’s configured daily note:
quicksave obsidian todayOne-off override:
quicksave obsidian append-latest \
--daily-notes-dir /path/to/daily-notes \
--daily-template /path/to/Daily.mdIf the Obsidian CLI binary is not named obsidian, set:
export QUICKSAVE_OBSIDIAN_CLI=/path/to/obsidianBuild the app bundle:
./scripts/build-app.shRun the app:
open "dist/Mac Quicksave.app"Restart an existing development build:
pkill -f "Mac Quicksave.app/Contents/MacOS/Mac Quicksave" || true
open "dist/Mac Quicksave.app"Build the DMG:
./scripts/build-dmg.shRun tests:
swift testCurrent tests cover clipboard capture, file/folder copies, image capture, PDF capture, rich text links, note sidecars, configurable paths, Obsidian daily-note creation, image embedding, file linking, and repeated distinct captures.
src/
app/ # AppKit menu-bar app, global hotkeys, note panel
cli/ # CLI commands for config and Obsidian appends
core/ # Clipboard capture, settings, file naming, Obsidian writer
tests/ # Unit tests for capture, settings, notes, Obsidian output
scripts/
build-app.sh # Build dist/Mac Quicksave.app
build-dmg.sh # Build dist/Mac-Quicksave.dmg
install-cli.sh # Install ~/.local/bin/quicksave
Quicksave saves only explicit clipboard content and explicit notes you type. It does not inspect the screen, scrape Accessibility trees, watch the clipboard in the background, OCR images, or use browser extensions.