尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Daily planner for iPhone you can drive from Siri. SwiftUI, SwiftData and App Intents, with swipe-to-complete, streaks and progress charts.
翻译准备中
正在加载完整 README。
查看完整 README ↗A focused daily planner for iPhone, built with SwiftUI and SwiftData. Plan what you're getting done today, check things off with a swipe, keep a streak going, and see how your week and month are tracking. You can also do it hands-free through Siri and Shortcuts.
Case study: How Launch Control is designed and built on my portfolio, covering the architecture, code decisions and trade-offs.
The repository is named
Daily-Protocol. The app and Xcode project are named Launch Control.
The app is a vertical pager. Swipe up or down to move between screens. The pager only takes over once the current screen's content has scrolled to its edge, so it doesn't fight with scrolling inside a screen.
| Screen | What it does |
|---|---|
| Protocol | Today's events, the date, and your current 🔥 streak |
| Calendar | Pick any date to see, add, and manage its events |
| Completion | Weekly bar chart of completed vs. total events, plus a 4-week monthly view and remaining-event counts |
StreakCalculator counts consecutive days that have at least one completed event. If you haven't completed anything yet today, the count starts from yesterday, so your streak doesn't reset to 0 the moment a new day starts.
Reminders are scheduled with UNCalendarNotificationTrigger and use a custom notification category. Tapping Mark Complete on the notification updates the event in SwiftData without opening the app.
| Intent | Example phrase |
|---|---|
| Add Event for Today | "Add event for today in Launch Control" |
| Mark Event Complete | "Mark [event] done in Launch Control" |
| Remove Event | "Remove [event] in Launch Control" |
| Today's Events | "What do I have today in Launch Control" |
Events are exposed to Siri as an AppEntity with an EntityQuery / EntityStringQuery, so Siri can suggest today's open events and search events by title.
All data stays on the device. The app has no accounts, no network calls, and no analytics. It ships with a PrivacyInfo.xcprivacy privacy manifest that declares no collected data types.
SwiftUI Views ──► EventEditor (editing state + actions) ──► SwiftData ModelContext
│ ▲
└── CompletionCalculator / StreakCalculator (pure logic) │
│
App Intents (Siri) ──► IntentContainer (actor) ─────────────────┤
Notification action ──► EventNotificationDelegate ──────────────┘
Shared store in the App Group: group.AA.Launch-Control
LaunchControl.store file in an App Group container, so changes made through Siri or a notification show up in the app right away.EntityQuery methods outside the main actor. A private IntentContainer actor creates the ModelContainer once and safely hands it to any async context.Calendar and reference date.Launch Control/
├── Launch_ControlApp.swift # App entry, ModelContainer setup + recovery
├── ContentView.swift # Vertical pager across the three screens
├── SiriIntents.swift # App Intents, AppEntity, EntityQuery, Shortcuts
├── Models/
│ ├── Event.swift # SwiftData @Model
│ ├── EventEditor.swift # Add / edit / complete / delete logic
│ ├── StreakCalculator.swift
│ ├── CompletionCalculator.swift
│ ├── AppearanceMode.swift
│ └── ActionButtonSide.swift
├── Features/
│ ├── Protocol/ # Today
│ ├── Calendar/
│ ├── Completion/ # Weekly + monthly views
│ └── Settings/
└── Components/ # Sheets, buttons, notifications, colors, pager helpers
Launch ControlTests/ # Unit tests (Swift Testing)
Launch ControlUITests/ # UI tests (XCUITest)
@Test). They cover EventEditor, event display formatting, appearance and button-side settings, and the pager's scroll-edge logic.-uiTestReset, the app wipes its SwiftData store and UserDefaults so every UI test starts from the same empty state.Run them in Xcode with ⌘U, or from the command line:
xcodebuild test \
-project "Launch Control.xcodeproj" \
-scheme "Launch Control" \
-destination "platform=iOS Simulator,name=iPhone 17"
git clone https://github.com/arturoa925/Daily-Protocol.git
cd Daily-Protocol
open "Launch Control.xcodeproj"
AA.Launch-Control) and the App Group (group.AA.Launch-Control) to IDs your team owns, and update the App Group ID in Launch_ControlApp.swift and SiriIntents.swift to match.Siri phrases can take a moment to register after the first install. You can also find the actions in the Shortcuts app.
SwiftUI · SwiftData · App Intents · UserNotifications · Swift Concurrency (actors) · OSLog · Swift Testing · XCUITest