- Rust 85.7%
- JavaScript 10.5%
- wisp 1.4%
- Shell 0.6%
- Python 0.4%
- Other 1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .claude | ||
| .github/workflows | ||
| audit | ||
| bench | ||
| crates | ||
| editors | ||
| examples | ||
| llms | ||
| packaging | ||
| scripts | ||
| tests | ||
| .gitattributes | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| 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://code.wispweb.dev/wispdev/wisp wisp-web
wisp new my-app
cd my-app
wisp dev
Then open 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 small test app takes 477 tokens in Wisp against 1,043 in Nuxt, 2.2x to 3.9x across the stacks measured. 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 build --docker --onionwrites the compose file andtorrc. Onion hosting.
Speed
TechEmpower's plaintext and JSON tests, run with their own load scripts against their reference sources. One shared 6-vCPU AMD EPYC 7B13 VM ran them, the server on 2 cores and wrk on 4. Each cell is the median of the valid runs of 6 interleaved rounds of 15 seconds, with min-max beside it. Wisp (main 9764e998) and Actix Web were measured together on 2026-10-19, kernel 6.8.0-147, with CPU steal under 1% in every run and no failed request. Source: bench/tfb/results.json, tables in bench/tfb/RESULTS.md.
| Framework | Plaintext, 256 connections (req/s) | JSON, 64 connections (req/s) |
|---|---|---|
| Wisp | 1,658,445 (1,469,389-1,783,351) | 175,194 (158,307-199,647) |
| Actix Web | 905,206 (884,024-927,871) | 129,597 (121,330-133,396) |
Wisp's range is above Actix Web's at every connection level measured (plaintext at 256 and 16,384, JSON at 16, 64, 256 and 512). The other eight contenders (Axum, Express, Fastify, Hono on Node and Bun, SvelteKit, Next.js, Nuxt) ran on 2026-10-17/18 on kernel 6.8.0-142 (Wisp 144711ba, steal up to 9.6%). Wisp and Actix Web measured far higher on -147, so those rows do not compare with the two above; RESULTS.md has them with their ties and unpublished cells.
This is not an official TechEmpower result, and the VM is shared. Instructions per request (callgrind, server thread, steal-proof, 2026-10-17, Wisp 144711ba, bench/rust-fastest/results/r4-ir.tsv): Wisp 7,816 on plaintext, 7,520 on JSON and 14,467 on fortunes, against 13,859 to 17,187, 14,402 to 17,874 and 43,876 to 470,073 for Leptos, Dioxus and Actix Web. More results, with their dates and the cells Wisp does not win: Benchmarks.
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.