Web app overview
emaw-web-app is the React single-page version of the EMAW mobile app: quiet times, Scripture memory, the Bible reader and the book questions, in a browser. It shares accounts with the mobile app and the website.
| Package name | emaw-website (sic; it is the web app) |
| Stack | React 18, Vite 6, JavaScript (JSX), react-router-dom 7, axios, i18next, Tailwind 4, howler (audio) |
| Hosting | Cloudflare Pages project emaw-react-web-app |
| URLs | dev https://develop-web-app.everymanawarrior.cc, prod https://app.everymanawarrior.cc |
| Backend | VITE_BACKEND_URL (trailing slash) |
| Own docs | README.md |
| Tests | none; ESLint |
Layout
src/
App.jsx auth gate; /auth/handoff renders before it
routers/ UnauthStack, AuthStack, BottomTabsNavigator (mobile tabs)
pages/ one file per route
components/ forms, practice modes, bible/ (reader modals), modals, GoogleButton, AuthShell
store/ AuthContextProvider, AxiosInstance
context/ VersionsContext, ThemeContext
utils/ one function per API call (fetchQT.jsx, postQT.jsx, ...), safeNextPath.js
constants/ backendIp.js, websiteUrl.js, googleClientId.js, bookInfo.json, audiofiles.js
locales/<lang>/ translation.json, book_info.json (en, alb, nor, ge, br)
i18n.js
assets/audio/ ~75 bundled verse recordings named by content hash
Routes
Signed out (UnauthStack): /login, /signup (only when VITE_WEBSITE_URL is empty; otherwise redirects to the website's sign-up with ?next=app), /reset-password, /resend-verification.
Signed in (AuthStack):
| Path | Page | Feature |
|---|---|---|
/home | HomePage | Toolkit tiles |
/war-prayer, /getting-started-right, /videos-training, /get-books, /donate | static / link-out pages | Home sub-pages (books and donate link to the legacy site) |
/qt, /qt/entry, /qt/historic-qt | QTPage, QTEntryPage, HistoricQTPage | Quiet-time journal |
/verse-memory, /verse-memory/all, /add, /collections, /practice, /finder | VerseMemoryPage and friends | Scripture memory with five practice modes and the AI verse finder |
/bible, /bible/library | BibleReaderPage, BibleLibraryPage | Reader with versions, compare, highlights, notes, tags, semantic search |
/books, /books/sub, /books/sub/discussion, /books/weekly-qt, /books/qt-entry | BooksPage and friends | The four books: weeks, discussion questions, weekly quiet times, progress |
/settings | SettingsPage | Stats, default version, language, theme, change password, delete account |
The bottom tabs on narrow screens are Quiet Time, Bible, Verse Memory, Books, Settings.
Localisation
i18next with the browser language detector (order: localStorage defaultLanguage, then navigator). Locales: en, alb (Albanian), nor (Norwegian), ge (German), br (Brazilian Portuguese). Each has translation.json and a book_info.json with the curriculum text. No Spanish, unlike the website.
Media
Verse audio is served from the bundled assets/audio/*.mp3 when present (mapped in constants/audiofiles.js); anything missing is generated by POST /rest/generate-audio-file/ and played with howler. Training videos link out to Vimeo. No R2 or Stripe.