Skip to content

About

Native iOS + macOS AI to-do & planner on the App Store: speak or type to add or change tasks and appointments (on-device Apple Intelligence), colour-coded priorities, calendar with Singapore holidays, alerts and iCloud sync. Agent reports with replies on iPhone and Mac; the Mac adds a Hermes terminal and AI agents. SwiftUI + SwiftData.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Tertiary Planner — AI To-Do & Planner for iOS & macOS

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.

Download on the App Store   Download for Mac (DMG)

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.

Tertiary Planner — month calendar with appointments written into each day

Features

  • 🗓️ 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: delete archives 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).

Tech Stack

Swift SwiftUI SwiftData Speech XcodeGen

  • 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: IntentAssistant uses Apple's on-device FoundationModels (Apple Intelligence, iOS 26+) for intent classification and title wording, falling back to SmartParser (NSDataDetector + NaturalLanguage). Dates always come from the deterministic parser so clock math never hallucinates.
  • Notifications: UserNotifications local alerts only — advance reminders, the morning summary and per-appointment alerts, kept under iOS's 64-pending-request limit.
  • Project: generated from project.yml via XcodeGen. The app icons are drawn by scripts/icon/make_icon.py (Pillow).

Architecture

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

Getting Started

# Requirements: Xcode 16+ (iOS 17 SDK), XcodeGen (brew install xcodegen)
xcodegen generate
open PlannerApp.xcodeproj

Build & run on the iPhone 17 Pro simulator, or select your device.

Tests

# 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.swift

Enabling iCloud sync on a device

The default device build installs with local storage. To turn on iCloud sync:

  1. In Xcode → Settings → Accounts, add your Apple ID (Apple Developer Program team).
  2. Select the PlannerApp target → Signing & Capabilities; Xcode registers the iCloud + Push Notifications capabilities declared in PlannerApp.entitlements and creates the iCloud.com.tertiaryinfotech.plannerapp container.
  3. Ensure CODE_SIGN_ENTITLEMENTS points at PlannerApp/PlannerApp.entitlements in project.yml, then rebuild.

Permissions

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.

Acknowledgements

Developed by Tertiary Infotech Academy Pte Ltd — tertiaryinfotech.com


🤖 Built with Claude Code

About

Native iOS + macOS AI to-do & planner on the App Store: speak or type to add or change tasks and appointments (on-device Apple Intelligence), colour-coded priorities, calendar with Singapore holidays, alerts and iCloud sync. Agent reports with replies on iPhone and Mac; the Mac adds a Hermes terminal and AI agents. SwiftUI + SwiftData.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages