This file is for people and coding agents making changes in this repository.
Spool is a native macOS menu bar app.
Core product constraints:
- menu bar-only by default
- no Dock icon during normal use
- transcript-first workflow
- Markdown summary output
- user-selected output directory
- OpenAI-backed summarization
Do not turn this into a web app, Electron app, or multi-platform abstraction project.
- Swift Package Manager
- Swift 6
- AppKit menu bar shell with SwiftUI settings UI
FluidAudiofor transcription-related audio pipeline support
The app is packaged as a macOS app bundle by scripts/build_swift_app.sh, not by an Xcode project.
Sources/Spool/AppSources/Spool/AudioSources/Spool/TranscriptionSources/Spool/SummarySources/Spool/ServicesSources/Spool/Viewsscripts/build_swift_app.sh
Compile:
swift buildPackage and install:
bash scripts/build_swift_app.shRun:
open /Applications/Spool.appThe build script installs to /Applications/Spool.app. Do not quietly change that workflow without a strong reason.
- Keep
.build/,dist/, and other local artifacts out of git. - Do not commit API keys, Keychain exports, transcripts, or test call artifacts.
- Do not hard-code user-specific filesystem paths.
- Keep bundle identifiers, entitlements, and
Info.plistaligned. - Preserve the menu bar-only behavior unless there is an explicit product change.
This app depends on macOS privacy permissions.
Be careful when changing:
- microphone access
- system audio recording access
- startup permission checks
- menu state shown when permissions are missing
Small permission regressions can make the app feel broken even when the underlying pipeline still works.
- The OpenAI API key belongs in Keychain.
- Do not move API key storage into plist files, defaults, or checked-in config.
- If you add new provider settings, assume this repo may be public.
Each recording session can generate:
session.jsonevents.jsonllogs.txttranscript.raw.txttranscript.txt- a Markdown summary
Changes to session naming, folder naming, or summary naming should be made carefully because they affect the user’s filesystem organization.
Current default:
- provider: OpenAI
- model:
gpt-5-nano
If you change prompts, naming heuristics, or summary parsing, verify:
- the summary still writes valid Markdown
- the title is not generic when the transcript has enough context
- session rename behavior still works
Global hotkeys are intentionally not a current priority.
- Do not reintroduce fake or non-functional shortcut labels.
- If you add real global hotkeys later, make sure they are actually wired and permission-safe.
- Keep the app visually quiet.
- Prefer stability over cleverness in the menu bar.
- Avoid status item jitter, resizing, or icon swaps that make the icon disappear.
- The menu should always reflect the real recording state.
At minimum:
- Run
swift build. - If the change affects the shipped app, run
bash scripts/build_swift_app.sh. - If the change affects runtime behavior, relaunch
/Applications/Spool.app. - Check that you did not introduce user-specific paths, secrets, or generated artifacts into git.
Safe areas to improve:
- summary prompt quality
- session naming quality
- error reporting and logs
- settings UX
- release packaging and signing
Areas to treat carefully:
- system audio capture
- permission startup flow
- status item lifecycle
- app bundle structure