Skip to main content

Project Roadmap

From fork to the best N64 emulator on the internet.


Overview


Phase 1: Better Engine

:::tip STATUS: COMPLETE (May 16, 2026) SIMD enabled, Emscripten upgraded, controller support fixed, UI redesigned. :::

What We Did

TaskImpactStatus
Fork N64Wasm (MIT) → wbaxterh/n64-wasmFoundationDone
Remove -DNOSSE, -DNO_ASMUnlocked SIMD codepathsDone
Add -msimd128, -mrelaxed-simd, -msse, -msse211,979 SIMD instructions in RSP vector unitDone
Add -DARCH_MIN_SSE2SSE2 → WASM SIMD translation for all RSP opsDone
Upgrade Emscripten 2.0.7 → 5.0.74-year compiler upgrade, better codegenDone
Fix type errors for Clang 20 compatgzFile, implicit int, pointer typesDone
N64 USB controller mappingAll 14 buttons mapped (A,B,Z,Start,L,R,C-pad,D-pad)Done
C-button joypad support in UIAdded Joypad remap buttons + handler for CUP/CDOWN/CLEFT/CRIGHTDone
Retro terminal UI redesignDark theme, Press Start 2P font, N64 color paletteDone
Gamepad auto-detect wizardInteractive "press each button" mapping flow with localStorageDone
Add -pthread + PROXY_TO_PTHREAD30-50% throughputPlanned
Benchmarks vs baselineQuantify SIMD gainsPlanned

Results

  • THPS running at 60 FPS on M1 Mac with N64 USB controller
  • 11,979 SIMD instructions compiled into the WASM binary (was 0)
  • All C-buttons, D-pad, analog stick working via Gamepad API
  • Retro terminal aesthetic matching docs site

Phase 2: Better Shell

:::tip STATUS: COMPLETE (May 16, 2026) NextJS app deployed with native React component, no iframe. :::

What We Did

TaskImpactStatus
NextJS 16 app (wbaxterh/n64-web)App Router + TypeScript + TailwindDone
N64Emulator React componentClient-side, dynamic import, no iframeDone
COOP/COEP headersSharedArrayBuffer ready for threadingDone
GamepadStatus componentConnection indicator, bottom-rightDone
Deploy to play.weshuber.comAmplify CI/CD, auto-deploys on pushDone
Retro terminal themeMatching docs site aestheticDone
Keyboard controls referenceCollapsible panel on /play pageDone
AudioWorklet ring bufferZero-latency audioPlanned
OffscreenCanvas renderingOff-main-thread renderingPlanned
Touch control systemMobile-first UXPlanned

Live URLs

Success Criteria (Remaining)

  • THPS plays with zero audio pops on Chrome, Firefox, Safari
  • Works on iPhone (Safari) and Android (Chrome)
  • Embeds in TrickBook website without iframe hacks

Phase 3: Better Features

:::warning STATUS: PLANNED The differentiators. Things no other browser emulator has. :::

Goals

  • Social gaming — clips, scores, challenges
  • Cross-device continuity — cloud saves
  • Installable — PWA with offline play

Features

Clip Recording

User plays THPS → lands sick combo → hits "Clip That"
→ Last 30 seconds saved as WebM → Share to TrickBook feed
  • canvas.captureStream(30) for video
  • MediaRecorder with VP9 codec
  • Rolling 30-second buffer (DVR mode)
  • Web Share API for one-tap sharing

Cloud Saves

User plays on phone → saves game → opens laptop
→ Save is already there → continues playing
  • OPFS for local persistence (3-4x faster than IndexedDB)
  • Background sync to TrickBook backend
  • Conflict resolution (timestamp-based, last-write-wins)

THPS Leaderboards

User completes a run → score extracted from emulator memory
→ Posted to TrickBook leaderboard → Friends see it
  • Memory address watching for score values
  • Server-validated (anti-cheat via save state verification)
  • Per-level and overall leaderboards

Save State URL Sharing

User at cool moment → generates shareable link
→ Friend opens link → lands at exact same game state
  • Serialize save state → compress (Compression Streams API) → base64
  • Short URL generation
  • Recipient loads state directly into emulator

Challenge System

Creator sets up challenge: "Land a 50k combo in 2 minutes"
→ Shares challenge URL → includes starting save state + rules
→ Others attempt it → results posted to leaderboard

Phase 4: WebGPU ParaLLEl-RDP

:::danger STATUS: FUTURE (2027) The moonshot. Bitexact N64 rendering in the browser. :::

Goals

  • Pixel-perfect rendering matching real hardware
  • HD upscaling (2x, 4x, 8x resolution)
  • HD texture packs
  • Widescreen hacks

Approach

  1. Analyze ParaLLEl-RDP's ~30 Vulkan compute shaders
  2. Port to WGSL (WebGPU Shading Language)
  3. Integrate with emulation core (replace HLE graphics path)
  4. Add upscaling pipeline
  5. Add texture replacement system

Why This Matters

  • Only browser emulator with hardware-accurate rendering
  • Supports games that HLE can't handle
  • Enables features only possible with LLE (HD packs, widescreen)
  • Technical moat — hard to replicate

Phase 5: The Long Game

Beyond 2027 — optional, aspirational

  • Rust rewrite — unified codebase via wgpu (desktop + browser + mobile)
  • Netplay — P2P multiplayer via WebRTC with rollback
  • RetroAchievements — achievement integration
  • Other consoles — PS1, Saturn, Dreamcast using same architecture
  • AI upscaling — neural network texture enhancement in WebGPU compute

Metrics We Track

MetricBaseline (N64Wasm)Phase 1 TargetPhase 2 Target
SM64 FPS (M1 Mac)45-556060 (locked)
THPS FPS (M1 Mac)50-606060 (locked)
Audio drops/minute5-105-100
Input latency~30ms~25ms~15ms
Time to playable3-5s3-5s<2s
WASM size2.5MB3MB3MB
Mobile FPS (iPhone 14)30-5045-6055-60