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 agreed to drop 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. I built it solo with Claude Code, which wrote the code. The product decisions and the main stack are mine. ADRs record the main choices.

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 agreed to drop Prisma 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 19 architecture decision records.
My contributions
- Solo, built with Claude Code: public site, CMS, AI chatbot, auth, database, and CI/CD.
- Made the product and privacy decisions: the knowledge base in the database, salted-hash logging, and AI output saved only as drafts. Chose the main stack. All 19 decisions are written down as ADRs.
- Claude Code wrote the code and the tests. I reviewed the test suite, removed tests that checked nothing, and added a coverage floor that CI enforces.