- Rust 82.9%
- JavaScript 11.2%
- wisp 1.7%
- Shell 1.3%
- Python 1.1%
- Other 1.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .claude | ||
| .forgejo | ||
| .github/workflows | ||
| audit | ||
| bench | ||
| crates | ||
| editors | ||
| examples | ||
| llms | ||
| packaging | ||
| proofs | ||
| scripts | ||
| tests | ||
| .gitattributes | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| deny.toml | ||
| DESIGN.md | ||
| LICENSE | ||
| PRODUCT.md | ||
| README.md | ||
| RELEASING.md | ||
| SECURITY.md | ||
Wisp
A fast, fun web framework for Rust.
This is a pre-release. The real release will be on GitHub, which we cannot use yet. Until then the source lives here, at code.wispweb.dev, and it moves to GitHub and crates.io with the full 1.0 release.
Docs · Quick Start · Tutorial · Benchmarks · Blog · Discord
File routes, .wisp templates compiled to Rust, form actions that work without JavaScript, and one binary to deploy. A folder is a URL, and its +page.wisp is the page: a short block of Rust that loads data and handles forms, then markup. The whole app, styles and static files included, becomes one small binary.
Quick Start
You need Rust 1.89 or later. Wisp is a pre-release for now: it installs from code.wispweb.dev and moves to crates.io with 1.0.
cargo install --git https://wisp.ar0.eu/ wisp-web
wisp new my-app
cd my-app
wisp dev
Every version, what changed in it and where to download the CLI, the crates and the editor packages: Changelog and Downloads (the same text as CHANGELOG.md; wisp changelog prints it in the terminal).
wisp dev serves http://127.0.0.1:3000. The Quick Start walks through the first page, and the Tutorial builds a small app with a form and a table.
Example
src/routes/+page.wisp:
---
let name = cx.query_or("name", "world".to_string());
---
<title>Hello page</title>
<meta name="description" content="A page that greets the name given in the query string of the URL.">
<h1>Hello, ${name}!</h1>
The --- block is Rust that runs for each request. The server renders ${name}. Turn JavaScript off and the page still works. The block also takes #[action] form handlers and a mod server { … } of JSON endpoints, so a route can be one file.
Why Wisp
- Fast. A route pays only for the features it uses. Before a change to the request path lands, an instructions-per-request A/B checks it.
- Cheap to write. The token counts of the small test app are under Speed. See Tokens for the method and the apps measured.
- Durable. Fast paths are proven at startup and fall back, and a panic in a handler is caught and answered as a 500. There is no unsafe code outside the Linux I/O drivers, the edge exports and the Windows Job Object for
wisp devcompanions. - Flexible. Forms, JSON APIs, uploads, signed cookies, hooks and components. Wisp gives you tools, not an auth or database layer.
What You Get
- Pages and forms:
#[action]handlers with validation.use:enhanceupdates a page in place.confirmandoncegive a delete that asks and a form that cannot be sent twice (both work with JavaScript off).#[derive(Rest)]makes a JSON CRUD API. Tables save to log files or to any database. - No JavaScript, any address: forms and whole apps work with scripts off (Tor Browser Safest, onion sites).
<form guard>adds a honeypot, a clock and a one-use token with no script or third party.cx.limitandBackoffcount visitors by a signed ticket where every client shares one address. A refused form gets a summary on top withrole="alert". Seeexamples/nojs. - Browser code:
on:click="count++"and{:count}with the state in the---block or none at all. A plain<script>is only for real browser logic ($derived,$effect, DOM, imports). Also: islands that load when needed, a router that morphs pages,{:#try}blocks that recover in place, optimistic lists, and actions such asuse:outside,use:shortcutanduse:modal. - No JavaScript needed: search, sort and paging by query string (
Table::page_where,Page::of,cx.sort_href), a light/dark switch by form and cookie (wisp ui add theme), tabs, menus and dialogs in HTML and CSS, and self-refreshing pages. They suit Tor Browser's Safest mode and strict CSPs. With JavaScript off. - Styling: scoped CSS in a
<style>block, Tailwind and Sass built in. - Tooling:
wisp devwith hot reload,wisp fmt,wisp check,wisp test, a language server with a VS Code extension, andwisp mcpto serve the docs to coding agents. - Hosting: one binary, Docker, static HTML, or a build for Cloudflare, Deno Deploy, Vercel, Netlify, AWS Lambda, Bun and Node. Pick your host.
- Tor onion services:
WISP_ONION=on(or anORIGINthat is a.onionaddress) sends no referrer, no HSTS, no external image, adaterounded to the minute and plain-http cookies.wisp deploy init docker --onionwrites the compose file andtorrc. Onion hosting.
Speed
Every number in this file is of release 1.0.0-pre.3, Wisp 2362ec0d, 2026-10-26. Instructions per request (callgrind, server thread, steal-proof, bench/rust-fastest/results/ir.txt, 3 runs, spread under 1%): Leptos 14,341 on plaintext, 14,906 on JSON and 165,437 on fortunes, Dioxus 13,750, 14,294 and 470,141, Actix Web 17,123, 17,829 and 43,815. Wisp: not measured at pre.3. Tokens of the small test app (bench/tokens/results.json): 477 in Wisp against 1,043 in Nuxt, 2.2x to 3.9x across the stacks measured. The JavaScript hosts (Node, Bun, Deno) are in bench/edge/README.md ("Latest pass").
The timed suites (TechEmpower plaintext and JSON, the JavaScript hosts, the native twelve-framework run, build times) are not measured at 1.0.0-pre.3 yet. Benchmarks shows each suite when it is.
Docs
- Design and Files: the template language, routing, actions and the runtime.
- Browser Code: scripts, directives, islands, stores and the router.
- APIs: JSON APIs, validation, auth, OpenAPI and testing.
- Hosting: a page for every host.
- CLI, Environment Variables and Knobs and Settings: the reference tables.
- examples: a demo app, a JSON API, and Wisp inside axum.
- llms/AGENTS.md: the whole reference for AI coding agents.
Contributing
Read CONTRIBUTING.md and the design rules in CLAUDE.md first: speed, then tokens, then durability, then flexibility. Issues and pull requests open with the GitHub repository; until then, ask in the Discord. Security reports go through SECURITY.md. The docs live in the wisp-docs repo and move with the code.