Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗समुदाय — plan together, participate together, spend transparently.
A platform for the events a residential community runs: Ganesh Chaturthi, a sports day, a cultural evening. Each one carries its own people, activities, checklist, fund and public ledger.
One codebase, four surfaces:
| Surface | What it is |
|---|---|
| Web | Next.js 16 app — resident portal and admin console |
| Mobile | Expo / React Native — iOS and Android from the same source |
| A bot for the fund, notices, activities and your own tasks | |
| API & MCP | REST for integrations, MCP so an AI assistant can use it as tools |
Nobody joins by guessing a URL. An admin shares the Society ID; a resident signs in with Google, picks their flat, and the admin approves them. For people the committee already knows, an invite code skips the waiting step.
apps/
web/ Next.js 16 (App Router) — UI, REST API, MCP server, WhatsApp webhook
mobile/ Expo SDK 57 + expo-router — iOS, Android
packages/
core/ Domain rules: roles, event maths, zod schemas, WhatsApp parsing
supabase/ Typed Supabase clients + generated database types
config/ Shared TypeScript config
supabase/
migrations/ Schema, RLS policies and RPCs
tests/ A Supabase shim + the RLS test suite
scripts/ db-test.sh, smoke-test.sh, gen-db-types.mjs, seed.ts
Event
├── Checklist tasks with owner and due date → drives "Readiness %"
├── Fund target, contributions, contributor count
├── Activities cultural acts residents sign up to perform in
├── Volunteer roles jobs residents sign up to do
├── Expenses vendor, amount, attached bill, approval trail
├── Vendors marketplace listings chosen to supply the event
└── Closure surplus rule → published transparency report
Marketplace what residents make, teach and sell each other —
listings with a phone and a photo, star ratings, reviews
In PostgreSQL. Every table has row-level security; the web app, the mobile
app, the API and the bot all go through it. The TypeScript in
packages/core/src/roles.ts decides what to show a user — it is not what
stops them. That separation is tested rather than asserted: supabase/tests
proves that
Two places bypass RLS on purpose, both server-side only:
apps/web/src/lib/api/resources.ts, so the scoping
cannot be forgotten piecemeal.lib/whatsapp/bot.ts
resolves the sender to one society first and scopes everything to it.Anywhere you like — supabase.com or a local stack. You need the project URL, the anon key and the service-role key.
pnpm dlx supabase link --project-ref <your-ref>
pnpm db:push # applies supabase/migrations in order
pnpm db:status # SUPABASE_DB_URL=… — names any migration the database is missing
Deploys and migrations travel separately: the web app ships when main moves,
the schema waits for db:push. The Migrations workflow runs db:status
against production on every push to main and once a day, so a migration left
behind turns a check red instead of turning a feature into "Something went
wrong". It needs a SUPABASE_DB_URL repository secret, and fails rather than
skips without one.
Use the Session pooler string for that secret — Supabase dashboard → Connect → Session pooler:
postgresql://postgres.<ref>:<password>@aws-<n>-<region>.pooler.supabase.com:5432/postgres
Not the direct db.<ref>.supabase.co one. It resolves to IPv6 only, and GitHub
Actions runners are IPv4, so the job would fail on the network rather than on
the schema.
In the Supabase dashboard → Authentication → Providers → Google, add your Google OAuth client ID and secret. In the Google Cloud console, add this redirect URI:
https://<your-project-ref>.supabase.co/auth/v1/callback
Then under Authentication → URL Configuration, add your site URL and
http://localhost:3000/** to the redirect allow-list. Email magic links are
built but switched off (EMAIL_SIGN_IN_ENABLED in each app's
lib/sign-in-options.ts); turning them on needs no Supabase setup.
cp .env.example apps/web/.env.local # fill in the Supabase values
cp .env.example apps/mobile/.env # the EXPO_PUBLIC_ ones
pnpm install
pnpm dev
The web app is on http://localhost:3000; pnpm --filter @compences/mobile start
opens the Expo dev server.
This is the beginning of the README. Read the rest at the original. Read the full README ↗