Carlos Perez

building-with-ai

I spent three hours on a logo, then gave the rest of the site away

I want to tell you about the ring.

Somewhere in the middle of building this site, I got stuck on a logo. Not stuck in an interesting way — stuck in the way where you’ve generated forty variations of a mostly-solid circle with a gap in it, and you can no longer tell if variation twelve or variation thirty-one is better, and it is 1am. It’s a ring: an open “C” shape standing in for a proof or a completed loop, with a small solid square inside it standing in for the “chosen” state. It means something to me. It does not need to mean anything to you, and that turned out to be the whole point of this post.

The part that wasn’t actually about me

While I was deep in that logo hole, I noticed something: everything around the logo — the color system, the type stack, the graph component I’d built for an earlier post — wasn’t personal at all. It was just… a decent starting point for a blog. Dark-first, one accent color that means “the optimal path” wherever it shows up, a palette picker in the nav so you’re not stuck with my taste, KaTeX and Shiki wired up, a dependency-free force-directed graph you can drop into a post with three lines of MDX.

None of that needed my name on it. My name, my bio, my domain, my actual opinions about fantasy baseball — those did. So I split the two apart.

Stripping a site down to its skeleton

This turned out to be more work than I expected, mostly because “personal” hides in more places than you’d think. Not just the obvious ones (bio, email, footer link) but:

  • The package.json name field. The og:title fallback. A header comment in global.css that just said “Carlos’s site” for no functional reason.
  • Planning docs that were never meant to be public — a full brand-positioning writeup, a content calendar with post ideas I hadn’t shipped yet. Those got deleted outright, not genericized.
  • The logo. I’d built a whole design-system doc explaining the ring’s meaning, tied to the “optimal path” concept. A template shouldn’t inherit someone else’s backstory as if it were neutral, so the public version gets a plain accent-colored circle instead — still wired to the live palette picker, still functional, just honest about being a placeholder.
  • The actual blog posts. Tempting to leave one in as a demo, but a real post about my fantasy baseball lineup is not an example anyone cloning this should have to git rm. I wrote three small instructional posts instead — plain Markdown, math-and-code, and the interactive graph — each one explaining a single feature and then getting out of the way.

The one thing I didn’t expect to be tedious: convincing myself I’d actually gotten it all. I ended up doing a plain grep -ri sweep for my own name across the whole tree before pushing, which feels like a strange sentence to type but was the only way to be sure.

What’s public now

blog-public is the result — MIT-licensed, clonable, npm install && npm run dev and you have the same stack this site runs on, minus every opinion of mine you didn’t ask for. If you want a dark-first Astro blog with a swappable accent color and an interactive graph component that isn’t secretly a 400KB charting library, it’s there.

The real combinatorial-optimization deep-dive I keep meaning to write is still on my list — that part stays mine.