// Migration toolkit — Astro

Carry your site
across. Intact.

Migration tools for Ghost, Squarespace, Substack, Webflow, and WordPress Astro. Content, assets, routes, and metadata. No lock-in. No data loss.

05Charted routes
100%Metadata preserved
0Vendor lock-in
MITOpen license
// Supported migrations

The Routes

Each route is a tested crossing — an origin platform to Astro, and the cargo that moves intact. Specs list every field, transform, and known edge.

RouteStatusTransfersSpec
GhostAstro Active Posts, tags, authors, images, and route slugs View Spec →
SquarespaceAstro Beta Pages, blog posts, images, and redirect maps. XML export. View Spec →
SubstackAstro Beta Newsletter archive, posts, images, and canonical URLs View Spec →
WebflowAstro Planned Content, assets, routes, and CMS collections via API View Spec →
WordPressAstro Planned Posts, pages, media, taxonomies, and SEO metadata View Spec →
// What Portage handles

The Manifest

A full accounting of what comes aboard. Four holds, nothing stowed loose.

Content

Posts, pages, collections, and CMS schemas. Mapped to Astro content collections or headless CMS structures.

Assets

Images, files, and media. URLs rewritten. Optimized for Astro's asset pipeline.

Routes

URL structures, slugs, and redirect maps. Your SEO equity moves with you.

Metadata

Titles, descriptions, Open Graph, alt text, publish dates. Nothing discarded.

// Procedure

How Portage Works

Three stages. Extract, transform, load. Each is inspectable, each is reversible, and nothing is written until the last.

01

Extract

Connect to source. Pull content, assets, and structure via API or export file.

02

Transform

Normalize schemas. Map to Astro content collections or your target headless CMS. Generate type-safe data layers.

03

Load

Write to Astro project. Output clean Markdown, MDX, or JSON. Asset references rewritten. Redirects generated.

portage · cli bash
$ npx portage extract --from ghost --to ./astro-project
  → 142 entries · 318 assets · 12 collections
$ npx portage transform --schema content-collections
  → schemas normalized · type-safe layer generated
$ npx portage load --assets ./public
  → markdown written · 47 redirects mapped · done
// Integrity

Nothing is left on the dock.

Portage treats your content as cargo with a manifest. Every item is counted on, and counted off.

01

No data loss

Every field in the manifest is checksummed on extract and verified on load. Mismatches halt the crossing.

02

No lock-in

Output is plain Markdown, MDX, or JSON in your repository. Portage leaves no runtime behind.

03

Reversible

Dry-run by default. Full diffs before anything is written. Nothing is overwritten without confirmation.

04

Inspectable

Every transform is logged. The manifest is a file you can read, diff, and commit alongside your code.

// Operated by

An infrastructure product of Salish Sea Consulting.

A small studio building migration and content tooling for teams leaving page-builders behind. We maintain Portage in the open, on the same schedule we'd want for our own crossings.

Salish Sea Consulting
Established2021 · Victoria, BC
Bearing48.4284° N · 123.3656° W
Buildportage v0.9.2
LicenseMIT · open source
// Cast off

Carry it across.

Read the route specs, or pull the toolkit and run your first extract as a dry-run. Nothing is written until you say so.

$ npx portage@latestcopy