Portal CRM
A complete self-hosted CRM + ops platform for a field-service crew.
A production CRM and operations dashboard for a residential field-service business — recurring scheduling, a Kanban pipeline, quotes/invoices, a map view, audit logging, and a mobile-first UX — built to deploy as a single self-hosted binary.
Seeded with sample data — log in to explore the full app.
The problem
Small field-service businesses run on paper, phone notes, and spreadsheets — and most off-the-shelf CRMs are either bloated, expensive, or require handing customer data to a third-party cloud. The need is a focused, fast, fully-owned system that works from a truck.
This project is a complete, production-grade CRM designed to replace all of that, with a hard constraint that drove every decision: 100% private and self-hosted — it zips up and runs as a single binary with near-zero setup.
What I built
- Full relational schema design — clients with embedded property data, recurring service scheduling that auto-advances on job completion, quotes, invoices, and payments.
- Operations dashboard: a drag-and-drop Kanban opportunity pipeline, calendar scheduling with conflict handling, and a map view of the client base.
- Production hardening: cascade-delete with audit logging and a recoverable trash view, duplicate-record prevention, timezone-correct date handling, and access rules.
- Mobile-first throughout — designed to be used on a phone or tablet in the field, with tap-friendly targets and responsive layouts.
- Single-folder deploy: PocketBase serves the built SvelteKit SPA from one directory, so the entire app runs from a single binary with SQLite — no cloud accounts, no telemetry.
Architecture
- 1SvelteKit + TypeScript SPA (mobile-first UI)
- 2shadcn-svelte + Tailwind component system
- 3PocketBase (Go) — auth, REST, realtime, SQLite
- 4Single binary serves SPA from pb_public/
- 5Self-hosted on a VPS — fully private, zero telemetry
What it demonstrates
This is full-stack system design end-to-end: data modeling, a realtime backend, a polished reactive frontend, and the operational details (audit logs, soft-deletes, timezone correctness) that separate a demo from a system real people depend on.
The live demo is seeded with sample data — use the demo login above to click through the full app.