Samanvay: what we built, and how to try it

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.

2main apps: Leads and Teams
4demo accounts
6languages in the home screen
0.97 sto open Leads, desktop test, 20 Oct (was 1.88 s)

1. What this is

Open the demo

Works best on a phone. A desktop browser also works.

Samanvay home screen with the Leads, Wisdom, Resources and Ask AI tiles

2. Try it

Open crm2-proto.anantmb.workers.dev. Sign in with one username below.

Password for every account: Jaigurudev123

PersonaUsernameTry this
Teachertour.teacher
  1. Open Leads. Tap Call on a lead.
  2. Open Survey. Look at your own QR.
  3. Open Teams. See your centre.
Volunteertour.volunteer
  1. Open Seva. Sign up for a shift.
  2. Open Seva Rides. Tap Need a ride.
  3. Open Promote. Share a video.
Second volunteertour.volunteer2
  1. Open Seva Rides. Tap Offer a ride.
  2. Answer the first volunteer's request.
  3. Go to Home on both phones. Watch the bell.
Coordinatortour.coordinator
  1. Open Leads. See the whole centre.
  2. Open Admin. Read Support requests.
  3. Open Announcements. Post a notice.
Admintour.admin
  1. On Home, tap Turn apps on or off.
  2. Switch Promote off.
  3. Go Home. The tile is gone. Switch it on again.

Tip: for the two volunteers, use two phones or two browsers.

3. The apps

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.

Main apps

Leads

Leads app: list of leads assigned to you

Follow up with people you invited. Call or WhatsApp in one tap.

Try
  1. Tap Leads. Find "Assigned to you".
  2. Tap Call or WhatsApp on a lead.
  3. Tap Keep/share. Keep it, or share it with your centre.

One lead per phoneDo not contact needs a reasonUndo the last stepClosed list with reason

Teams

Teams app: your centre and its team

Your centre and its team. Invite people. Set the centre's place on the map.

Try
  1. Tap Teams. See your centre.
  2. Tap Add team member.
  3. Change "Days before an idle lead returns". Tap Save days.

More apps

Survey

Survey app

The Happiness Survey. Each teacher makes their own QR link.

  1. Tap Survey.
  2. Open your QR.
  3. Tap Results.

Seva

Seva app

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

  1. Tap Seva.
  2. Pick This week.
  3. Open a card and sign up.

Seva Rides

Seva Rides app

Shared rides to programs and seva.

  1. Tap Seva Rides.
  2. Tap Search near here.
  3. Tap Need a ride.

My Programs

My Programs app

Programs you run or attend.

  1. Tap My Programs.
  2. Open a program.
  3. See who comes.

Find Programs

Find Programs app

The Art of Living program catalog.

  1. Tap Find Programs.
  2. Search a program name.
  3. Open one.

Announcements

Announcements app

Notices from registered centres. Filter by centre.

  1. Tap Announcements.
  2. Read the newest.
  3. Teachers: post one.

Promote

Promote app

Videos, posters, your program links and ready messages.

  1. Tap Promote.
  2. Pick Videos.
  3. Tap Share.

Admin (staff only)

Admin hub

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

  1. Sign in as coordinator.
  2. Tap Admin.
  3. Open Support requests.

Profile and account

Profile screen

Your details and your language.

  1. Tap the round initial at top right.
  2. Change the language.
  3. Open any app. It uses your language.

Apps from the CRM2 team

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

4. How it fits together

Before Home screen tile list fixed in code CRM2 modules only Postgres New tile? code change and a new deploy After Home + one top bar reads the app list when you sign in CRM2 modules own data, Postgres Added apps own data, D1 Admin switch any app on or off, no rebuild (a new app: 1 id row in the shell)
  1. One home. All apps open from one tile screen.
  2. One top bar. Back, app name and account look the same in every app.
  3. Your tiles only. The app list is read at sign-in. Your role decides the tiles.
  4. Off without a rebuild. An org admin switch hides a tile. An added app then answers "not found".
  5. Two teams, no clash. CRM2 modules and added apps keep separate data. They meet only in the home screen and through APIs.

5. What changed in CRM2

ItemBeforeAfterWhy
App listThe 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 switchEvery 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 frameCRM2 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 addressThe 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 languagesGeneric 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.
SpeedSign-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.

Changes to the CRM2 core

Part 1: the Samanvay shell. Part 2 (AOL split) follows.

A board with sockets; teams plug tiles in; one switch dims a tile. RegistrySwitchDoorOne frame

The core becomes a plug-in board

173 files+11,126 / −375
9 → 17tiles
2 → 6locales · VITE_SHELL=aol
≈2 s → ≈1 sopen an app · desktop · before one-frame
Overview: phone, shell with bar, grid, registry, door and frame, binding, AOL Worker and D1 Lines added by area

Plug in

2.1 Tile = data row

Registry diagram: 8 dev edits; mounted AOL app needs one shell id row

Dev: 8 edits · native tile: 10+ stepsWithout: Every tile ships shell

Row carries permission and switch

2.2 One switch

Switch diagram: edit code and deploy before, one tap after

Deploys 1 → 0Without: Faulty app stays on

Bad app off in one tap

2.3 Admin > Apps

Admin Apps flow: org admin toggles AOL D1 switch; grid refetches

5 files ≈+270Without: Only developers switch

Org admins switch tiles

2.9 AOL registry

AOL app registry: shell keeps lists; check catches id and path drift

Shell classifier removed · drift caught by checkWithout: Two lists drift

Shell keeps app lists; check pins ids and paths

One frame

2.4 One bar

Shell bar diagram: before, AOL was a separate site with its own bar; now AOL pages sit under the shell bar

AOL apps under the shell barWithout: AOL stays a separate site

AOL's own chrome stays hidden

2.5 Door + frame

Door and frame: one first-party AOL session, five frame-to-shell and two shell-to-frame messages

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

One origin, one session

2.6 Speed

Desktop speed measurements from before one-frame; SPEED-5 and deploy-1022 were not timedFrame decision: ready and page allowed

Sign-in 1123 → 572 ms · desktop, before one-frameWithout: ≈2 s every tap

Deploy-1022 one-frame state was not timed

2.8 Bell

Notice count appears only on Home; tap opens Notices in the frame

4 files ≈+150Without: Notices go unseen

Notice seen from Home

Look + proof

2.7 Languages

Locale choices: 2 to 6 in the AOL shell build only; 4 drafts

Locales 2 → 6 · AOL shell buildOther builds: en + hi

Six locales in the AOL shell build

2.10 Flows + chunks

Shell flows run against deployed proto; chunk count is checked at build time

17 chunks checkedWithout: Breaks found on phones

Breaks caught before team release

2.11 Other edits

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.

Changes to the AOL app: one PR per app

Part 2. Part 1 is the CRM2 shell above. Before is AOL main 55df3634. After is main ba3653b5 and its branch cut of 22 Oct 03:24 (integration 2256d0e9): 1,607 files / 274,334 lines. Fair-run rows are 55df3634 vs afcf4e05. Where after is worse, the card says so.

A central hub; teams carry blocks that dock to it; one block is dimmed.CoreApps plug inOne PR eachSwitch off

One core, apps plug in

15 PRsnumbered 6 to 18 · 1,607 files
0 failcore alone 501 · core + Leads 1,953
50 → 6hand-written core → app imports
11/16 → 6/14conflict files / hunks · fair run · afcf4e05

Honest rows: total core → app imports rise (50 → 57), adding an app adds lines (26 → 86), removing one touches more files (44 → 53), Leads first load is 301 B larger, and /app is 4.1 ms slower in the fair run. The gain is where the links sit and who can switch an app off.

Since #394 the generated lists merge with 0 conflicts (ba3653b5); two real app PRs still edit shared test pins (being fixed).

Structure

A.1 Folder tree

The like-for-like file tree grows from 1,446 to 1,607 carried files; 423 .claude and .backlog files are not carried.

1,446 → 1,607 files carriedWithout: Apps mixed in src/ and frontend/src/

Apps move out; core keeps listed leftovers

A.2 Plug-in board

Nineteen app ids plug into twelve hook keys; apps:list writes six generated lists.

19 ids · 12 hook keys · 6 generated listsWithout: Hubs import every app

Apps plug into twelve hook keys

A.3 Import graph

