Project — 2026
hirohyun.com
How this bilingual site keeps its writing editable, its photographs organized, and its pages ready to read.
A personal website accumulates obligations as it accumulates content. An old link should still lead somewhere. A revised sentence should reach the page. A photograph should fit the screen on which someone opens it. Each requirement is small enough to sound obvious; maintaining all of them gives the project its shape.
This site is built with Astro 6 and TypeScript. Astro generates the public pages ahead of time, and Cloudflare Pages serves the resulting files. Publishing means producing a new set of pages. Reading means requesting files that are already there.
Keeping the words within reach
The articles live in the repository as Markdown or MDX files. TinaCMS provides the editing interface; saving through Tina commits a change to GitHub and triggers a build. That gives a sentence a recoverable history as it moves through revisions.
English and Chinese articles have separate files, paired so the language switcher can take you to the corresponding page. This is an editorial choice as well as a technical one. The Chinese version needs room to choose its own opening and carry an explanation through its own paragraphs.
Search uses Pagefind, which builds an index from the finished pages. The browser loads the search code when the search interface opens. The index belongs to the published site, so an article becomes searchable after a successful build.
Giving photographs their own workflow
Gallery photographs go through a separate import step. That process creates several sizes in AVIF and WebP, with a JPEG fallback, and uploads the prepared images to Cloudflare R2. Each album has a manifest describing its photographs. The public pages use those records to offer the browser suitable image sizes.
The separation matters: a text edit can rebuild the pages using the photographs already prepared. Article images uploaded through Tina’s media manager take a different route, through a small Worker to R2. The gallery’s image processing should not be assumed to apply to every inline upload.
Videos stay on YouTube. Their embeds begin with a lightweight facade and load the player when activated.
Checking the page at the other end
One of the more instructive failures came from a Git ignore rule. A pattern intended for a local photo staging folder also matched the gallery’s source directories. Local builds passed because those files existed on the computer. The deployed site was missing the gallery.
The fix was small. The lesson has stayed in the project’s working rules: after publishing, check the deployment and visit the affected routes. A successful build tells me something useful about the files it received. Opening the published page answers the next question: did the work actually arrive?
That is the kind of maintenance this site needs. I want to be able to revise a paragraph, arrange an album, and know where to look when the result differs from what I intended.