V1 to V2 migration

Reading time 6 min

Migrate by building a separate, reviewed V2 reader, not by overwriting a working first-generation installation. Keep the old source, output and configuration until the new reader is checked live and you know how to restore the previous version.

This comparison is grounded in first-generation source and the V2 engine pinned for this handbook. Both package fields currently say 1.1.4; that string does not mean the engines are identical or establish a numeric 2.0 package release. Record repository and commit identifiers.

What changes

The first-generation comparison below comes from inspected source, not claims copied from the old public website. A customized old installation can differ; inventory its actual revision and changes before transferring anything.

Area Older source versus pinned V2
Node Older minimum 18; V2 minimum 24. Check the executable actually running the build/service.
Preview Older npm script runs npx serve dist; V2 includes a loopback-only preview server.
Editor Older local development server; V2 adds accounts, sections, Admin and private runtime.
Raw HTML Older builder enables it; V2 requires an explicit strict-true file policy.
Build paths Older fixed paths; V2 accepts content, output and data selectors.
Search Older page-level entries; V2 page and heading results with a changed schema.

What to transfer

Keep/adapt Do not overlay
Reviewed Markdown and metadata Old build/server implementation
Public media/downloads Old browser libraries/template as a wholesale replacement
Intended branding/site address Old dependencies or lockfile
Individually reviewed custom styles/templates Generated HTML as source
Explicit old-to-new route map Private runtime in public static inputs

Retain V2’s local library/font bundles and their licenses/notices. Port a necessary customization against the actual current template/CSS contract; do not copy an older template over the new one and assume its scripts/search/paths stay compatible.

Compatibility of a Markdown file is not proof that its route, rendering, template or editing permissions stay the same. Treat each of those as a separate check.

1. Inventory the old site before touching it

Record the old engine commit, Node version, build command and host/deployment process. Copy the intended Markdown, media, configuration and custom templates/styles into a recoverable backup. Preserve the previous rendered reader as a separate rollback snapshot.

Make a list of published URLs and the important links that point to them. Include home, section landings, deep pages, images and downloads. Old browser/editor data is not automatically compatible with a new account store. Do not copy dependency folders or arbitrary private files into the new reader.

If you cannot identify which directory contains source versus deployed output, stop and use Project map. Backing up only HTML is not a source backup.

2. Create a separate V2 installation

Use a new checkout with Node.js 24+ and npm ci. Select the intended V2 commit deliberately; this handbook documents the pinned engine revision shown in Complete setup.

Build the included V2 documentation first so a later error can be separated from an installation problem. Do not overlay the entire old project onto this checkout. Carry over only reviewed content/media and deliberate configuration/customization changes.

3. Transfer source without changing the old installation

Copy your intended Markdown into a dedicated review content tree. Preserve YAML frontmatter and section _index.md files. Bring public images/downloads into appropriate static paths. Keep private editor/account backups outside those public inputs.

A simple file might remain familiar:

---
title: Recovery checklist
description: Confirm a service is ready after a planned restart.
---

# Recovery checklist

## Verify the result

Check the service's expected health response and record the result.

Its filename does not alone determine its public URL. V2 builds routes from titles and section paths. Before/after route review is necessary even when the file contents did not change.

Old raw-HTML styling/embed tricks may render as text or no longer have the same behavior. Prefer supported Markdown where possible. Do not switch on raw HTML globally merely to make one old page look similar; review the security and compatibility tradeoff separately.

4. Build into a dedicated review output

npm run build -- --content ./migration-content --out ./migration-output

Create/review migration-content first. The output path is cleared by build, so it must be a disposable generated-output directory, never the old site/source/private data. File configuration/templates/static inputs still come from the V2 installation.

The bundled npm run serve serves default dist/, not this alternate directory. Use an appropriate HTTP server for the review output, or place the reviewed source into the intended V2 content location and build normal dist/ for its preview. Do not mistake an old preview for this migration build.

Fix YAML errors and duplicate-title URL collisions in source. Retest custom templates against V2’s actual placeholder and script expectations; old generated HTML is not a substitute for adapting source templates.

5. Check content and routes, not just build success

Walk each important old URL and identify its new destination. Stable routes are preferable when practical. For changed routes, plan supported host redirects and test the actual status/destination after deployment. This showcase’s Old URL map is an example of an explicit map, not an automatic migration feature.

Check page title, headings, tables, code copy, diagrams, images, downloads, internal links, search page/heading results, themes and phone-width layout. Look for collisions or broken anchors caused by punctuation/language title normalization. Do not assume all title scripts produce useful routes; the current limits are documented in Capabilities and limits.

6. Introduce editor accounts only if needed

The reader can remain file/Git-based. If you want V2 browser writing, create new intended accounts with supported commands and test section assignments on synthetic content first. No automatic first-generation account/content converter is claimed.

Keep the new private store outside reader output, select the same path for account commands and server, and verify an editor’s allowed and denied pages. Recheck saved/source/published/deployed boundaries before giving a team access.

7. Switch the reader with a return path

Review the exact generated upload and deployment controls. Keep the prior output and source backups. Deploy the new reader using your chosen host’s normal process, then inspect the real home/deep routes, assets, search, 404 and redirects.

A repository commit or provider success message is not the entire check. If the live result is wrong, decide whether the problem is content, output layout, host settings or caching before repeatedly pushing unrelated fixes.

Rollback must identify the exact old output and what private-data state is compatible. Restoring old HTML does not reverse account changes. Follow Upgrades and rollback for planning, and do not overwrite newer source/runtime data without knowing what you would lose.

Migration completion checklist

  • Old source/configuration/media and reader version remain recoverable.
  • New engine revision and dependency/build procedure are recorded.
  • Intended pages render and search correctly, with no private data exposed.
  • Every important old link has a verified destination or redirect.
  • Optional writers have tested role/section permissions.
  • The actual live reader passes desktop/phone-width checks.

Only then retire obsolete deployments or backups according to your retention policy. The migration is a reviewed transition, not a blind folder copy.