Hand-written core-to-app imports fall from 50 to 6 and app-to-app from 2 to 0; the total core-to-app count rises from 50 to 57 because generated lists name each app. Commits 55df3634 and ba3653b5.

Hand-written hub imports 50 → 6 · app → app 2 → 0Without: Worse: total core → app 50 → 57 (generated lists)

Core imports no app by hand

A.4 One owner per app folder

PathOwner (proposed)
core/, migrations, scripts, testsaol-core
apps/leadsaol-leads
apps/teamsaol-teams
apps/programsaol-programs
apps/surveyaol-survey
apps/seva, apps/ridesaol-seva
apps/announcements, apps/promoteaol-comms
apps/adminaol-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.

The PRs

Fifteen AOL split PRs run from PR 6 tooling through PR 18 integration, with app changes from 607 to 45,144 lines.

PR 6 Tooling

Build, scripts, CI

Alone: via 8 (no code to test)

88 files · +32,539 · base dev

Read first: package.json, then ci.yml

Without: No app builds or runs the boundary check

PR 7 Core server

Server core, 87 migrations

Alone: via 8

304 files · +34,588 · base PR 6

Read first: core/server/app-registry.mjs

Without: Nothing runs

PR 8 Core UI

Client core, UI kit, built bundle

Alone: 501 / 0 (was 427 / 220)

269 files · +19,519 · base PR 7

Read first: the two registry readers

Without: Core alone fails 220 tests

PR 9a Leads

Queue, detail, follow-ups

Alone: proven on 9c

203 files · +45,144 · base PR 8

Read first: two registration files, then routes

Without: No Leads tile

PR 9b Leads intake

Intake, ads, coverage

Alone: proven on 9c

36 files · +9,186 · base PR 9a

Read first: server/apps/leads-intake.mjs

Without: No intake or ads screens

PR 9c Leads bulk

Import, export, refer

Alone: core + Leads 1,953 / 0 (was 189 / 120)

22 files · +7,030 · base PR 9b

Read first: server/apps/leads-bulk.mjs

Without: No CSV import or referrals

PR 10 Teams

Team tree, invites, centre profile

Alone: 2,076 / 0

53 files · +8,407 · base PR 9c

Read first: server/apps/my-centres.mjs

Without: No Teams tile; Admin cannot land

PR 11 Programs

My and Find Programs

Alone: 717 / 0

76 files · +15,134 · base PR 8

Read first: both registrations, then apps/programs/routes/events.mjs

Without: No programme pages

PR 12 Survey

Happiness Survey, form builder

Alone: 532 / 0

39 files · +6,258 · base PR 8

Read first: server/apps/survey.mjs

Without: No Survey tile

PR 13 Seva

Callouts, shifts, roster, safety

Alone: 593 / 0

54 files · +11,338 · base PR 8

Read first: server/apps/seva.mjs (hooks)

Without: No Seva tile; Rides cannot land

PR 14 Rides

Ride offers, needs, notices

Alone: 629 / 0

44 files · +6,629 · base PR 13

Read first: server/apps/rides.mjs (cron, notices)

Without: No Rides tile

PR 15 Announcements

Announcements tile (the template)

Alone: 507 / 0

23 files · +607 · base PR 8

Read first: all 7 app files: copy this PR for a new app

Without: No Announcements tile

PR 16 Promote

Videos, posters, links, messages

Alone: 513 / 0

33 files · +1,279 · base PR 8

Read first: server/apps/promote.mjs

Without: No Promote tile

PR 17 Admin and profile

Staff hub, own profile

Alone: 2,115 / 0

55 files · +7,326 · base PR 10

Read first: both registrations; the one declared link

Without: No Admin hub or profile page

PR 18 Integration

357 cross-app test files, 5 generated lists

Alone: 4,226 / 0

357 new files · ~+69,350 · base merge of 11, 12, 14, 15, 16, 17

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. All counts are from the 22 Oct 03:24 cut of ba3653b5 (branch-status.md). PR 9a and 9b were not run alone, only the stack tip 9c.

Workflows

C.1 Add an app

Adding an app moves from 12 files to 9 files in the fair run; 4 hub or core files change in both, and the lines added rise from 26 to 86.

