Verified migration

    Vue 2 → Vue 3, verified by the real compiler.

    Vue 2 hit end-of-life in December 2023. Refactyl moves your project to Vue 3 and keeps the Options API you already ship. No Composition API rewrite. Every converted .vue file is validated by @vue/compiler-sfc before handoff. Anything it can't convert keeps its Vue 2 original and gets flagged, so nothing breaks quietly.

    No credit card · Docker-sandboxed · Deleted on handoff · How we handle your code →

    Why this migration is hard to get right

    Breaking changes are numerous and non-obvious

    v-model changed its binding target (value → modelValue, input → update:modelValue). $listeners was removed. Filters were removed. The v-enter/v-leave CSS transition class names changed. A search-and-replace finds some of these; an LLM without the full breaking-change catalog misses most.

    Template compilation is the only real gate

    Vue 3's template compiler rejects patterns Vue 2 accepted silently. Getting a .vue file to compile with @vue/compiler-sfc is the only test that matters, not whether the syntax looks right to a model or a human reviewer.

    Ecosystem packages don't have stable Vue 3 builds

    Vuetify and BootstrapVue didn't have stable Vue 3 releases at Vue 2 EOL. A naive vue@3 bump silences a reactive UI without an obvious error if vue-router is still on v3. Getting the right version of each ecosystem package is a dependency research problem, not a file conversion.

    How Refactyl does it

    01Isolate
    02Plan
    03Transform
    04Verify & Repair

    The official Vue 3 migration guide applies as deterministic rules first: filter removals, v-model binding renames, $listeners/$children removal, lifecycle hook renames. CSS transition class renames (v-enter → v-enter-from, v-leave → v-leave-from) run as a deterministic regex post-pass on every <style> block. The AI transform reliably skips <style> sections, so a deterministic fallback is required. Every converted .vue file then passes a real @vue/compiler-sfc parse + template compile gate, with one repair round if compilation fails.

    Compiler: @vue/compiler-sfc (template compile) · Zero files ship unverified.

    Before (Vue 2 SFC)
    <template>
      <input :value="value"
             @input="$emit('input', $event.target.value)" />
    </template>
    
    <script>
    export default {
      props: ['value'],
      filters: {
        shout: v => v.toUpperCase()
      }
    }
    </script>
    After (Vue 3, compiler-sfc verified)
    <template>
      <input :value="modelValue"
             @input="$emit('update:modelValue',
                           $event.target.value)" />
    </template>
    
    <script>
    export default {
      props: ['modelValue'],
      emits: ['update:modelValue']
    }
    </script>

    Measured against real alternatives

    Vue 2→3 · Compiler-Verified Benchmark

    Same bar as the JS→TS benchmark: the real @vue/compiler-sfc gate.

    Five pinned open-source Vue 2 repos. Three tools. Judge: every converted .vue file must parse and compile with @vue/compiler-sfc. Harness and repos are public.

    vue-codemod

    Official CLI, results recorded per repo. Like ts-migrate, coverage is incomplete on modern repos.

    Raw GPT: high v2 residue

    The naive LLM leaves Vue 2 API patterns in place (beforeDestroy, this.$on, this.$set). SFCs "compile" but Vue 2 behaviour remains.

    Refactyl: clean SFCs

    Deterministic breaking-change rules + compiler-sfc gate + one repair round. Every file passes before handoff, or ships with a flag explaining why not.

    Numbers are being benchmarked now. Results will appear here once published.

    Numbers are real. Harness is public. cd backend && npx tsx bench-vue.ts all to reproduce.

    Full benchmark

    Manual / raw LLM vs Refactyl

    ConcernManual / raw LLMRefactyl
    Template compiler gateRun npm run build; template errors surface then@vue/compiler-sfc validates every .vue file before handoff
    v-model binding renameEasy to miss across many componentsDeterministic rule, applied to every file
    CSS transition class renamesModels skip <style> blocks; manual grep requiredDeterministic regex post-pass on every <style> block
    Ecosystem package versionsVuetify/BootstrapVue break silently on wrong versionsFlagged as migration risks; never blindly bumped
    vue-router versionOften bumped to untested majorPinned to tested 4.x, not the newer 5.x major
    Unconvertible filesSilently broken or blocked on manual reviewVue 2 original preserved; clearly flagged with reason

    FAQ

    Vue 2 → Vue 3 migration: common questions

    Real questions engineers ask before migrating Vue 2 to Vue 3, answered honestly.

    Ready to migrate?

    Run your Vue 2 repo through the real compiler.

    One free migration per month, up to 100 files. No credit card. Every file gated by @vue/compiler-sfc (template compile), repaired until clean, or clearly flagged with the reason.

    Start free migration

    No credit card · Docker-sandboxed · Deleted on handoff · Never used for training