# kernl docs > Developer documentation for kernl, an opinionated shell for sandboxed web applets built on the kehto toolkit. Markdown twins of every docs page, served at the HTML path with `.md` instead of `.html`. These docs describe one shell; the protocol authority is NIP-5D (https://github.com/nostr-protocol/nips/pull/2303) and the NAPs (https://github.com/napplet/naps). ## Start - [kernl](https://kernl.run/docs/index.md): kernl is an opinionated shell for sandboxed web applets. - [Alpha status](https://kernl.run/docs/alpha-status.md): kernl is a first draft. - [Roadmap](https://kernl.run/docs/roadmap.md): Ordered by the tie-breakers in SOUL.md: the user's safety and agency first, protocol conformance second, the applet developer's ability to build third. - [Changelog](https://kernl.run/docs/changelog.md): Each entry says what ships, per package and app. - [Agent access](https://kernl.run/docs/agent-access.md): How an AI agent should read these docs. - [Decisions](https://kernl.run/docs/decisions.md): The architecture decisions behind kernl, one entry per D-NNN. ## Concepts - [Architecture](https://kernl.run/docs/concepts/architecture.md): kernl is three layers. - [Guard](https://kernl.run/docs/concepts/guard.md): The guard is everything that stands between an applet and the user. - [Identity and grants](https://kernl.run/docs/concepts/identity-and-grants.md): An applet is not a name. - [Messaging](https://kernl.run/docs/concepts/messaging.md): No encrypted messaging protocol is inherently superior. - [Bridges](https://kernl.run/docs/concepts/bridges.md): Nostr is kernl's identity and resolution layer. - [Relay tiers](https://kernl.run/docs/concepts/relay-tiers.md): The shell, not the applet, decides which relays a request goes to. - [Inbox, outbox and finding servers](https://kernl.run/docs/concepts/inbox-outbox-and-servers.md): An account on the network is reached through relays it names itself. - [Persistence](https://kernl.run/docs/concepts/persistence.md): kernl keeps the user's choices in the browser they made them in. - [Layouts](https://kernl.run/docs/concepts/layouts.md): Where a shell puts its windows is the part of kernl most likely to be changed, so it is built to be: a layout is a pure function, the layouts on offer are a registry, and everything else about wind… - [Applets under kernl](https://kernl.run/docs/concepts/applets-under-kernl.md): kernl adds nothing to the applet format. - [The store and intents](https://kernl.run/docs/concepts/store-and-intents.md): kernl finds applets for the user and lets applets hand work to each other. ## Tutorials - [Run the shell](https://kernl.run/docs/tutorials/run-the-shell.md): This tutorial takes you from nothing to an applet running in a window, signed in with your own account, and shows the Kernl calls behind each step. - [Write an applet](https://kernl.run/docs/tutorials/write-an-applet.md): This tutorial builds a small applet as one HTML file, checks it against the limits kernl will hold it to, publishes it with the applet format's own tooling, and opens it in kernl. - [Embed kernl in a page](https://kernl.run/docs/tutorials/embed-a-host-page.md): This tutorial builds the smallest page that runs a real applet under kernl: one HTML file, one script, an address field and a frame. ## How-tos - [How-tos](https://kernl.run/docs/how-tos/index.md): One task per page, with the exact calls. - [Change the guard profile](https://kernl.run/docs/how-tos/change-guard-profile.md): The hosted shell boots in strict. - [Add a messaging provider](https://kernl.run/docs/how-tos/add-a-messaging-provider.md): A provider is a package change plus a docs page. - [Add a bridge backend](https://kernl.run/docs/how-tos/add-a-bridge-backend.md): The four non-HTTP bridges are complete up to the backend interface they call. - [Add a cache backend](https://kernl.run/docs/how-tos/add-a-cache-backend.md): The event cache has one contract and a backend per context (D-030). - [Grant and revoke](https://kernl.run/docs/how-tos/grant-and-revoke.md): A grant is something the user gave and can take back. - [Embed kernl core](https://kernl.run/docs/how-tos/embed-kernl-core.md): apps/web is one host for @kernlize/core; your own page can be another. - [Change the shell's layout](https://kernl.run/docs/how-tos/change-the-shells-layout.md): Where the shell puts its windows is decided by a layout: a pure function from the open windows to one rectangle each. - [Write your own window manager](https://kernl.run/docs/how-tos/write-a-window-manager.md): kernl has opinions about windows: they cascade as they open, one layout arranges them all, a narrow screen shows one at a time. - [Deploy](https://kernl.run/docs/how-tos/deploy.md): kernl deploys as one static artifact: the landing site at the root, the shell at /app/, the docs at /docs/ and the generated API reference at /docs/api/. - [Publish packages](https://kernl.run/docs/how-tos/publish-packages.md): The four packages publish to two registries from the same commit and versions: ## Guides - [Troubleshooting](https://kernl.run/docs/guides/troubleshooting.md): The failures people actually hit with this draft, what each one looks like, and what fixes it. ## Packages - [Packages](https://kernl.run/docs/packages/index.md): kernl has four packages. - [@kernlize/guard](https://kernl.run/docs/packages/guard.md): Ingress flood control, visibility gating, focus-aware firewall, CSP profile and nested-frame insertion lock for the kernl shell. - [@kernlize/messaging](https://kernl.run/docs/packages/messaging.md): Messaging provider contract, registry, composite direct-message backend and an in-memory backend for the kernl shell. - [@kernlize/bridges](https://kernl.run/docs/packages/bridges.md): Locator parsing, the bridge contract, the registry that routes and authorises, an HTTP bridge with an SSRF policy, four backend-driven bridges for downloads, sharing and mail, hand-off backends tha… - [@kernlize/core](https://kernl.run/docs/packages/core.md): Opinionated shell composition over kehto and applesauce. ## Reference - [API reference](https://kernl.run/docs/reference/api.md): The API reference is generated from source JSDoc by TypeDoc 0.28 with entryPointStrategy: packages over the four workspaces in typedoc.json. - [Error reasons](https://kernl.run/docs/reference/errors.md): Every failure in the four packages carries a stable reason string with a prefix that says what kind of failure it is. ## Policies - [Policies](https://kernl.run/docs/policies/index.md): Rules the repository enforces mechanically. - [Public vocabulary](https://kernl.run/docs/policies/public-vocabulary.md): The public website and the shell UI never name a protocol. - [Security posture](https://kernl.run/docs/policies/security-posture.md): The rules the shell keeps when it runs untrusted code next to the user's identity. - [Spec conformance](https://kernl.run/docs/policies/spec-conformance.md): kernl conforms to specifications it does not own.