Skip to main content

Known gaps and discrepancies

This list was compiled from a read-through of all six repositories in late October 2026. Each item says what the code actually does. When you fix one, delete it here.

Stale documentation inside the repos​

WhereSaysActually
emaw-mobile-app/CLAUDE.mdBase URL is https://dock.emaw-app.com/constants/backendIp.js points at https://app.emaw-app.com/ (dev URL commented out)
emaw-mobile-app/CLAUDE.mdVersionsContext is in store/versionsContext.jsIt is context/VersionsContext.js
emaw-mobile-app/CLAUDE.mdTab table lists Home as a tab and has no Bible tabHome is a hidden tab; Bible is a visible tab
emaw-mobile-app/CLAUDE.mdRunbook at EMAW_BACKEND/docs/GOOGLE_SIGN_IN_SETUP.mdemaw-django-app/docs/GOOGLE_SIGN_IN_SETUP.md (EMAW_BACKEND is a historical name for the repo)
emaw-django-app/CLAUDE.md"Single Django app (EMAW/)"14 local apps
emaw-django-app/CLAUDE.mdMemory verse cache 300 sUSER_CACHE_TTL is 3600
emaw-django-app/CLAUDE.mdEMAW model listOmits SocialIdentity and AppHandoffCode
emaw-django-app/CLAUDE.md CI/CD sectionDescribes the GitHub Action to Azure Web App as the deploymentLive deployment is Docker Compose on VMs (dev: SSH; prod: Portainer)
emaw-django-app/CLAUDE.md vs ONBOARDING.mdDev DB via cloudflared tunnel on 127.0.0.1:5433 (CLAUDE) vs Tailscale + pgbouncer (ONBOARDING)Tailscale is current; these docs follow ONBOARDING
emaw-django-app/EMAW_BACKEND/urls.py commentAI search is "Postgres + pgvector"Qdrant
emaw-website/README.mdVite template boilerplateNot project-specific; CLAUDE.md is the real doc
emaw-crm-app/README.md env tableLists 2 variables5 are read in src/config.ts

Legacy and leftover artefacts​

WhereItemNote
emaw-django-app/.github/workflows/main_emawweb.yml, azure-pipelines.ymlDeploy to Azure Web App EMAWWeb on push to main, Python 3.10 / 3.11Not the live backend (Docker image is 3.12). Remove them or the App Service to avoid confusion
emaw-django-app rootquestions_with_ids.json, questions_with_ids_and_quiet_times.json, emaw_backup.jsonNo code references them
emaw-django-app rootverify_redis_down.py, verify_redis_opt.py, verify_seed_dupes.py, verify_db.sqlite3Manual scratch scripts committed with a sqlite file
emaw-website/constants/url.tsxPoints at an unrelated APIUnused
emaw-website/.env.development, .env.productionSet VITE_BACKEND_URLNothing reads it
emaw-website/.dev.varsR2_*, STUDIO_* keysNothing in the repo reads them; R2 credentials belong on the backend
emaw-mobile-app/.envEXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID, EXPO_PUBLIC_GOOGLE_ANDROID_LOCAL_CLIENT_IDNever read; Android matches by package + SHA-1
emaw-mobile-app/android/app/src/main/res/values/strings.xml (local prebuild)expo_runtime_version 1.1.2App is 1.1.3; regenerated by prebuild

Configuration gaps​

WhereGap
emaw-django-app/docker-compose.yml x-app-envVariables read by settings but not passed to containers: SHIPPING_RATE_SOURCE, SHIPPING_HISTORY_RECENT_DAYS, SHIPPING_HISTORY_HALF_LIFE_DAYS, FULFILLMENT_TIME_ZONE, EVENTS_PAYMENT_METHOD_CONFIGURATION, EVENTS_NOTIFY_RECIPIENTS, CONTACT_FORM_RECIPIENTS, GEOGRAPHY_ASSIGN_SYNC_MAX, GEOGRAPHY_RUN_STALE_MINUTES, CRM_CONTACT_LIST_CACHE_SECONDS, OPENAI_API_KEY
emaw-django-app/.envPresent but never read: EMAIL_PASSWORD, QUICK_BOOKS_CLIENT_ID, QUICK_BOOKS_CLIENT_SECRET, ALLOWED_HOSTS (the hosts list is hard-coded per settings module)
emaw-django-app settingsJWT_SIGNING_KEY is read but SIMPLE_JWT["SIGNING_KEY"] uses SECRET_KEY
emaw-mobile-app/package.jsonexpo-dev-client is not a dependency although npm start uses --dev-client and the EAS development profile sets developmentClient: true
emaw-mobile-app/eas.jsonNo ascAppId for iOS submit; no Android submit profile
emaw-mobile-appBackend URL is hard-coded; switching to dev means editing a tracked file
Package namesemaw-website is emapw-website; emaw-web-app is emaw-website; emaw-crm-app is emaw-admin
No reposets a Node engines field or .nvmrc; CI uses Node 24, the team standard is 26

Pipeline gaps​

AppGap
BackendNo CI at all (no tests on PR, no automated deploy). Dev is deployed by git pull on the VM; prod by Portainer
WebsiteNo production workflow; manual wrangler pages deploy
Admin CRMNo production workflow; npm test not run in the develop workflow
All frontendsThe raw *.pages.dev hostnames should be behind Cloudflare Access where the custom domain is
MobileNo EAS workflow; builds and updates are run by hand

Test coverage gaps​

WhereGap
emaw-django-appnotes, bibles and ai are in pytest.ini testpaths but have no test files
emaw-website, emaw-web-app, emaw-mobile-appNo test runner configured

Operations gaps​

See Backups and recovery (open items) and Logs and monitoring (no uptime check, alerting, log shipping or crash reporting).

Security notes​

  • Production VM and database are not on Tailscale yet; the IP whitelist is the control until the planned migration.
  • Django admin (/admin/) is behind the tunnel but not behind Cloudflare Access.
  • emaw-mobile-app/.env is committed; it holds only public OAuth client ids, which is acceptable, but keep it that way.