← Case Studies

03 / VUE TO MARIONETTE

From Vue to Marionette: An Agent-Led Migration

ChatGPT’s coding agent, dot, migrated a substantial Vue application to Marionette v5 RC2 without the developer supplying Marionette-specific implementation instructions. The measured frontend opened rich tasks faster and transferred less JavaScript and CSS on the cold list route than Vue.

Vikunja task details in dark theme, with project navigation, description, comments, an editor and task actions.
Vikunja task details in the Marionette v5 RC2 frontend · original 1440 × 900 capture · dark theme. · View full size

Reuse versus rewrite

Vikunja is an open-source task manager with a Vue interface and Go backend. The agent inspected the existing application and used installed, version-matched Marionette guidance to replace its frontend.

Frontend replacement
KeptChanged
Go backend and API clientVue templates → Marionette Views
Models and servicesComponent coordination → Applications and Regions
Assets and translation filesUI bindings, wrappers and lifecycle integration

Reusable styles still depended on DOM structure. Vue bindings, wrappers, and component lifecycles needed replacement; framework-neutral code could stay. Migration record.

A faster rich task journey

Median time to open a rich task

Vue: 3.71943 s; Marionette: 1.03577 s. Median of 20 samples per app; lower is better. 500-task fixture, 50 visible rows/cards, rich task with 50 comments. Production builds, desktop Chromium; timings include automation, API and frame waits. Original chart.

Rich-task opening was 72% shorter. Cold-list JS/CSS transfer was 420.5 KiB versus Vue’s 614.2 KiB, about 32% less. Search was mixed: total input-to-paint was 194.80 ms versus 221.25 ms, but the results-publication-to-paint interval was slower, 24.45 ms versus 12.75 ms. These are implementation and journey comparisons, not framework rankings. Measurement report.

Why the architecture matters

The workspace survives project navigation while individual panels come and go. Task records publish accepted writes; editor Views keep their own drafts. If someone types during a save, the newer draft stays dirty after the older save succeeds. Updating a status indicator does not require rebuilding the editor. Task ownership review.

This TypeScript/Vite implementation renders through lit-html alongside existing services and UI libraries; v5 requires neither Backbone nor jQuery. Lit updates template nodes. The application chooses which child Views remain mounted. Architecture.

What to weigh before migrating

Try this approach for features with local drafts, asynchronous panels, and explicit lifetimes. You own routing, persistence integration, and synchronization policy. Follow a task from its Application to its record and editor View, then run the paired journey.

The developer directed outcomes, appearance, progress, and verification. The agent handled implementation, investigation, and technical corrections. Its incomplete Vue-source readings caused mistakes; paired desktop/mobile journeys exposed focus, styling, and label defects that builds missed. Verified follow-up fixes.

Evidence and methodology

All 59 original routes are ported; acceptance verification is incomplete. Fix snapshot 66af00fd passes 778 unit cases and 82/84 focused browser cases; the two retained mobile-wheel assertions also fail in Vue. Licensed integrations, external providers, Electron, OS IME and screen-reader equivalence remain unverified.

Benchmarks stay pinned to 5fca3cbd, before the label and recovery fixes; neither follow-up was rebenchmarked. The hero was captured October 7 at 05:48 UTC from 8de771eab, with the same measured frontend tree 50662d985. Runtime: 5.0.0-rc.2.

The developer confirms that he supplied outcome and verification direction, not Marionette-specific implementation instructions. This is an account of the migration, not a controlled agent-development experiment; the public migration record documents implementation and follow-up work, not a complete prompt transcript.

Measured code · Architecture · Measurements and method · Verified fixes and limits