12 → 9 filesWithout: Worse: lines added 26 → 86 (fair run)

A new app is mostly its own files

C.2 Remove or switch off

Removing an app drops its registration folders while core code remains; switch-off is one tap in the CRM2 shell for mounted apps when EMBED_ENABLED is 1, with Seva exits kept open.

Off in one tap, no deployWithout: Worse: remove touches 44 → 53 files

Off in one tap, no deploy

C.3 Review and merge one app PR

Review size falls from 274,334 lines to 607–45,144 per PR; in the fair run, conflicts fall from 11 files and 16 hunks to 6 and 14.

Conflicts 11/16 → 6/14 (fair run)Without: One 274,334-line review

Each team reviews its folder only

C.4 A user opens an app

A tap on Leads goes through the shell door and service binding to the AOL Worker; if the app is switched off it answers 404, else the registry route reads AOL D1.

No behaviour change · Leads open 0.0574 → 0.0546 sWithout: Core knows every app

Same tap, registry finds the app

C.5 Database migrations

Eighty-seven migration files stay in core; 0645 is file 58 of 87 and 0666 is file 77, shell_handoff plus app_switch.

One ordered line, held by coreWithout: Two apps pick the same number

All 87 migrations stay in PR 7

Benchmarks

Benchmarks before and after: hand-written core-to-app imports 50 to 6, app-to-app 2 to 0, two-app conflict files / hunks 11 / 16 to 6 / 14 in the fair run, core alone 220 failures to 0. Worse after: total core-to-app imports 50 to 57, /app page plus 4.1 ms, add-app lines 26 to 86, remove-app files 44 to 53, Leads first load plus 301 bytes, sign-in plus 0.5 ms.
Worse afterBeforeAfterWhy
Core → app imports, all5057Generated lists name each app (51 of 57). Hand-written: 50 → 6.
Add an app: lines added2686The old lists were rewritten whole. #394 now makes one line per app; not re-measured.
Remove an app: files4453Lists, boot and route checks still need edits. The gain is the one-tap switch.
Leads first load (gzip B)109,541109,84255df3634 → ba3653b5; +301 B, inside the 109,850 B budget.
/app page (local)0.0302 s0.0343 s+4.1 ms; no cause isolated.
Sign-in to 303 (local)0.0376 s0.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 (add, remove, 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). Local times are local-stack times, not phone times. Mostly plug-in: 6 hand-written core → app imports remain (Queue.jsx and five server routes), plus ride, seva and survey form files, SurveyShare.jsx and seva-safety-switch.mjs in core. App-owned tests, flows and pages outside the app folder, plus test pins, still cost files on add/remove; a package to move them is running.

6. User manual

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.

Leads for volunteers and teachers

Goal: Add a person, call them, log what happened.

  1. Open Leads. Active leads show first. Closed leads have their own tab.
    Leads: Open Leads. Active leads show first. Closed leads have their
  2. Tap + Leads. Type a name and a mobile number. Pick how you know them, and write a short comment. The comment is required.
    Leads: Tap + Leads. Type a name and a mobile number. Pick how you kLeads: Tap + Leads. Type a name and a mobile number. Pick how you k
  3. Tap Send 1 to my team. A number your organisation already holds is skipped, and the screen says so.
    Leads: Tap Send 1 to my team. A number your organisation already hoLeads: Tap Send 1 to my team. A number your organisation already hoLeads: Tap Send 1 to my team. A number your organisation already ho
  4. Search by name or phone. Tap Filters to narrow by status, program or source.
    Leads: Search by name or phone. Tap Filters to narrow by status, prLeads: Search by name or phone. Tap Filters to narrow by status, prLeads: Search by name or phone. Tap Filters to narrow by status, prLeads: Search by name or phone. Tap Filters to narrow by status, pr
  5. Open a lead. Tap Call or WhatsApp. WhatsApp fills a message from a template. Tap Open WhatsApp to send.
    Leads: Open a lead. Tap Call or WhatsApp. WhatsApp fills a message Leads: Open a lead. Tap Call or WhatsApp. WhatsApp fills a message
  6. Tap Log. Pick the outcome, add a comment, then tap Save update. Tap Undo in the bar if you tapped wrong.
    Leads: Tap Log. Pick the outcome, add a comment, then tap Save updaLeads: Tap Log. Pick the outcome, add a comment, then tap Save updaLeads: Tap Log. Pick the outcome, add a comment, then tap Save updaLeads: Tap Log. Pick the outcome, add a comment, then tap Save upda
  7. To stop all contact, pick Not interested and tick the do-not-contact box. The lead closes and shows Do not contact.
    Leads: To stop all contact, pick Not interested and tick the do-notLeads: To stop all contact, pick Not interested and tick the do-notLeads: To stop all contact, pick Not interested and tick the do-not
  8. Tap Keep/share to keep a lead, show it to your team, or open it to the team. Tap Save.
    Leads: Tap Keep/share to keep a lead, show it to your team, or openLeads: Tap Keep/share to keep a lead, show it to your team, or openLeads: Tap Keep/share to keep a lead, show it to your team, or open
  9. Tap Assign to give a lead to someone else. Pick a team or a person, then tap Take this one or the assign button.
    Leads: Tap Assign to give a lead to someone else. Pick a team or a Leads: Tap Assign to give a lead to someone else. Pick a team or a Leads: Tap Assign to give a lead to someone else. Pick a team or a Leads: Tap Assign to give a lead to someone else. Pick a team or a
