Eduin Garcia
Co-founder & sole engineer · Multi-tenant SaaS

Insurance SaaS, builtas the sole engineer

Multi-tenant SaaS for independent insurance agents — client and policy management, a commission and income ledger, expenses, tax reporting, renewals, and license and continuing-education tracking, all on Stripe-billed subscriptions.

I co-founded Caxper with a US-based business partner and built the entire product — architecture, apps, API and infrastructure — as the sole engineer.

Caxper client management view
Fig. 01 — Agent dashboard
~150k
Lines of TypeScript
217
REST endpoints
62
Database entities
44
Migrations
6 + 9
Apps & shared packages

01 · Architecture

pnpm workspaces monorepo

02 · Apps in the monorepo

6 apps · 9 packages
app

Main agent-facing SPA (React Router 7, Vite).

admin

Internal back-office SPA.

website

SSR marketing site (React Router 7 + @react-router/serve).

api

NestJS API.

worker

BullMQ worker + React Email preview server.

docs

VitePress developer documentation site (Vue 3).

03 · Stack

TypeScript end to end
Backend
Node.js 22TypeScript 6NestJS 11Express 5PostgreSQL 17TypeORM 0.3BullMQ 5Redis 7Keycloak 26Zod 4Stripe 17ResendAWS S3react-pdfpdfjs-distOpenAPI 3PinoJest
Frontend
React 19Vite 8React Router 7Tailwind CSS 4shadcn/uiRadix UITanStack Query 5Redux ToolkitReact Hook FormTanStack Table 8Recharts 3i18nextSSEVitest
Infrastructure & DevOps
Docker ComposeDocker SwarmGitLab CI/CDNginxfrp tunnelingMakefileCustom Keycloak imageBiomeHusky
Delivery pipeline

Install → SDK generation → lint + test → tagged image build & push to a private registry → docker stack deploy → automated post-deploy health validation.

04 · Engineering highlights

Six decisions
Tenancy the database enforces

Postgres row-level security is the tenancy boundary, with an auto-injector that adds enable_rls() calls into generated migrations, so a new table cannot ship unscoped.

Idempotent commission generation

A rule-based automation engine generates commission and income entries against deduplication keys, so a replayed import cannot pay an agent twice.

Plan changes as a state machine

Every plan × billing-interval transition is modelled explicitly, with Stripe proration and entitlement side effects hanging off the transition rather than the caller.

One import pipeline, many carriers

Pluggable PDF adapters normalize each carrier's export into the same wizard pipeline as CSV and XLSX, so a new carrier is an adapter rather than a new flow.

Locales without migrations

A three-table normalized translation model resolves copy at runtime, so adding a language requires no schema change and no deploy.

Read-only forecasting

The residual-income forecast replays the same calculator as the ledger in read-only mode, so projections can never write a real commission row.

Caxper income and commission tracking
Caxper tax reports view
Previous: HolaPlaceNext: My Altafit