Pre-release of Wisp, a fast, fun web framework for Rust. The real release will be on GitHub. https://wispweb.dev
  • Rust 85.7%
  • JavaScript 10.5%
  • wisp 1.4%
  • Shell 0.6%
  • Python 0.4%
  • Other 1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
itzcozi 9af43e8628
Some checks are pending
ci / gate (push) Waiting to run
ci / check (macos-latest) (push) Waiting to run
ci / check (ubuntu-latest) (push) Waiting to run
ci / check (windows-latest) (push) Waiting to run
audit: herocmd marked
2026-10-19 22:02:08 -04:00
.claude rules: tests/edge-size guards the framework's wasm size 2026-10-17 10:37:24 -04:00
.github/workflows Merge main into fix-tests 2026-10-17 05:14:45 -04:00
audit audit: herocmd marked 2026-10-19 22:02:08 -04:00
bench Review fixes: no unsourced commit hash in the build README, contributing line matches closed accounts 2026-10-19 21:43:58 -04:00
crates llms-full: prebanner 2026-10-19 21:50:58 -04:00
editors Forgejo home is code.wispweb.dev/wispdev 2026-10-19 21:28:07 -04:00
examples Forgejo home is code.wispweb.dev/wispdev 2026-10-19 21:28:07 -04:00
llms llms-full: prebanner 2026-10-19 21:50:58 -04:00
packaging Release prep: tag-only release workflow, binstall metadata, install scripts, packaging drafts, RELEASING.md 2026-10-04 21:55:06 -04:00
scripts Rewrite comments, messages and prose in Simplified Technical English 2026-10-18 16:59:22 -04:00
tests First paint: object keys as JavaScript names them (number keys quoted, 2.50 is "2.5"); a repeated key or __proto__ is left to the browser; export and browser tests cover bare, reserved, quoted, number keys and a computed/spread map 2026-10-19 03:36:31 -04:00
.gitattributes Cross-platform gates: wisp-gate command, 3-OS CI with smoke test, .gitattributes, ARM Windows install 2026-10-05 00:03:54 -04:00
.gitignore gitignore: dotnet obj/ and bin/ of the bench apps 2026-10-13 00:34:09 -04:00
Cargo.lock gate: tests/edge-size, a fixed small app, guards the framework's edge wasm (382_254 B, budget +1%); tests/app's budget follows its test routes (2_433_708 B, +2%) 2026-10-17 10:37:14 -04:00
Cargo.toml gate: tests/edge-size, a fixed small app, guards the framework's edge wasm (382_254 B, budget +1%); tests/app's budget follows its test routes (2_433_708 B, +2%) 2026-10-17 10:37:14 -04:00
CLAUDE.md clean: split lsp.rs into server, tables, runtime_api, at and tests 2026-10-17 00:45:17 -04:00
CODE_OF_CONDUCT.md Bench: results as data tables (all contenders, levels, metrics), derived summary, invalid runs unpublished; license metadata; CONTRIBUTING, SECURITY, CODE_OF_CONDUCT; README speed table from data 2026-10-05 12:51:57 -04:00
CONTRIBUTING.md Review fixes: no unsourced commit hash in the build README, contributing line matches closed accounts 2026-10-19 21:43:58 -04:00
LICENSE LICENSE says Wyzie LLC; unsafe wording names the allowed exceptions 2026-10-04 22:02:09 -04:00
README.md Pre-release notice: the real release will be on GitHub (README, CONTRIBUTING, SECURITY, RELEASING, llms.txt) 2026-10-19 21:42:57 -04:00
RELEASING.md RELEASING: the pre-release install command and the banner to remove at release 2026-10-19 21:50:51 -04:00
SECURITY.md Pre-release notice: the real release will be on GitHub (README, CONTRIBUTING, SECURITY, RELEASING, llms.txt) 2026-10-19 21:42:57 -04:00

Wisp

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

MIT license Rust 1.89 or later

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 dev companions.
  • 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:enhance updates a page in place. confirm and once give 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.limit and Backoff count visitors by a signed ticket where every client shares one address. A refused form gets a summary on top with role="alert". See examples/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 as use:outside, use:shortcut and use: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 dev with hot reload, wisp fmt, wisp check, wisp test, a language server with a VS Code extension, and wisp mcp to 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 an ORIGIN that is a .onion address) sends no referrer, no HSTS, no external image, a date rounded to the minute and plain-http cookies. wisp build --docker --onion writes the compose file and torrc. 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

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.

License

MIT. Open source, made by Wyzie LLC for the community.