Skip to content
Mai Trinh
Completed

Mai Portfolio — Professional & Freelance Hub

A bilingual professional portfolio and freelance journey built as a working product, with a Next.js website backed by a PostgreSQL CMS and a Flutter companion app still using the Apps Script/Google Sheets data path.

Role
Solo developer — product, architecture, backend, web & mobile
Platform
Web
Period
2026

Project overview

Domain
Personal engineering portfolio — a public system for presenting professional, freelance and personal work truthfully, built and maintained by its own subject.
Product
More than a static CV or portfolio site, this is a bilingual product for presenting professional work, freelance projects, and personal products through structured content. The Next.js website now uses PostgreSQL as its authoritative CMS and provides an authenticated Admin area for content management. The Flutter companion app still uses the existing Apps Script/Google Sheets API; moving mobile onto the PostgreSQL-backed data source is a separate step that has not started. Apps Script also remains part of Review intake, while moderation, documented consent, and publication for website Reviews are managed separately in the web system.
Audience
Prospective clients and employers trying to understand what I've actually worked on and how I approach delivery — and, for anyone curious about the system itself, a working case study of the same engineering habits described elsewhere in this portfolio.
Why it exists
A static CV or a one-page portfolio site can list what I've done, but it can't honestly represent an in-progress freelance engagement's real status, distinguish a proposal from delivered work, or separate what's public from what's confidential per client. A CV is a snapshot; this needed to be a maintained, structured product.
Problem
Bringing together professional employment, freelance engagements and personal products under one honest, structured, bilingual public presentation — one that can represent a project's real current status (in progress, on hold, proposal-only, completed) without ever implying more certainty or progress than what's actually confirmed, and that keeps commercially or personally private details private by construction, not by convention.

My role & contributions

I built the system in stages: architecture and data contracts first; the initial Apps Script/Sheets backend; the Next.js website and Flutter companion app; migration from sample data to real project records; progress and milestone presentation; and the Reviews workflow. The web data source was later migrated to PostgreSQL and an Admin area was added for direct content management. Recent work has focused on operational safety: development/production isolation, guarded production writes, CI, deployment controls, and explicit consent before a Review can become public.

Challenges & solutions

  1. Technical challenges

    Three challenges shaped the system. First, evolving the data source without losing consistency: it started with Google Sheets/Apps Script because that was lightweight and fast, but the website moved to PostgreSQL once administration, moderation, and data-safety requirements grew. Second, keeping one content model coherent across two structurally different clients — server-rendered Next.js on the web and Flutter on mobile — without duplicating business rules until they drift. Third, turning truthfulness and privacy into system rules: project status must reflect reality, client identity stays private unless explicitly cleared, approximate progress stays visibly approximate, and a Review can be published only when its status, visibility, and consent are all valid.

    How I approached it

    The architecture separates data access so each client can be developed and tested independently while keeping a common public data contract. The Next.js website now reads content from PostgreSQL through its own transport/repository layers and manages changes through an authenticated Admin area; local and preview environments are prevented from connecting to the production database. Flutter still uses its HTTP transport to the Apps Script/Google Sheets path, and both clients can run against fixture data during development. Reviews deliberately separate intake from publication: Google Form/Apps Script receives submissions as pending, while the website publishes a Review only after moderation and documented consent in Admin. This reflects the system's evolution from its original Sheets/Apps Script architecture to a PostgreSQL CMS for the web without implying that mobile has already migrated or that the two data stores synchronize automatically.

    Impact

    The system now manages 15 real projects across professional, freelance, and personal work. Public portfolio content comes from real project records rather than fictional filler; even this portfolio's own case study is held to the same rules for status, privacy, and what information is safe to publish.

Architecture & technologies

Web: Next.js (App Router) + React + TypeScript, server-rendered with next-intl for bilingual routing and PostgreSQL/Neon as the authoritative CMS source. Repository and transport layers separate public reads from Admin mutations; migrations are controlled and production writes are guarded. Mobile: Flutter + Dart with Riverpod, go_router, and Dio in a pragmatic Clean Architecture (domain/data/presentation). The wider system includes a moderated Reviews workflow with explicit publication consent, CI for the web and migration tooling, controlled Vercel deployment, and automated tests that protect behavior as the data model and architecture evolve.

Technologies

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • Google Apps Script
  • Google Sheets
  • Flutter
  • Dart
  • Riverpod
  • go_router
  • Dio
  • Vitest
  • Testing Library
  • flutter_test

This project demonstrates

This project is deliberately not framed as expertise in every technology it touches — the goal was never to claim senior-level mastery across web, backend and mobile all at once. What it demonstrates is the same habit described throughout this portfolio: understanding a problem's real shape before building, choosing simple/appropriate tools over impressive ones (Sheets over a database, a shared API contract over a shared runtime), and treating truthfulness as something the system enforces structurally rather than something to remember to do by hand.

  • Web Development
  • Backend Development
  • Android Development
  • Third-Party Integration
  • Automation
  • QA & Testing
  • Requirements Analysis

Current progress

  1. Product & content architecture

    Done
  2. Content management system

    Done
  3. Portfolio experience

    Done
  4. Real project content

    Done
  5. Progress & milestone tracking

    Done
  6. Review system

    Done
  7. Mobile companion

    Done
  8. Production readiness

    Done

Have a similar project in mind?

Tell me about your product or challenge, and we can discuss how I can help.

Work With Me