A modern, sync-ready sticky-notes app for macOS — like the built-in Stickies, but with iCloud sync across your devices, on-note color and font controls, and a cleaner UI.
- Local app — done: borderless rounded notes, hover-revealed color palette and font/size pickers, drag / resize / double-click-to-roll-up, soft-delete, persistence.
- iCloud sync — working: notes sync across your Macs via CloudKit
(
NSPersistentCloudKitContainer). Window geometry stays device-local.
.
├── Package.swift # NotesKit Swift package (model + stores)
├── Sources/NotesKit/ # platform-agnostic: Note, NoteStore, palette, fonts
├── Tests/NotesKitTests/ # round-trip tests (swift test)
└── StickySync/ # the macOS app (Xcode project)
├── StickySync.xcodeproj
└── StickySync/ # AppKit UI; links NotesKit; carries the entitlements
NotesKit is a Swift package (Foundation + CoreData, no UI framework) so the
Mac app — and a future iOS app — reuse it unchanged. Persistence sits behind a
NoteStore protocol with two implementations: JSONNoteStore (local) and
CloudKitNoteStore (Core Data + CloudKit). The Xcode app links the NotesKit
library product and supplies the AppKit UI.
Two deliberate model decisions: window geometry is device-local (never synced); colors and fonts are stored as stable tokens (not values/indexes) for light/dark theming, palette reorder-safety, and cross-device font fidelity.
open StickySync/StickySync.xcodeproj # then ⌘R, destination: My MacFor sync, the app target needs (already configured):
- iCloud → CloudKit capability, container
iCloud.design.wooj.StickySync - Push Notifications capability
- App Sandbox → Outgoing Connections (Client)
- the
CLOUDKITflag in Active Compilation Conditions (Debug + Release). Without it the app falls back to the localJSONNoteStore. - the Mac signed into iCloud.
Test the model layer without Xcode:
swift test # NotesKit round-trip testsA direct-download Mac app must be signed with a Developer ID Application certificate and notarized by Apple, or Gatekeeper blocks it. High level:
- Make sure
CLOUDKITis set for the Release config too. - Deploy the CloudKit schema to Production (CloudKit Console → Deploy Schema Changes) — distributed builds use the Production environment, not Development.
- Xcode → Product ▸ Archive → Distribute App ▸ Direct Distribution (Developer ID). Xcode signs, uploads for notarization, and staples.
- Export the notarized
.app, zip or wrap it in a.dmg, and host it. - Each recipient signs into their own iCloud account; their notes sync across their own devices (shared notes would be a later CloudKit-sharing feature).
The Mac App Store is a separate path (App Store Connect + review).
- iPhone app on the same
NotesKit. - CloudKit sharing — share a note with another person.