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
An all-in-one operations platform for small digital agencies: CRM, projects, invoicing, a client portal and an AI assistant.
BusinessTypeScript · JavaScriptGitHub @MaazAhmed99OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Portfolio demo: an ERP-style operations platform for small agencies. Next.js 16, Postgres (Neon) + Drizzle, Better Auth, Stripe test mode and a free-tier AI assistant.
Loading the full README.
Read the full README ↗An all-in-one operations platform for small digital agencies: clients, projects, invoices and payments, a client portal, team roles and an AI assistant.
Live demo: https://brieflow-ten.vercel.app · Roadmap: https://brieflow-ten.vercel.app/roadmap
This is a portfolio demo. The agency, its staff and clients are invented, generated by a seed script, and the data resets every night. Payments run in Stripe test mode, or in a clearly labelled demo mode, and the AI assistant uses free-tier models. Modules marked Preview show real sample data read-only while they're being built.
| If you need… | Where to look |
|---|---|
| A SaaS dashboard with roles and permissions | src/server/authz/, /app/team (the permissions matrix) |
| Multi-tenant data isolation | scopeFor() in src/server/authz/scope.ts, tests/authz.test.ts |
| An AI chatbot that answers questions about your data | src/server/ai/, /app/assistant |
| Stripe payments with webhooks | src/server/payments/, src/app/api/stripe/webhook/ |
| A documented REST API with API keys | src/server/api/, src/app/api/v1/, /docs/api |
| Secure file uploads | src/server/data/project-updates.ts, src/app/api/files/[id]/ |
| Third-party API integrations | Groq, Gemini, Stripe, Vercel Blob, Frankfurter, Nager.Date (src/server/integrations/) |
| A Next.js App Router backend without a backend-as-a-service | Server Actions, Route Handlers and a Data Access Layer on PostgreSQL |
Working: sign-in with one-click demo roles (admin, manager, accountant, staff, client) · dashboard with KPIs and a 12-month revenue chart · clients · projects (table and board) · invoices with multi-currency totals · mark invoices paid · online payment (Stripe test mode or demo mode) · client portal · comments · private file uploads · team and permissions matrix · audit log · AI assistant · nightly demo reset · integration status page · read-only REST API with public docs.
Preview (read-only sample data): sales pipeline · time tracking · expenses and purchase orders · HR directory and leave (with live public holidays) · support tickets · reports.
Stack: Next.js 16 (App Router, React 19), TypeScript (strict), Tailwind CSS and shadcn/ui, PostgreSQL (Neon) with Drizzle ORM, Better Auth, TanStack Table, Recharts, Zod, Vitest, deployed on Vercel.
Authentication. Better Auth handles email and password sign-in and sessions (src/server/auth/auth.ts). There's no public sign-up: visitors use the demo buttons, which sign in server-side, so the demo password never reaches the browser. Sign-in is rate limited.
Authorization: one rule, everywhere.
getViewer() returns who is asking: user, organization, role and, for client users, their client company.src/server/authz/permissions.ts is the single table of what each role may do. The Team page renders this same table.src/server/data/). Each function checks the permission and adds scopeFor(viewer, table) to its WHERE clause: same organization always, and same client company for client users.Multi-tenancy. Every business table has organization_id. The seed creates a second agency purely so tests can prove the two never see each other's data.
AI assistant (src/server/ai/).
AiProvider interface with adapters for Groq (default) and Google Gemini (fallback when Groq is rate limited), both on their official SDKs.Payments (src/server/payments/). A PaymentProvider interface with two adapters: Stripe Checkout, which accepts test keys only, and a demo checkout.
recordInvoicePayment. It locks the invoice and relies on a unique payment reference, so a retried webhook never records a payment twice.This is the beginning of the README. Read the rest at the original. Read the full README ↗