How This Was Built, How It Works

A little behind the scenes look

Thanks to everyone who took part in yesterday’s test of this new personal site, and after a few short hiccups, showed that the Bluesky integration is, in fact working. I wanted to write a quick thing about what’s going on here.

The history

I’m not even quite sure when I set up my personal blog, though it was long after Techdirt was a going concern (after all, I set up Techdirt before the word blog even existed!). But somewhere in the mid-aughts I figured it might be good to have a personal site as well. This was before social media got big, and I figured it might be good to have a space that wasn’t Techdirt.

Over the years I posted a little over 50 posts, on a range of topics from personal to just random thoughts I had that didn’t fit on Techdirt. I may do another post sometime soon calling out some of the highlights.

Still, as social media got bigger, it seemed less and less necessary, but that also meant less and less control (as we’ve learned). I’m trying to rectify some of that with ATproto/Bluesky, giving more control back to the users, but still getting some of the benefits of social. People forget (or never knew) how layering a social component on personal blogs was seen as a big deal at the time (first messily with pingbacks, and then with the long-forgotten MyBlogLog, which in retrospect was really interesting).

Anyway, most of my posts were in the 2007 to 2009 and then it went dormant. In 2012 it popped up one more time, when I posted about my new desk setup (still using it today!). And then… nothing.

A few years ago I thought maybe I should update it. The site was built on WordPress, but I couldn’t even remember how to login. Last year at some point I at least found the login page, but somehow didn’t seem to have the login. Either that or the backend WordPress just broke. I vaguely recall that I would have to update the WordPress install with the click of a button every so often and I hadn’t logged in in well over a decade, so who knows.

I had been debating what to do about all this, including maybe just killing the whole site and starting fresh, and figured that was really about all I could do. I thought maybe I’d somehow copy a few of my favorite articles but wasn’t sure what else I could do.

The plan

In the past year I’ve been doing some experiments with vibe coding, mostly with Lovable and then Google AI Studio. But I recently was convinced to finally move over to Claude Code, which is like switching from a bicycle to an automobile for vibe coding. Lovable basically will build web apps for you. Claude Code will… just do stuff.

So, almost on a whim, I told it I wanted to make a new site but wanted to preserve the old blog posts, and it said “no problem” and went to the website, scraped every post, converted them to markdown files and said it could put them on a new site.

(Side note: since Claude Code is a little bit more terrifying, I actually used Google Gemini as an assistant, talking through what I wanted to do with Claude Code first, to see what Gemini’s response was, and it made some suggestions for what I should tell Claude Code. I didn’t automatically trust either of them, because of course, and spent a lot of time quizzing Gemini (and later Claude) why it was suggesting various things, and asking for pros and cons to various approaches).

Claude Code did a phenomenal job of it. After it scraped the text and turned them into markdown files, it asked if I wanted to preserve the images as well (yes, yes I did) and so it made that work as well.

I then asked it to design a personal site for me where this would live, saying I wanted it to not just be a blog, but also have some bio info, etc. Also, I wanted it to show (1) my latest Techdirt posts and (2) my latest Bluesky posts. We went through some variations on this, often involving me telling it more of what I wanted and getting it to redesign things to work, but we ended up in a place I’m fairly happy with, at least for now.

How this works now

For what it’s worth, after some discussion, it made sense not to install WordPress or some heavyweight CMS again. Instead, we just used Hugo, an open source framework for building websites, that can then be stored on Github. I wanted to change my web host as well (as the old one, which I’ve used forever, is likely shutting down at some point soon), and so I started to look around at a few cheap webhosts.

I suggested some to Claude Code, who suggested it would be easier just to use Cloudflare Pages, which would be free at the level I was using it at and worked nicely with Hugo such that it would be easy to set it to rebuild the site any time I made a change to the repo on Github.

We had a bit of a struggle to fix the DNS (it’s always DNS!) to get the site live at the domain, but eventually we got there. And with that the site was live. You could see my bio, an about page, the old blog posts, the most recent Techdirt posts and my most recent Bluesky posts.

