This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
A few days ago I introduced migrateme.tech — an open-source, dry-run-first migration toolkit whose proof path was WordPress (WXR) → Markdown/MDX, validated on a real 44-item run. This week it grew the thing it was always pointed at: MigrateMe Universal, an anything-to-anything content converter, and the first public release of the Open Migration Package (OMP) — an open import/export standard designed so the converter eventually makes itself unnecessary.
One hub, not N×N converters
Every migration tool I have used is a pile of pair-to-pair converters. Add a platform and you owe a converter to and from everything else. Universal refuses that shape: every source parses into one canonical item model, and every destination renders from it. Fifteen source parsers and fifteen destination renderers — WordPress WXR, Markdown/MDX variants, Ghost, Shopify CSV, Webflow CSV, Notion and Medium exports, Sanity NDJSON, Contentful JSON, RSS/Atom, Blogger, canonical JSON, CSV, static HTML — and adding platform #38 costs one parser or one renderer, never both.
A registry that tells the truth
The converter's registry covers 37 nodes: 21 researched platforms (10 AI builders — Replit, Lovable, Bolt.new, v0, Bubble, Softr, Glide, AppSheet, Adalo, DronaHQ — and 11 CMS platforms by market share, WordPress at the top) plus the format connectors. That is 37 × 36 = 1,332 directed pairs, and every pair has its own landing page stating plainly whether the route is Supported, Lossy — with the losses named, not footnoted — or Planned. Every pair also has its own canonical address: lovable.wordpress.migrateme.tech is the Lovable → WordPress route (the path form, universal.migrateme.tech/convert/lovable-to-wordpress, redirects there — no duplicate URLs). The whole index is public, too: sitemap-pairs.xml lists all 1,332 canonical pair URLs.
Honesty is a feature here, and it cuts both ways: when a source platform offers no export at all, the built-in Scanner (lite) discovers what it can from sitemaps, feeds, and structured data — in the browser, respecting robots rules, never pretending to be a full crawler and never going near a login wall.
The pair wheel — all 1,332 addresses in 29 seconds.
The Open Migration Package
The converter is the reference implementation; the standard is the point. An OMP package is a manifest.json (source, items, assets, taxonomy, mappings, provenance, sha256 checksums over every file), a content/ folder of Markdown/MDX with Portable Text bodies, and an assets/ index. There is a published JSON Schema, a validator that returns specific errors instead of vibes, and conformance levels — OMP Reader, OMP Writer, OMP Full — so a platform can adopt incrementally. The ask to every builder and CMS on the registry: implement two translators (to-OMP, from-OMP) instead of N×M converters, and your users can leave whenever they want. That is what an exit door looks like.
The spec lives in the repo at docs/format/open-migration-package.md, the schema and validator in packages/format, and this weekend Universal folded into the main monorepo — packages/connectors/universal for the parsers and renderers, apps/web/universal for the app, and Manifest v2 in packages/core, which generalises the original v1 manifest while keeping every v1 file valid.
Building a new standard — the Open Migration Package in 74 seconds.
Who it's for, and who would pay
The user is anyone whose content is fenced in: a freelancer whose client's site lives on a builder they want to leave, a small agency doing the same migration for the tenth client by hand, a hobbyist community moving off a platform that's shutting down. Migrations are episodic, high-stakes, and currently priced like hostage negotiations — agency line items and per-site SaaS fees for what is, mechanically, a format conversion with a risk report.
The toolkit itself is free and MIT-licensed, and the AI step runs a local open-weight model, so a migration costs nothing to run — that's what makes freemium honest here rather than a trial in disguise. The business model it grows into is a Commons Donation Bundle: when a migration succeeds, the tool inventories the open-source technology it touched — the platform the site came from, the platform it's going to, and the stack the tool itself stands on — and assembles a suggested donation across all three, Humble Bundle–style, with a slider for the amount and the split. Designed, not yet wired: no payments are taken today. A tool that moves people between open-source platforms should feed the commons it depends on.
How the monetization works — the Commons Donation Bundle.
Demo
Try it live: https://universal.migrateme.tech/ — it runs entirely in your browser; nothing you upload leaves your device. Every route is live too, e.g. wordpress.markdown.migrateme.tech for the flagship route, or lovable.wordpress.migrateme.tech for a Lossy one with its losses named. Project home: https://migrateme.tech/
Code
Mike-Demo
/
migrateme.tech
Open-source AI-assisted CMS migration toolkit. Dry-run-first, local-first WordPress → Markdown migrations via CLI, MCP, web, and agents.
migrateme.tech
Open-source AI-assisted CMS migration toolkit. Dry-run-first, local-first WordPress → Markdown migrations via CLI, MCP, web, and agents.
MigrateMe Universal + Open Migration Package (folded in 2026-10-18)
The anything-to-anything Universal converter and the Open Migration Package (OMP) standard (issue #34) were folded in from the Universal Bolt Forge build:
-
packages/connectors/universal— 15 source parsers + 15 destination renderers on one canonical hub (no pair-to-pair converters), plus the 21-platform registry with honest Supported / Lossy / Planned labels. -
packages/format(@migrateme/format) — the OMP manifest JSON Schema and validator surface; the spec lives atdocs/format/open-migration-package.md. -
packages/coregained Manifest v2 (manifest-v2.ts): v1 manifests upgrade losslessly, so any registered pair can be described. -
apps/web/universal— the Universal web app (standalone Vite app live at https://universal.migrateme.tech).
Setup
Use Node.js 24.21.0 (version in .nvmrc) and pnpm 10.22.0 (pinned by
packageManager in the root package.json). Enable Corepack and install…
-
packages/connectors/universal— the source parsers and destination renderers (the hub's spokes) -
packages/format— the OMP package reader/writer, JSON Schema, and validator -
packages/core— Manifest v2, the canonical model everything parses into -
apps/web/universal— the browser app: matrix, pair pages, converter, Scanner (lite) -
docs/format/open-migration-package.md— the OMP spec;docs/copilot-usage.md— the running log of how the AI builders and reviewers were used, and checked
How I Built It
Universal was built during a Bolt Forge weekend on GLM 5.3 Flash, an open-weight model, driven in narrow single-purpose prompts — big prompts died on the run budget, so the work was sliced until each prompt did exactly one thing. The open model is not decoration: it wrote the parsers, the renderers, the pair-page generator, and the app shell.
Around it, a strict rule: nothing counts as done until it is verified in the synced GitHub code and the live output — AI builders' completion claims included. Every build round went through GitHub Copilot as an adversarial reviewer, not a rubber stamp: it caught a data-loss bug in the OMP asset packaging and an injection hole in WXR parsing before either shipped, and the fold-in PR carried 13 review findings — 12 fixed, one answered as a design point. Accessibility was a from-the-first-prompt requirement, not an audit-week patch: WCAG 2.2 AA targets, keyboard-first flows, aria-live progress, and statuses that are always icon plus text, never colour alone. The whole site family also moved hosting this weekend — migrateme.tech, the converter, and the run-output site now all serve from SpaceFast.
How Copilot was used — and checked — across the whole build.
Why Does Open Innovation Matter?
Because the problem this tool solves is closed-ness. Platforms fence content in with proprietary exports precisely because exit is supposed to hurt. A closed migration API would reproduce the disease: your escape hatch, rented back to you, revocable at pricing-page notice.
Open pieces are what make Universal work, specifically:
- The standard is open. OMP is MIT-licensed with a published schema, so a platform adopting it isn't integrating with my product — it's implementing a format its users can verify. I've already opened an interop conversation with Automattic's liberate.sh team, offering an OMP writer and shared testing, in a public issue.
- The model is open-weight. GLM 5.3 Flash ran the build at no per-token cost during the Forge weekend, and the toolkit's own AI step is designed to run a local open-weight model — a migration costs nothing to run, which is what makes the free tier honest.
- The execution is local. Conversions run in the visitor's browser. There is no server for your content to leak from, no upload to trust anyone with. A closed cloud converter couldn't make that promise structurally — only contractually.
- The work is inspectable. Every claim in this post — the 44-item validated run, the review findings, the pair counts — resolves to a public commit, issue, or page. Open innovation is also an audit trail.
If you build a platform: the standard is MIT-licensed, the schema is published, and the reference implementation is right there. Give your users an exit door.
My Agent Session
No DevRelay session for this one — the build's agent work happened in the open on GitHub instead. The sessions are the issue and PR threads: the Universal build was commissioned and tracked in issues (design restyle: #38, homepage: #41), Copilot's review reports live on the PRs (fold-in: #35; the full review report: #37), and docs/copilot-usage.md in the repo is the running session log — prompts, verdicts, and the bugs the reviewers caught, in order.
My First User
Yes — an agency PM I know took an early version for a spin last week, and their feedback steered what v2 became: less "a better WordPress exporter," more "the hub has to be the product." They didn't pay — the tool is free, and the donation bundle isn't wired yet — but a working practitioner telling you your scope is wrong, early enough to fix it, is worth more than a first dollar at this stage.
Prize Categories
- Best Use of GitHub Copilot
- Best Use of a .tech Domain
What's next: more parsers and renderers down the registry's Planned list (issue #32) · a server/CLI full crawler to sit behind Scanner (lite)'s honesty boundary · OMP adoption outreach to the registry platforms, AI builders first.
Additional Videos
What's next for MigrateMe — the roadmap.
DXS: the Digital Experience Showcase test bed — real sandboxes, real proof runs.
Top comments (1)
Pinned context for anyone landing here cold 📌
This is part two. Part one — the dry-run-first toolkit, the canonical model, and the real 44-item WordPress run that proved the shape — is here:
Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸
Open Source Migration Tool
Fastest ways to kick the tires:
→ The converter itself: universal.migrateme.tech (runs entirely in your browser)
→ A Lossy route with its losses named: lovable.wordpress.migrateme.tech
→ All 1,332 pair addresses, as a sitemap: migrateme.tech/sitemap-pairs.xml
If you build a platform or a CMS: the Open Migration Package spec is in the repo (docs/format/open-migration-package.md), MIT-licensed, with a schema and validator. Two translators — to-OMP and from-OMP — and your users get an exit door. Interop questions and adoption notes are very welcome in the comments or the repo issues.