AgencyOS
Operating System for Agencies

The Challenge
The agency's work was spread across spreadsheets, chat apps, invoicing tools and shared drives. Nobody could see at a glance which projects were on track, which invoices were overdue, or whether a project was actually profitable once expenses were counted.
The Solution
I designed and built the whole platform. A dashboard brings together monthly targets, revenue, expenses, pending payments and project status. Projects have teams, comments and Kanban boards with tasks and subtasks. The finance module handles invoices with line items and proforma numbering, PDF generation, partial payments, expenses, and per-project profitability. A unified calendar shows task deadlines, project dates, invoice due dates, meetings, reminders and leave, and syncs with Google Calendar. Real-time chat, in-app and web-push notifications, a folder-based file manager, sales targets and prospect follow-ups complete it, and a super-admin layer can run several organisations with role-based access down to each module.
Technical Architecture
Next.js 16 App Router with React 19 and server actions, PostgreSQL via Prisma across 37 data models, NextAuth v5, Socket.io with a Redis adapter for real-time chat, BullMQ background jobs, Firebase and Web Push for notifications, Google Calendar API, React-PDF and jsPDF for invoices, and Supabase Storage for files.
Key Tech Stack
Business Outcome
The agency's day-to-day system for projects, finance and team communication, designed and engineered end to end by one person.
Interface & Dashboard Details




UX & Design Decisions
- Dashboard first: the numbers an agency owner checks every morning — target, revenue, profit, pending payments — sit above the fold.
- Profitability is calculated per project from real invoices and expenses, not typed in, so it can't drift from the books.
- One calendar for everything with a colour legend, instead of separate date views in each module.
- Installable as a PWA with push notifications, so the team gets updates without keeping a tab open.
