IITM Companion
A personal iOS app that runs an online degree's study plan: tap to start a block, a countdown on the lock screen, real hours logged, and a small Swift server that keeps it in sync.
My role: Designed and built it alone: the iOS app, its widget, the sync server and the deployment
Daily
use since 28 September 2026
1 core
of Swift shared by the app, the widget and the server
85
records matched exactly on the first sync with the live server
0
ports opened on the home network to put the server online

01
The brief
I study for the IIT Madras online BS alongside a full-time job, and the study plan lived in a calendar file. I wanted a phone app that starts each block for me, records what actually happened against the plan, and plans around what is due.
It had to work on a free Apple developer account, which rules out push notifications and iCloud and makes every install expire after seven days.
02
What I built
- Tap to start: a notification starts a block, an AlarmKit timer runs it, a Live Activity counts down on the lock screen, and the real start, pause and stop times are logged.
- A wake-up alarm through AlarmKit, which breaks through silent mode and Focus, and a wind-down reminder.
- Planned against actual hours per course every week, plus deadlines and a syllabus progress map.
- Its own calendar, rewritten from the plan whenever the plan changes, and the course's live session feeds read by an iCal parser I wrote.
- A sync server in Swift (Hummingbird and SQLite) on my home server, published through a Cloudflare Tunnel.
03
How I did it
Design first, then build28 September 2026
Layout studies came before code. The first version was about 2,600 lines of SwiftUI and SwiftData with zero warnings, and it went onto the phone the same night.
Work within the free account
No push and no iCloud meant offline-first from day one. Every record carries an ID, an updated time and a soft delete, so syncing could be added later without a migration. Local notifications refill a rolling window each time the app opens, because iOS caps how many can be pending.
One brain, three places12 October 2026
The plan logic lives in a Foundation-only Swift core compiled into the app, the widget and the server, so all three compute the same plan. The server keeps SQLite inside a single actor so transactions can't interleave. It went live on 12 October, and the phone's first sync sent 85 records that matched its own data file exactly.
Safe to expose
The server runs in Docker on my home server behind a Cloudflare Tunnel, so nothing is opened on the home network. Separate tokens cover the phone, my Mac work log and admin.
Make it feel designed12 October 2026
When the app felt bare, two rounds of layout studies picked a new Home countdown, a full-screen focus ring and a syllabus progress map, then the screens were rebuilt to match.
04
What it changed
Study blocks start on time and the hours are real, not remembered. Each week's review reads actual numbers, and the plan adjusts to what is due next, on the phone and the server alike.
At a glance
A personal iOS app that runs my IIT Madras study plan: tap to start a block, a lock-screen countdown, and planned versus actual hours every week.
- In daily use since 28 Sep 2026; the sync server has been live since 12 Oct
- AlarmKit timers and Live Activities that break through silent mode and Focus
- A gradual wake-up ramp, wake log and wind-down
- Writes the plan to its own calendar and keeps it in sync
- Planned versus actual hours per course, exported for a weekly review
- Sync server in Swift that shares the app's core code, live on my home server behind a Cloudflare tunnel