Teams for team coordinators

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

  1. Open Teams. You see each team with its calls and registrations, and the people in your area.
    Teams: Open Teams. You see each team with its calls and registratio
  2. Tap Add a new team. Type a name. Pick a map place if you want one. Tap Add team.
    Teams: Tap Add a new team. Type a name. Pick a map place if you wanTeams: Tap Add a new team. Type a name. Pick a map place if you wanTeams: Tap Add a new team. Type a name. Pick a map place if you wanTeams: Tap Add a new team. Type a name. Pick a map place if you wan
  3. Tap Add team member. Type a mobile number and pick a role. Tap Add. Anybody already in the app joins at once. A new number gets an invitation on WhatsApp.
    Teams: Tap Add team member. Type a mobile number and pick a role. TTeams: Tap Add team member. Type a mobile number and pick a role. T
Announcements for teachers

Goal: Post a notice at one centre.

  1. Open Announcements. Tap New announcement.
    Announcements: Open Announcements. Tap New announcement.
  2. Pick the team. Type a title, pick a date and type a message. Tap Post.
    Announcements: Pick the team. Type a title, pick a date and type a message. Tap Post.Announcements: Pick the team. Type a title, pick a date and type a message. Tap Post.
  3. Everyone can read it in the same screen. You can edit or remove your own notice.
    Announcements: Everyone can read it in the same screen. You can edit or remove your own notice.
Find Programs for everyone

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

  1. Open Find Programs. Sessions for the next 30 days show first, grouped by when.
    Find Programs: Open Find Programs. Sessions for the next 30 days show first
  2. Type a place, language or PIN code in the search box.
    Find Programs: Type a place, language or PIN code in the search box.
  3. Tap the chat button on a session to share it on WhatsApp.
    Find Programs: Tap the chat button on a session to share it on WhatsApp.
My Programs for teachers

Goal: See your sessions and share them.

  1. Open My Programs. You see coming up and running sessions, and weekly sessions.
    My Programs: Open My Programs. You see coming up and running sessions, an
  2. Tap a session for dates, place, contribution and who to contact.
    My Programs: Tap a session for dates, place, contribution and who to cont
  3. Tap Share on WhatsApp to invite people. You can also set a map place or look at rides and seva for the session.
    My Programs: Tap Share on WhatsApp to invite people. You can also set a m
Promote for volunteers

Goal: Find links and material to share.

  1. Open Promote. Tap My links to see your own link and how many clicks and registrations it has.
    Promote: Open Promote. Tap My links to see your own link and how many
  2. Tap Videos to find a video. Use Kind, Language and Max minutes. Tap Share.
    Promote: Tap Videos to find a video. Use Kind, Language and Max minut
  3. Posters and Messages are in this demo with sample data. The real posters and texts come later.
    Promote: Posters and Messages are in this demo with sample data. The Promote: Posters and Messages are in this demo with sample data. The
