Skip to content

Migrating from another platform

We ship free, open-source migration tools as a standalone CLI. It’s not a plugin on purpose: you run it once on your server, it writes straight into the Xentium database, and all it leaves behind is the migration log (ACP → System → Migration History).

Adapter Source Status
@xentium/migrate-wp WordPress, from a WXR export file (wp-admin → Tools → Export). You don’t need a WordPress install or database access. ✅ Available
@xentium/migrate-phpbb phpBB 3.1+, over a direct MySQL connection. The xentium-forum plugin must be installed and enabled on the target (we check before anything runs). Users keep their passwords. ✅ Available
@xentium/migrate-xenforo XenForo 2.x, over a direct MySQL connection. Needs the xentium-forum plugin on the target. Users with native bcrypt hashes keep their passwords. ✅ Available
vBulletin, WoltLab Suite direct database connection Planned
Terminal window
# 1. Always start with a dry run: it inspects, extracts and reports, and writes NOTHING
pnpm --filter @xentium/migrate-wp migrate -- \
--file my-export.xml \
--db "postgresql://user:pass@localhost:5432/xentium" \
--dry-run
# 2. The real run (asks you to confirm; --yes skips that)
pnpm --filter @xentium/migrate-wp migrate -- --file my-export.xml --db "postgresql://…"
# Forums: point at the board's MySQL database instead of a file
# (same flags for @xentium/migrate-xenforo; --prefix overrides the table prefix)
pnpm --filter @xentium/migrate-phpbb migrate -- \
--source-db "mysql://user:pass@host:3306/phpbb" \
--db "postgresql://…" --dry-run

The target has to be an installed Xentium (run the wizard first). Migrations can be resumed: we track every imported item in an import map, so if a run is interrupted, the next one continues where it stopped instead of creating duplicates. Accounts that match an existing user by email are merged into that user.

  • Users: accounts, display names, join dates and a best-effort role mapping (admins → Administrator, moderators → Moderator). Where the source has password hashes (the database adapters; for XenForo we pull them out of its serialized auth data), users keep their passwords: we check the old hash on their first login and quietly upgrade it to argon2. WXR exports don’t contain hashes, so WordPress users reset their password once.
  • Content: categories with their hierarchy, posts/articles (converted to the TipTap format; headings, lists, quotes, code, images and links survive), tags and member comments (threaded one level deep). For forums: the whole node tree, threads (locked, pinned, view counts) and posts with their BBCode converted.
  • Social graph where the source has one: XenForo reactions become likes (every reaction type turns into a like), follows carry over 1:1 and ignores become blocks. phpBB foes become blocks. phpBB’s friend flag is a private buddy list, so we don’t turn it into public follows. A block cancels follows in both directions, as it does in Xentium, and we recount every like and follower total.
  • Not migrated: themes and styling (Xentium has its own appearance system), the old platform’s plugins, private messages, guest comments (comments on Xentium need an account), and, in this version, media files and attachments (we link to them by URL but don’t download them). The migration report lists everything we skipped and why.