To-dos tucked into your MacBook's notch. Rest the pointer on the notch for a moment and a short list slides out: type, press Return, tick things off, move on. Native macOS app (SwiftUI + AppKit, macOS 14+).
Tuck has no window, no Dock icon and no menu bar item. It sits in the notch and stays out of the way until you hover. On Macs without a notch it lives, invisible, at the top center of the screen.
Tuck is open source and free. No accounts, no telemetry, no network calls except the daily update check against GitHub releases.
Download Tuck-<version>.zip from Releases, unzip, and move Tuck.app to Applications. Builds are signed and notarized. Tuck opens at login by default. Updates come through Sparkle: Tuck checks the latest GitHub release once a day and installs new versions on its own.
Or build it yourself (needs Xcode 26 / Swift 6):
git clone https://github.com/techtheoryio/tuck.git && cd tuck
scripts/build-app.sh 0.0.0 && open .build/Tuck.appFor development:
swift run Tuck # build and launch (no updates or login item outside the .app)
swift test # to-do list tests- Rest the pointer on the notch: it grows a little and a thin bar below it fills up; when it is full the list opens (1.8 s by default, adjustable in Settings). On a MacBook with a Dynamic Island a ring runs around the pill instead, and the list floats out of it. Clicking or tapping the notch opens the list right away.
- Type and press Return to add a to-do. Click one to tick it off. Right-click to delete it.
- Clear done removes ticked-off items. Esc or moving the pointer away closes the list (it stays open while you have unsent text).
- Click Tuck in the open panel for Settings (hover delay, open at login, updates) and Quit.
Bug fixes and polish are always welcome — just open a PR. For a new feature, open an issue first. Tuck is supposed to stay tiny.
- Keep the diff focused. One change per PR.
- No new dependencies (Sparkle for updates is the only one).
- Logic goes in
Sources/TuckCorewith a test inTests/TuckCoreTests;swift testmust pass.
Sources/TuckCore— the to-do list and its storage, no UI.Sources/Tuck— the notch panel (NotchController: window, hover and positioning;NotchView: SwiftUI).- To-dos live in
~/Library/Application Support/Tuck/todos.json, saved on every change. A file that can't be read is moved totodos.json.brokenrather than overwritten. - Debug:
TUCK_OPEN=1 swift run Tuckstarts with the list open and keeps it open. AddTUCK_SNAPSHOT=out.pngto write a PNG of the panel and quit.- App icon: put it atSources/Tuck/Resources/AppIcon.icns;scripts/build-app.shpicks it up. - Releasing: push a
v1.2.0-style tag;.github/workflows/release.yamlruns the tests, builds a universal.appwithscripts/build-app.sh, signs and notarizes it, and attaches the zip to a GitHub release. It also signs the zip with Sparkle's EdDSA key and attaches anappcast.xml; the app's feed URL isreleases/latest/download/appcast.xml. Secrets:DEVELOPER_ID_P12(base64.p12),DEVELOPER_ID_P12_PASSWORD,NOTARY_KEY(base64 App Store Connect.p8),NOTARY_KEY_ID,NOTARY_ISSUER_ID,SPARKLE_ED_KEY(.build/artifacts/sparkle/Sparkle/bin/generate_keys --account tuck -x key.txt; the public key is inscripts/build-app.sh).
MIT.
