Trinity Church Sheboygan · iOS & Android

Thirteen years
on the same app.

First commit is October 2013, in ActionScript on Adobe AIR. Adobe killed AIR, the repo sat at near-zero commits for five years, and I rebuilt it on Ionic. It's still on both stores. Current branch is a 3.0 feature branch.

2013first commit
13years shipping
2ground-up builds
250+installs
2013 → 2026
October 2013

The first commit is an Adobe Flex project.

.actionScriptProperties, .flexProperties, and a compiled TrinityMobile.swf checked into bin-debug/. Adobe AIR handled the iOS and Android packaging.

One requirement drove the whole thing, and it took forever to get right: make the church's Google Calendar public, then read it straight through the Calendar API — no OAuth flow, no sign-in, no token refresh per user. The README still opens with the Stack Overflow thread on listing events without user auth. That calendar is still the first thing on the home screen.

ActionScriptAdobe FlexAdobe AIRiOSAndroid

Commits per year

Five years at near-zero commits.

Two active years, five dormant, a rebuild, then steady maintenance. 2026 is the highest-volume year in the repo.

Commits per year

Oct 2013 – Jul 2026
13'13
27'14
3'15
1'16
2'17
1'18
0'19
10'20
15'21
14'22
2'23
13'24
12'25
34'26
2013–14  Flex / AIR 2015–19  7 commits in five years 2020–21  rebuilt on Ionic 2022–26  kept current

2015–2019 is seven commits across five years — API fixes and an "iPhone 10 Updates" commit, nothing structural. February 2020 lands "Ionic Project" and the second build starts.


Same app, seven years apart

Two builds, one tab dropped.

AIR was dead, so v2 was a rewrite rather than a port: new stack, new codebase, same feature set. The navigation survived mostly intact — it took until v3 to lose a tab.

The 2013 app on an iPhone 5: Trinity Lutheran branding, Today's Verse, a list of upcoming events, and tabs for Home, About, Liturgy and Watch.
Version 1 ActionScript on AIR, iPhone 5. Verse card, event list, four tabs. Marketing shot from the original store listing. 2013–2019
The 2020 rebuild on a modern iPhone: the same verse card and events list, plus a Recorded Services video feed.
Version 2 Ionic + Angular, Cordova at first, then Capacitor. Same verse card and event list, plus a recorded-services feed backed by YouTube. 2020 rebuild

The 2013 build shipped four tabs: Home, About, Liturgy, Watch. v3 ships three ion-tab-buttons — home, about, watch — with liturgy demoted to a lit-details child route under About and surfaced as a bulletin card on Home instead. The legacy tab1/tab2/tab3 paths are still routed so old deep links keep resolving.


The YouTube tax

Everything about YouTube fought back.

The Watch tab is just a list of the church's videos and the live service. Both halves — playing the videos and knowing they exist — got rebuilt multiple times, because every shortcut YouTube tolerates eventually gets taken away.

1
Playback

Three players for one tab

Playback started on a Cordova YouTube-player plugin. It was fragile from day one and eventually got scrapped outright. The replacement was the plain embedded iframe player in a webview — fewer moving parts, but the embed won't just play whatever you hand it on demand, so the video list sits behind a cache and the player only ever gets asked for known videos.

plugin scrappediframe embedcached list
2
The feed

Over quota in about three hours

Live services needed a feed of upcoming and latest videos. The first version stitched together a third-party service and another API — and YouTube kept peeling those integrations off, one by one, until none of them could see the channel. Fine: use the official YouTube Data API from the phone. That blew through the daily quota in about three hours.

The version that stuck inverts it: a function calls the Data API on a schedule, writes the upcoming and latest videos to a cache in Firebase, and the phones read the cache. The API gets called a handful of times a day instead of once per user per open.

youtube data apiquotafirebase cache

In progress · version 3.0

Version 3.0, coming soon.

The app's biggest update in thirteen years is in flight. Screens below are from the in-progress build, on an iPhone 17 Pro Max.

Live service

The banner is derived, not a separate feed.

Home and the Watch tab share one source of truth for videos. When a live service starts, the same feed that lists it under Watch lights up the banner on Home with the service's title — there's no second live API to poll, and no way for the two screens to disagree.

And since the church only streams once a week, there's a developer switch to force the banner on — otherwise the live UI would only be testable on Sunday mornings.

Global search · 36 commits

Search that reads inside the PDFs.

Global search covers staff, events and documents. Documents is the interesting one: PdfTextService runs pdfjs-dist to extract page text, so a query matches what a document says, not just what it's called — three letters of "new" is enough to pull the bulletin and newsletter up by their contents.

Extraction is expensive, so it's cached twice: an in-memory map where concurrent searches share one extraction, and a localStorage copy with a 7-day TTL. Bulletins get a fresh URL weekly, so the cache key handles staleness by itself.

Home & calendar

The home screen, reworked

A 2×2 quick-action grid, per-line tap targets on the calendar card, event rows as tiles, and a rebuilt event modal. "Add to calendar" goes through @ebarooni/capacitor-calendar — with a follow-up commit fixing it silently no-opping on device.

native calendarhome redesign
Bulletin & newsletter

The swipeable cards

The bulletin and newsletter live on Home as cards you swipe between. The fun part wasn't the swipe — it was that both documents are PDFs at URLs that change every week, so I had to come up with a way to cache the current bulletin and newsletter locally. The cards always have a copy to open instead of depending on a fetch at tap time.

swipeable cardspdf cache

Version 3.0

Thirteen years in, it looks like this.

The same verse card and calendar the app shipped with in 2013 — wearing 2026.

Trinity v3 home screen in dark mode: live-now banner, verse of the day card, a 2x2 quick-action grid and this week's services. The same home screen in light mode, on a warm cream background with white cards.
Home · drag the seam One screen, both themes. The app follows system / light / dark and remembers your pick.
Search results showing matching videos and, under a Documents heading, the Weekly Bulletin and Newsletter matched on text pulled from inside the PDFs.
Search · documents The DOCUMENTS hits are the point: the snippets under Weekly Bulletin and Newsletter are text extracted out of the PDFs, not titles.
Today's Verse sheet showing the verse, its reference, and the full surrounding chapter with numbered verses.
Verse → chapter The daily verse opens the whole chapter with numbered verses and a share action, rather than linking out to a Bible site.
Where it stands

Thirteen years, two rewrites, still open.

The app has outlived Adobe AIR, Cordova and ten major versions of Angular. One full rewrite, one near-abandonment, same four tabs as 2013, still listed on both stores. 3.0 is coming soon. Long-lived apps are mostly this: migrations, deprecations and version skew, punctuated by features.

13years maintained
147commits
7commits, 2015–19
3.0version in flight
2app stores