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 these 4 accounts: Jaigurudev123

Admin demo login: ask the owner.

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.

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.

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.