Site transformer like mitosis

Tuesday, June 2, 2026

A site transformer like Mitosis is a tool or compiler that lets you write your UI or site components once in a neutral “source” format and then compile them into multiple target frameworks (React, Vue, Svelte, Angular, Web Components, etc.).[3] Mitosis (from Builder.io) is the best‑known example of this approach and is often described as a “universal reactive transformer.”[3]

Below is a comprehensive article explaining what this means, why it matters, how Mitosis works, and what a “site transformer” architecture looks like.


1. What is a “site transformer like Mitosis”?

In modern front-end development, each framework (React, Vue, Svelte, Angular, Solid, etc.) has its own:

  • Component syntax
  • Reactivity model (state, effects, signals, etc.)
  • Tooling ecosystem

A site transformer solves the cross‑framework problem by introducing:

  • A universal component language for authoring UI logic and layout.
  • A compiler that transforms those universal components into framework-specific code.

Mitosis.js is exactly this: a JavaScript/TypeScript compiler that consumes a universal, JSX-like syntax and outputs components for many frameworks.[3] You write a component once, then compile to:

  • React
  • Vue
  • Angular
  • Svelte
  • Solid
  • Web Components
  • Plain HTML (and others like Qwik.js on the roadmap)[3]

Builder.io’s own product uses Mitosis to translate between visual designs (e.g., from Figma) and components in whatever framework the host app uses.[3]


2. Core idea: “Write once, compile everywhere”

Traditional approaches to sharing UI across frameworks include:

  • Copying and rewriting components for each framework.
  • Wrapping components via Web Components or microfrontends.
  • Using framework-specific “ports” of the same design system.

A site transformer like Mitosis takes a more compiler-driven approach:

  1. You define your UI in a universal representation (Mitosis syntax).
  2. The compiler analyzes and normalizes this representation.
  3. It emits platform-specific source code that looks and feels native to each target framework.[3]

This is different from runtime wrappers:

  • No extra runtime layer is required.
  • The generated code is standard framework code.
  • Each target can be optimized with its own idioms (state management, hooks, etc.).[3]

3. Mitosis: the universal reactive transformer

3.1. What is Mitosis.js?

According to Builder.io’s documentation and coverage:[3]

  • Mitosis is:

  • A compiler + toolchain.

  • A universal reactive component syntax.

  • An abstraction layer that reveals the common concepts across modern front-end frameworks.

  • It is syntactically a subset of JSX, inspired by Solid.js’s JSX variant.[3]
    That choice:

  • Leverages React’s widespread familiarity.

  • Uses JSX as a concise way to describe reactive UIs.

In practical terms, Mitosis gives you:

  • A single source format for components (TS/JS + JSX-like template).
  • A CLI that builds to multiple frameworks.
  • Integration with tools like Builder.io and Figma for design‑to‑code workflows.[3]

4. How Mitosis’s universal syntax works

Mitosis defines a constrained, framework‑agnostic dialect of JSX. Key characteristics:[3]

  • No framework-specific APIs (no useEffect, ref, computed, etc. from any specific library).
  • Unified state model expressed in plain objects or simple primitives.
  • Events, props, loops, conditionals expressed in a way that can be mapped cleanly to each target.

Example (conceptual):

import { useStore } from '@builder.io/mitosis';

export default function Counter() {
  const state = useStore({
    count: 0,
    increment() {
      state.count++;
    }
  });

  return (
    <button onClick={() => state.increment()}>
      Count: {state.count}
    </button>
  );
}

From this one component, Mitosis can emit:

  • A React component using useState or a chosen state provider.[3]
  • A Vue single‑file component.
  • A Svelte component with let count = 0;.
  • An Angular component class + template.
  • A Web Component using custom elements.

The compiler takes care of mapping useStore, event handlers, and dynamic bindings into each framework’s patterns.


5. The compilation pipeline (architecture of a site transformer)

Conceptually, a site transformer like Mitosis has several stages:

  1. Parsing and front-end
  • Parse the source (TypeScript/JSX).
  • Build an AST (Abstract Syntax Tree).
  • Apply type information if available.
  1. Normalization / IR (Intermediate Representation)
  • Convert the AST into a framework‑agnostic IR that represents:
    • Components and their props.
    • State and lifecycle.
    • Template structure (elements, bindings, loops).
  • This IR is essentially JSON describing a reactive UI.[3]
  1. Target-specific back-ends
  • For each supported framework:
    • Traverse the IR.
    • Generate corresponding source code, using:
    • React: function components + hooks or other state provider.[3]
    • Vue: component options or <script setup> SFCs.
    • Svelte: scripts + markup with {} bindings.
    • Angular: class, decorators, and templates.
    • Solid: signals and JSX.
    • Web Components: custom elements.
  1. Code formatting and output
  • Emit the generated files into distinct output directories (one per framework).
  • Optionally run formatting or linting for readability.[3]

The mitosis.config.js file tells the compiler which targets to generate and how to map certain patterns.[3]


6. Example workflow with Mitosis for a multi-framework site

