← All workNative apps

Endeo

Handwriting on an iPad, turned into searchable text — and a sermon, transcribed while you take notes on it.

Year
2026–
Role
Design + Development
Endeo

Endeo is an iPad-first Bible study app. You pull up a passage in any of a dozen translations, write on it with Apple Pencil, and the app turns your handwriting into text. Start a listening session while someone teaches and it records, transcribes, and links their words to the notes you were writing at that moment — then summarizes the whole thing, stamped with date, time, place, and speaker.

The problem

Handwriting is better for thinking and worse for everything else

People who study seriously write by hand. It's slower, and that's the point — it forces you to compress an idea before committing it. But handwritten notes are a dead end: you can't search them, you can't pull a thread across three years of notebooks, and you can't line them up against what the speaker actually said.

The obvious fix is to make people type. That trades away the thing that made the notes worth having. So the app had to keep handwriting as the input and solve the retrieval problem behind it.

What we built

Two capture streams that have to line up in time

Notes are captured with PencilKit and recognized with Vision's handwriting OCR, so the stroke data stays authoritative and the text is a derived, searchable index of it. You never lose what you actually wrote.

Live sessions run through SFSpeechRecognizer, transcribing a talk as it happens. The two streams share a clock: a note written at 14 minutes in is linked to what was being said at 14 minutes in. That correspondence is the whole product — it's what turns two separate recordings into one artifact you can actually use later.

Afterward, a Supabase Edge Function calls Claude to summarize the session, drawing on both the transcript and the notes.

The hard part

It has to work with no signal and no account

The app is used in rooms with bad wifi by people who don't want to make an account before they can write something down. So the offline path isn't a fallback, it's the default: SwiftData caches everything locally, and Supabase auth starts anonymous and upgrades later if the person wants sync.

With no backend configured at all, the app still runs — bundled chapters, full note-taking, everything except cross-translation search and cloud sync. Degrading to useful rather than degrading to a spinner was a requirement, not a nicety.

The hard part, continued

Owning the text instead of renting it

Bible text could have come from a third-party API on every request. Instead it's ingested into our own Postgres — public-domain translations from an open source, with an optional key-based provider for more versions.

That decision costs an ingestion pipeline and a migration story. It buys instant cross-translation search, full-text indexing we control, and an app that doesn't break when someone else's free tier changes. For content this static, renting it is the worse trade.

Shipping it

Generated project files, and an Android build

The Xcode project is generated from an XcodeGen manifest rather than committed, which keeps project-file merge conflicts — a genuine tax on any team touching an iOS repo — out of the picture entirely.

Row-level security is enforced in Postgres, so a user's notes are isolated at the database rather than in application code. There's an Android build alongside the iOS app, and it's on the App Store.

Stack
  • SwiftUI
  • iOS 17+
  • PencilKit
  • Vision
  • SFSpeechRecognizer
  • SwiftData
  • Supabase
  • Postgres + RLS
  • Claude
  • XcodeGen
Outcome

On the App Store, with an Android build alongside it.

Have something like this to build?

Work with us