Migrate

Alpha

Legacy upgrades (Angular 17→21, Next 14→16, Node 18→20, CJS→ESM, JS→TS): paste a package.json, get a deterministic rule-based plan (7 rules).

  1. 1.Input
  2. 2.Deterministic analysis
  3. 3.Claude/Gemini reasoning (optional, BYOK)
  4. 4.Validation
  5. 5.Evidence
  6. 6.Human review
  7. 7.Export

Migration plan checklist

  • Commit a clean baseline and capture the lockfile.
  • Apply the findings table below top-down (breaking first).
  • Run Next.js codemods per major, then fix App Router breaking changes.
  • Reinstall, typecheck, run tests, and diff the lockfile before merging.
SeverityRuleEvidenceSuggestion
breakingnext-major-lt-15"next": "14.2.5"Upgrade Next.js one major at a time (14→15→16); run the official codemods and review App Router migration notes for layouts, metadata, and async request APIs.
warningreact-major-lt-19"react": "18.3.1"Bump react to ^19 and align peer ranges; check ref-as-prop changes and removed legacy APIs before upgrading dependents.
warningengines-node"node": ">=18"Raise engines.node to >=20 and re-verify native deps and CI images built for Node 18.
infomajor-bump-list"next": "14.2.5", "react": "18.3.1", "react-dom": "18.3.1", "zod": "~3.23.8", "typescript": "5.4.5"Pinned/tilde ranges listed above will not float to the new majors automatically; bump each deliberately and run tests per dependency.

Alpha: verify everything before acting.

What the 7 rules check

  • next-major-lt-15: flags Next.js below 15 when moving to 16.
  • react-major-lt-19: flags React below 19.
  • react-dom-peer: flags mismatched react and react-dom majors.
  • engines-node: flags a missing or low engines.node field.
  • cjs-main-field: flags a CJS main entry when moving to ESM.
  • cjs-missing-type: flags a missing "type": "module" field when moving to ESM.
  • major-bump-list: lists pinned or tilde ranges that will not float to the new majors on their own.

With the default sample and the Next 14 → 16 target, the table above shows 4 findings: 1 breaking, 2 warnings, 1 info.

Privacy: your key is sent only to the chosen provider through our stateless proxy, which never stores it server-side. Requests bill to your own provider account. Without a key every deterministic feature still works; the model step is optional.