App Compose helps you build front-end applications from isolated tasks with explicit dependencies and predictable execution order—without containers, decorators, or framework-specific APIs.
Note
Beta: This project is currently in beta. The API may change before the stable release.
@app-compose/core@3.0.0-beta.8@app-compose/eslint-plugin@3.0.0-beta.8@app-compose/coda@3.0.0-beta.8
- Simplicity — lightweight, no containers/providers/decorators, zero dependencies. Framework-agnostic.
- Clarity — no magic, no globals; context flows through typed wiring.
- Reusability — same code, different context per compose.
- Testability — missing context, duplicates, unused wires fail in CI.
- Observability — your app as plain JSON; hooks for start, complete, fail.
If you want to use App-Compose for a part of your existing app, you don't have to rewrite the rest. Add it to your stack, and bring in more when you're ready.
A minimal example built on the three key pieces: Task, Tag, and Wire (how they connect). Two features share data without knowing about each other.
import { compose, createTask, createWire, tag } from "@app-compose/core"
const name = tag<string>("name")
const user = createTask({
name: "user",
run: { fn: () => ({ name: "World" }) },
})
const greeting = createTask({
name: "greeting",
run: {
context: name.value,
fn: (name) => console.log(`Hello, ${name}!`),
},
})
await compose()
.step(user)
.step(createWire({ from: user.result.name, to: name }))
.step(greeting)
.run() // Hello, World!Try App Compose in the online sandbox without installing anything, or add @app-compose/core with your package manager:
- npm:
npm install --save-exact @app-compose/core - pnpm:
pnpm add --save-exact @app-compose/core - Yarn:
yarn add --exact @app-compose/core - Bun:
bun add --exact @app-compose/core
Continue with the Quick Start.
Give your coding assistant the documentation index to find the pages relevant to your task.
Open deepwiki and ask anything about the codebase.
App Compose is available under the MIT License.