
2.1 Tile = data row
Dev: 8 edits · native tile: 10+ stepsWithout: Every tile ships shell
Row carries permission and switch
For the CRM2 team. 21 Oct 2026. All names and numbers in the demo are invented.
This is a demo. Try it, then send us your notes. Nothing here changes your own code or data.
Works best on a phone. A desktop browser also works.
Open crm2-proto.anantmb.workers.dev. Sign in with one username below.
Password for every account: Jaigurudev123
| Persona | Username | Try this |
|---|---|---|
| Teacher | tour.teacher |
|
| Volunteer | tour.volunteer |
|
| Second volunteer | tour.volunteer2 |
|
| Coordinator | tour.coordinator |
|
| Admin | tour.admin |
|
Tip: for the two volunteers, use two phones or two browsers.
Each tile on Home opens one app. You see only the apps your role may use.
An org admin can turn any app off. Go to Home > Turn apps on or off. The tile hides at once. No rebuild.
Follow up with people you invited. Call or WhatsApp in one tap.
TryOne lead per phoneDo not contact needs a reasonUndo the last stepClosed list with reason
Your centre and its team. Invite people. Set the centre's place on the map.
Try
The Happiness Survey. Each teacher makes their own QR link.

Seva you can join near you. Sign up, check in, log hours.

Shared rides to programs and seva.

Programs you run or attend.

The Art of Living program catalog.

Notices from registered centres. Filter by centre.

Videos, posters, your program links and ready messages.

Accounts, support requests, return rules, data import, connected apps.

Your details and your language.
These tiles show demo data in this demo.
Wisdom · talks by GurudevResources · posters, videos, templatesAsk AI · find or create anythingVTP · Volunteer Training ProgramCentres · find a centreEvents · events and sign-up
| Item | Before | After | Why |
|---|---|---|---|
| App list | The tile list was fixed in code. | Home reads the list at sign-in. | A team adds an app with one row in its own list. One id row in the shell, which a check keeps equal. |
| On/off switch | Every person saw every tile. | Each app has a permission and a switch. | An admin hides an unready app in one tap. |
| Top bar and app frame | CRM2 modules shared one header. AOL was a separate site with its own bar. | AOL apps open under the same top bar. Their own bar is hidden. | Every app looks like one product. App teams build no header. |
| One web address | The shell talked to CRM2's own backend only. | Added apps run under the same address. | One sign-in, one cookie, no cross-site setup. |
| Icons and languages | Generic icons. English and Hindi. | Sunburst icons. Six languages in the Samanvay build: English, Hindi, Marathi, Telugu, Gujarati, Kannada. | One look, and the languages volunteers speak. The last four are drafts. |
| Speed | Sign-in 1.12 s. Open Leads 1.88 s. | Sign-in 0.57 s. Open Leads 0.97 s. | A tile tap no longer reloads the whole page. |
Speed: median of 3 runs, desktop browser at phone size. Phones were not measured. Timed on the 20 Oct builds; the current build is not re-timed.
Part 1: the Samanvay shell. Part 2 (AOL split) follows.
RegistrySwitchDoorOne frame
The core becomes a plug-in board

Dev: 8 edits · native tile: 10+ stepsWithout: Every tile ships shell
Row carries permission and switch

Deploys 1 → 0Without: Faulty app stays on
Bad app off in one tap

5 files ≈+270Without: Only developers switch
Org admins switch tiles

Shell classifier removed · drift caught by checkWithout: Two lists drift
Shell keeps app lists; check pins ids and paths
AOL apps under the shell barWithout: AOL stays a separate site
AOL's own chrome stays hidden

