Skip to main content
jpfchang.org
Blog · July 2026

I Tore Down the Portfolio and Built a Blog Instead


For a while this site tried to be a resume. It had a “portfolio,” a “selected work” grid, an evaluation matrix for hiring managers, and enough talk of “product judgment” and “data analytics candidacy” to make my own eyes glaze over. It read like a cover letter that had been left in the sun.

So I tore it down. jpfchang.org is a personal blog again — a place for a hacker who likes mountains to write things down. Here’s what changed, and why.

One theme, all the way through

The site had quietly become three sites wearing a trench coat. The home page ran one layout, the content pages ran another, the games ran a third, and the terminal did its own thing entirely. Every one of them had its own navigation, its own palette, its own idea of what a footer was.

Now it’s all astro-sienna — a calm, serif, reading-first theme — from the front porch to the 404 page. One nav, one footer, one set of type. I deleted the two old layouts, a pile of magazine-cover components, and a couple of big stylesheets that existed only to prop them up. The whole thing loads lighter and, more importantly, it finally feels like a single place.

Projects are on GitHub, where they belong

I removed the Projects page. It was a museum of screenshots and bullet points that went stale the moment I shipped anything new.

If you want to see what I actually build, two links do a better job than any curated grid:

Those are in the footer of every page now. Old /projects links redirect home so nothing breaks.

The games are gone

I also removed the entire games arcade — 2048, snake, tetris, the tower climber, the wuxia RPG, the leaderboards, all of it. It was a fun detour and a lot of code, but it had nothing to do with writing, and it dragged a whole login-and-database apparatus along behind it. Cutting it took the site from “sprawling web app” back to “blog,” which is what I wanted.

A terminal, hidden in plain sight

Here’s the part I’m quietly delighted by.

The old terminal interface — the fake shell you could ls and cd around in — isn’t linked anywhere anymore. Ordinary visitors will never see it. But if you show up in a terminal text browserLynx, w3m, ELinks, or Emacs’ EWW — the site notices and hands you the command line instead of the normal page. No JavaScript required; it’s rendered server-side as clean, linkable text.

It’s a small wink to the people who still browse the web from a terminal. If that’s you: hello, you found it. If it’s not, try it sometime:

lynx https://jpfchang.org

Everyone else gets the quiet reading site, and that’s exactly the point — a pleasant surprise only shows up for the people looking in the right place.

The favicon actually works now

This one is embarrassing. The site’s favicons were SVG files that had been saved with .png extensions. Browsers politely ignored them, so the tab just showed a blank sheet of paper. There was no favicon.ico at all.

I wrote a small sharp-based script that renders the real icon — a little green mountain with a >_ prompt, which is about as on-brand as I get — into proper 16, 32, 180, 192, and 512-pixel PNGs plus a genuine multi-size .ico. The tab has a face again.

The words got rewritten

Finally, I went through every page and rewrote the copy in my own voice instead of recruiter-speak. Less “leverages data-informed product flows,” more “I dig into data and enjoy the moment where a messy pile of numbers finally tells you something true.” If you’re hiring, there’s still a clear way to reach me — it’s just no longer the only thing the site shouts about.

That’s the tour. The site is smaller, faster, and finally sounds like a person. If you want to talk about any of it, say hello — or cat your way through it from a text browser and enjoy the surprise.