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.
- ⌂ 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.
Jest→Vitest
Convert jest.config.js / package.json to vitest.config.ts via AST. Maps moduleNameMapper, coverage, transforms, setup files.
Open Jest → Vitest converter →ESLint→Flat Config
Convert .eslintrc and .eslintignore to eslint.config.js. Flags FlatCompat usage, plugin compatibility risks, and removed CLI flags before you commit.
Coming soonWebpack→Vite
Analyzer for webpack.config.js. Emits a Vite 8 vite.config.ts skeleton and a tiered report: what maps cleanly, what needs manual work, and which Vite plugin replaces each loader.
Open Webpack → Vite converter →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.