A lightweight, always-available macOS companion for your Apple Notes and Apple Reminders. EdgeNoted slides in from the edge of your screen, lets you view and edit a single note instantly, and hides again — no app switching.
- Always-on-top edge panel. Slides in from the left, right, or bottom edge
and stays above other apps, full-screen apps, and Stage Manager
(
.fullScreenAuxiliarywindow behavior). - Three ways to invoke it.
- Global keyboard shortcut (default
⌃⇧N, configurable) - Click the thin "Open Bar" strip at the screen edge
- Hot Side: touch the chosen screen edge with the mouse
- Global keyboard shortcut (default
- Apple Notes, one-way writes (pull on demand). EdgeNoted does not store your notes. It lists your folders and notes, opens one note at a time, and writes your edits straight back to Apple Notes. Changes made in Apple Notes are pulled in once at startup and whenever you press the sync button in the panel; if you are editing when the remote note changes, you choose Keep Mine / Take Theirs / Open in Notes — nothing is overwritten silently.
- Apple Reminders. Browse lists, view/create/edit/complete reminders, set due dates and priorities, and quick-capture new ones. A horizon control in the panel header widens the view from overdue + due today out to overdue + 30 days, or everything.
- Themes: choose built-in themes or create your own.
- Extras: color-code preview (
#rrggbb/#rgbswatches), interactive checklists (- [ ]/- [x]). - Keyboard-first:
⌘Nnew note,Eschide, all actions keyboard-accessible. - Quit built in. No Dock or menu bar icon (by design), so quitting is explicit: the panel's power button or Settings > General > Quit EdgeNoted. Unsaved edits are flushed to Apple Notes first.
- File logging. Diagnostics are written to rolling files in
~/Library/Logs/EdgeNoted/(EdgeNoted.logrotating toEdgeNoted-1.log…EdgeNoted-5.logat ~1 MB each). Note bodies, titles, and reminder contents are never logged.
Apple Notes only exposes plain text through AppleScript. Therefore:
- Notes containing rich formatting/attachments are shown read-only with an explicit "Convert to plain text" opt-in (conversion is destructive).
- Images and attachments inside notes cannot be read or written by EdgeNoted.
- Reordering inside Apple Notes itself is not supported; order lives locally.
- This integration requires the Automation permission: the first time you use the panel, macOS asks for access to control "Notes" and "Reminders" (System Settings > Privacy & Security > Automation).
EdgeNoted is not sandboxed (the app-sandbox entitlement was removed). It
must drive other apps through Apple Events, and the sandbox prevented its
AppleScript helper from launching Notes/Reminders (-600) and blocked writes
to ~/Library/Logs. As a utility that can never be distributed on the Mac App
Store anyway, a non-sandboxed build is the correct trade-off.
Only the Xcode Command Line Tools are needed (xcode-select --install) —
full Xcode is not required. Earlier builds depended on SwiftData, whose
@Model/#Predicate macros ship only inside the full Xcode app; the local
metadata store now persists to a plain JSON file instead, so any modern Swift
toolchain can build it. The app icon is generated with sips + iconutil
rather than Xcode's actool, and xcrun is not required at all.
make build # compile with SwiftPM + create Build/EdgeNoted.app (signed)
make run # build (if needed) and launch the app
make install # build + install into ~/Applications (or double-click install.command)First launch after this change starts with fresh local metadata (folders’ ordering, pins, colors). Nothing stored in Apple Notes is affected — Apple Notes remains the only source of note content.
make backup-notes # or: bash Scripts/backup-notes.shBacks up every Apple Notes note to a timestamped folder under
~/Documents/EdgeNoted Backup/backup-<timestamp>/:
- The folder structure is mirrored (
<Folder>/<Note>.html), including nested folders; notes outside any folder land inNo Folder/. - Each note is saved as its raw HTML body (the most faithful restore format) with deduplication, safe file names, and collision handling.
- A
manifest.tsvlists folder, name, id, and file path for every note. - It is read-only on Apple Notes — it only writes inside the backup folder.
Local-only, sensitive. This backup contains your complete Notes content in plaintext. Never commit, upload, sync, or share it; the script refuses to run inside the repository to prevent accidental commits. Delete old
backup-*folders when no longer needed.
Or step by step:
swift build -c release
bash Scripts/build-app.sh
open "Build/EdgeNoted.app"make test runs the full suite via SwiftPM — no Xcode required.
brew install swiftlint periphery pre-commit
pre-commit installmake build # compile with SwiftPM + create .app bundle
make run # build and launch the app
make backup-notes # back up all Apple Notes to ~/Documents/EdgeNoted Backup
make format # auto-format all Swift files
make lint # run SwiftLint syntax rules (--strict)
make dead-code # scan every SwiftPM target for unused declarations (Periphery)
make test # run unit tests via SwiftPM
make precommit # format + lint + dead-code + testEdgeNoted/
├── App/ # App entry, AppState hub, ApplicationCoordinator (panel/hotkey wiring)
├── Windowing/ # Edge panel, Open Bar, Hot Side monitor, Carbon global hotkey
├── Integrations/ # AppleScript executor + Notes/Reminders services (protocols + AppleScript + fakes)
├── Sync/ # NoteDraftSync state machine + Debouncer
├── Persistence/ # SwiftData local metadata
├── Features/ # Panel, Notes, Reminders, Settings views
├── DesignSystem/ # Themes, hex color parsing
└── Utilities/ # Note body classifier + renderer (checklists, hex chips)
Key design decisions:
- AppleScript bridge is safe by construction. The script is a single
constant string; all user data is passed as positional
argvarguments, so note text is never interpolated into AppleScript source. Structured results come back as JSON. - Apple Notes stays the source of truth. Only opaque IDs and presentation preferences are stored locally (SwiftData). Note bodies are never persisted.
- Conflict-safe sync. Local edits are debounced and written back; a pull (startup or the panel's sync button) that observes a remote change while edits are pending raises a conflict the user resolves explicitly.
- Hermetic test mode. Launch with
-UITestFakeServices YESand the app uses in-memory fake Notes/Reminders services and disables real automation.
After building, verify with disposable content:
- First launch: approve the automation prompt for Notes and Reminders.
- Hotkey, Open Bar click, and Hot Side each show/hide the panel exactly once.
- Create/edit a text-only note in EdgeNoted and confirm it in Apple Notes; edit the same note in Notes and confirm the change is adopted after pressing the sync button (or a conflict banner appears if you were editing).
- Create/edit/complete a reminder and set a due date and priority.
- Export a note as a PNG and confirm the image renders.
MIT — see LICENSE.
