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.jsonname field. Theog:titlefallback. A header comment inglobal.cssthat 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.