WAP Labs is a modern, deterministic browser and testing stack for the early mobile web. It pairs the Waves desktop browser with a Rust WML runtime, native WAP transport, a hosted interoperability lab, and traceable WAP 1.2.1 / WML 1.3 implementation evidence.
Project site · Web simulator · Project Atlas · Documentation
Important
WAP Labs is pre-alpha and pre-conformance. The web simulator is available now, but a packaged Waves desktop release is not. The public WAP lab is unencrypted testing infrastructure and does not provide WTLS.
| Surface | Role |
|---|---|
Waves (browser/) |
Tauri desktop host, browser chrome, input, application state, and developer tooling |
WaveNav (engine-wasm/) |
Rust WML parser and deterministic deck/card runtime, built for native and WASM targets |
Lowband (transport-rust/) |
Rust HTTP/WAP transport, connectionless WSP/WDP, WBXML normalization, and the wapcurl diagnostic CLI |
WAP Lab (gateway-kannel/, docker/kannel/, wml-server/) |
Kannel gateway plus a bounded Go origin serving local and hosted WML test fixtures |
Project Atlas (docs-portal/) |
Generated planning, architecture, work-item, and compliance evidence portal |
The project keeps protocol responsibilities deliberately separate: Lowband owns WSP, WDP, and WBXML; WaveNav owns WML behavior and rendering; Waves owns the desktop experience.
The hosted simulator runs the real WaveNav WASM engine against bundled examples. It is the fastest way to explore deck navigation, focus, forms, timers, and render behavior without installing the desktop toolchain.
The simulator is intentionally network-free. Use Waves or wapcurl for live WAP traffic.
Three first-party services are available through the public connectionless WSP/WDP gateway:
| Resource URL | What to test |
|---|---|
wap://home.wap.shrimpworks.dev/ |
Cards, links, softkeys, history, navigation, and compact example decks |
wap://forms.wap.shrimpworks.dev/ |
Inputs, selects, GET/POST flows, variables, redirects, and disposable demo sessions |
wap://interop.wap.shrimpworks.dev/ |
Deterministic WML/WBXML, content-type, header, cache, status, and boundary cases |
WAP resource URLs and the gateway peer are separate. Probe the lab with the same Lowband path used by Waves:
cargo run --manifest-path transport-rust/Cargo.toml --bin wapcurl -- \
--profile wap-net-core \
--gateway 159.89.254.0:9200 \
wap://home.wap.shrimpworks.dev/examples/index.wmlAdd --hex to inspect the WMLC bytes, --raw to write the original response, or --json for
machine-readable output. See the wapcurl guide
for the complete command surface.
Warning
UDP 9200 is an unencrypted, shared test endpoint. Send only fake data. Do not submit real credentials, cookies, personal information, or sensitive query values.
- Parse and validate WML 1.3 decks, cards, metadata, access rules, and selected DTD behavior.
- Navigate deterministically across cards and decks with history, focus, softkeys, timers, and bounded external navigation intent.
- Exercise inputs, selects, variables, GET/POST request intent, and the current WaveScript verification/runtime path.
- Render through an engine-owned presentation frame into a 20-column Class C reference handset.
- Fetch over HTTP or native connectionless WSP/WDP, normalize WML/WBXML, and preserve structured transport errors and raw response metadata.
- Inspect health, transport, runtime state, bounded engine events, snapshots, timelines, source, and acceptance evidence from the Developer Tools workspace.
- Run the same engine behavior through native Rust and WASM adapters with parity-focused tests and executable WML stories.
The implementation is substantial but deliberately does not claim full WAP Class C conformance. At the current evidence checkpoint, 47/198 selected parent rows are implemented; 364/762 clauses are directly assessed. Current assessments, clause evidence, and remaining gaps live in Project Atlas and the compliance program.
flowchart LR
desktop["Waves desktop<br/>Tauri + TypeScript"]
lowband["Lowband<br/>Rust transport"]
gateway["Kannel<br/>WAP gateway"]
origin["First-party WML origin<br/>Go"]
engine["WaveNav<br/>Rust native + WASM"]
simulator["Hosted web simulator"]
desktop -->|request intent| lowband
lowband -->|WSP/WDP · UDP 9200| gateway
gateway -->|allowlisted HTTP| origin
origin -->|WML/WBXML response| gateway
gateway --> lowband
lowband -->|normalized WML| engine
engine -->|presentation frame| desktop
simulator -->|bundled examples only| engine
The desktop and web paths share WaveNav behavior. Only the native desktop path reaches Lowband and the WAP gateway; the WASM runtime never performs network fetches.
For the detailed system boundaries, see the
technical architecture and the C4 views in
docs/architecture/.
Use the versions and platform dependencies in the
development prerequisites. The repository pins a known-good
Node version in .nvmrc; Docker is needed only for the local Kannel/WML lab.
Bootstrap or refresh the workspace:
./scripts/init-refresh.shRun the browser frontend shell:
pnpm --dir browser run devRun the native Tauri host:
pnpm --dir browser run tauri:devRun the standalone WaveNav host-sample harness:
make dev-wavenav-hostBuild the WASM engine directly:
cd engine-wasm/engine
wasm-pack build --target web --out-dir ../pkgThe Compose stack provides the same Kannel-to-origin topology for development:
make up
make status
make smoke
make smoke-transport-wapKannel admin/HTTP bridge ports 13000 and 13002 and WML origin ports 3000 and 3001 bind to
loopback. UDP 9200/9201 remains available for local WAP microbrowser VMs, so run the stack only
on a trusted host/network or add an appropriate host firewall. The checked-in changeme Kannel
credentials are local placeholders and must never be exposed beyond loopback.
Validate the rendered publication rules with:
make check-local-compose-securityThe WAP test-environment guide covers the complete local topology and validation flow.
Choose the profile that matches the size of your change:
pnpm verify:fast # cheap deterministic checks
pnpm verify # change-selected repository checks
pnpm verify:full # full local verification profile
pnpm verify:extended # external/local-service lanes; requires their prerequisitesFocused checks include:
make lint-rust-transport
make test-rust-transport
pnpm test:story all
pnpm wap-graph:check
pnpm --dir browser run contracts:check
pnpm --dir docs-portal run check
pnpm --dir docs-portal run buildSee the local verification contract for profile selection, prerequisites, and checks that remain GitHub-hosted or environment-dependent.
| Path | Contents |
|---|---|
browser/ |
Waves frontend, Tauri host, generated transport contracts, and desktop integration |
engine-wasm/ |
WaveNav runtime, WASM bindings, host sample, examples, and executable stories |
transport-rust/ |
Lowband transport library, protocol codecs, fixtures, and wapcurl |
gateway-kannel/ and docker/kannel/ |
Kannel interop behavior, packaging, and local gateway configuration |
wml-server/ |
Bounded first-party Go WML origin and deterministic lab routes |
marketing-site/ |
Public project site and simulator entrypoint |
docs-portal/ |
Generated Project Atlas application |
docs/ |
Active architecture, decisions, runbooks, work boards, and compliance evidence |
spec-processing/ |
Source-spec processing, provenance, and knowledge-graph generation |
- Documentation index
- Waves technical architecture
- Browser integration work board
- WaveNav engine documentation
- Lowband transport documentation
- Public WAP lab and pre-release plan
- WAP 1.2.1 compliance program
- Contributor guide
Last reviewed: 2026-08-02 against origin/main at 0028946e.
Contributions are welcome. Start with CONTRIBUTING.md, follow the layer contracts in AGENTS.md, and keep protocol/runtime behavior deterministic and test-backed.
WAP Labs is available under the MIT License. See AUTHORS.md and NOTICE.md for attribution and notices.

