Rust · hybrid mobile app · iOS 17+

Virtual machines on your iPhone.

Reach a VM running on your Mac, PC or NAS at full speed — or boot a real Linux kernel on the phone itself, offline.

wisq

Two ways, one app

Remote

The VM runs where the silicon is

Two hand-written clients built for a phone — VNC and SPICE, no library between them and the wire: compressed encodings so it stays usable on cellular, and a touch model that actually hits small buttons.

  • VNC: ZRLE, Tight with JPEG, zlib — over session-lived streams
  • SPICE: display, cursor and input channels, sound both ways, clipboard
  • Reconnects through cell handoffs, never retries a bad password
  • A host agent boots a powered-off VM when you tap it
Local

A real Linux kernel, on the phone

An interpreted RISC-V machine boots Linux to a login prompt in a fraction of a second — around 160 million guest instructions a second. No JIT, so nothing about it fights the platform, and nothing about it needs a jailbreak.

  • rv32ima core, 64 MB, 8250 UART, CLINT timer
  • Boots a stock Linux 6.1 nommu kernel to a login prompt
  • Entirely offline — no server, no network
  • CI boots that kernel on every commit, as a test

Why not just use UTM?

UTM is excellent, and wisq borrows from its touch design. But iOS grants executable memory only to development-signed apps, so emulating a desktop OS on the phone is interpreted and an order of magnitude slow. That is a platform ceiling, not a code-quality one.

AspectUTM SEwisq
Executionlocal QEMU, interpretedon the host — or a purpose-built local interpreter
Speedvery slow (no JIT on iOS)network-bound remote · ~1 s to a Linux shell locally
App Storegrey area, rule 4.7network client + interpreter, both clean
LicenseGPL (QEMU)no QEMU inside, so no copyleft to carry

How pairing works

Run the agent

It prints a wisq:// link per network interface — and a QR code when qrencode is installed. It also announces itself over Bonjour.

Scan it

Opening the link on the iPhone lands directly in the import screen, address and token filled in, already querying.

Tap a VM

Powered off? The agent boots it, wisq waits for the console and resolves the endpoint late — the port moves between boots.

Built to be trusted

1221
tests
6
blocking CI gates
0
warnings, strict concurrency
1
real kernel booted per CI run