The taekwondo club’s website was ten years old, on a theme nobody maintained anymore, with a form plugin that had been sending registrations into the void since a date nobody knew. It was late August. Registrations open in early September. There was no moment to take the site down: for a sports club, the start of the season is the three weeks when the website actually matters.
The context
A non-profit club with about a hundred members, near Grenoble. A WordPress with four hundred posts, eight pages, six hundred photos, and three volunteers who update the schedule and post competition results. None of them is a developer, and that was not going to change.
The constraint was easy to state: the new site had to be online Monday morning, with the old URLs still working, registrations landing somewhere, and volunteers able to edit a page without calling me.
What went well
The technical part, honestly. WordPress exports everything as XML. I had a script written that turns that export into Markdown files, one per post, with dates and categories in the front matter. Astro reads those files and generates a static site: no more database, no more plugins, nothing left to update.
The content volunteers touch, schedule, fees, training venues, lives in a few YAML files, one per topic. One line per time slot. It can be edited from the browser, with a ten-line help page. I tested it with the club treasurer on Sunday evening: she changed a time slot, the site rebuilt itself, the change was live two minutes later. She did not ask anything.
Registrations and payments moved to HelloAsso, which is built for that and which the club already used for training camps. A form embedded in the page, nothing left to host.
The old URLs were preserved. I kept the list of WordPress URLs and checked that every one of them existed on the new site before switching. DNS changed on Sunday at ten in the evening. Monday morning, the site was there.
What I would do differently
The conversion script. I had it written, I skimmed it, I ran it on all four hundred posts, and I looked at the home page. It looked good. I moved on.
On Tuesday, a volunteer sent me a link. A post from 2019, with a line like this in the middle of the text:
[caption id="attachment_2841" align="aligncenter" width="600"]
A WordPress shortcode, left as is. The script did not handle them. Eighty posts were in that state, every one with a captioned photo. I had not seen them because I had not opened a single one.
The fix took an hour. What bothers me is not the hour. It is that I could have noticed on Saturday, in ten minutes, by opening five random posts before running the script on everything. Five, not four hundred. One with an image, one with a video, one with a table, a very old one, a very recent one.
That is exactly the kind of check I used to do without thinking when I wrote the script myself, because writing it forced me to look at the data. When you no longer write it, that step disappears with it. You have to put it back on purpose.
A script you didn’t write, you don’t know what it doesn’t do. Try it on five cases before running it on four hundred.
Get the journal by email
About one entry a week. What I build, what breaks, what I learn. No promotion, one-click unsubscribe.
You can also follow the RSS feed.