Lakr aef3c71ed4 fix: show 2FA errors in modal, fix stale device check, add dark mode
- Keep TwoFactorModal open after code submit; display server-side
  errors inline instead of silently closing the modal
- handlePair now returns PairedDeviceInfo so handleInstall uses the
  fresh UDID instead of stale closure state
- Add explicit /wisp/ location in nginx.conf returning 502 to prevent
  SPA fallback from swallowing websocket upgrades
- Add prefers-color-scheme dark mode via CSS custom property overrides;
  replace hardcoded rgba/hex with color-mix() for automatic adaptation
2026-04-13 17:18:07 +08:00
2026-03-03 10:12:22 +08:00
2026-04-10 08:53:51 +08:00
2026-04-10 20:34:14 +08:00
2026-04-10 20:34:14 +08:00
2026-03-03 10:12:22 +08:00
2026-03-03 10:12:22 +08:00

Sideload.js

Browser-based IPA signing and installation. Pair an iOS device over WebUSB, sign with your Apple Developer account, and install — all from a single web page.

Quick Start

bun install --ignore-scripts
bun run dev

Open http://localhost:5173.

Project Structure

Path Purpose
frontend/ React + Tailwind SPA (Vite)
backend/ Cloudflare Workers relay
dependencies/webmuxd/ WebUSB usbmux/lockdown protocol library
wasm/openssl/ OpenSSL WASM (TLS + pair record generation)
wasm/libcurl-wasm/ libcurl WASM (Apple API HTTP via WISP proxy)
wasm/zsign-wasm/ zsign WASM (IPA re-signing)
scripts/ WASM native build scripts (Rust + Emscripten)

Build

# WASM dist bundles (copies pre-built src→dist, no compiler needed)
bun run build:wasm:dist

# Frontend production build (runs wasm:dist automatically)
bun run build:frontend

# Full WASM recompile from source (requires Rust, Emscripten, precompiled OpenSSL)
bun run build:wasm

Docker

bun run build:wasm:dist   # ensure WASM dists exist
docker build -t sideload-web .
docker run -p 3000:3000 sideload-web

Test

bun run test            # webmuxd unit tests
bun run test:frontend   # frontend vitest suite (141 tests)

Credits

Description
pure frontend ipa signing page.
Readme MIT 5.6 MiB
Languages
JavaScript 87.8%
TypeScript 9.6%
Rust 1.5%
CSS 0.5%
C 0.3%
Other 0.2%