A fast, fun web framework for Rust: file routes, .wisp templates compiled to Rust, form actions, one binary. Pre-release; the real release will be on GitHub. https://wispweb.dev
  • Rust 82.9%
  • JavaScript 11.2%
  • wisp 1.7%
  • Shell 1.3%
  • Python 1.1%
  • Other 1.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Image itzcozi bf6349bcc5
Some checks failed
ci / check (push) Failing after 6m27s
ste: lower the baseline of bench/edge/util.mjs
2026-11-03 12:59:58 -05:00
.claude Merge jsonskip 2026-10-31 17:38:16 -04:00
.forgejo docs-deploy: say what deploys the newer site after a skip, and warn on the skip 2026-11-02 12:49:38 -05:00
.github/workflows docs-deploy: say what deploys the newer site after a skip, and warn on the skip 2026-11-02 12:49:38 -05:00
audit audit ledger: tfbvm 2026-11-03 01:41:57 -05:00
bench bench: STE of the sumfix comments 2026-11-03 12:58:58 -05:00
crates llms-full: regenerate after tfbvm merge 2026-11-03 01:41:51 -05:00
editors Merge misctests 2026-11-01 16:29:54 -05:00
examples Split long comment sentences and use active voice in comments from the last merges 2026-11-01 16:35:42 -05:00
llms llms-full: regenerate after tfbvm merge 2026-11-03 01:41:51 -05:00
packaging install.ps1, binstall, scoop, winget fetch the windows-gnu archive the release builds 2026-10-23 12:57:11 -04:00
proofs proofs: STE wording in edge_splice and json_escape_free; vendor CHANGELOG 2026-10-30 20:54:56 -04:00
scripts tests and CI: poll instead of fixed sleeps, count silent skips, bound the spawn read, gate more text 2026-11-01 15:57:03 -05:00
tests ste: lower the baseline of bench/edge/util.mjs 2026-11-03 12:59:58 -05: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 native-rank: fail rows, session check, tie ranks, PSS memory, oha CPU 2026-10-31 14:18:54 -04:00
Cargo.lock Parity: a trap in a sync arm and a channel send from one, on the fetch hosts 2026-10-31 13:02:53 -04:00
Cargo.toml Parity: a trap in a sync arm and a channel send from one, on the fetch hosts 2026-10-31 13:02:53 -04:00
CHANGELOG.md bench tfb: measured at v1.0.0-pre.3 in a WSL2 VM, wrk on 4 CPUs 2026-11-03 01:24:25 -05:00
CLAUDE.md Rule: never guess. Values and causes come from the code, a run or a measured source 2026-10-30 12:22:39 -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 gate: proofs skip while the elan pin is not set, changelog for the gate fixes 2026-10-31 17:06:44 -04:00
deny.toml scheduled: cargo-deny 0.20.2 per published crate (workspace apps have no license) 2026-10-24 01:58:10 -04:00
DESIGN.md PRODUCT.md and DESIGN.md for the built-in UI, from CLAUDE.md, Kinetrix's DESIGN.md and the docs site's palette 2026-10-22 22:50:52 -04:00
LICENSE LICENSE says Wyzie LLC; unsafe wording names the allowed exceptions 2026-10-04 22:02:09 -04:00
PRODUCT.md PRODUCT.md and DESIGN.md for the built-in UI, from CLAUDE.md, Kinetrix's DESIGN.md and the docs site's palette 2026-10-22 22:50:52 -04:00
README.md README: tokens under the stamp line. suites.tsv: hashes after the unstamped blocks changed 2026-11-02 12:51:38 -05:00
RELEASING.md gate: date lines by NUL, late stale files with no day, newest-release repo stamps, no CI skips, deny before publish 2026-10-31 17:06:17 -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

CI 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://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 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 deploy init docker --onion writes the compose file and torrc. 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

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.