CommunityOS
Everything Skool does, built for how India and the UK actually sell.
A paid-community platform with the courses, feed, chat, gamification and live calls you would expect — and the parts the American platforms skip: UPI, autopay mandates, GST invoices, rupee pricing and WhatsApp as a first-class sales channel.
The member experience — feed, classroom, chat, leaderboard — sits behind a login by design. These parts are open to anyone, and they are the live platform, not screenshots.
A recorded walkthrough of the owner side — building a paid community, taking a UPI payment, paying an affiliate — is being filmed. It will appear here when it exists, and not before.
Why this
exists.
A creator in India selling a course has one realistic option: an American platform that charges their students in dollars through a card processor, cannot take UPI, does not issue a GST invoice, and treats WhatsApp — the channel their entire audience actually lives in — as something you link to.
The result is a checkout that a large share of Indian buyers abandon, an accountant who cannot file from it, and a marketing channel bolted on from outside.
The product surface itself is well understood; Skool defined it. What was missing was the plumbing underneath, and plumbing is most of the work.
Everything that’s actually built.
Courses & assessment
- Courses with sections and chapters, video, article and quiz content
- Four drip modes — none, by completion, by date, or by enrolment — enforced in the database, so a locked lesson's content cannot be fetched, not merely hidden
- Auto-graded quizzes whose correct answers never travel to the browser
- PDF certificates issued the moment a member hits 100%, with a public verification page for anyone they show it to
- An AI course builder that turns transcripts, links or a PDF into a draft course for review
The community
- A single feed sliced by categories, with rich text, images, polls, @mentions and video embeds
- One-to-one DMs and per-category chat rooms over realtime
- Nine-level gamification, points for likes, daily streaks and 7-day / 30-day / all-time leaderboards
- Events with server-side recurrence, RSVPs, reminders and calendar files
- Native live calls with replays, and web push with no third-party notification vendor
- Search across posts, comments, courses, chapter titles and events that re-checks access on every single row
Money
- Paid tiers through Cashfree — cards, UPI, netbanking
- UPI Autopay mandates for recurring renewals, opt-in per checkout
- PayPal in USD for international buyers, with geo-aware pricing display
- GST-inclusive pricing with sequential per-financial-year invoice numbering
- An affiliate programme: commission on net, a referrer linked to a member for life, and payout batches that cannot double-pay
- A dispute-evidence vault behind private storage and short-lived signed links
Growth & automation
- A WHEN → DO automations builder over the platform's own event stream — nine actions including email, tier grants, points, tags and signed webhooks
- Broadcasts with audience targeting, resumable batch sending and one-click unsubscribe
- A WhatsApp sales bot on Meta's Cloud API directly, with a drag-to-reorder conversational flow builder
- A member-facing AI copilot that answers only from content that member is already allowed to see, with citations
- A one-afternoon importer for creators switching from Skool
The stack,
without mystique.
Standard, boring technology your next developer will recognise. That’s the point — nothing here is a proprietary runtime you’d be locked into.
- Framework
- Next.js 14.2 App Router, TypeScript strict
- Data
- Supabase — Postgres + Auth
- Migrations
- 63, applied in order
- Authorization
- Row-level security — the only boundary
- Payments
- Cashfree PG, Cashfree Subscriptions (UPI Autopay), PayPal
- Messaging
- Meta WhatsApp Cloud API, direct — no reseller
- AI
- Claude — Haiku for the copilot, Opus for course drafting
- Live video
- Daily, with per-community minute caps
The decisions that took the longest.
Anyone can list features. These are the calls that decide whether the thing survives contact with real customers and real money — explained without jargon, because you should be able to judge them without being an engineer.
- 01
The database decides who can see what — not the application
Authorization lives in Postgres row-level security, and the app's own permission checks exist only to hide buttons. If a page forgot a check tomorrow, the query would still return nothing. Every tenant read is gated on the caller's own membership, so guessing an id gets you an empty result rather than someone else's data.
- 02
The authorization bug that a passing test suite could not see
A helper answering “what is this person's role here?” returned nothing at all for a non-member — and in Postgres, a permission check written as “if not allowed, refuse” treats nothing as false and lets the request through. Eighteen functions were affected. I found it by auditing all 161 functions from three independent angles, confirmed it live — a stranger could promote themselves to owner of a community they had never joined — and closed it by making every check total. The full write-up is in the project's decision log, because the interesting part is not the fix.
- 03
The attack suite that reported zero breaches over a live escalation
The suite had been reporting “32 attacks blocked, 0 breaches” the whole time the hole above was open, because every role it impersonated held a membership somewhere — and the bug only opened for someone holding none. I added that missing role. It now runs 59 attacks and the pass condition is the breach count, never a total, precisely because a hard-coded total is part of how the first one survived.
- 04
A linter for exactly one class of bug
To stop that pattern ever returning, a custom linter parses every migration, resolves each database function to its final definition and fails the build if a permission check is written in the shape that fails open. It runs in CI on every push. Writing a bespoke linter for a single bug class is unusual; it is proportionate when the bug is silent privilege escalation.
- 05
Getting paid twice is worse than getting paid once
Payment fulfilment is idempotent and keyed on the gateway's order reference, so the webhook and the thank-you page can both fire, and a retried webhook can fire a third time, and the member is still granted access exactly once and the ledger written exactly once. Prices are always recomputed on the server — the browser is never asked what something costs. Refunds reverse the affiliate commission in the same transaction.
- 06
Sanitise when you read, not when you write
Post bodies are a column members can write to, so a hostile client can push raw HTML straight past any server-side cleaning on the way in. The real defence is re-sanitising at every path that reads a body out. Getting this backwards is the most common way a community platform ends up with stored cross-site scripting.
- 07
Every milestone is adversarially reviewed before it ships
Each feature goes through a review pass whose job is to break it — findings are then independently verified, and the ones that survive get fixed before launch. It has caught a live production bug that had silently stopped paid course buyers being enrolled, a WhatsApp attribution leak that would have credited the wrong community's ad, and a refund path that reversed an affiliate's entire commission over a partial refund.
- 63
- database migrations
- 59
- attacks blocked, 0 breaches
- 4
- ways a member can pay
- 0
- third-party notification vendors
CommunityOS is in production and running my own community. It has no other paying creators on it yet.
Want one of these for your business?
CommunityOStook the shape it did because of one specific business problem. Tell me yours and I’ll tell you what it would take — or watch me drive the back end of these first.
Got a project to scope? Start there. Just want to see it working first? Book the demo.