shiftkit/ dev migrations

Config converters that actually read your code.

ShiftKit is a small, opinionated migration tool for the JavaScript ecosystem. Paste a config in, get a working one out, with honest notes for whatever needs your eyes. AST-based, not regex.

local
Runs in your browser
No upload. No signup. The textarea is the entire data flow.
deterministic
Same input, same output
AST passes covered by an extensive test suite. Reviewable in git.
honest
Flags what it can’t map
No silent guesses. Manual / verify / info warnings, not “best effort”.
  • ⌂ Runs in your browser
  • ≡ Same input, same output
  • ! Flags what it can’t map

Available converters

One focused tool per migration. Each ships its own page, npm package, and test suite.

Why a separate tool per migration?

Migrations look similar from the outside (parse one config, emit another) but the failure modes diverge fast. The Jest-to-Vitest converter alone has to reason about hook timing, module factories, custom transformers, and Vitest 4’s workspace model. Bundling that depth into a multi-purpose wizard means each migration gets less attention. ShiftKit ships one focused converter per migration, with its own page and its own test suite.

Common questions

Do these tools send my config anywhere?

No. Parsing happens entirely in your browser. We don't log inputs and we don't persist anything.

How is this different from jscodeshift or framework-provided migrate scripts?

Codemods rewrite test bodies and source files; ShiftKit only handles config. The two are complementary. Run a codemod for tests, run ShiftKit for config.

What does 'AST-based' actually mean here?

We parse your config with Babel into an abstract syntax tree, then transform it field-by-field with full TypeScript and ES-module awareness. The alternative - regex substitution - silently misbehaves on satisfies, defineConfig() wrappers, function-form configs, or anything more complex than a flat object literal. AST passes either map a field correctly or surface it for review; they do not produce subtly-wrong output.

Try Jest → Vitest →