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
Ooruda helps commercial property associations manage units, billing, payments, and maintenance charges in one platform.
BusinessTypeScript · PLpgSQLGitHub @naithodu-consultingOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
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 ↗Ooruda is a premium Software-as-a-Service (SaaS) application built for housing association and property management. It is designed using a multi-tenant architecture on top of Next.js 16 (App Router), Supabase (Postgres, Auth, Storage), Tailwind CSS 4, and Turborepo.
auth.users.id = accounts.id).super-admin: Platform-wide administrator with control over dashboards, user accounts, subscription metrics, and association creation.assoc_admin: Association Admin owning and managing the settings and memberships of their team/association.billing_operator: Association operator responsible for billing, receipts, and invoices.prop_owner: Property Owner within an association.tenant: Tenant occupying a property within an association./admin):
| Directory | Purpose | Detail |
|---|---|---|
apps/web | Main Next.js Product App | Contains marketing pages, auth, user workspaces, and super-admin panels. |
apps/web/supabase | Backend Migrations & Config | Handles local database schemas, seeds, and migration logic. |
apps/e2e | Playwright E2E Tests | End-to-end testing scripts. |
packages/ui | Core Component Library | Design system elements (@kit/ui) styled with Tailwind and CSS variables. |
packages/supabase | Supabase Clients & SDK | Preconfigured Supabase hooks, browser clients, and server clients. |
packages/next | Next.js Utilities | Safe action clients (authActionClient) and enhancements for route handlers. |
packages/features | Shared Feature Modules | Domain modules (e.g., admin, accounts, auth, billing, team-accounts). |
v20.10.0 or higherv9.15.0 or higherClone the repository and install the dependencies:
pnpm install
Start the local Supabase environment (launches PostgreSQL, Auth, and Storage locally inside Docker):
pnpm supabase:web:start
To reset the database, apply migrations, and run seed files:
pnpm supabase:web:reset
Generate TypeScript types for your Supabase database:
pnpm supabase:web:typegen
Start Next.js and Tailwind dev server:
pnpm dev
The app will be accessible at http://localhost:3000.
getSupabaseServerClient() from @kit/supabase/server-client. Row-Level Security (RLS) is automatically enforced based on the session token.useSupabase() hook from @kit/supabase/hooks.getSupabaseServerAdminClient() from @kit/supabase/server-admin-client when performing actions that bypass RLS (e.g., in a background job or admin actions). Ensure manual validation is done first.Actions are written using authActionClient from @kit/next/safe-action to ensure type-safe parameters, parsed input validations (using Zod schemas), and automatic authentication checks.
import { authActionClient } from '@kit/next/safe-action';
import { z } from 'zod';
export const myAction = authActionClient
.inputSchema(z.object({ id: z.string().uuid() }))
.action(async ({ parsedInput: { id }, ctx }) => {
// ctx.user contains the authenticated caller
});
Before pushing code, run the verification commands:
pnpm typecheck # Run compiler checks
pnpm lint:fix # Fix lint errors with oxlint
pnpm format:fix # Format code with oxfmt
Deployment consists of deploying the frontend Next.js application to Vercel and linking migrations/Edge functions to Supabase.
Detailed deployment instructions, required environment variables, and SMS/OTP configurations are listed in DEPLOYMENT.md.