NOW PLAYING · SOLO BUILD
2026 — live
dhruva
All 701 verses of the Gita, explained. No accounts, no ads, no network required.
A contemplative reader for the Bhagavad Gita: every verse in Devanagari with transliteration, a literal translation and an explanation written for this project. The palette follows the time of day, the whole book works with the network off, and nothing you read or write leaves your device.

- 701
- VERSES EXPLAINED
- 1,339
- STATIC PAGES
- 8
- PALETTES AUDITED
- 0
- TRACKERS
the problem
The Gita online is mostly two things: a scan of a public-domain translation from 1909, or an ad-farm that wants a newsletter signup before the second verse. Neither is readable, and neither explains anything — you get the words and none of the argument they sit inside.
There is also a format problem. A text written to be read slowly is the worst possible fit for infinite scroll, and a reading app that needs a network and an account is one you can’t take to a bus or a hospital waiting room — which is when people actually reach for this book.
how it works
It’s a static site: 1,339 pages prerendered at build time, with React islands only where interaction genuinely earns one — the reader, search, the journal. The corpus lives as JSON and the search index is built during the build, held under 400 KB gzipped by a check that exits nonzero rather than warns, so search works offline from the first visit.
The palette is keyed to the time of day — dawn, noon, dusk, night — and a reader can override theme, contrast, motion, line length, emphasis and how much commentary shows. That’s eight palette configurations across every route, which is a lot of ways for contrast to quietly fail, so an audit runs axe over 13 routes in all of them and every faint ink value carries its measured ratio in a comment beside it.
Reading progress, journal reflections and the words you’ve met are stored in IndexedDB and never sent anywhere. The colophon’s claim is deliberately literal: nothing you read or write here leaves your device.
Offline took the most care. The service worker precaches the 18 chapter pages — each carrying its whole chapter, so the entire book reads offline — and deliberately not the 701 verse permalinks, which would mean a 9 MB download before anyone read a word. Those cache as they’re visited.
▸ ATTRACT MODE
the rest of the screens.

▸ RUNS ON
the back of the box.
- site
- Astro 5React 19 islandsTypeScriptTailwind v4static output
- state
- Zustandidb-keyvalIndexedDBno server, no accounts
- offline
- vite-pwaWorkboxprecache manifest transformsruntime caching
- search
- MiniSearchbuild-time indexone shared config
- type
- Tiro Devanagari SanskritEB GaramondFrauncesself-hosted woff2
- gates
- axe-corePlaywright13 routes × 8 palettestoken + contrast checks
▸ GAME OVER · CONTINUE?
the bit that bit.
Workbox precached `chapter/2` while the server served `/chapter/2/`, so every chapter navigation missed the cache and the fallback quietly served the homepage instead. The build log read “precache 58 entries” the whole time. HTTP 200, a correct-looking page, the wrong content — the only thing that caught it was killing the server and actually reloading a chapter offline.