This Portfolio — a Full-Stack App, CMS & AI Chatbot
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.