Auth is not just a login page.
Sessions, email verification, password reset, OAuth, organizations, invitations, roles. Written from zero, this eats weeks.
Auth, billing, organizations, invitations, and an Indonesian payment gateway are done. Free and open source — clone it and focus your time on the product itself.
Built with
Not a buzzword list. These are the packages actually installed.
Install, dev, build, and test through one tool.
Type-safe routes. OpenAPI docs generated from the code.
Migrations live in the repo. Not in a vendor dashboard.
Email, OAuth, organizations, invitations, roles.
Implemented. Midtrans, Xendit, and Stripe share the same interface — implementation is on you.
Bahasa Indonesia and English resources included.
Not the feature list. It is the layer underneath — auth, orgs, billing, webhooks. The part that gets rewritten from scratch on every project.
Sessions, email verification, password reset, OAuth, organizations, invitations, roles. Written from zero, this eats weeks.
Duitku, Midtrans, Xendit — signature schemes, webhook shapes, and status codes all differ. Wiring the first one is work. The second starts over.
Every query needs the org scope. Active org needs to be resolved per request. Role checks need to be in the right place. One slip and the data leaks.
Loose types, manual migrations, brittle test setups. Bugs that should surface in the editor only show up in production.
The full list of packages with their versions. Everything is already integrated.
One tool for install, dev, build, and test. TypeScript strict mode across every workspace.
Hono for routing, zod-openapi for request validation and auto-generated OpenAPI spec. Swagger UI at /api/docs.
Drizzle ORM with TypeScript schema. Versioned migrations. No drift between dev and production.
Sessions, email verification, password reset, OAuth (Google/GitHub), organizations, invitations, and roles — all one package.
Abstract interface as the contract. Duitku already implemented. Midtrans, Xendit, and Stripe just need implementation — they share the same interface.
TanStack Router auto-generates the route tree. TanStack Query for server state. Tailwind v4 with shadcn/ui — every component already customized.
React Email for templates. Falls back to console log when the API key is missing — dev is never blocked.
Multi-stage Dockerfiles for API and web. GitHub Actions for lint, typecheck, and test. A separate workflow builds and pushes images to GHCR. Vitest for unit tests, Playwright for end-to-end.
Not optional add-ons. These are the leaks that show up once production has real users.
CSP, HSTS, X-Frame-Options, Referrer-Policy — all wired through hono/secure-headers. The SPA nginx is hardened too.
AppError with a stable code and HTTP status. Clients branch on the code, not on parsed strings.
Sliding window on business routes, stricter cap on sign-in and password reset. Webhooks are exempt so provider retries do not trip the limit.
Every gateway adapter verifies the signature timing-safely. Amount and currency are re-checked against the pending order.
Payments dedupe by (provider, reference). Terminal states (paid/refunded) cannot regress. Subscription activation runs in the same transaction.
requireActiveOrg + requireRole helpers. Owner/admin/member hierarchy. Workspace-changing routes require admin at minimum.
Routes declared with createRoute() appear in Swagger UI at /api/docs during dev. In production docs are gated off.
Vitest for unit tests, Playwright for end-to-end. GitHub Actions CI is already configured.
Hierarchical AGENTS.md files carry the invariants next to the code they govern. Point Claude Code, Cursor, or Copilot at the repo and it ships features instead of rediscovering your stack.
A root map plus one AGENTS.md beside each package. Golden rules, landmines, and file-sync tables live where the agent reads them — no context re-derivation per session.
Tenant scoping, money-as-integer, provider-agnostic payments, error-at-boundary — each rule is stated explicitly so an agent (or a new hire) cannot silently break it.
Every rule pairs with a grep or command to verify it — one <AppShell>, filter by organization_id, i18n keys in both locales. Reviewable by a machine before merge.
New table, route, page, provider, or error code each has a documented path. The agent follows the same recipe you would, touching the exact files that must stay in sync.
OpenAPI is the HTTP source of truth; shared @saas/* types flow across packages. A broken contract fails typecheck, so the agent catches it at compile time.
The id locale is typed against en, so a missing key breaks the build instead of falling back silently. Agents add copy to both files or CI stops them.
+ No secret prompt. The docs your team reads are the same context your agents get.
Monthly IDR plans. Organizations with members and roles. Checkout through a swappable gateway.
Vendors each get their own workspace. Members, invitations, and billing scoped per organization.
Auth guards, role-based access, and a dashboard shell you can extend without a rewrite.
Rate limits, consistent error shape, and hooks for usage-based billing.
One codebase across client apps. Swap gateway config per project.
Build solo without rewriting the plumbing. Spend the time on what makes your product different.
Not a hosted platform. Not a code generator. It is a repo you clone and edit freely.
If auth, billing, or multi-tenancy has stalled you before — those parts are done here. Clone the repo and build.