# plainkit > Vanilla JavaScript toolkit for multi-page HTML apps. DataProvider owns each resource. Interceptor is the only fetch. plainkit is files you copy: `src/` and `css/`. The kit has no package install and no build step. An app is many HTML pages. Navigation is a real link. An agent builds a screen by copying a recipe, pointing a DataProvider at a URL, and leaving the English in the HTML. Shared HTTP behavior is one Interceptor hook on that page. A bearer token or a redirect on 401 lives there. The page script does not call fetch, and it does not construct a WebSocket. ## Site - [Home](/): Why plainkit exists, DataProvider, Interceptor, bind, LiveProvider, and why that shape stays cheap for an agent - [How it is used](/how): Copy the kit, the four owners, and a page script with a request hook and redirectOnStatus - [Examples](/examples): Screenshots of sign-in, dashboard, items, table, settings, activity, and the live room ## Kit - [plainkit](https://github.com/mikeleitz/plainkit): MIT source. Copy `src/` and `css/`. `make preview` serves the recipes at http://localhost:8091/demo/ - [Agent brief](https://github.com/mikeleitz/plainkit/blob/main/AGENTS.md): Rules for changing the kit - [40k foot view](https://github.com/mikeleitz/plainkit/blob/main/40k-foot-view.md): One page, three owners, bind, and what is deliberately absent ## Owners - DataProvider: one resource. `load` is GET, `create` is POST, `save` is PUT, `remove` is DELETE. `subscribe` reports data, status, and error. SessionProvider is a DataProvider whose payload includes roles. - Interceptor: `defaultInterceptor.fetch` is the only fetch. A request hook sets headers. `redirectOnStatus` sends 401 and 403 to HTML pages. - Bind: `bindText`, `bindField`, and `bindList` paint HTML that already holds the English. - LiveProvider: owns the socket on a live page. `connect`, `send`, and `close` are the verbs. The site layout is Tailwind Plus Spotlight and is not part of the MIT kit.