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
Follow up with people you invited. Call or WhatsApp in one tap.
Try
Tap Leads. Find "Assigned to you".
Tap Call or WhatsApp on a lead.
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
Your centre and its team. Invite people. Set the centre's place on the map.
Try
Tap Teams. See your centre.
Tap Add team member.
Change "Days before an idle lead returns". Tap Save days.
More apps
Survey
The Happiness Survey. Each teacher makes their own QR link.
Tap Survey.
Open your QR.
Tap Results.
Seva
Seva you can join near you. Sign up, check in, log hours.
Tap Seva.
Pick This week.
Open a card and sign up.
Seva Rides
Shared rides to programs and seva.
Tap Seva Rides.
Tap Search near here.
Tap Need a ride.
My Programs
Programs you run or attend.
Tap My Programs.
Open a program.
See who comes.
Find Programs
The Art of Living program catalog.
Tap Find Programs.
Search a program name.
Open one.
Announcements
Notices from registered centres. Filter by centre.
Tap Announcements.
Read the newest.
Teachers: post one.
Promote
Videos, posters, your program links and ready messages.
Tap Promote.
Pick Videos.
Tap Share.
Admin (staff only)
Accounts, support requests, return rules, data import, connected apps.
Sign in as coordinator.
Tap Admin.
Open Support requests.
Profile and account
Your details and your language.
Tap the round initial at top right.
Change the language.
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
One home. All apps open from one tile screen.
One top bar. Back, app name and account look the same in every app.
Your tiles only. The app list is read at sign-in. Your role decides the tiles.
Off without a rebuild. An org admin switch hides a tile. An added app then answers "not found".
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
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.
Changes to the CRM2 core
Part 1: the Samanvay shell. Part 2 (AOL split) follows.
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
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
AOL apps under the shell barWithout: AOL stays a separate site
AOL's own chrome stays hidden
2.5 Door + frame
Sign-ins: 1 (AOL's session, first-party)Without: Separate AOL site
One origin, one session
2.6 Speed
Sign-in 1123 → 572 ms · desktop, before one-frameWithout: ≈2 s every tap
Deploy-1022 one-frame state was not timed
2.8 Bell
4 files ≈+150Without: Notices go unseen
Notice seen from Home
Look + proof
2.7 Languages
Locales 2 → 6 · AOL shell buildOther builds: en + hi
Six locales in the AOL shell build
2.10 Flows + chunks
17 chunks checkedWithout: Breaks found on phones
Breaks caught before team release
2.11 Other edits
Seva → Samanvay: own PR, refusable
Leads link
Local stubs: never ship
rbac test +2
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.
Leadsfor volunteers and teachers
Goal: Add a person, call them, log what happened.
Open Leads. Active leads show first. Closed leads have their own tab.
Tap + Leads. Type a name and a mobile number. Pick how you know them, and write a short comment. The comment is required.
Tap Send 1 to my team. A number your organisation already holds is skipped, and the screen says so.
Search by name or phone. Tap Filters to narrow by status, program or source.
Open a lead. Tap Call or WhatsApp. WhatsApp fills a message from a template. Tap Open WhatsApp to send.
Tap Log. Pick the outcome, add a comment, then tap Save update. Tap Undo in the bar if you tapped wrong.
To stop all contact, pick Not interested and tick the do-not-contact box. The lead closes and shows Do not contact.
Tap Keep/share to keep a lead, show it to your team, or open it to the team. Tap Save.
Tap Assign to give a lead to someone else. Pick a team or a person, then tap Take this one or the assign button.
Teamsfor team coordinators
Goal: See your teams, add a team, add a person.
Open Teams. You see each team with its calls and registrations, and the people in your area.
Tap Add a new team. Type a name. Pick a map place if you want one. Tap Add team.
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.
Announcementsfor teachers
Goal: Post a notice at one centre.
Open Announcements. Tap New announcement.
Pick the team. Type a title, pick a date and type a message. Tap Post.
Everyone can read it in the same screen. You can edit or remove your own notice.
Find Programsfor everyone
Goal: Find a program by place, language or PIN code.
Open Find Programs. Sessions for the next 30 days show first, grouped by when.
Type a place, language or PIN code in the search box.
Tap the chat button on a session to share it on WhatsApp.
My Programsfor teachers
Goal: See your sessions and share them.
Open My Programs. You see coming up and running sessions, and weekly sessions.
Tap a session for dates, place, contribution and who to contact.
Tap Share on WhatsApp to invite people. You can also set a map place or look at rides and seva for the session.
Promotefor volunteers
Goal: Find links and material to share.
Open Promote. Tap My links to see your own link and how many clicks and registrations it has.
Tap Videos to find a video. Use Kind, Language and Max minutes. Tap Share.
Posters and Messages are in this demo with sample data. The real posters and texts come later.
Seva Ridesfor volunteers and riders
Goal: Offer or ask for a ride to a session.
Open Seva Rides. Pick My location, My centre or PIN code, and a distance.
Tap Search near here. Pick Going or Coming back. Open a ride to ask for a seat.
Sevafor volunteers and coordinators
Goal: Find seva near you and sign up. Coordinators add seva.
Open Seva. Tap Near me or Near my centre. Use Any date, This week or 30 days to narrow it.
Open a seva. Tap I will do this. Tick that you are 18 or older. Tap I will do this again.
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.
Tap Publish. The seva shows in the list.
Surveyfor teachers
Goal: Make a link or QR code for a survey and read the answers.
Open Survey. Ready-made forms are listed. Tap Survey for another source.
Pick a form and a source. Set how many days the link works. Tap Make the QR.
Share the link or the QR. Tap Copy link or Share on WhatsApp. Tap Stop this link to close it.
Tap Results to see the answers and the new leads that came from the survey.
Profile and accountfor everyone
Goal: Change your language, see your profile, ask for a change.
Tap your round account button at the top right. Pick a language from the six listed. The screen changes at once.
Open Profile and Account. To change your name, areas or PIN codes, send a request. An admin approves it.
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)
The shell (apps/volunteer2-fe) owns the sign-in screen, the top bar, the tile grid and the app frame. AOL checks the account.
CRM2 modules use volunteer-be and Postgres, as before.
Added apps run in the AOL-Connect Worker on D1.
Both sit under one address, so every cookie is first-party and no CORS is needed.
How an app plugs in
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.
GET /api/apps returns only the rows this person may open.
A tap opens /x/<id>/. This "door" checks the session and the switch.
The shell draws the top bar. The app page loads below it, with no bar of its own.
The page talks back with 5 messages only: back, ready, title, badge, language. The shell sends 2: open and language. Each is checked.
Switch off: the tile hides. The door and the app's API answer 404.
The PR plan: 21 branches, app by app
Every branch opens a PR into feature/samanvay, not into dev. One bad PR then cannot break dev for the team.
When all 21 are merged and the team agrees, one PR merges feature/samanvay into dev.
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.
Leads is too big for one PR. It goes as three stacked PRs: 9a, 9b, 9c. Each passes its own tests.
Teams comes after Leads. Its centre view reads the Leads API.
All database steps (87 migrations) go in the AOL core PR (7). D1 applies them in one fixed order.
AOL code stays outside the team's pnpm workspace. Its own CI lane runs its build and tests.
#
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