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_postmeta joins. fields_data is a single column with a GIN index.
  • Taxonomies and terms work the same way. One thin migration script.
  • Media is an extension. media-manager handles uploads, variants, picker UI; you can bulk-import via core.media.upload or core.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

  1. Register your node types via core.nodetype.create
  2. Migrate taxonomies + terms
  3. Bulk-import media
  4. Write the block-translation script for posts
  5. Build a thin theme (start by forking the squilla theme)
  6. 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.

← all posts