All projects
Next.js · SupabaseAI-assisted

This Portfolio — a Full-Stack App, CMS & AI Chatbot

2026Full-stack · AI · CMS

The problem

After graduating from UTS, I was job-hunting for full-stack and AI roles — and I needed one home to both record everything I'd built over the years and show what I can actually do. A static page of links could hold the list, but it wouldn't really demonstrate full-stack or AI ability. I wanted the showcase itself to be the evidence.

The solution

So I made the portfolio itself a real product. The site you're reading is a production full-stack application that doubles as my portfolio: a custom CMS where I record and edit every project, a working AI chatbot that answers questions about me, role-secured admin, bilingual content, analytics, and a CI/CD pipeline — all live. It stores my work and demonstrates the skills at the same time, just by being what it is.

The chatbot's knowledge base — a bilingual summary stored in the database that grounds the AI. Editing it here changes what the bot knows, with no redeploy.

A few decisions I'm happy to walk through in an interview: the admin is secured at the database layer with Postgres Row-Level Security — I deliberately dropped Prisma so RLS could be the real defense; the chatbot's knowledge lives in the database and is edited from the CMS, with the AI SDK isolated to a single server-only adapter so the provider stays swappable; and chat logs identify visitors only by a salted, irreversible hash that auto-deletes after 90 days. It was built solo and AI-assisted with Claude Code — the implementation went faster, but every architecture decision is mine, and each one is written down as an ADR.

One accent colour themes the whole site — buttons, links, and the hero — and it's auto-tuned per theme to stay WCAG AA legible in both light and dark.

Key features & challenges

  • Admin secured at the database layer with Postgres RLS — I dropped Prisma on purpose so RLS could be the real defense.
  • An AI chatbot whose knowledge lives in the database and is edited from the CMS — no redeploy to change what it knows.
  • The AI SDK sits in one server-only adapter, so the LLM provider is swappable.
  • Privacy-first chat logs: visitors are only ever a salted, irreversible hash of their IP, auto-deleted after 90 days.
  • Token-based theming — the admin picks the accent colour at runtime, so a hard-coded hex is a bug.
  • Bilingual (EN/中文) with instant switching, documented across 18 architecture decision records.

My contributions

  • Solo — designed and built the whole stack: public site, CMS, AI chatbot, auth, database, and CI/CD.
  • Made and documented every architecture decision across 18 ADRs — dropping Prisma for RLS, one data model (Server Components + Server Actions), knowledge base in the database, salted-hash logging.
  • Built AI-assisted with Claude Code: accelerated the implementation, owned the decisions.