Software · Firebase CRM

Clearline

A Firebase-backed CRM I built for a real business — not a class assignment. Real architecture decisions and real bug-fixing on something that actually deploys.

Firebase
Firestore Backend
Vanilla
JS PWA · No Framework
Live
GitHub Pages Deploy

Why it exists

From texts and
scattered notes

SC Pressure Point ran on text messages and memory — fine at first, unworkable as jobs piled up. Clearline is the fix: a customer relationship manager that keeps jobs, customers, quotes, and schedules in one place instead of across a phone.

It's the most substantial engineering project I've shipped — a deployable product with a backend, not a static page.


Architecture & decisions

What I
actually built

I chose a no-framework, vanilla-JS PWA on purpose — fewer moving parts to break, and it's something I fully understand end to end. Firebase Firestore handles the data; GitHub Pages serves the app.

  • Firestore as the live backend — jobs, customers, quotes, schedules
  • Vanilla JS PWA (no React/Vue) — small, fast, fully owned
  • GitHub Pages deploy that regenerates config from secrets on every push
  • Access model built on a signed-in accessUids list, plus a backfill tool to grant access to existing records

Real engineering

The bugs were
real too.

Shipping it meant solving actual problems, not toy ones:

  • Firestore security rules: the jobs list query broke until I set the rule to signedIn() && uid() in accessUids — a get()/owner check made array-contains queries unprovable
  • Chasing "permission-denied" errors that were sometimes stale rules, sometimes client bugs — had to pull the full console stack, not just the error text
  • Deploy discipline: rules publish manually; the deploy script rebuilds config from secrets each push (one unquoted secret once broke the live site)
  • Tradeoffs between simplicity and a clean security model, decided and documented

What it taught me

A product is
more than code.

Clearline is where I learned to think like an engineer instead of a tinkerer: a security model that holds, a deploy that's reproducible, and the discipline to debug at the root instead of patching the symptom. The decisions I'd make differently next time are the most valuable part.

Firebase Firestore Vanilla JS PWA GitHub Pages CRUD Security Rules CRM

Back to Portfolio