Problem
One of the recurring problems in freelance development is that the work itself is usually more coherent than the process around it. A site or application may be built well, but the delivery experience still feels disjointed because the supporting workflow is scattered.
The common pattern looks something like this:
- updates are sent in chat or email
- files are attached somewhere else
- invoices are issued through a separate system
- approvals are handled informally
- the client asks for status because there is no single reference point
None of those steps are especially difficult on their own. The problem is accumulation. Once the project state is spread across multiple places, both sides lose certainty.
Why That Matters
This is not just a convenience issue. It changes the quality of delivery.
When the client has to ask for the current state of the project, confidence drops. When the developer has to rebuild context from scattered sources, the process becomes slower and more error-prone. The cost is not only time. It is cognitive overhead.
That made the portal a useful project because it sits in a very practical problem space: improving the workflow around real project delivery.
Approach
The key design decision was to avoid treating the portal as a feature catalogue. The product is more useful when it is organised around delivery events and project context.
That meant starting with questions like:
- what should a client see first?
- what does a developer actually need to manage?
- what information belongs to the project itself?
- what should be visible only to the client, only to admin, or to both?
- where does ambiguity usually appear in project handover?
Those questions shaped the application more effectively than starting from generic dashboard sections.
Product Structure
The portal is built around a core relationship between:
- client
- project
- project membership
- project files
- project communication
- invoice history
- workflow activity
That structure matters because it keeps the system anchored to the thing the user actually cares about: the project. Instead of navigating a pile of disconnected modules, the user moves through a project-centred flow.
Implementation
A modern TypeScript stack is a good fit here because the project crosses interface, backend logic, permissions, and data modelling.
The implementation approach centred on:
- Next.js for full-stack delivery
- TypeScript for consistency across UI and backend logic
- PostgreSQL for relationship-heavy data
- invite-only authentication for client onboarding
- role-aware access control for admin and client separation
This makes the project feel more like a real internal product than a static marketing demo.
Tradeoffs
The biggest challenge was resisting scope creep. It would be easy to add task boards, notes, general collaboration features, or broad admin tooling. But the more features you add, the easier it is to lose the main value of the system.
The better discipline was to keep asking whether a feature reduced delivery friction or simply expanded the surface area.
Result
The resulting portal is a believable example of the kind of software I want to build more often:
- practical
- full-stack
- workflow-oriented
- maintainable
- shaped around clarity rather than novelty
It demonstrates not only application development but also an interest in improving how work is delivered and understood.