GTHome
All projects

Full-Stack Developer (Solo) · 2026

Open Source

Terry Masila Portfolio

An editorial portfolio site for a fashion model — hero, gallery archive, client list, measurements and representation — where the owner signs in and edits every line of copy and swaps every photograph in place on the live page.

TanStack StartReact 19TypeScriptAppwriteTailwind CSS v4Radix UIZod
Terry Masila Portfolio preview
Terry Masila Portfolio screenshot

Problem

A model's book changes faster than a developer can be booked to change it — a new campaign, a dropped client, a revised set of measurements — and a portfolio that needs a redeploy for each edit is out of date the week it ships.

Approach

Built the site so its owner maintains it. Every heading, paragraph and measurement is an editable text node and every photograph is an image slot; signing in at the owner route turns the live page itself into the editor, so there is no separate admin dashboard to design, learn or keep in sync with the front end. Content, clients, social links and photographs live in Appwrite collections with a storage bucket behind them, and the page falls back to a typed set of defaults for any key the database has not been given yet — so the site renders complete before a single record exists.

Tech highlights

TanStack Start with server-side rendering on React 19, TanStack Router for file-based routes and TanStack Query for data, built by Vite 8 and styled with Tailwind CSS v4 over Radix UI primitives; Appwrite supplies database, authentication and file storage through a single typed client; Zod and TypeScript carry types end to end; a server route proxies storage files behind the site's own origin — rejecting any path containing '..' before redirecting — so image URLs never leak bucket structure, and sitemap.xml is generated as a route rather than a build artefact.

Results

Live and deployed, with the editorial front end, gallery and client pages, owner authentication and in-place editing all working against Appwrite; the photograph archive is awaiting the model's content upload.

Challenges

Deciding where 'editable' stops. Making text editable in place is straightforward; making it editable only for the owner, without shipping edit affordances or a second render path to every visitor, meant the owner check had to resolve before the page committed to a layout — and a session probe that fails is the normal case, not an error, since almost every visitor is not signed in.

Command palette

Search pages, projects, and quick actions