ULTRV

Migrating from Ghost to ULTRV

Two routes: the JSON export, or an Admin API key and no file at all.

Ghost exports well. Its content export is a single JSON file with your posts, pages, and tags in it, and its Admin API will hand over the same thing without a download step. ULTRV reads either. Which one you use depends mostly on whether the Ghost site is still running.

The thing to settle before you start is scope. Ghost is a publishing business in a box — memberships, newsletters, Stripe, tiers. ULTRV is a blog. The writing moves; the business does not. TheGhost alternative comparisongoes through that in detail, including where Ghost is simply the better product.

Route one: the JSON export

In Ghost Admin, go toSettings → Advanced → Import/Export and use the Export option to download your content. Ghost gives you one .json file named after your site and the date. It contains your settings, staff users, posts, pages, and tags. Members are a separate export, and themes are a separate download again. (Path checked August 2026 against Ghost's own documentation.)

In ULTRV, open your blog'sSettings → Import, choose theGhost tab, leaveUpload file selected, and pick the JSON. Upload it as JSON, not as a zip: Ghost can bundle content and images together for Ghost-to-Ghost moves, but ULTRV wants the plain file. The cap is 50 MB, and a Ghost content export is text, so that is rarely close.

Route two: the Admin API

Switch to Connect via URL. In Ghost Admin, go to Settings → Integrations and add a custom integration. Ghost shows you an Admin API key in the formid:secret — two halves separated by a colon. Paste the part before the colon intoAdmin API key id and the part after it intoAdmin API key secret. ForSite URL, give the base address of the site without /ghost on the end.

ULTRV signs each request with that key and walks the Admin API a hundred items at a time until it has every post and page, tags included. The credentials are cleared from storage 24 hours after the import finishes, and you can delete the integration in Ghost as soon as the import history says it is complete.

What maps, and what does not

Both routes bring across:

  • Posts and pages. Ghost pages become ULTRV static pages; posts become posts.
  • Titles and slugs. The Ghost slug is reused, which is why the paths usually still match afterwards.
  • The rendered body. ULTRV takes the HTML Ghost rendered, not the underlying Lexical source.
  • Custom excerpts. The excerpt you typed, where there is one. Ghost's auto-generated excerpts are not carried.
  • Published or draft, and the publication date. Anything not published — drafts, scheduled, sent-only — arrives as a draft.
  • Tags. Resolved from the export's tag table, or from the API's inline tags, and created on the ULTRV side as needed.
  • Feature images and inline images. Downloaded from your Ghost site and re-hosted, then relinked.

What stays behind:

  • Members, tiers, Stripe, and newsletters. Ghost exports members separately; ULTRV has nowhere to put them.
  • Staff users and authorship. Every imported item belongs to your ULTRV account.
  • Themes, custom templates, routes.yaml, and code injection. Pick from ULTRV's themes instead.
  • Comments, redirects, and integrations.
  • Tables and embeds. Imported HTML is sanitised to headings, paragraphs, lists, links, images, blockquotes, code, and emphasis, so Ghost cards that render as an iframe or a table do not survive.

After the import

The import history reports the counts and lists anything that errored. Because ULTRV reads Ghost's rendered HTML, the failure mode to look for is a post that arrived with a title and an empty body — that means the source had no rendered HTML for it. Open a handful of posts and check:

  1. A recent, long post. If its body is intact, the ordinary ones are fine.
  2. Anything built on a Ghost card that is not text — bookmark cards, embeds, product cards, toggles, galleries. These are the ones sanitising strips.
  3. Your pages, which are easy to forget because they are not in the post list.
  4. The tag list, since ULTRV creates tags it has not seen before and you may want to prune them.

Any batch can be rolled back from the history: it removes the posts, pages, images, and newly created tags from that import and nothing else. Re-running is safe too, because each item keeps its Ghost id — a second pass either skips what it already imported or overwrites it, whichever you chose.

Your old URLs

This is the easiest migration of the five for URLs. Ghost's default permalink is /slug/ and ULTRV serves posts at /slug, so if youmove your domain across most addresses land on the same post they always did. Custom permalink structures set in routes.yaml will not, and ULTRV does not serve redirects for them, so check a few real URLs before you switch the DNS.

Frequently asked questions

Can I upload the zip that Ghost offers, or does it have to be JSON?

It has to be the JSON file. Ghost can bundle content and images together in a zip for Ghost-to-Ghost moves, but ULTRV reads the JSON export directly. If you end up with a zip, unpack it and upload the .json file inside. ULTRV fetches your images from the live site anyway, so the bundled copies are not needed.

Do Ghost members and paid subscriptions come across?

No. Members are exported separately from Ghost as their own CSV, and ULTRV does not read that file. There is no membership system, no newsletter sending, and no Stripe integration on ULTRV to put them in. If memberships are how your site works, this migration removes that, and the Ghost alternative comparison is honest about it.

Which is better, the JSON export or the Admin API?

The Admin API if the site is live, because there is no file to produce and no file to keep current — ULTRV reads what is published right now, and you can re-run it the day you switch the domain. The JSON export if the site is already down, or if you would rather not create an integration.

Do my Ghost URLs still work after moving?

The paths usually match. Ghost serves posts at /slug by default and so does ULTRV, and the slug is carried over from the export, so the same post keeps the same path under your domain. If you customised your permalink structure in routes.yaml, or you are dropping the domain, the old addresses will not resolve — ULTRV does not serve redirects for them.

Start your blog →

Free, no credit card. Run the import against a blank blog and compare it with the Ghost site side by side before you move the domain.