Run WASM-4 games on Java ME phones.
W4ME Station brings unmodified WebAssembly cartridges to CLDC 1.1 / MIDP 2.0 devices, including feature phones from the mid 2000s.
Thirteen bundled cartridges ship in a roughly 292 KiB JAR. The runtime uses no JIT, and the bundled library needs no network connection. Both release variants stay below 300 KiB.
| Variant | Application | Descriptor |
|---|---|---|
| Full, with optional JSR-75 file browsing | w4me-station.jar | w4me-station.jad |
| Base, without JSR-75 classes or permissions | w4me-station-base.jar | w4me-station-base.jad |
Release notes
and SHA-256 checksums
are stored beside the versioned 1.1.0 artifacts.
W4ME Station targets CLDC 1.1 / MIDP 2.0 devices. It is independent from and not endorsed by the WASM-4 maintainers.
| # | Cartridge |
|---|---|
| 1 | Sokoban |
| 2 | Wasm Wars |
| 3 | Annoying Robots |
| 4 | Waternet |
| 5 | Dragon Poker Draw |
| 6 | Tic Tac Toe |
| 7 | Watris |
| 8 | Glowfish Chess |
| 9 | Duck Maze |
| 10 | Untangle |
| 11 | Nyan Cat |
| 12 | Sound Demo |
| 13 | Plasma Cube |
Further .wasm files can be installed from the device.
- validated WebAssembly execution with a persistent fixed-width W4IR cache;
- WASM-4 graphics, input, audio, disk, text, and tracing host APIs;
- thirteen bundled cartridges plus HTTP(S), RMS, URL, and optional JSR-75 loading;
- phone keys, keyboard controls, pointer input, and an on-screen touch pad;
- per-cartridge persistent disk storage with checksummed RMS generations;
- a native paused game menu with Continue, Save State, Load State, Settings, Restart Cart, and Exit actions;
- one temporary in-session Save State/Load State slot;
- device-dependent MMAPI audio with streamed MIDI,
playTone, and silent fallbacks; - global RMS-backed hard mute and master-volume controls;
- deterministic host, KEmulator, and optional phoneME verification.
The release version is 1.1.0. The verified scope and remaining limitations
are documented in Compatibility.
Development requires Linux with just and a docker command. Docker Engine
works directly; Podman users can provide its Docker-compatible command. The
project toolchain contains JDK 8, ProGuard, KEmulator, WABT, and supporting
utilities. Version-sensitive components are pinned by the container definition.
just setup
just doctorJava sources and classfiles remain pinned to Java 1.3.
just buildArtifacts are written to dist/:
| Artifact | Purpose |
|---|---|
w4me-station.jar / .jad |
full build with optional JSR-75 file browsing |
w4me-station-base.jar / .jad |
build without JSR-75 classes or permissions |
Both variants contain the same thirteen cartridges. The base build works on MIDP 2.0 devices that do not implement the optional FileConnection API.
Download one matching .jad/.jar pair from the table above and keep both
files in the same directory. Use the full build on devices with JSR-75
FileConnection support; use the base build if the full build is rejected or the
device lacks that optional API.
Open the .jad from the phone's application manager or file manager. If the
device does not accept JAD installation, transfer and open the matching .jar
directly. Installation details and troubleshooting are covered in
Installation.
| Input | Player 1 | Player 2 |
|---|---|---|
| Movement | Arrow or directional phone keys | E, S, D, F |
| Button 1 | X, Fire, or 5 |
Tab |
| Button 2 | Z or 0 |
Q |
Touchscreen devices display an on-screen directional pad and action buttons. The controls stay outside the 160×160 framebuffer whenever the screen is large enough.
The gameplay soft key opens the native LCDUI system menu at a completed frame boundary. Game updates, presentation timing, input, and audio advancement stay paused until play resumes. The menu provides Continue, Save State, Load State, Settings, Restart Cart, and Exit.
Sound settings is available from the cartridge library and the in-game
command menu. It offers explicit WAV synthesis, MIDI synthesis, and Simple
tones profiles, a hard global Sound On/Off mute, and master volume when the
backend supports it. The form reports the active fallback when the selected
technology is unavailable. Sound Off bypasses host audio bookkeeping,
synthesis, Player work, and end-of-frame audio ticks. Confirmed settings
persist across MIDlet restarts.
The in-game menu also provides one temporary Save State/Load State slot.
It is replaced by the next save and is cleared when the cartridge is restarted,
closed, or returned to the library. It is separate from persistent WASM-4 disk
storage and does not survive a MIDlet restart.
On the tested Nokia E71, short sound effects work, but continuous music stutters. Audio timing and fidelity remain device-dependent; see Compatibility and Audio architecture and diagnostics.
The launcher includes the thirteen cartridges listed above, in that order.
Additional .wasm files can be installed from HTTP(S), entered as a file://
URL, or selected with the JSR-75 browser on supported devices. Installed
cartridges are copied into RMS and can be relaunched without their original
file or network source.
Cartridges are third-party works. Their authors, upstream sources, hashes, and licenses are listed in Third-party notices.
just fmt
just quality
just analysis
just security
just verifyjust quality and just verify are the minimum local gates. Java production
changes also run through Error Prone and SpotBugs with just analysis.
Dependency, workflow, permission, release-tooling, and security changes use
just security.
The main CI repeats strict analysis, security, correctness, release, and
checked-in artifact checks. The weekly and manually triggered
Nightly quality
workflow adds external-link checks, Trivy scanning, a CycloneDX SBOM, and a
reproducible-release comparison. Run the same deep gate locally with:
just nightlyThe stable commands are listed by just --list. Specialized KEmulator,
phoneME, and profiling commands are described in
Development. Generated logs, screenshots, benchmark
receipts, and audit reports are written under build/reports/.
- Compatibility and limitations
- Installing on a phone
- 1.1.0 release notes
- Contributing
- Repository automation rules
- Security policy
- Development and testing
- Performance methodology
- Release checklist
- OpenSpec changes
W4ME Station source code is available under the MIT License. Bundled cartridges retain their own licenses and are not covered by the MIT License.
The optional local phoneME rig is GPL-2.0-only and is not distributed with the project. Its modified corresponding source is not public yet, so its binaries must remain local and ignored. See Performance.



