Closing the panel only hid it, and launching the app again did nothing because the running instance ignored the reopen, so it looked like the app refused to exit. Reopening now shows the panel, and the main menu makes Cmd+Q and Cmd+W work while the panel has focus. Termination also tears down the event tap, hotkeys and sync timers instead of leaving them live.
Prompt
A native macOS app for keeping prompts and photos, in the spirit of Copper by shadcn: a floating panel that sits next to your work. Click anything to copy it back to your clipboard.
- Click to copy — text notes go back as text, photos go back as images.
- Capture from anywhere — select text in any app and tap Left Shift twice.
- Photos — paste (Cmd+V), drag & drop, or add via the photo button.
- Sections — type
# Namein the composer; Cmd+K switches sections. - Copy as List — Cmd+click to multi-select, right-click → Copy as List (or Shift+Cmd+C) for a numbered list ready to paste into a chat.
- Merge Notes, Mark as Done, Edit, Move To — right-click any item.
- Search — Cmd+F searches across all sections.
- Sync (optional) — generate an 8-digit code (
1234-5678) on one Mac and enter it on the other; no account, no login. The code is the only secret. - Local & private — everything lives in
~/Library/Application Support/Prompt/(store.json+Images/). No account, no sync, no telemetry.
Shortcuts
| Action | Shortcut |
|---|---|
| Capture current selection | Left Shift ×2 (or Cmd+Shift+C) |
| Show/hide panel | Right Shift ×2 (or Cmd+Shift+Space) |
| Switch/create section | Cmd+K |
| Search | Cmd+F |
| Focus composer | Cmd+N |
| Sync settings | Cmd+, |
| Copy selection as numbered list | Shift+Cmd+C |
| Close panel | Esc |
Double-Shift gestures require Accessibility access (Prompt reads the selection by simulating Cmd+C, then restores your clipboard untouched). The Cmd+Shift fallbacks work without it. Bare keys like Space and Cmd+C are deliberately not bound inside the panel so they never conflict with typing in the composer.
Install
brew tap TZGyn/tap https://gitea.tzgyn.dev/TZGyn/homebrew-tap.git
brew trust TZGyn/tap
brew install --cask prompt
Sync server
Sync is optional and needs the small Go backend in Server/. There is no
authentication: a sync group is identified by an 8-digit code, and whoever has
the code can read and write the group.
createdb prompt_sync
cd Server
PROMPT_SYNC_DATABASE_URL="postgres://localhost:5432/prompt_sync?sslmode=disable" \
go run . # listens on :8080
Or build the Docker image (docker build -t prompt-sync Server/) and point it
at your own Postgres — see Server/README.md for that and for
deploying to a host.
Then in the panel: click the sync icon (or Cmd+,), confirm the server URL, and either Generate Code on the first Mac or paste the code into Join on the other.
Notes:
- Sync defaults to
https://prompt.tzgyn.dev; change it in the sync panel to point at your own server. Both Macs must be able to reach it — a LAN address or a Tailscale hostname works, andlocalhostonly works if the server runs on the same Mac. See Server/README.md to deploy it. - Joining a group that already has notes replaces what's on that Mac.
- The app polls every 5 seconds (a tiny version check) and pushes 1.5s after a change; last write wins, and changes that came from the server are not echoed back.
- Verify sync from a terminal with
Prompt --sync-check.
Build from source
swift build # debug build
swift run Prompt # dev run (menu bar icon appears)
./build-app.sh 0.1.0 # release build + Prompt.app + icon + codesign
./release.sh 0.1.0 # build + dist/Prompt.zip (+ notarization when configured)
Requires macOS 14+.