✍️ This site isn’t just a portfolio.
It’s a place where I reflect on what I’ve built — and more importantly, why I built it.
Tech is just a tool. Direction and intention always come first.
💡 I care more about why something should exist than how fast I can build it.
Structure over UI, maintainability over speed, context over features.
Clean code helps me think clearly — and that’s the real goal.
🛠️ Lately, I’ve been focused on full-stack JavaScript, performance tuning, and UX flow design.
I run side projects regularly and rebuild things often, sometimes just to see if I can do it better.
💬 This page isn’t a highlight reel — it’s a record, made to be shared.
You’ll find code, context, and probably a few mistakes along the way.
Got questions? I’m always up for a conversation. DMs are open 🙌
CHANGHYUN.me has been built, scrapped, and rebuilt probably ten times since 2015 — not even kidding.
It all started with just HTML and CSS, until I hit a wall and jumped into PHP. From there, I wandered through Wordpress and Node.js, and now? It’s running on Next.js with a little help from Vercel.
Below is a rough timeline of each version — mostly based on memory, so take it with a grain of salt.
This version of CHANGHYUN.me is built with React and styled using TailwindCSS. It’s fast, minimal, and flexible enough to keep evolving without starting over.
I made a conscious decision to avoid traditional CSS altogether — no SCSS, no BEM. Instead, I chose to stay fully within the Tailwind ecosystem, pushing its utility-first model to the edge. That constraint actually made things more fun and deliberate.
I used to split my editor just to keep up with my own CSS. With Tailwind, I finally reclaimed half my screen.
The site runs on Next.js — mostly because it handles routing and rendering cleanly out of the box, and I’ve gotten used to how it balances flexibility with convention.
Hosting is handled by Vercel. The free tier covers everything I need for now, and I’m totally fine paying once it doesn’t. I chose it because it saves me from hours of server setup (which always feels minor but ends up eating time), deployment is literally just git push
, and things like SSL and basic security are pre-configured.
For blog content, I built a custom parser that structures content into reusable objects — making it easy to support multiple formats later (like Markdown, HTML, YAML) via clean imports. I could’ve gone with an off-the-shelf MD parser, but I wanted something more purpose-built and minimal — with less magic and more control.
This makes the Journal and Sandbox sections more than static blogs — they’re rendered from structured data that I can query, transform, or re-render any way I want.
(For now, all content is managed directly on the file system — no database involved. So please, no hacking attempts 😅.)
Syntax highlighting is done via Prism, and the layout components are fully modular, making it easy to inject new sections or switch styles as needed.
I studied HTML using MDN and W3Schools. In hindsight, that was probably the best decision I could've made.
I found joy in ditching the `$()` syntax and using `getElementById` directly instead.
I wasn’t big on pre-designed CSS frameworks — I was more excited about crafting my own styles with pure CSS and tools like LESS.
Back then, I started feeling the limitations of static, server-rendered websites. I used XMLHttpRequest to fetch content dynamically and render it with JS in the browser — which, looking back, was actually pretty close to how modern web apps work.
Frameworks like Angular were gaining traction at the time, but honestly? I just couldn’t see the point of frontend frameworks back then. Didn’t know where to use them.
Next.js is by far the most well-crafted framework I’ve ever used. It gives you complete freedom, while still making it obvious what you should be doing — like playing a well-designed game.