So far, we've looked at the why of Mosaic: today's apps create friction, and App Flows adapt to your journey like a living companion.
Now, let's look at the how. What would it take to actually build Mosaic with today's technology?
The Core Building Blocks
To make App Flows real, Mosaic relies on four components:

The four core building blocks that make Mosaic App Flows possible
1. The Context Engine
This is the brain of Mosaic.
Powered by a Large Language Model (LLM), it interprets a user's intent: "I'm visiting Tokyo," "I'm preparing for a check-up," "I'm starting a new class."
It uses signals like time, location, role, and past behavior to understand what stage of the journey you're in.
Unlike today's chatbots, which just respond to prompts, the Context Engine continuously updates context and reshapes the App Flow as your journey evolves.
2. The Registry of Tiles
The Tile Registry is the keystone of Mosaic — and the part that makes it more than "just another MCP."
In MCP, registries expose APIs that an agent can call.
In Mosaic, registries expose tiles: modular units made of three layers:
Logic Layer
Defines what the tile does.
Exposed as functions or API wrappers.
Example (TypeScript):
// logic.ts
export async function getWeather(location: string) {
const response = await fetch(`/api/weather?loc=${location}`);
return await response.json();
}
Presentation Layer
Defines how the tile looks inside an App Flow.
Built as reusable components (Web Components, Svelte, React, or Lit).
Supports different modes: card, widget, popup.
Example (Svelte):
<!-- WeatherTile.svelte -->
<script lang="ts">
export let weather: { temp: number; condition: string };
</script>
<div class="tile card">
<h3>Weather</h3>
<p>{weather.temp}°C — {weather.condition}</p>
</div>
Metadata Layer
Tells the Composer when and how to use the tile.
Example manifest (JSON):
{
"name": "WeatherTile",
"version": "1.0.0",
"provider": "Community",
"logic": "./logic.ts",
"presentation": {
"modes": ["card", "widget"],
"component": "./WeatherTile.svelte",
"props": {
"weather": "object"
}
},
"metadata": {
"context": ["travel", "daily-life"],
"priority": "medium",
"pairsWith": ["MapTile"]
}
}
So the registry doesn't store raw UI or screenshots. It stores logic modules, UI components, and metadata — everything needed for the Composer to use the tile.
3. The Composer
The Composer is the layout and integration engine.
- It receives a set of relevant tiles from the Context Engine.
- It looks at each tile's manifest (logic + presentation + metadata).
- It decides:
- Which tiles to show.
- In what order.
- In what presentation mode (card, widget, popup).
How the Composer Renders Tiles
The Composer uses a shared design system (like Tailwind, Material UI, or a custom theme) to keep tiles consistent.
It mounts tile components dynamically, passing in data as props.
Example flow:
- Context Engine says weather is relevant.
- Composer imports
logic.ts
, runsgetWeather("Tokyo")
. - Composer mounts
WeatherTile.svelte
in card mode, passing weather as props.
With existing web tech (dynamic imports, Web Components, Svelte/React), this is totally possible today.
Handling Multiple Tiles for the Same Thing
What if there are multiple tiles for weather or translation? Mosaic handles this in layers:
- Registry curation — verified tiles can be highlighted.
- Context Engine arbitration — the LLM can pick based on metadata (offline support, reputation, integration).
- User override — users can swap tiles if they prefer a different one.
- Coexistence — in some cases, multiple tiles can appear side by side.
This avoids today's app-store chaos while still allowing competition.
4. Security & Control
Dynamic apps need trust. Mosaic provides:
- Version locking — freeze your App Flow at a safe state.
- Rollback — undo unexpected updates.
- Verified tiles — signed by trusted providers.
- User overrides — control which tiles get used.
This ensures flexibility without sacrificing control.
Why PWAs Are the Bridge
We don't need to invent a new OS to make this work. Progressive Web Apps (PWAs) already give us:
- Self-updating behavior (Service Workers).
- Cross-platform reach (runs in browsers, mobile, desktop).
- Installability (can live on the home screen or open via link).
- Offline support (cached tiles, limited resilience).
PWAs are the perfect near-term vehicle for Mosaic — an App Flow could be shared as a link, installed instantly, and evolve dynamically.
PWA Limitations
- Limited access to device APIs (push, Bluetooth, sensors).
- Discoverability bias (native apps favored in app stores).
- On iOS, stricter background and storage restrictions.
So while PWAs can't yet replace every native app, they can already demonstrate the App Flow model in practice.
The Role of LLMs
The LLM-powered Context Engine is what ties it all together:
Interpret intent
User says: "I'm visiting Tokyo."
LLM infers sub-goals: flights, hotels, maps, translation, restaurants.
Query registry
Finds relevant tiles: FlightTile, HotelTile, MapTile, TranslateTile.
Assemble flow
Tells Composer which tiles to render, in what order, and in what mode.
The result: a persistent, adaptive App Flow that evolves with you, rather than static apps you have to juggle.
Why This Matters
With these pieces, Mosaic is not science fiction. Using today's tech:
- Logic can be written as functions or API wrappers.
- UI can be packaged as components.
- Manifests can live in a registry (like NPM for tiles).
- PWAs can deliver adaptive App Flows cross-platform.
- LLMs can interpret user intent and orchestrate flows.
Together, they transform apps from static silos into Living Companions that grow and adapt with your context — location, time, role, and goals.
Homework for You
👉 Homework 1: Pick one task you'd describe in a sentence ("I'm moving to a new house," "I'm training for a marathon"). What tiles would you need if Mosaic built an App Flow for you?
👉 Homework 2 (for builders): Take one feature from your app and imagine it as a tile. Write a simple manifest:
- What logic would you export?
- What UI component would you package?
- What metadata would you declare?