Business logic that survives
framework changes
MVVM is the architectural discipline. The browser is the platform. Web Loom packages give you clean, typed APIs over mature browser primitives — fetch, storage, routing, events — without heavy abstractions or framework lock-in. Your business logic runs anywhere.
The pattern
One ViewModel.
Every framework.
The ViewModel is plain TypeScript — no framework imports, no heavy runtime. Infrastructure packages sit directly on mature browser APIs: fetch for HTTP, localStorage for persistence, History API for routing. Typed interfaces over what the platform already provides — not replacements for it.
- Model — owns data, calls browser APIs or your backend
- ViewModel — derives displayable state, exposes Commands
- View — subscribes and renders — the only framework-specific code
import { BaseViewModel, Command }
from '@web-loom/mvvm-core';
import { map } from 'rxjs/operators';
export class TaskListViewModel
extends BaseViewModel<TaskModel> {
readonly fetchCommand =
this.registerCommand(
new Command(() => this.model.fetchAll())
);
readonly pendingCount$ =
this.data$.pipe(
map(tasks =>
(tasks ?? []).filter(t => !t.done).length
)
);
}Platform-first
The browser has matured.
Web Loom works with it, not around it.
Every infrastructure package is a thin, typed wrapper over a stable browser primitive. No proprietary runtimes. No invented protocols. Full tree-shaking.
Typed requests with interceptors and response mapping
Versioned, typed persistence with session and memory adapters
Reactive navigation state over pushState and popstate
Strongly typed event emitter with automatic disposal
Ecosystem
Explore the packages
Core Architecture
BaseModel, BaseViewModel, Commands — MVVM in plain TypeScript. No framework imports, fully testable.
Signals Core
Zero-dependency reactive primitives. Push-based state without a virtual DOM or framework runtime.
Query Core
Typed caching layer over fetch. Deduplication and stale-while-revalidate — no separate runtime.
Store Core
Minimal reactive store for UI-only state. localStorage adapter built in, no boilerplate.
Event Bus Core
Typed pub/sub over EventTarget primitives. Decoupled cross-feature messaging with zero overhead.
UI Core
Headless accessibility behaviors for dialog, list, and form. Bring your own markup.
Design Core
Design tokens as CSS custom properties. Flat and paper themes included — no CSS-in-JS required.
Package Roadmap
10 packages published on npm. 24 more in active development across forms, media, i18n, and more.
Compatibility
Works with every major framework
The ViewModel has no framework imports. Connecting it to a new framework means writing one thin subscription bridge — typically under 20 lines.
The author
Festus Yeboah
Framework Architect
Festus is a frontend architect who has spent years watching teams rewrite the same business logic every time the framework pendulum swings. Web Loom is his attempt to give the web the same architectural continuity that Android, iOS, and .NET have enjoyed for twenty years.
The project is open-source and driven by the conviction that the 80% of an application that is not rendering code should be portable, testable, and immune to framework churn.
Follow on GitHubReady to stop rewriting?
Install the core package and wire up your first ViewModel in minutes.