Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Modern SaaS client portal and CRM built with Next.js, TypeScript, Prisma and Supabase.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
A multi-tenant CRM SaaS for freelancers and small agencies — every account is an Organization with its own team (staff members with roles), its own Clients/Projects/Tasks/Invoices, its own billing subscription, and an optional Client Portal its clients can log into directly. Built with Next.js App Router, Prisma, and Supabase.Read the full README ↗A multi-tenant CRM SaaS for freelancers and small agencies — every account is an Organization with its own team (staff members with roles), its own Clients/Projects/Tasks/Invoices, its own billing subscription, and an optional Client Portal its clients can log into directly. Built with Next.js App Router, Prisma, and Supabase.
A complete, tested multi-tenant SaaS foundation: real multi-tenancy, real Paddle billing (buyer supplies their own account/credentials — see Billing), a Client Portal, attachments, comments, notifications, onboarding, analytics, search, and a Platform Admin console — all built on Server Components and Server Actions with no client-side data-fetching library.
Staff demo credentials (Owner):
[email protected] | |
| Password | DemoPassword123! |
A second staff account ([email protected], same password) is a plain Member of the same organization — sign in as either to see the same shared workspace, with the Team page showing both.
Client Portal demo credentials (a real, separate portal-only identity, invited into one of the demo clients):
[email protected] | |
| Password | DemoPassword123! |
All three accounts are seeded via npm run db:seed (prisma/seed.ts, see Database setup) into one already-connected demo organization — clients, projects, tasks, invoices, a couple of threaded comments (including an @-mention), and a couple of notifications, so every staff account lands directly on a populated dashboard, no extra setup step required. Attachments are deliberately not seeded: an Attachment row is a pointer to a real Supabase Storage object, and the seed script performs no Storage upload, so a fake row would just 404 — upload a real file through the app itself to see that flow.
These demo credentials are intentionally public — the seeded organization uses only fictional data (see prisma/seed.ts), but the account has full read/write access, so treat data in it as disposable and re-seedable, not as a stable fixture between sessions.
| Dashboard — live metrics, revenue trends, and status breakdowns | Clients — search, filter, sort, pagination |
| Projects | Tasks |
| Invoices | Client Portal — a client's own view of their invoices |
| Client detail — Client Portal access management | Project collaboration — threaded comments with @-mentions |
| Analytics — KPIs and trend charts derived entirely from the org's own data | Team — roles and membership |
| Billing settings — plan, usage, and Paddle plans (buyer-configurable; intentionally unconfigured in this demo) | Onboarding — first-login "Getting started" checklist |
Also: branded login · Client Portal — Projects
Organization; staff join it via a Membership with a role (OWNER / ADMIN / MEMBER), enforced server-side on every sensitive mutation (team management, billing, etc.), never just in the UI./portal) — a separate, thinner identity space (PortalUser, invited per-Client) where a client can log in to view their own projects and invoices — no access to staff data, no access to other clients./analytics, OWNER/ADMIN) — KPIs and trend charts derived entirely from the org's own data; no external analytics provider, no tracking./platform-admin) — a read-only, env-var-gated internal console for whoever operates the deployment (see Platform Admin) — separate from any tenant's own Organization.?q=&status=&sort=field:dir&page=), so state survives a refresh and is shareable as a link.This is the beginning of the README. Read the rest at the original. Read the full README ↗