FreelanceOS
FreelanceOS is a CRM I built to run a freelance IT business in one place. It follows each job from lead to quotation, project, invoice, and payment, and tracks renewals, expenses, and profit along the way.
At a glance
- Type
- Freelance CRM
- Client
- Personal project
- Status
- Live
- Stack
- TypeScript · React · Vite · Tailwind CSS · Shadcn UI · Supabase · Vercel
What I built
- A sales pipeline with a drag-and-drop lead board, and quotations that become projects in one click.
- Projects with milestones, tasks, time logs, change requests, and a note of where each client login is kept, never the password itself.
- Quotations and invoices with automatic numbers like INV-2026-0001, discounts, and a print-ready layout.
- Hosting, domain, and software renewals: marking one renewed records the payment and its cost, then sets the next due date.
- A dashboard and reports for income, unpaid balances, profit, and the effective hourly rate on each project.
Technical decisions
Business rules in the database
Document numbers, renewals, and the dashboard and report figures run as Postgres functions and views. A renewal is one transaction, so a payment is never saved without its expense and new due date.
Row-level security instead of a custom API
Every table only returns rows owned by the signed-in user. The app queries Supabase directly from the browser, with no backend server to run.
Sample data on demand
One button in Settings fills the app with example leads, clients, projects, and invoices for a demo. Another removes them without touching real records.