Work · 2026
Arttrip: moving a fourteen-year-old magazine off WordPress
A travel and art-history magazine online since 2012, rebuilt as a static site in four languages. 2,082 pages, an SEO audit that can fail the build, and no database left to patch.
Arttrip is a magazine about cultural travel and art history, published since 2012. The writing is its author’s, and it stays hers. What I did was move the whole thing off WordPress and onto a static site, without losing a page, a URL or a position in search.
What the migration had to preserve
A fourteen-year-old site is not a content folder. It’s a set of promises made to search engines and to anyone who ever shared a link. The constraint I set before writing any code was that no existing URL could break, in any of the four languages the magazine publishes in — Italian, English, French and Spanish.
The site in January 2025, the last WordPress year, captured from the Internet Archive.
The build produces 2,082 pages, roughly 420 articles per language plus the
hubs and indexes that tie them together. Redirects from the old WordPress
permalinks are generated at build time rather than maintained by hand, and
written into both a redirects file and an .htaccess, so the rule lives in one
place and the two outputs can’t drift apart.
The earliest snapshot the Internet Archive holds, June 2012. The crawler never kept the stylesheet, so what survives is the bare HTML — not how the site looked at the time.
An audit that can fail the build
The part I’d keep in any future project is the SEO audit. It isn’t a report
someone reads once a quarter: it’s scripts/audit-dist-seo.mjs --strict, run
against the built output, and a failure stops the release.
It checks the things that quietly rot on a large multilingual site — canonicals
pointing where they should, hreflang sets that reference each other in both
directions, titles and descriptions that exist and aren’t duplicated, pages that
are indexable actually being linked from somewhere. On a site with four
languages those relationships multiply fast, and they break in ways nobody
notices until traffic drops two months later.
Making it a build gate rather than a dashboard was the whole point. A number on a dashboard is advice; a non-zero exit code is a decision.
Images, measured rather than assumed
Every photograph is converted to WebP with responsive steps at 420, 800 and 1280 pixels, generated by an idempotent script that can be re-run after any upload.
One case is worth stating because it cuts against the obvious rule. For about 400 of the author’s own photographs, the full-resolution WebP came out larger than the source JPEG — median width 1183 pixels, already well compressed. Forcing conversion for the sake of consistency would have cost 65 MB to serve files 11% heavier. Those keep their responsive steps and skip the full-size WebP. “Convert everything to WebP” is good advice right up to the point where you measure it.
An article today, one of roughly 420 per language.
What I took from it
Search goes through Pagefind, indexed at build time, so a site with no backend still has real full-text search in four languages.
The outcome that matters isn’t the stack. It’s that a magazine that used to need a database, a plugin stack and a maintenance window is now a folder of files behind a CDN, and the thing most likely to break — its relationship with search engines — is the one thing a script checks on every single build.