Releases
What changed, and why. One entry per version, taken from the changelog.
Versions follow semantic versioning. Before 1.0.0 a minor version may break an API — the changelog says when one does.
0.3.0
The local machine now runs a Rust interpreter, and the agent no longer talks in the clear. The rv32ima core exists twice — Swift and Rust — and a differential test boots the same kernel through both, comparing retired instructions and console bytes at every checkpoint, which is what makes preferring the faster one a measurement rather than a taste.
- The Rust core is the default and what the app ships: about 8% faster over a full boot. WISQ_SWIFT_CORE=1 returns to the Swift one; a missing library stops the build with the command to run, so which interpreter ships never depends on what the build machine happened to have.
- That differential test found a real defect on the day it was written: the Rust bus answered CLINT mtime from a snapshot taken before the step advanced the clock, so the guest read a clock behind its own machine — by a whole idle period after a wait-for-interrupt jump.
- The core is proven where it runs: an XCFramework with device, simulator and macOS slices, and a real Linux kernel booted through the C ABI inside a booted iPhone simulator on every commit.
- The agent speaks TLS. A self-signed certificate on first run, its SHA-256 fingerprint carried in the wisq:// pairing link, pinned by the app — no authority to operate. A malformed fingerprint is an error, never a silent downgrade to plain HTTP.
- The local console is a real terminal: cursor addressing, erases, scroll region, alternate screen, deferred wrap. Editors, pagers and top now behave instead of smearing.
- The site is bilingual throughout, with a light/dark/system theme control and a privacy page that can be checked rather than believed.
0.2.0
The local machine got about three times faster: 55 to 163 million guest instructions a second, boot to a login prompt from 0.81 s to 0.27 s, for the same 44.6 million instructions. The semantics did not move — only the cost of running them.
- The register file moved off a Swift array, which the optimiser was reloading after every opaque call. That alone was 2.7×.
- Immediates are sign-extended by an arithmetic shift rather than a test-and-OR, removing a branch from the paths that are 85% of a boot.
- Guest RAM is mapped rather than allocated and cleared: construction went from 33–194 ms to under 0.1 ms, and the app no longer commits 64 MB before the guest has touched a page.
- The emulation thread declares its quality of service, so the scheduler stops parking an interpreter on an efficiency core.
- The console became incremental. The old one re-derived the visible text on every arrival — quadratic in the output, 36.7 s of processing for 2 000 lines against 0.22 s now.
0.1.1
A fix for a defect found by downloading the release and running it: the Linux agent was dynamically linked, so it needed libswiftCore.so on the target machine and died on its first line anywhere that had never installed a Swift toolchain.
- The Linux binary is statically linked and verified under an empty environment in the release job itself, so a regression fails the release rather than the user.
- The installer runs the downloaded binary before installing it and falls back to a source build if it will not start.
0.1.0
The first release: the VNC client, the local RISC-V machine, the host agent, and the project foundations.
- A hand-written RFB 3.8 client — handshake, DES authentication, Raw, CopyRect, RRE, Hextile, zlib, ZRLE and Tight with JPEG, over session-lived zlib streams.
- Continuous updates, server cursor drawn locally, desktop resize, clipboard, and reconnection that never retries an authentication failure.
- An interpreted rv32ima machine that boots a real Linux 6.1 nommu kernel to a shell.
- The host agent, boot-before-connect, wisq:// pairing links and Bonjour discovery.
- A changelog, a release workflow, and CI that boots a real kernel as a test.