A typical site transformer workflow using Mitosis:

  1. Initialize a project
  • Use npm init to create a project.
  • Install Mitosis CLI and core packages: bash npm install @builder.io/mitosis-cli @builder.io/mitosis The InfoWorld overview describes such a setup and demonstrates basic configuration.[3]
  1. Create Mitosis components
  • Write your components in the Mitosis syntax (TypeScript + JSX subset).
  • Keep them free from framework-specific APIs.
  1. Configure compilation
  • Add a mitosis.config.js specifying:
    • Input directory for Mitosis components.
    • Output directory structure.
    • Target frameworks (React, Vue, Svelte, etc.).[3]
  1. Run the build
  • Execute: bash npx mitosis build
  • This generates framework-specific components under paths like:
    • output/react/src/components/...
    • output/vue/src/components/...
      etc.[3]
  1. Integrate into apps
  • In each framework codebase, import the generated components like normal.
  • You now have one source of truth for component behavior, with multiple framework outputs.

7. Why use a site transformer?

7.1. Key benefits

  • Framework portability

  • You can support multiple front-end frameworks from a single codebase.[3]

  • Useful for product suites that embed into different host apps (e.g., customer portals written in React, Vue, or Angular).

  • Design system reuse

  • Design systems become truly cross-framework without manual ports.

  • You maintain one canonical component definition.

  • Migration paths

  • If you are migrating from one framework to another, a transformer can:

    • Generate components for the new framework.
    • Let you run both versions in parallel during transition.
  • Meta-framework experimentation

  • Mitosis exposes the underlying common model of reactive UIs across frameworks.[3]

  • This suggests future meta frameworks that operate at the IR level rather than framework level.

7.2. Real-world use case: Builder.io

Builder.io:

  • Lets users visually design UIs.
  • Needs to output those UIs as components in whatever framework the end customer uses.
  • Uses Mitosis as the translation bridge:
  • From internal representation (or Figma design data).
  • To React, Vue, Svelte, Web Components, etc.[3]

This is exactly the “site transformer” concept in action: design once, generate everywhere.


8. Constraints and challenges of site transformers

Building (or using) a site transformer like Mitosis involves tradeoffs.

8.1. Limited language surface

To be portable:

  • The source syntax must avoid framework-specific features that have no clear analog elsewhere.
  • Mitosis deliberately restricts:
  • Certain advanced React idioms.
  • Deep Vue composition or Angular dependency injection patterns.
  • Developers must stay within the supported subset.

8.2. Imperfect 1:1 feature mapping

Different frameworks have different:

  • Lifecycle hooks.
  • Refs and DOM access patterns.
  • Async behavior and batching.
  • State management paradigms.

The transformer must approximate equivalent behavior in each target. In rare cases, behavior might diverge subtly if a pattern doesn’t map cleanly.

8.3. Tooling and debugging

  • You debug generated code in the target framework.
  • Source maps and conventions can help, but the developer must be aware that:
  • The source of truth is Mitosis components.
  • Edits in generated files are typically overwritten on rebuild.

8.4. Performance considerations

  • Generated code aims to be idiomatic and efficient in each framework.
  • However, some optimizations that are easy in a framework-specific codebase may be harder in a generic IR.

Despite this, Mitosis is designed to generate “normal” framework code without extra runtime overhead.[3]


9. Designing your own “site transformer like Mitosis”

If you intend to create a similar system (your own site transformer), key design steps are:

  1. Define a neutral component model
  • Identify the common denominator across frameworks:
    • Components, props, state, events, effects, context.
  • Express it as a structured IR (e.g., JSON).
  1. Choose a source syntax
  • JSX subset (like Mitosis) for familiarity.
  • Or a purely declarative JSON / DSL if you’re more tool-centric.
  • Ensure the syntax is fully representable in your IR.
  1. Implement parsers and front-end
  • Use existing tools (TypeScript compiler, Babel, etc.) to parse.
  • Build an AST → transform into IR.
  1. Implement target back-ends
  • For each framework:
    • Map IR nodes to code templates.
    • Handle framework-specific:
    • State patterns.
    • Lifecycle hooks.
    • Directives and attribute syntax.
  1. Handle configuration and plugins
  • Allow developers to:
    • Choose state providers (e.g., React useState vs zustand).[3]
    • Specify project conventions.
  • Support plugin hooks for custom transformations.
  1. Provide tooling
  • CLI for builds and watch mode.
  • Optional playground to preview generated code (like the Mitosis playground).[3]

10. Future directions: beyond Mitosis

The idea of a universal reactive transformer opens up further possibilities:

  • Higher-level composition tools

  • Instead of writing framework code, teams might:

    • Work entirely in a visual designer.
    • Or a higher-level DSL that compiles down via a transformer.
  • Meta-frameworks

  • Frameworks that target the IR first, and then downstream compilers handle framework-specific code.

  • This could create ecosystems where:

    • Libraries are written once for the IR.
    • They are consumed by apps in any framework via generated bindings.
  • Deeper static analysis

  • Since IR is structured, tools can analyze:

    • Performance characteristics.
    • Accessibility.
    • Design system consistency across frameworks.

Mitosis’s ability to describe reactive UIs as JSON-like data is a key step toward such meta-level tooling.[3]


If you clarify what audience you’re targeting (e.g., junior React devs vs. toolchain architects) or which frameworks you care about most, I can adapt this into a more tailored article, with concrete examples for those specific ecosystems.

No comments: