Good Word started as a simple Bible reader and evolved into a full study dashboard. Along the way, I learned a few things worth sharing.
First, offline-first is harder than it sounds. Service workers cache your app shell, but the real challenge is data. I ended up shipping a 5MB SQLite database with every deployment, containing the full text of multiple Bible translations indexed with FTS5. When a verse isn't in the local database, the app fetches it from an external API and caches it locally for next time.
Second, full-text search needs tuning. Out of the box, FTS5 returns results ranked by frequency, which isn't useful for Bible search. A verse mentioning "love" once is just as relevant as one mentioning it three times. Custom ranking and context-aware snippets made the search actually useful.
Third, theming is more than swapping colors. Good Word supports five themes — Light, Dark, Monokai, Dracula, and Solarized. Each theme needs careful contrast ratios, especially for long-form reading. CSS custom properties made this manageable, but testing every theme against every component was the real work.
The Vue 3 + Pinia architecture held up well. Pinia stores keep the state clean, and Vue's reactivity means the UI updates instantly when you switch translations, highlight verses, or toggle views.