Catch fleeting thoughts before they slip away.
A menu barโresident macOS app for capturing thoughts: hit a global shortcut, type, press return.
English ยท ไธญๆ
While coding, reading docs, or sitting in a meeting, ideas flash by: a possible cause for a bug, a small improvement, a message to send, an email to reply to. They vanish in seconds.
Opening Notion / Apple Notes / Bear is too heavy โ switch apps, find the notebook, place the cursor, type, save, switch back, and the thread of thought is already broken.
Quick Thoughts does exactly one thing: from any app, โฅโT โ type โ Enter, three steps. Light enough not to interrupt your flow, structured enough to browse / search / clean up later.
- โจ๏ธ Global hotkey (default
โฅโT, customizable) โ never break the current flow - ๐ Spotlight-style popup: multi-line input,
Enterto save,Shift+Enterfor newline,Escto cancel - ๐ Draft preservation: closing the popup (clicking outside / Esc) keeps your text for next time
- ๐ Full-text search: instant filtering in the main panel, case-insensitive
- โ๏ธ Inline edit / delete: hover-revealed actions, delete asks for confirmation
- ๐พ Single-file JSON storage: easy to back up, migrate, grep
- ๐ก๏ธ Crash-safe: atomic writes, auto-backup of corrupt files, schema version guard
- ๐ Light / dark adaptive: follows the system appearance
- ๐ Bilingual UI: English + ็ฎไฝไธญๆ, switch in Settings
- ๐ชถ Featherweight: menu barโonly, no Dock icon, native Swift + SwiftUI, no Electron baggage
- Runtime: macOS 13.0 or later
- Build from source: full Xcode (free, Mac App Store).
- Command Line Tools alone (
xcode-select --install) is not enough: theKeyboardShortcutsdependency uses#Previewmacros (needs the Xcode macro plugin), andswift testneeds Xcode's bundled XCTest framework. - After installing Xcode, let it install additional components on first launch, then switch the toolchain:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
- Command Line Tools alone (
First release pending.
- Grab the latest
Quick-Thoughts-x.y.z.zipfrom Releases - Unzip, drag
Quick Thoughts.appto/Applications - First launch: right-click โ Open โ click Open in the warning dialog (one-time Gatekeeper bypass since the app isn't notarized yet; double-click works thereafter)
git clone https://github.com/ruanwenjun/quick-thoughts.git
cd quick-thoughts
make install # โ /Applications, requires sudo
# or sudo-free:
make install-user # โ ~/Applicationsmake install runs a release build, produces the .app bundle, ad-hoc signs it, and copies it to the target directory.
| Action | Shortcut |
|---|---|
| Open capture popup | โฅโT (configurable) |
| Newline in popup | Shift+Enter |
| Save & close popup | Enter |
| Cancel popup (keep draft) | Esc |
| Open Settings | โ, |
Click the menu bar icon for "New Thought / Open Panel / Settingsโฆ / Quit".
In the main panel, hover any row to reveal โ๏ธ edit and ๐๏ธ delete (delete shows an inline confirmation first to prevent mistakes); the toolbar search box filters in real time.
The Settings window has a Language picker โ Auto / English / ไธญๆ. Auto follows the system language (Chinese variants โ ไธญๆ, otherwise English).
The recommended path is to add Quick Thoughts under System Settings โ General โ Login Items.
Settings also has a "Launch at login" toggle (built on
SMAppService), but that API needs a properly signed app to work reliably; with the current ad-hocโsigned build it may fail โ the inline red error is expected. The System Settings approach is more reliable.
~/Library/Application Support/QuickThoughts/thoughts.json
A simple, stable format โ easy to back up, grep, or migrate by hand:
{
"schemaVersion": 1,
"thoughts": [
{
"id": "5C9E1F8A-...",
"content": "Saw a nice design today",
"createdAt": "2026-05-09T10:23:45Z",
"updatedAt": "2026-05-09T10:23:45Z"
}
]
}Settings shows the current path with a "Show in Finder" button.
File I/O strategy:
- Atomic writes: write
thoughts.json.tmpfirst, thenreplaceItemAt/moveItemโ a crash doesn't lose the previous file - Debounced: continuous edits flush 500 ms after the last keystroke; a forced flush runs on
willTerminate - Corruption recovery: JSON decode failure โ backs up the original as
thoughts.json.corrupt-<timestamp>-<uuid>, starts with an empty database - Schema guard: reading a higher
schemaVersionthan supported aborts writes and prompts the user to upgrade
v1 shipped: capture, browse, search, edit, delete, settings, JSON persistence, menu bar app, Spotlight-style popup, card-style main panel, bilingual UI.
Explicitly not in v1 (YAGNI): iCloud sync, iOS / web clients, tags / folders, rich text / Markdown rendering, image attachments, reminders / alarms, multi-account.
Possible future work (issues / discussion welcome):
- Apple Developer signing + notarization โ double-click
.dmginstall, stableSMAppServicelaunch-at-login - Homebrew Cask (
brew install --cask quick-thoughts) - GitHub Actions CI: tag โ build / sign / publish Release
- Tags / lightweight Markdown rendering
- Export / one-click zip backup
make build # swift build (debug)
make test # swift test โ 16 cases covering the data layer
make run # swift run (terminal blocks; closing it kills the app)
make bundle # bundle .app into dist/ only
make uninstall # remove the installed .app
make clean # wipe .build / distSources/QuickThoughts/
โโโ QuickThoughtsApp.swift entry; MenuBarExtra + Window + Settings
โโโ Models/Thought.swift data model
โโโ Storage/
โ โโโ JSONFileRepository.swift atomic write, corruption backup, schema guard
โ โโโ ThoughtStore.swift ObservableObject + CRUD + debounced flush
โโโ Features/
โ โโโ MenuBarContent.swift menu bar menu
โ โโโ Capture/ capture popup (NSPanel + NSTextView bridge)
โ โโโ Browse/ main panel + card row
โโโ Localization/ bilingual UI (Auto / English / ไธญๆ)
โโโ Settings/ shortcut Recorder + login launch
One runtime dependency: KeyboardShortcuts โ global shortcut registration + SwiftUI Recorder component.
ThoughtTests Codable round-trip
JSONFileRepositoryTests read / write / missing file / corrupt file / higher schema / nested dirs
ThoughtStoreTests CRUD / whitespace trim / search / sort / flush / fatalLoadError
UI is not unit-tested; relies on manual smoke testing. Please attach before/after screenshots in PRs that touch UI.
Issues and PRs are welcome. Before submitting:
make testpassesmake buildhas no new warnings- Keep changes surgical โ don't "improve" unrelated code along the way
- UI changes should include before/after screenshots
- Use lowercase verb-prefixed commits (
feat:/fix:/style:/chore:etc.)
Apache License 2.0 ยฉ 2026 ruanwenjun
- Sindre Sorhus' KeyboardShortcuts โ global shortcuts + recording UI with nearly zero code
- macOS native
MenuBarExtra/NSPanel/Settingsscenes โ the menu bar app substrate