On Bluesky, since I repost a lot of other posts, I wanted to see if I could separate out my actual posts from reposts. Claude Code said no problem and originally was just posting my posts (initially it would look back through my most recent 20 posts to find three, but that wasn’t nearly enough…). And then I added the “signal boost” section showing the most recent three things I had reposted. We played around a bit with the look and feel until it got to a point I was comfortable with.

Initially, the Techdirt posts were in the right-hand column too, but that was a bit much. We tried a lefthand column, but it really overwhelmed the page, so we moved it as a second carousel of cards beneath the masnick.com blog posts… and it works (at least to me!).

So it was up for a few days, and the way to create new blog posts was just to go into Github and create a new page there with some special text at the top. Except each time I tried the text at the top didn’t work right, and it was a bit annoying.

So I asked Claude Code if there was a good way to create a simple UI to handle things. It suggested either Decap or TinaCMS as options. I looked at them both and Decap just… didn’t appeal to me. But TinaCMS looked nice. So I asked it to set that up… but that proved impossible. Spent a day or so going back an forth and for whatever reason, we couldn’t get it to actually work right (it also involved having to set up a free cloud account with the TinaCMS people). So Claude Code suggested moving to Decap instead.

I still didn’t like the look of Decap, so did a search and found Sveltia myself, which is an attempt to make a better Decap. And it is. So I pointed Claude Code at it, and it said “oh yeah, that looks like a better option” and literally three minutes later it was working. It has a nice simple UI and I can now create and edit posts with it. It also seems super easy for Claude Code to make changes to it. So, for example, initially I couldn’t edit my About page via it and I asked Claude Code why and it said “we can change that if you want” and then… it did so.

The final step was Bluesky integration. Again, I relied heavily on Claude Code (and Gemini) to figure out what to do here. It was interesting to me that they all recommended a variety of possible courses, but pushed BridgyFed as the simplest, saying we could revisit more complex ideas later.

I started to go down that path, but there were a few things about it I wasn’t sure about. It helped that I know the folks behind BridgyFed and started asking them some questions, and they suggested I might want to check out original Bridgy (which predates BridgyFed, and yes, everyone admits the naming here is confusing), and we realized that was probably better.

To make it all work right, it meant I should probably change my Bluesky username from @mmasnick.bsky.social to @masnick.com, which I did. Then I followed the steps recommended by Claude Code to setup Bridgy and WebMention (to track replies and such and feed them back to these posts as replies, likes, and reposts).

It took a few final tweaks… and then it just started working. Hallelujah.

Oh yeah, also, I asked Claude Code about a few things: when it automatically posted stuff to Bluesky, what if I wanted it not to just take the beginning of the post? No problem, Claude Code just added a new text box for that purpose inside Sveltia:

An image of the “Bluesky Text” box showing “custom text for Bluesky cross posting via Bridgy”

What if I didn’t want a blog post to automatically go up on Bluesky? No problem, Claude Code added a toggle in about 5 seconds.

A toggle for “Skip Bluesky.” “If checked, this post will NOT be auto-published to Bluesky.”

Future?

I still have some other ideas, and I’m curious about making the blog compliant with standard.site, but that seems like a bigger project (Claude Code did map out a plan to do it and stored it for future work). I’d also maybe like to get the comments to thread properly (also apparently a bit of a project, but Claude Code put in place some initial ideas for how to get there).

I know that it’s fun to hate on AI tools right now, but honestly, none of this would have happened without my being able to use Claude Code as a tool. And it was very much used as a tool. I pushed back on it at times, and questioned some of its ideas and decisions. And there were some things that took multiple experiments to get it to work properly.

But after 12+ years of dormancy, the blog is back, connected to the social web, and I actually want to post on it again. Neat!

Responses

Respond on Bluesky and your response will appear here via Bridgy.

Loading responses...