Workzo
Workzo is a client-work platform for freelancers. It follows a project from the first conversation to the final invoice: discovery, proposals, approved extra costs, documents and invoicing all sit on one shared, dated record that both the freelancer and the client can see. Clients can take part signed in or as a guest.
It's a production SaaS with a Nuxt 4 and TypeScript front end and a modular .NET 10 backend built with domain-driven design. PostgreSQL row-level security protects the data, sign-in is passwordless with role-based access, and Stripe handles billing. It runs in Docker containers behind Nginx and Cloudflare, and GitHub Actions runs the checks before each deploy.
Why I built it
I wanted to build and run a real product from start to finish, not just ship features inside someone else's system. As the founder and only developer, I make every call, from the product and architecture to billing, privacy and deployment, and I do it on a small budget.
The problem I was solving
Freelancers often end up absorbing the cost when a client project drifts. When the scope grows, it's hard to show what was agreed, when it was agreed, and who approved it.
Workzo puts all of that on one dated record that both sides can see, so extra costs are approved before they're billed and neither side has to rely on memory.
What I learned
- Designing around domains: splitting the backend into modules such as billing, documents, identity and projects, while keeping them in one deployable application.
- Handling money safely: making Stripe webhook processing idempotent and reconciling billing automatically, because the same event can arrive more than once.
- Securing data at the source: enforcing access rules in the database with row-level security, not only in application code.
- Running production alone: keeping deployments, monitoring and infrastructure reliable as a solo developer on a low budget.
- Treating privacy as a requirement: letting Canadian privacy law shape how data is handled and which providers are used.