Seva Rides for volunteers and riders

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

  1. Open Seva Rides. Pick My location, My centre or PIN code, and a distance.
    Seva Rides: Open Seva Rides. Pick My location, My centre or PIN code, an
  2. Tap Search near here. Pick Going or Coming back. Open a ride to ask for a seat.
    Seva Rides: Tap Search near here. Pick Going or Coming back. Open a ride
Seva for volunteers and coordinators

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

  1. Open Seva. Tap Near me or Near my centre. Use Any date, This week or 30 days to narrow it.
    Seva: Open Seva. Tap Near me or Near my centre. Use Any date, This
  2. Open a seva. Tap I will do this. Tick that you are 18 or older. Tap I will do this again.
    Seva: Open a seva. Tap I will do this. Tick that you are 18 or oldSeva: Open a seva. Tap I will do this. Tick that you are 18 or old
  3. Coordinators (and volunteers, where allowed): tap Add seva opportunity. Pick the team, the kind of seva, the time and how many people. Tap Add a shift for more times.
    Seva: Coordinators (and volunteers, where allowed): tap Add seva opportunity. Pick the team, the kind of seva, the time and how many people. Tap Add a shift for more times.Seva: Coordinators (and volunteers, where allowed): tap Add seva opportunity. Pick the team, the kind of seva, the time and how many people. Tap Add a shift for more times.Seva: Coordinators (and volunteers, where allowed): tap Add seva opportunity. Pick the team, the kind of seva, the time and how many people. Tap Add a shift for more times.
  4. Tap Publish. The seva shows in the list.
    Seva: Tap Publish. The seva shows in the list.
Survey for teachers

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

  1. Open Survey. Ready-made forms are listed. Tap Survey for another source.
    Survey: Open Survey. Ready-made forms are listed. Tap Survey for ano
  2. Pick a form and a source. Set how many days the link works. Tap Make the QR.
    Survey: Pick a form and a source. Set how many days the link works. Survey: Pick a form and a source. Set how many days the link works.
  3. Share the link or the QR. Tap Copy link or Share on WhatsApp. Tap Stop this link to close it.
    Survey: Share the link or the QR. Tap Copy link or Share on WhatsApp
  4. Tap Results to see the answers and the new leads that came from the survey.
    Survey: Tap Results to see the answers and the new leads that came f
Profile and account for everyone

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

  1. Tap your round account button at the top right. Pick a language from the six listed. The screen changes at once.
    Profile and account: Tap your round account button at the top right. Pick a languProfile and account: Tap your round account button at the top right. Pick a langu
  2. Open Profile and Account. To change your name, areas or PIN codes, send a request. An admin approves it.
    Profile and account: Open Profile and Account. To change your name, areas or PIN

Not in this manual yet: Admin, Wisdom, Resources, Ask AI, VTP. Posters, messages and videos in Promote show sample data.

7. For developers

Architecture (team target; in the demo CRM2 tiles use mock data)

