# Extensible Web Apps
> A platform for malleable web apps: a small kernel in a shared worker (and, optionally, on a server for each shared space), and everything else is a plugin. An app is an app.html page that lists plugins with ; each plugin is one ES module with a literal manifest, runs in its own worker, can do only what its manifest asks for, and draws plain-HTML views from template files. No build step.
Start with AGENTS.md for the rules and conventions, then the developer guide. The API reference is generated from the running kernel.
## Docs
- [AGENTS.md](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/AGENTS.md): rules the kernel enforces, how to write an app, how to check it
- [How an app works](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/how-an-app-works.md): the page, the kernel and the plugins, and the messages between them
- [Writing a plugin](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/writing-a-plugin.md): builds the Habits app step by step
- [Views and templates](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/views-and-templates.md): template syntax, actions, components, live views, allowed HTML
- [Data and permissions](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/data-and-permissions.md): collections, schemas, ui-form and ui-table, permissions, reviews
- [Debugging an app](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/debugging.md): the debug console, hook tracer, view source, inspect mode, the debugger app and the reflect service
- [Styling](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/styling.md): design tokens, plugin stylesheets, page overrides
- [Sharing data between apps](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/sharing-data-between-apps.md): one app reading another's collection
- [Commands and the command palette](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/commands.md): commands plugins add, run from a palette, a shortcut or an agent
- [Hooks of your own](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/plugin-hooks.md): a manifest's `hooks`, named :, run with ctx.hooks.emit or ctx.hooks.call, listened to with ctx.on
- [Routes and the service worker](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/routes.md): plugins answering links, forms and fetches
- [Agents](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/agents.md): a Markdown file linked with , run as a plugin that asks a model and calls tools through the gate
- [Deploying one app on its own](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/deploying-an-app.md): npm run deploy:app puts one app on a Cloudflare Worker of its own, with the whole platform
- [Places](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/places.md): plugins adding to, replacing or hiding parts of a page with no slot for them; open, review and locked areas; a person's own plugins
- [Spaces, and plugins on a server](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/spaces-and-servers.md): spaces shared by a group of people with sync; plugins with `runs: "server"` that answer public routes, run on a schedule and send email
- [Tools for language models](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/tools.md): service methods offered to a model as tools, called through the gate
- [The plugin registry](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/plugin-registry.md): packages/, plugins a person adds from Customize, including ones that provide services
- [Editors, and a folder of files](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/editors.md): a text box's selection, pastes and drops, the Markdown element, and the folder service for files on the person's disk
- [How the Markdown editor is built](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/markdown-editor.md): demos/markdown-editor taken apart: posts.js owns the post and its posts:* hooks and document service, every feature is a plugin on them, and the writer agent uses their reports as tools
- [Games and sound](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/games-and-audio.md): a game loop whose rules are plugins, clips rendered through effects that are plugins, and the element
- [An app of your own](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/your-own-app.md): npm create extensible-app makes a project that is one app, its files at the top and the platform as a dependency; npm run dev and npm run deploy serve it at /
- [Loading fast, without jumping](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/loading-fast.md): what the host and service worker do so apps draw early without layout shift
- [Slots in views, and view transforms](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/slots-and-transforms.md): a plugin declaring `` in its view for others to fill (page.slots), and changing another plugin's view with a place `in` it (ui:transform:)
- [Making an app by describing it](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/making-apps.md): the app maker agent writes app.html and plugins through review cards, checks the app as it runs and fixes it, with each file's versions (std/maker/, /apps//)
## Reference
- [API reference](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/api.md): every ctx call, service method, hook, capability, manifest field, component and allowed element
- [The kernel](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/kernel.md): where it runs, and how plugins are run, checked and reviewed
- [The layers](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/layers.md): Cordis, the kernel core, kernel services, std plugins and apps, and the trust line between them
- [Servers and spaces](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/server.md): the kernel on Node and Cloudflare, seams, sign-in, sync, server plugins
- [API keys and web requests](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/keys-and-requests.md): network:, net.fetch, and secrets a plugin uses without seeing
- [Outside agents: WebMCP and MCP](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/outside-agents.md): a plugin that calls outside.open lets the browser's agents (WebMCP) and members' MCP clients (/s//mcp/, agent keys) use its tools
- [Installing, offline, and opening files](https://github.com/PaulKinlan/ExtensibleWebApps/blob/main/docs/guide/installing-and-files.md): every app gets a manifest and works offline; file_handlers and the launch service; the page policy (Trusted Types, no inline scripts, Permissions-Policy)
## Examples
- [Starter](https://github.com/PaulKinlan/ExtensibleWebApps/tree/main/starter): the app `npm run new-app` copies; `npm run check` finds mistakes in it
- [Habits](https://github.com/PaulKinlan/ExtensibleWebApps/tree/main/demos/habits): the smallest complete app, the one the guide builds
- [All demo apps](https://github.com/PaulKinlan/ExtensibleWebApps/tree/main/demos): reading list, spending, recipes, contacts, calendar, survey and feeds (server plugins), household (a space), debugger, and more
- [Live demos](https://extensibleweb.app/)