Drawing 02.2, community platform
Biblical Battle Plans
A Bible reading tracker built like a role-playing game: reading plans, streaks, XP, guilds, and a journal. A web app that works offline, with a native iOS app in testing on the same API.
| No. | Part | What it does here |
|---|---|---|
| 1 | Web app | Plans, streaks, guilds, and the journal, with offline reading that syncs when it reconnects. |
| 2 | iOS app (in build) | The native SwiftUI client in TestFlight, built on Swift types generated from the web's contracts. |
| 3 | Next.js API | About 75 route handlers over one services package; sessions for the web, bearer tokens for iOS. |
| 4 | Neon Postgres | Readers, plans, progress, guilds, chat, device tokens, and the error log, through Drizzle. |
| 5 | Vercel Cron | Hourly reading reminders and a nightly streak warning. |
| 6 | APNs, Web Push | Delivers the reminders to phones and browsers. |
Why it exists
I wanted a Bible reading tool that felt like a game, not a chore. Nothing like it existed, so I built it.
What went wrong, and what it taught me
It hit its limits around a hundred users: no test environment, and the rules of the game buried in database queries. I rebuilt it as version two, with the rules in one services package behind the app's API routes, covered by tests, and with every error logged, flagged in Slack, and summarized for me by Claude when I ask.
That rebuild is paying off twice. The native iOS app calls the same routes the web app does, with Swift types generated from the TypeScript contracts, and the build fails if the two drift apart. The TestFlight build has the Home, Quests, and Hero tabs, reading check-offs on the dashboard, side quests, the church calendar, the web's animated tier sprites, and reminder settings. Reminders go out from an hourly and a nightly cron, by web push and by Apple push.
What it does
- Reading plans with daily progress
- Streaks with shields, XP, levels, and achievements
- Guilds with leaderboards, chat, and prayer requests
- Offline reading that syncs when it is back online
- Reminders by web push and Apple push
- A native iOS app in TestFlight on the same API
Plates