Phone browser Samanvay shell (volunteer2-fe) sign-in · top bar · tile grid · app frame one address: one cookie, no CORS · Worker has no DB HTTP Worker link CRM2 modules volunteer-be, /api/v1/* mock data in the demo Added apps AOL-Connect Worker Postgres (CRM2 team) D1 (added apps) The two sides share no tables. They meet only in the shell and through APIs.
  1. The shell (apps/volunteer2-fe) owns the sign-in screen, the top bar, the tile grid and the app frame. AOL checks the account.
  2. CRM2 modules use volunteer-be and Postgres, as before.
  3. Added apps run in the AOL-Connect Worker on D1.
  4. Both sit under one address, so every cookie is first-party and no CORS is needed.

How an app plugs in

1. A row in the app list id, entry, permission, switch 2. A tile on Home GET /api/apps: only your rows 3. The door /x/<id>/ checks session and switch 4. The app in the frame top bar, app page below Switch off? tile hidden door: 404
  1. Add one row to AOL's app list (src/routes/apps.mjs) and the same id to the shell list (packages/app-registry). A check keeps the two equal.
  2. GET /api/apps returns only the rows this person may open.
  3. A tap opens /x/<id>/. This "door" checks the session and the switch.
  4. The shell draws the top bar. The app page loads below it, with no bar of its own.
  5. The page talks back with 5 messages only: back, ready, title, badge, language. The shell sends 2: open and language. Each is checked.
  6. Switch off: the tile hides. The door and the app's API answer 404.

The PR plan: 21 branches, app by app

PR order: one PR per app on core Arrow = must merge first. Core (6→7→8) first. Then each app on core: Leads 9a→9b→9c, Teams after Leads, Seva Rides after Seva, Admin after Teams. 18 lands last. Shellparallel: 1→2→3→3b→4→5 AOL core6→7→8 Leads & Teams9a→9b→9c; Teams after Leads Other appseach on core (8) 1App registry 2Shell frame 3Brand, icons, i18n 3bBrand decision 4Shell speed 5Shell flows 6Core tooling 7AOL core · 87 migrations 8Core UI 9aLeads 9bLeads intake 9cLeads bulk 10Teams 11Programs 12Survey 13Seva 14Rides 15Announcements 16Promote 17Admin 18Cross-app integration · lands lastOctopus parents: 10, 11, 12, 14, 15, 16, 17 feature/samanvay → dev
  1. Every branch opens a PR into feature/samanvay, not into dev. One bad PR then cannot break dev for the team.
  2. When all 21 are merged and the team agrees, one PR merges feature/samanvay into dev.
  3. Shell (1 to 5) and AOL core (6 to 8) go at the same time. Then one PR per app, each on core. Leads and Teams first.
  4. Leads is too big for one PR. It goes as three stacked PRs: 9a, 9b, 9c. Each passes its own tests.
  5. Teams comes after Leads. Its centre view reads the Leads API.
  6. All database steps (87 migrations) go in the AOL core PR (7). D1 applies them in one fixed order.
  7. AOL code stays outside the team's pnpm workspace. Its own CI lane runs its build and tests.
#BranchWhat it addsLines (estimate, before the app split; re-cut pending)
1feat/app-registryRuntime app list, permission per tile, switches, Admin › Apps~1.9k
2feat/shell-bar-frameTop bar, app frame, door, Home and Back, sign-in handoff~2.1k
3feat/shell-brand-icons-i18nSamanvay brand, Sunburst icons, six-language shell~5.3k
3bchore/brand-samanvaySeva → Samanvay in team apps (the team may refuse this one alone)~0.2k
4perf/shell-speedCached assets, boot data in the page, one chunk per module~0.3k
5test/shell-flowsBrowser flows for the shell~0.7k
6chore/aol-core-toolingPackage, seeds, invented test data, boundary check, CI lane~16k
7feat/aol-coreAuth, session, scope, roles, people, lead store, all migrations~25k
8feat/aol-core-uiUI kit, router, store, core texts~14k
9afeat/app-leadsLead queue, detail, follow-ups, status~32k
9bfeat/app-leads-intakeIntake, ads, coverage, lead sources and fields~27k
9cfeat/app-leads-bulkImport, export, refer, offline book~12k
10feat/app-teamsTeam tree, members, invites, centre profile~10k
11feat/app-programsMy Programs and Find Programs~21k
12feat/app-surveyHappiness Survey and form builder~11k
13feat/app-sevaSeva callouts, shifts, roster, safety~14k
14feat/app-seva-ridesRide offers, needs, notices~10k
15feat/app-announcementsAnnouncements tile~1k
16feat/app-promoteVideos, posters, program links, messages~2.3k
17feat/app-admin-profileStaff hub and own profile~12k
18test/aol-integrationTests that cross two or more apps~26k
Totalestimate, before the app split; re-cut pending≈245k

What stays in the demo only

Stays in the demoWhat 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 shellNone. 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 configThe real CI SDK and the team's own config.
The link to our own demo databaseThe team links its own AOL-Connect Worker and D1 per environment.
The name "Samanvay" in team-owned appsOnly if the group agrees (branch 3b).

8. What is next

  1. The team tries the demo and sends notes.
  2. Core PRs (6 to 8) open first. Then one PR per app on core. Leads and Teams first.
  3. The user manual covers Admin, Wisdom, Resources, Ask AI and VTP.
  4. Hindi is checked. Then Marathi, Telugu, Gujarati and Kannada.
  5. The group decides on the name, and on D1 for new apps.