Sign-ins: 1 (AOL's session, first-party)Without: Separate AOL site
One origin, one session

Sign-in 1123 → 572 ms · desktop, before one-frameWithout: ≈2 s every tap
Deploy-1022 one-frame state was not timed

4 files ≈+150Without: Notices go unseen
Notice seen from Home

Locales 2 → 6 · AOL shell buildOther builds: en + hi
Six locales in the AOL shell build

17 chunks checkedWithout: Breaks found on phones
Breaks caught before team release

26 files +84/−69Without: Brand forced on team
Brand change can be refused alone
≈ marks an estimate. Speed figures are desktop measurements from before the one-frame change; deploy-1022 was not timed. Phones were not measured.
Part 2. Part 1 is the CRM2 shell above. The real cut is AOL-Connect-app 6cef4b9a (#398), at integration tip 0469eda3: 1,724 files, +275,681 lines vs dev f27a587e. Fair-run rows remain 55df3634 vs afcf4e05; add/remove recipe data remain from the prior #397 run, comparing 55df3634 with b48d7e60.
CoreApps plug inOne PR eachSwitch offOne core, apps plug in
Honest rows: total core → app imports rise (50 → 57), Leads first load is 301 B larger, and /app is 4.1 ms slower in the fair run. The add/remove recipe counts below use 55df3634 vs b48d7e60. The gain is where the links sit and who can switch an app off. Removing an app touches more files (44 → 85: the Rides tests, pages and flows now move with it; core 8 → 5, reviewer 44 → 5).
Since #394, the generated lists merge with 0 conflicts (ba3653b5).

1,724 files · +275,681 lines vs devWithout: Apps mixed in src/ and frontend/src/
Apps move out; core keeps listed leftovers
19 ids · 12 hook keys · 6 generated listsWithout: Hubs import every app
Apps plug into twelve hook keys
Hand-written hub imports 50 → 6 · app → app 2 → 0Without: Worse: total core → app 50 → 57 (generated lists)
Core imports no app by hand
| Path | Owner (proposed) |
|---|---|
core/, migrations, scripts, tests | aol-core |
| apps/leads | aol-leads |
| apps/teams | aol-teams |
| apps/programs | aol-programs |
| apps/survey | aol-survey |
| apps/seva, apps/rides | aol-seva |
| apps/announcements, apps/promote | aol-comms |
| apps/admin | aol-core |
Each folder has one ownerWithout: all code in one review lane
Owner names are proposed; no CODEOWNERS file in the cut. The boundary check fails a new cross-app import.
Build, scripts, CI
Alone: not run alone; tested in core UI chain (466 pass / 0 fail)
75 files · +31,836 lines · base dev · tip 788f5044
Read first: package.json, then ci.yml
Without: No app builds or runs the boundary check
Server core, 87 migrations
Alone: not run alone; tested in core UI chain (466 pass / 0 fail)
296 files · +32,970 lines · base tooling (PR 6) · tip 97826a61
Read first: core/server/app-registry.mjs
Without: Nothing runs
Client core, UI kit, built bundle
Alone: 466 / 0 (was 427 / 220)
255 files · +18,788 lines · base core (PR 7) · tip 257536e1
Read first: the two registry readers
Without: Core alone fails 220 tests
Queue, detail, follow-ups
Fails alone: client tests need Leads bulk; stack passes 1,931 / 0
237 files · +46,935 lines · base core-ui (PR 8) · tip 46496ee3
Read first: two registration files, then routes
Without: No Leads tile
Intake, ads, coverage
Fails alone: client tests need Leads bulk; stack passes 1,931 / 0
36 files · +9,186 lines · base leads (PR 9a) · tip 0ff23c23
Read first: server/apps/leads-intake.mjs
Without: No intake or ads screens
Import, export, refer
Alone: Leads stack 1,931 / 0 (was 189 / 120)
23 files · +7,121 lines · base intake (PR 9b) · tip 3bb89464
Read first: server/apps/leads-bulk.mjs
Without: No CSV import or referrals
Team tree, invites, centre profile
Alone: 2,064 / 0
70 files · +9,403 lines · base leads-bulk (PR 9c) · tip 29676167
Read first: server/apps/my-centres.mjs
Without: No Teams tile; Admin cannot land
My and Find Programs
Alone: 697 / 0
95 files · +17,697 lines · base core-ui (PR 8) · tip 3e5ce662
Read first: both registrations, then apps/programs/routes/events.mjs
Without: No programme pages
Happiness Survey, form builder
Alone: 505 / 0
67 files · +7,911 lines · base core-ui (PR 8) · tip 561a39ef
Read first: server/apps/survey.mjs
Without: No Survey tile
Callouts, shifts, roster, safety
Alone: 570 / 0
103 files · +14,391 lines · base core-ui (PR 8) · tip 9e8b24a2
Read first: server/apps/seva.mjs (hooks)
Without: No Seva tile; Rides cannot land
Ride offers, needs, notices
Alone: 619 / 0
78 files · +8,735 lines · base seva (PR 13) · tip 25af1d72
Read first: server/apps/rides.mjs (cron, notices)
Without: No Rides tile
Announcements tile (the template)
Alone: 479 / 0
36 files · +897 lines · base core-ui (PR 8) · tip af03eea4
Read first: all 7 app files: copy this PR for a new app
Without: No Announcements tile
Videos, posters, links, messages
Alone: 485 / 0
48 files · +1,877 lines · base core-ui (PR 8) · tip f0eac184
Read first: server/apps/promote.mjs
Without: No Promote tile
Staff hub, own profile
Alone: 2,114 / 0
73 files · +8,087 lines · base teams (PR 10) · tip 648cdb30
Read first: both registrations; the one declared link
Without: No Admin hub or profile page
Integration tip equals the whole moved tree
Alone: 4,356 / 0
1,724 files · +275,681 lines · base dev + 6 leaf tips · tip 0469eda3
Read first: test names only
Without: No proof the apps work together
Alone = tests of core plus the apps on the branch chain, in a separate checkout. Tips, bases, sizes and pass counts use branch-status.md, table “real cut 6cef4b9a”. Leads and Leads-intake fail alone because their client tests need Leads bulk; all three parts pass together (1,931 pass) and must be reviewed as one Leads stack.

12 → 7 files · core 4 → 3 · reviewer 11 → 3+26/−11 → +20/−0 lines · build and suite pass
4 app files; 3 generated lists stay committed

Core 8 → 5 · reviewer 44 → 544 → 85 files · +61/−4,062 → +0/−10,505 lines · build and suite pass
The Rides and locales/rides folders hold all its code, tests, pages, flows and words; deleting them removes all.
Off in one tap, no deploy

Conflicts 11/16 → 6/14 (fair run)Without: One +275,681-line review
Each team reviews its folder only
No behaviour change · Leads open 0.0574 → 0.0546 sWithout: Core knows every app
Same tap, registry finds the app

One ordered line, held by coreWithout: Two apps pick the same number
All 87 migrations stay in PR 7
| Metric | Before | After | Why |
|---|---|---|---|
| Core → app imports, all | 50 | 57 | Generated lists name each app (51 of 57). Hand-written: 50 → 6 (afcf4e05 → ba3653b5). |
| Add demo-x: files / core / reviewer | 12 / 4 / 11 | 7 / 3 / 3 | Lines +26/−11 → +20/−0; build and suite pass. 55df3634 → b48d7e60. |
| Remove Seva Rides: files / core / reviewer | 44 / 8 / 44 | 85 / 5 / 5 | Lines +61/−4,062 → +0/−10,505; build and suite pass. The Rides and locales/rides folders hold all its code, tests, pages, flows and words; deleting them removes all. |
| Leads first load (gzip B) | 109,541 | 109,842 | 55df3634 → ba3653b5; +301 B, inside the 109,850 B budget. |
| /app page (local) | 0.0302 s | 0.0343 s | +4.1 ms; no cause isolated. |
| Sign-in to 303 (local) | 0.0376 s | 0.0381 s | +0.5 ms; no cause isolated. Leads open is faster: 0.0574 → 0.0546 s. |
Not measured: per-app test time (run only one app's tests). Fair-run rows (build, sign-in, Leads open, /app page) are 55df3634 vs afcf4e05, median of 3, same machine; they were not re-run on ba3653b5. Fair-run conflicts: 11/16 → 6/14 (55df3634 vs afcf4e05). Add/remove compare 55df3634 with b48d7e60 after PRs #395–#397. Local times are local-stack times, not phone times. Since #398, the core-name guard (tests/core-names-no-app.test.mjs) covers every registered app (19); each allow-listed core word has a written reason. By rule, the /health schema probes name Seva, Survey, Announcements and Rides. Core still deliberately names Leads and Programs for the lead store. The 10 Seva forms moved from frontend/src/forms into apps/seva. The changed core and reviewer files are committed generated lists (*.gen.*) because deploys run no build step.
How to read this. Each block is one app. Steps are in order. Each picture shows the screen for that step. All names and numbers are invented demo data. The pictures show the app on its own. In the demo the Samanvay top bar replaces its header and bottom bar. In the pictures, Teams is called My Teams.
Goal: Add a person, call them, log what happened.


























Goal: See your teams, add a team, add a person.







Goal: Post a notice at one centre.




Goal: Find a program by place, language or PIN code.



Goal: See your sessions and share them.



Goal: Find links and material to share.




Goal: Offer or ask for a ride to a session.


Goal: Find seva near you and sign up. Coordinators add seva.







Goal: Make a link or QR code for a survey and read the answers.





Goal: Change your language, see your profile, ask for a change.



Not in this manual yet: Admin, Wisdom, Resources, Ask AI, VTP. Posters, messages and videos in Promote show sample data.
apps/volunteer2-fe) owns the sign-in screen, the top bar, the tile grid and the app frame. AOL checks the account.volunteer-be and Postgres, as before.src/routes/apps.mjs) and the same id to the shell list (packages/app-registry). A check keeps the two equal.GET /api/apps returns only the rows this person may open./x/<id>/. This "door" checks the session and the switch.feature/samanvay, not into dev. One bad PR then cannot break dev for the team.feature/samanvay into dev.| # | Branch | What it adds | Lines (estimate, before the app split; re-cut pending) |
|---|---|---|---|
| 1 | feat/app-registry | Runtime app list, permission per tile, switches, Admin › Apps | ~1.9k |
| 2 | feat/shell-bar-frame | Top bar, app frame, door, Home and Back, sign-in handoff | ~2.1k |
| 3 | feat/shell-brand-icons-i18n | Samanvay brand, Sunburst icons, six-language shell | ~5.3k |
| 3b | chore/brand-samanvay | Seva → Samanvay in team apps (the team may refuse this one alone) | ~0.2k |
| 4 | perf/shell-speed | Cached assets, boot data in the page, one chunk per module | ~0.3k |
| 5 | test/shell-flows | Browser flows for the shell | ~0.7k |
| 6 | chore/aol-core-tooling | Package, seeds, invented test data, boundary check, CI lane | ~16k |
| 7 | feat/aol-core | Auth, session, scope, roles, people, lead store, all migrations | ~25k |
| 8 | feat/aol-core-ui | UI kit, router, store, core texts | ~14k |
| 9a | feat/app-leads | Lead queue, detail, follow-ups, status | ~32k |
| 9b | feat/app-leads-intake | Intake, ads, coverage, lead sources and fields | ~27k |
| 9c | feat/app-leads-bulk | Import, export, refer, offline book | ~12k |
| 10 | feat/app-teams | Team tree, members, invites, centre profile | ~10k |
| 11 | feat/app-programs | My Programs and Find Programs | ~21k |
| 12 | feat/app-survey | Happiness Survey and form builder | ~11k |
| 13 | feat/app-seva | Seva callouts, shifts, roster, safety | ~14k |
| 14 | feat/app-seva-rides | Ride offers, needs, notices | ~10k |
| 15 | feat/app-announcements | Announcements tile | ~1k |
| 16 | feat/app-promote | Videos, posters, program links, messages | ~2.3k |
| 17 | feat/app-admin-profile | Staff hub and own profile | ~12k |
| 18 | test/aol-integration | Tests that cross two or more apps | ~26k |
| Total | estimate, before the app split; re-cut pending | ≈245k |
| Stays in the demo | What the team uses |
|---|---|
| Demo sign-in with AOL accounts (the stub code is for local tests only) | CRM2's own sign-in. The added apps accept the shell's handoff. |
| Our AOL sign-in screens inside the shell | None. A CRM2 person maps to an AOL user by verified phone. A handoff never creates an account. |
| Local stub of the CI SDK and the demo Worker config | The real CI SDK and the team's own config. |
| The link to our own demo database | The team links its own AOL-Connect Worker and D1 per environment. |
| The name "Samanvay" in team-owned apps | Only if the group agrees (branch 3b). |