A native iOS + macOS app for managing to-dos and appointments by voice or touch. Speak naturally — "Lunch with Sam tomorrow at 1pm" — and on-device intelligence turns it into a scheduled appointment; "Buy groceries" becomes a to-do. See every appointment written into a month calendar (with Singapore public holidays marked), check what's Upcoming day by day, get a morning summary of today's appointments, and organize everything into your own lists — all synced across your iPhone and Mac through your personal iCloud, with full undo.
iPhone / iPad: get it on the App Store. Mac: download the DMG, open it, and drag Planner onto Applications — no App Store needed. Both apps sync through the same private iCloud database.
- 🗓️ One Planner page, two tabs — To-Do (All Tasks · Pinned Tasks) and Appointment (Today · Upcoming) sit as top tabs on a single page, so a list never mixes the two kinds.
- ⏭️ Upcoming, by date — everything with a date, broken down into Today, Tomorrow and each day after, with anything overdue gathered on top. Same view on the Mac sidebar.
- 📅 Month calendar — each day's appointments are written right into the grid (with times on iPad and Mac), the selected day's agenda sits underneath, and a List view shows every appointment grouped by day, opened at today. Swipe (iPhone) or use the arrows to change month; long-press (iPhone) or double-click (Mac) a day to add an appointment there.
- 🇸🇬 Singapore public holidays — marked in red on the calendar with their names, including the observed Monday when a holiday falls on a Sunday. Dates come from the Ministry of Manpower list (2025–2027), bundled so the calendar works offline.
- 🎥 Meeting links — paste a Google Meet, Zoom or Teams link into an appointment's Meeting link field and a Join meeting button appears on it (calendar too); links already in the notes are picked up automatically. The link is kept in the notes, so it syncs everywhere, and it's included in the alerts and WhatsApp digests.
- ⏰ Today's appointments alert (iPhone) — a morning summary of the day's appointments (8 am by default, adjustable; quiet days stay quiet) plus an alert just before each of your own appointments (15 minutes by default, or at start / 5 / 30 / 60 minutes / off).
- 🔔 Advance reminders — a heads-up before anything with a date is due: 3 days ahead by default, or 1 day / 1 week. All alerts are local notifications, re-armed whenever items change (including iCloud edits from another device) and shown even while the app is open.
- 🎨 Choose your look (iPhone) — Light, Dark or System appearance, and eight accent colours (Indigo, Red, Blue, Green, Orange, Purple, Pink, Teal) in Settings ▸ Appearance. The Mac has its own Light/Dark toggle (⇧⌘D) and default in Settings.
- 💬 Capture bar — a chatbot-style bar at the bottom of the Planner: type or dictate what you need and the assistant drafts a nicely worded entry and saves it instantly; the new row is the feedback, and the toolbar Undo takes it back.
- 🍎 Apple Intelligence on-device — on iOS/macOS 26+ devices with the system model, the assistant uses Apple's FoundationModels framework to classify and word entries; everywhere else it falls back to the deterministic parser. Both paths are fully local. Dates always come from the deterministic parser, and a date on a to-do is a deadline, not a promotion to appointment.
- ✍️ Typo-tolerant titles — the assistant fixes spelling as it writes an item ("sumit ato" → "Submit ATO"), but never adds words you didn't type.
- 🔁 Change appointments by voice or text — say or type "move the Claude exam to 8pm" or "postpone UOB training to Friday" and the existing appointment is changed instead of a new one being added. A time alone keeps the day; a day alone keeps the time.
- 🎙️ Voice capture — tap the mic, speak, and native speech-to-text transcribes it.
- ✏️ Tap to edit — tap any item to change its title, notes, type, date, list or assignee in the same form used to create it.
- 🔎 Search — find anything active by keyword across titles, notes, assignee and list name; words match in any order. Archived items are never searched.
- 👯 Duplicate check — spots the same title on the same day and offers to archive the extra copies, keeping the original. Multi-day courses (same title, different days) are left alone.
- 🗂 Your own lists and sub-lists — create, rename, nest and delete lists ("Clients" ▸ each client); a parent list shows its own items plus everything in its sub-lists. Move an item to another list from its menu (iPhone) or by dragging it onto the sidebar (Mac).
- 🔽 Collapse & expand — fold a group shut with its chevron, or collapse/expand every list at once from the Mac sidebar or the Manage Lists toolbar on iPhone.
↕️ Drag to rearrange — hold and drag to-dos, appointments and lists into any order; the custom order syncs across devices.- 🚩 To-Do priorities — mark a to-do Critical, High, Medium or Low from the flag on its row, the edit form or its menu; to-dos sort by priority, and Critical and High are pinned automatically (lowering them unpins). Each level has its colour — Critical red, High orange, Medium blue, Low green — on the flag, the badge and every priority menu. The Hermes agent can set it too.
- 📌 Pin to top — tap the pin on a row (or swipe right on iPhone); pinned entries float above the rest, and the Pinned view collects them.
- 👤 Delegate with Assign to — put someone's name on an item and it leaves your queue: the smart views show only your own work (unassigned, or assigned to you), while that person's list shows theirs. Set who "you" are in Settings ▸ Me.
- 📆 Mirror to your system Calendar — optionally copy dated appointments into any calendar you pick, including a Google account added in iOS Settings; EventKit only, off until enabled.
- ❓ "Did this happen?" — an appointment that's over but never ticked asks instead of judging, with Yes, it happened, Cancelled, Rescheduled and Reply / comment. Cancelled crosses it out (with Undo); Rescheduled picks a new date and time, moves the appointment and its calendar event, and notes where it moved from. A comment opens right under the row, is saved in the appointment's notes and syncs to every device. On the Mac, Atlas (the Digital Workforce schedule agent) answers each comment on the spot: it checks Gmail, Calendar and Planner, says what to do next and saves any message as an unsent Gmail draft. Its answer appears under your comment on the iPhone too.
- ✅ Follow-up actions — add follow-up to-dos straight from an appointment; they show under it and in your To-Do queue.
- 📥 Auto-archive — checking off an item moves it to the Archive; uncheck to restore.
- ↩️ Undo everywhere — ⌘Z on the Mac, the Undo toolbar button on iPhone.
- ☁️ iCloud sync — SwiftData + CloudKit mirrors your data to your private iCloud database across iPhone, iPad and Mac, with a live sync status, last-sync time and Sync Now in Settings, plus a refresh button on the iPhone Calendar and report pages and pull-to-refresh on the Planner, Calendar and Updates tabs. The Calendar shows when the phone last synced, so stale data is easy to spot.
- 🖥 macOS desktop edition — a two-column Mac app: smart views (To-Do, Pinned, Today,
Upcoming, Appointments, Calendar) and your lists in the sidebar, the item list with the
capture bar on the right. Distributed as a
DMG; build it
yourself with
./scripts/build-macos-dmg.sh. - 💚 WhatsApp digests (Mac) — today's appointments at 8 am and tomorrow's at 3 pm (times adjustable), sent automatically through the Hermes WhatsApp bridge or opened in WhatsApp for you to send. Set the recipient number in Settings — none is built in.
- 🤖 Hermes agent terminal (Mac) — a collapsible right-hand panel (⌥⌘T) embeds a real
terminal (SwiftTerm) that auto-starts the
Hermes Agent CLI. Ask it in plain language —
"add buy milk tomorrow", "move the n8n task to AI-LMS-TMS", "mark it done" — and it
edits your planner through a local command bridge (a file inbox the open window answers),
reading live state from an auto-maintained JSON snapshot. The agent cannot delete your
data by default:
deletearchives instead and deleting a list is refused; opt in via Settings ▸ Agent safety. - 📰 Updates (iPhone + Mac) — read the Digital Workforce agents' reports (Morning Brief, daily previews, weekly reviews) in Planner ▸ Updates, newest first and grouped by day. Reply under any card, from either device; on the Mac the agent that wrote the report answers right away, and every reply is handed to the agents' next run. Replies synced in from the other device appear under their card, and a brief re-published on the Mac reloads on the iPhone; pull down (or tap ↻) on a report to fetch the latest from iCloud.
- 🧑💼 Digital Workforce (Mac) — each agent's profile and org chart, a chat with any agent, and a Schedule view of every background job on the Mac (workforce LaunchAgents, Hermes and OpenClaw cron, WhatsApp reminders). The agent panel has a built-in Browser tab for reports and claude.ai artifacts.
- 💬 Feedback & About — house-style tabs (WhatsApp feedback, developer info, version).
- UI: SwiftUI, Human Interface Guidelines, SF Symbols, Dynamic Type; user-selectable Light/Dark/System appearance and accent colour.
- Persistence & sync: SwiftData with automatic CloudKit mirroring (private database).
- Voice:
SFSpeechRecognizer+AVAudioEngine(prefers on-device recognition); the audio engine is created lazily so no microphone prompt appears until dictation is actually used. - Intelligence:
IntentAssistantuses Apple's on-device FoundationModels (Apple Intelligence, iOS 26+) for intent classification and title wording, falling back toSmartParser(NSDataDetector+NaturalLanguage). Dates always come from the deterministic parser so clock math never hallucinates. - Notifications:
UserNotificationslocal alerts only — advance reminders, the morning summary and per-appointment alerts, kept under iOS's 64-pending-request limit. - Project: generated from
project.ymlvia XcodeGen. The app icons are drawn byscripts/icon/make_icon.py(Pillow).
PlannerApp/ — iOS app + code shared with the Mac target
├── App/ PlannerApp.swift — @main, SwiftData + CloudKit container,
│ foreground notification presenter
├── Models/ PlannerItem.swift — CloudKit-safe model (task | appointment)
│ PlannerList.swift — user-created list (items kept on delete)
│ PlannerCategory.swift — smart views (To-Do, Pinned, Today, Upcoming…)
│ DaySections.swift — Upcoming's by-date grouping (Overdue first)
│ SingaporeHolidays.swift — MOM public-holiday table for the calendars
│ MeetingLink.swift — find/set an appointment's video-meeting link
│ ManualOrder.swift — synced drag-rearrange ordering helper
│ AppointmentComments.swift — "Reply / comment" lines + agent answers in notes
│ FollowUpActions.swift — follow-up to-dos linked to an appointment
│ AgentUpdates.swift — synced agent reports (AgentReport) + replies
│ ReportPresentation.swift — report titles and ordering
│ ListHierarchy.swift — nested sub-list outline + drag-to-nest logic
│ ChatMessage.swift — assistant conversation turn
├── Services/ IntentAssistant.swift — on-device Apple Intelligence drafting (26+)
│ SmartParser.swift — deterministic date/time + intent parsing
│ SpeechRecognizer.swift — native speech-to-text (cross-platform)
│ ReminderScheduler.swift — advance "N days before" alerts; rebuilds all alerts
│ TodayAlerts.swift — morning summary + alert before each appointment
│ CalendarSync.swift — mirrors appointments into the system Calendar
│ CloudSyncStatus.swift — iCloud account + last-sync status, Sync Now
│ PlannerCommand.swift — assistant command router (15 verbs, on-device)
│ DuplicateAudit.swift — same-title-same-day duplicate detection
│ ModelUndoSupport.swift — system undo/redo for all SwiftData changes
├── Theme/ Theme.swift — colour tokens, accent themes, appearance choice
└── Views/ MainTabView, TodoListView (Planner: To-Do | Appointment), CalendarView
(month grid + list), ArchiveView, AddItemView, ListsManagerView
(+ ListDetailView), RemindersSettingsView (Settings), ItemRow,
FollowUpActionsView, UpdatesView,
VoiceCaptureView, AssistantChatView (not currently shown), FeedbackView,
AboutView
PlannerAppMac/ — macOS desktop edition (DMG)
├── App/ PlannerMacApp.swift — @main, same schema + iCloud container
├── Services/ HermesBridge.swift — command bridge (file inbox/outbox) + JSON state
│ snapshot + Hermes skill/AGENTS.md workspace
│ WhatsAppReminders.swift — daily WhatsApp digests of appointments
│ AppearanceController.swift — Light/Dark/System for the Mac app
│ UpdatesSync.swift — agent reports → iCloud; replies → the agents
│ AppointmentAgent.swift — Atlas answers appointment comments
│ AgentRoster.swift — the agents in ~/.claude/agents
│ AgentChat.swift — chat sessions with an agent
│ PowerSettings.swift — daily wake / power-on schedule
└── Views/ MacRootView.swift — sidebar: smart views + user lists + sync badge
MacPlannerPane.swift — item list (Upcoming by date) + capture bar
MacCalendarPane.swift — month grid / list calendar with holidays
MacTerminalPanel.swift — collapsible SwiftTerm panel running hermes
MacBrowserPanel.swift — agent panel's Browser tab (reports, replies)
MacUpdatesPane.swift — report history, grouped by day
MacSchedulePane.swift — every scheduled background job on this Mac
MacAgentProfileView.swift, MacAgentChatView.swift,
DigitalWorkforceArtifactView.swift — agent profiles, org chart, chat
MacSettingsPane.swift — owner, appearance, WhatsApp, agent safety
PlannerAppUITests/ — iOS UI tests (navigation, appointment edits)
scripts/build-macos-dmg.sh — Release build → signed, notarized DMG
scripts/test-*.swift — standalone regression tests (capture-bar edits,
follow-up actions)
scripts/icon/make_icon.py — draws the iOS + Mac app icons
# Requirements: Xcode 16+ (iOS 17 SDK), XcodeGen (brew install xcodegen)
xcodegen generate
open PlannerApp.xcodeprojBuild & run on the iPhone 17 Pro simulator, or select your device.
# UI tests (iOS simulator)
xcodebuild test -project PlannerApp.xcodeproj -scheme PlannerApp \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro'
# Standalone regression tests (no simulator) — the run line is at the top of each file
head -3 scripts/test-capture-edits.swift scripts/test-follow-up-actions.swiftThe default device build installs with local storage. To turn on iCloud sync:
- In Xcode → Settings → Accounts, add your Apple ID (Apple Developer Program team).
- Select the PlannerApp target → Signing & Capabilities; Xcode registers the
iCloud + Push Notifications capabilities declared in
PlannerApp.entitlementsand creates theiCloud.com.tertiaryinfotech.plannerappcontainer. - Ensure
CODE_SIGN_ENTITLEMENTSpoints atPlannerApp/PlannerApp.entitlementsinproject.yml, then rebuild.
The app requests Microphone and Speech Recognition access only when you first use voice capture (transcription prefers Apple's on-device engine), Notifications for the reminders and today's-appointment alerts, and Calendar access only if you turn on calendar mirroring.
Developed by Tertiary Infotech Academy Pte Ltd — tertiaryinfotech.com
🤖 Built with Claude Code
