/* case study · product */

ClientVault Pro

A polished, offline-first CRM I built for freelancers who outgrew Notion.

Role:Solo builder (design & development)Type:Offline desktop appStatus:In daily use, open-sourced

The origin

Every freelancer starts with Notion. It's flexible, free, and for a while it holds. But as a solo agency owner juggling multiple clients, I kept hitting the same wall. Notion tracked my deadlines and goals fine, but it had no memory for the details that make freelance work repeatable. Which exact font did I use for that client's brand six months ago? What resources went into that project? Where's the thread of everything we agreed on? That context lived in my head, scattered databases, and half-remembered files, and every time I lost it, I paid for it later. ClientVault Pro started as a fix for my own frustration, not a product.

The problem, precisely

The tooling landscape forces a bad trade-off. Flexible note apps like Notion are great canvases, but you rebuild freelance structure from scratch every time, and the free tier caps out exactly when you start needing it. Real CRMs are powerful but bloated, subscription-locked, and architected for sales pipelines (leads, deals, funnels), not for a designer tracking deliverables, assets, and client relationships. Nothing in the middle was lightweight, freelance-shaped, fully offline, and yours. That gap is the whole reason this exists.

Design decisions (the why)

Why offline-first?
Your client data is some of the most sensitive information you hold: contacts, contracts, pricing, project history. I didn't want it on someone else's server behind a monthly fee that, if you stop paying, locks you out of your own business records. Local-first means the data is a file on your machine: owned, private by default, no subscription, no server to trust.
Why SQLite via sql.js (WASM)?
Native SQLite bindings in Electron are a notorious source of pain, recompiling per platform and Electron version and breaking constantly. Running SQLite compiled to WebAssembly sidesteps that entire class of problems while still writing a real, portable clientvault.sqlite file to disk (not a toy store). A reliability decision: fewer moving parts that break on a user's machine.
Why desktop, not web?
A desktop shell gives two things a browser can't: a genuine local database file the user controls, and native PDF generation for real invoices and documents. For an offline, data-owned tool, desktop was the honest architecture.

Under the hood

Electron main process for the shell, file access and PDF generation; a React, TypeScript and Vite renderer for a fast, typed UI; Tailwind for styling; SQLite via sql.js persisted as a local file; React Hook Form with Zod so bad data never reaches the database; Recharts for reporting visuals; Lucide for icons. The architecture keeps the heavy, breakable work (DB, PDFs, filesystem) in the main process, and the interface fast in the renderer.

Features

Client CRUD with one-tap contact (email, WhatsApp, phone, website, socials)
Rich client profiles: projects, tasks, deadlines, resources, bookmarks, notes
Deliverables, invoices, generated docs, and a full activity timeline
Invoice generator: line items, tax, discount, paid/pending, PDF export
Document generator: SoW, contract, proposal, briefs, AI-work, SaaS, consultation, handover. Add, edit, or duplicate.
Category system with per-category views and progress cards
Global search across everything
Reports: revenue, paid vs pending, revenue by category, project statuses, overdue tasks, upcoming deadlines
Data ownership: backup / restore, JSON export, CSV import & export

A look at the app

clientvault-pro.app
Welcome back
Dashboard
+ New client
Revenue (Jun)
₹1,84,200
+12%
Pending invoices
₹42,900
3 overdue
Active clients
17
+2 this month
Upcoming deadlines
Aara Jewels · Landing page · Fri
Fintrail · Churn deck · Mon
Studio Onyx · Handover · Wed
Recent activity
Invoice INV-104 marked paid
Doc 'SoW · Northloop' generated
Client 'LedgerPay' updated
Illustrative reconstruction

What's next

Auto-onboarding: adding a client automatically generates the contract, pricing, SOPs, and SoWs, then queues the first invoice. One entry, an entire relationship scaffolded.

Outcomes

  • Replaced multiple disconnected tools with one workspace
  • Every client detail lives in one place and stays there
  • Open-sourced free for early-stage freelancers

Reflection

I built this for exactly one user: me. But building it made me realize how many early-stage freelancers are in the same spot, doing real client work without the budget for expensive tooling, so I open-sourced it free. The most useful discipline it forced on me was encoding fuzzy freelance habits (how I organize clients, what a "handover" actually contains) into concrete, structured software. Turning your own tacit process into something a program can execute is harder, and more clarifying, than it sounds.

Tech

ElectronReactTypeScriptViteTailwindSQLite (sql.js)PDFKitReact Hook Form + ZodRechartsLucide