Migrating from WordPress
Field notes from porting a real site.
Squilla isn't a one-click WordPress migration tool, and it's not trying to be. But the data model is close enough that a thoughtful manual port is straightforward, and the resulting site is dramatically simpler to operate. These are the field notes.
The model maps cleanly
WordPress's posts become Squilla nodes. WordPress post types become Squilla node types. WordPress taxonomies are Squilla taxonomies. Custom fields (ACF, postmeta) become entries in fields_data. The biggest conceptual shift: WP's blocks are HTML stored as a string; Squilla's blocks are structured {type, fields} objects with their own templates. You'll be unpacking a lot of <!-- wp:paragraph --> markers.
The good news
- Custom post types translate directly. Register the node type, copy the field schema, you're 80% there.
- Custom fields are JSONB. No more
wp_postmetajoins.fields_datais a single column with a GIN index. - Taxonomies and terms work the same way. One thin migration script.
- Media is an extension.
media-managerhandles uploads, variants, picker UI; you can bulk-import viacore.media.uploadorcore.media.import_url.
The harder bits
- Block parsing. Gutenberg blocks need parsing into Squilla blocks. The straightforward path: write a one-shot script that iterates posts, parses the WP block list, and emits Squilla
blocks_data. Most blocks (paragraph, heading, image, list, code, quote) map 1:1. - Plugins. WP plugins don't port. You'll be replacing them with extensions — and most of what mid-sized WP sites use is already covered by the seven reference extensions (forms, media, email, sitemap, content blocks).
- Theme code. PHP templates don't translate to Go templates automatically. Realistically you're rebuilding the theme. The good news: themes are smaller, partials are reusable, and the seed runs idempotently.
The shape of a port
- Register your node types via
core.nodetype.create - Migrate taxonomies + terms
- Bulk-import media
- Write the block-translation script for posts
- Build a thin theme (start by forking the squilla theme)
- Stand the new site up alongside WordPress; flip DNS when you're satisfied
It's not a click. But once you're across, you have a CMS you can drive from Claude Code, with no plugin updates, no “white screen of death”, and no PHP-FPM tuning.