Microfrontend projection for the modern web.
Compose independently deployed applications into a unified interface —
with full interactivity, style isolation, and cross-origin support.
Documentation • Get Started • Examples • GitHub
Enterprise frontends are no longer monoliths. They're assembled from dozens of independently owned services, teams, and deployment pipelines. Yet the tools for composing them are stuck in the past — containers that break layout flow, build-time coupling that kills team autonomy, or custom protocols that lock you into a single framework.
Virtual Frame takes a different approach. It projects remote content directly into your DOM — fully interactive, style-isolated, and framework-agnostic. No build-time coordination. No layout traps. No vendor lock-in.
Each team deploys on their own schedule. Virtual Frame projects their UI into a unified experience at runtime — no shared builds, no version conflicts, no deployment coordination.
React, Vue, Angular, Svelte, Solid, Next.js, Nuxt, SvelteKit — it doesn't matter. Virtual Frame works with any web content from any origin. Bring your own stack.
Projected content lives in your page's DOM flow. It participates in your layout, respects your scroll context, and behaves like native content — because it is.
Shadow DOM encapsulation prevents style bleed between host and remote applications. Each projected surface is sandboxed without sacrificing interactivity or accessibility.
| Microfrontend Projection | Compose independently deployed apps into a single view — dashboards, widgets, entire pages |
| Framework Agnostic | First-class bindings for React, Vue, Svelte, Solid, Angular, and Next.js. Works with plain HTML too |
| Shadow DOM Isolation | Prevents CSS bleed between projected content and the host page |
| Selector Projection | Project only the parts you need using CSS selectors — a chart, a form, a sidebar |
| Shared Reactive Store | Synchronized state between host and remote apps via @virtual-frame/store |
| Cross-Origin Support | Compose content from any origin using a lightweight bridge script |
| Canvas & Media Streaming | Live canvas and video content projected in real-time |
| Full Interactivity | Clicks, forms, scroll, drag & drop — all proxied transparently to the source |
| Module Federation Compatible | Works alongside Webpack/Rspack Module Federation for hybrid composition |
npm install virtual-frame
That's it. No build plugins. No config files. No framework buy-in.
<script type="module">
import "virtual-frame/element";
</script>
<virtual-frame src="https://other-team.example.com/widget" isolate="open"></virtual-frame>
npm install virtual-frame @virtual-frame/react @virtual-frame/store
import { VirtualFrame, useVirtualFrame, useStore } from "@virtual-frame/react";
import { createStore } from "@virtual-frame/store";
const store = createStore();
function App() {
const count = useStore(store, ["count"]);
const frame = useVirtualFrame("/remote/", { store });
return (
<>
<p>Count: {count ?? 0}</p>
<VirtualFrame frame={frame} selector="#counter" />
</>
);
}
import { VirtualFrame } from "virtual-frame";
const vf = new VirtualFrame(sourceFrame, host, {
isolate: "open",
selector: "#main-content",
});
Bindings also available for Vue, Svelte, Solid, Angular, and Next.js — see the full documentation.
@virtual-frame/store provides an event-sourced synchronized store that keeps state in sync between host and remote applications in real time. Read and write like a plain object — synchronization happens automatically.
import { createStore } from "@virtual-frame/store";
const store = createStore();
store.count = 0;
store.user = { name: "Alice" };
console.log(store.count); // 0
console.log(store.user.name); // "Alice"
When passed to a VirtualFrame component, the store automatically synchronizes between the host and the remote. Both sides see the same state and updates propagate instantly.
(timestamp, sourceId, seq)useStore hooks for React, Vue, Svelte, Solid, and Angular| Package | Description |
|---|---|
virtual-frame |
Core library and <virtual-frame> custom element |
@virtual-frame/store |
Event-sourced synchronized store for cross-frame state |
@virtual-frame/react |
React component and useStore hook |
@virtual-frame/vue |
Vue component and useStore composable |
@virtual-frame/svelte |
Svelte component and useStore readable store |
@virtual-frame/solid |
Solid component and useStore signal |
@virtual-frame/angular |
Angular directive and injectStoreValue signal |
@virtual-frame/next |
Next.js integration (App Router & Pages Router) |
Every major framework. Host + remote pairs. Ready to run.
| Example | Stack | Command |
|---|---|---|
| Vanilla | Plain HTML/JS | pnpm example:vanilla |
| React | React + shared store | pnpm example:react |
| Vue | Vue 3 | pnpm example:vue |
| Svelte | Svelte 5 | pnpm example:svelte |
| Solid | SolidJS | pnpm example:solid |
| Angular | Angular 19 | pnpm example:angular |
| Next.js App Router | Next.js 16 (App Router) | pnpm example:nextjs-app |
| Next.js Pages Router | Next.js 16 (Pages Router) | pnpm example:nextjs-pages |
| Nuxt | Nuxt 4 | pnpm example:nuxt |
| React Router | React Router 7 | pnpm example:react-router |
| TanStack Start | TanStack Start | pnpm example:tanstack-start |
| Analog | Analog (Angular meta-framework) | pnpm example:analog |
| SvelteKit | SvelteKit 2 | pnpm example:sveltekit |
| SolidStart | SolidStart | pnpm example:solid-start |
| Rspack + Module Federation | Rspack MF v2 hybrid | pnpm example:rspack-mf |
For content served from a different origin, include the bridge script in the remote page:
<script src="https://unpkg.com/virtual-frame/dist/bridge.js"></script>
Virtual Frame automatically detects cross-origin sources and activates the bridge. No server proxy or CORS configuration required.
We welcome contributions of all kinds — bug reports, feature requests, documentation improvements, and code.
Before submitting a pull request, please make sure your changes pass the full quality pipeline:
pnpm install # Install dependencies
pnpm build # Build all packages
pnpm test # Unit tests (Vitest + browser mode)
pnpm test:e2e # End-to-end tests (Playwright)
pnpm lint # Lint with oxlint
pnpm format:check # Check formatting with oxfmt
pnpm typecheck # TypeScript type checking
Run the full example suite in development mode to verify integration across frameworks:
pnpm dev # All examples in parallel
See the documentation site for architecture guides and API reference.
Source Available License (SAL-1.0). See LICENSE for details.
Virtual Frame is created and maintained by Level 0x40 Labs — building the next generation of web composition infrastructure.