Full-Stack Application

Client Portal for Project Delivery

This project grew from a very practical problem: freelance work often becomes harder to manage than the actual build. Files end up spread across email threads, project updates become inconsistent, and invoices are separated from the wider delivery context. The portal was shaped as a calmer operational system for both developer and client.

TypeScriptNext.jsReactNode.jsPostgreSQLBetter Auth

Overview

A full-stack client portal designed to reduce back-and-forth during project delivery by bringing project status, files, invoices, and communication into one structured system.

01

Problem / Context

Freelance delivery can become unnecessarily fragmented when project updates, files, invoices, and communication live in separate places. That fragmentation creates friction for both sides: the developer spends more time managing context, and the client has less confidence about what is happening.

02

Solution / Approach

The portal was approached as an operational system rather than a generic dashboard. The structure focused on the practical stages of delivery: onboarding, project updates, files, invoices, and client communication. Every feature was measured against whether it made delivery clearer or simply added another layer of software.

03

Overview

The result is a more deliberate client experience and a more maintainable internal workflow. Instead of improvising project operations around email and ad hoc notes, the process can be handled through a single typed system with clearer boundaries and fewer loose ends.

04

Technical Details

Built with the Next.js App Router and server actions for authenticated project workflows

PostgreSQL-backed data model for projects, documents, invoices, and project communication

Better Auth used for invite-only client onboarding and admin/client role separation

Document uploads structured around project ownership and access control rather than generic file storage

Dashboard surfaces shaped around practical delivery events such as updates, approvals, invoices, and file handover

05

Challenges

Keeping the system broad enough to handle real project work without turning it into generic project-management software

Making the client experience simple while preserving the operational detail needed on the admin side

Designing permissions so file access, invoices, and discussions stay scoped correctly per client and project

06

Lessons Learned

Client systems become easier to use when they are organised around real delivery milestones instead of feature categories

Role separation is much clearer when the data model is designed around ownership from the start

The most useful client-facing software is usually software that reduces ambiguity rather than adding more interaction

Detailed Content

More context behind the project.

Context

The portal started from a familiar freelance problem: the quality of the actual build is often undermined by the quality of the surrounding process. A project can be designed and engineered well, but if updates are inconsistent, files are shared in different places, invoices live in separate tools, and the client has to ask for status repeatedly, the overall experience still feels fragmented.

That makes delivery harder than it needs to be for both sides. The client loses confidence because there is no single place to understand what is happening. The developer loses time because project context has to be reconstructed repeatedly from messages, notes, attachments, and memory.

Product Goal

The goal was not to build another generic dashboard. The goal was to create an operational layer around freelance delivery that makes the project easier to run.

That meant the portal needed to answer a few practical questions very quickly:

  • what project is this user allowed to see?
  • what is the current state of that project?
  • what files belong to it?
  • what has already been communicated?
  • what invoices and documents are attached to the work?
  • what needs to happen next?

Why A Portal Makes Sense

There is a common temptation to solve freelance process issues informally:

  • send files by email
  • send invoices through another system
  • send updates through chat
  • track work in private notes

Each step looks reasonable on its own. The problem is that the project state becomes distributed. Once that happens, neither side has a reliable operational view of the work.

The portal addresses that by treating the project as the centre of the system. Files, communication, invoices, and access are all scoped to the project rather than treated as unrelated features.

System Design

The application is shaped around a small set of important entities:

  • users and roles
  • clients
  • projects
  • project memberships
  • files
  • invoices
  • messages
  • activity

The relationships matter more than the raw entity count. The useful part of the model is that everything meaningful is tied back to project ownership and visibility. That keeps the system understandable and reduces the risk of records drifting out of context.

UX Direction

The interface was designed around clarity, not feature density. A client should be able to log in and understand the state of a project quickly without learning a complicated product.

That shaped several decisions:

  • show only the data a client actually needs
  • separate admin and client responsibilities clearly
  • group information by project context rather than technical module
  • keep actions obvious and limited
  • reduce dead-end screens and ambiguous navigation

Technical Direction

This is the kind of problem that fits a modern TypeScript stack well. Next.js provides a strong full-stack delivery model, while TypeScript keeps shared logic, permissions, and data flows more reliable as the surface area grows.

Key technical decisions included:

  • using App Router patterns for authenticated workspace routes
  • structuring the backend around role-scoped access
  • using typed models for files, communication, and invoices
  • keeping the auth model invite-only for client onboarding
  • treating the client area as a real product surface rather than a hidden admin add-on

Challenges

The hardest part was scope control. It would be easy to turn a project like this into generic project-management software. That would make the product broader, but not necessarily better.

The more useful challenge was deciding what to leave out:

  • task boards that do not improve delivery visibility
  • generic collaboration features with no clear role in the workflow
  • dashboards that show more data but answer fewer questions

That restraint is part of the project. The value comes from designing the right operational boundaries, not from adding more modules.

Why It Fits My Goals

This project reflects the kind of software I want to build more of: practical full-stack applications that improve the surrounding workflow, not just the interface. It combines frontend clarity, backend structure, access control, document handling, and process design in a way that feels grounded in real work rather than abstract product ideas.

Outcome

The result is a believable delivery platform that improves how freelance work is run. It gives the client a clearer experience, gives the developer a better operational system, and demonstrates a style of application design based on structure, maintainability, and reducing friction.

Related Articles

More writing connected to this project.

Case Study

Building a Client Portal That Reduces Delivery Friction

How a client portal can improve freelance delivery by combining project context, invoices, files, and communication into one structured system.

Shane Gifford

Manchester-based web developer focused on practical full-stack applications, functional minimalist systems, and workflow-aware tooling.

Modern web applications

Backend workflows and APIs

Functional minimalist systems

Built for practical, well-structured software

© 2026 Shane Gifford