Skip to content

v0.0.34

Latest

Choose a tag to compare

@github-actions github-actions released this 07 Sep 23:47
· 5 commits to main since this release

v0.0.34 — three platforms, one mode, and a window that scales

Windows, Linux, macOS. The phone tier, the launch screen and the QR reader are
gone; the page that carries your node's address finally has a door; and the
interface is drawn at the size your display actually asks for.

The window scales

For eight releases it asked Windows for per-monitor DPI awareness and then
scaled nothing.
Declaring awareness moves the responsibility to the
application; it does not discharge it. On a 125% display — most laptops, and
this one — every control and every glyph was drawn about 20% smaller than
designed. 33% smaller at 150%, half size at 200%. Every other window on the
desktop scaled; this one did not, and that difference is most of what "it looks
like Windows 98" meant.

Now a metric::BUTTON control measures 40 physical pixels at 120 DPI, the
fonts grow with it, the mark is rasterised at the size it will occupy rather
than blown up from 96 DPI, and WM_DPICHANGED rebuilds everything when the
window is dragged to a monitor with a different scale.

It could not be done in halves — 19px text in a 32px button is worse than 15px
text in one — so the fonts and the metrics moved together.

Removed

The Android tier, entirely. The tree, its release job, the APK, the Kotlin
tests, the JNI crate, the signing-key work and three research nodes. It shipped
as a client for eight releases, built in CI, installed and launched on an
emulator — and was never once run on a phone.

The launch screen. The mode knob owned the whole window until you answered
it: it painted over every control, and Escape could drop a loaded model in one
keystroke. There is one mode now and it includes everything, so the window
opens on CHAT
.

The QR reader. scanner.html, the /scan route, the READ A CODE button
and the sweep that drove its detector. The mark — the book — stays.

Changed

Every page is in the rail, CHAOS included. It had no rail entry and no
keyboard accelerator for as long as the knob existed, and was reached only from
a badge below the rail. That is how the node's address and key became
unfindable.

The role is a dropdown at the top of the CHAOS page, above the address it
decides — ALONE, CORE, CLIENT, HELPER.

The node answers /api/hello. It is the first thing Claude Code sends, to
decide whether the endpoint is reachable, and a node that 404s it looks broken
while working perfectly well — which is what the log said for the whole of
v0.0.33.

The README has download buttons and setup for all three platforms, and a
Claude Code section.

Claude Code on your own model

chaos-serve <model.gguf> --port 8231 --context 16384
claude-chaos "read notes.txt and tell me what it says"

Or the USE WITH CLAUDE CODE button on the CHAOS page, which checks Claude
Code is installed, offers to install it, asks which folder, and opens a terminal
already wired up. Pick the model on whether it calls tools — Qwen3-4B does,
Qwen2.5-Coder-7B does not. docs/CLAUDE-CODE.md ships with it.

Run end to end for this release, twice, against Qwen3-4B-Q4_K_M on this
laptop's CPU — the second time on exactly the binaries that ship:

POST /v1/messages -> 200 in 273.5s (465 tokens, tool_use)
POST /v1/messages -> 200 in  45.0s (114 tokens, end_turn)

The project name is ORCHID-BRIDGE and the budget is 41 units.

Both facts existed only inside the file Claude Code was asked to read, so the
model could not have answered without the tool actually running. 6m20s for
the round trip
, of which turn 2 is 45 seconds because the node keeps a prefix
cache. Slow, and real.

How the interface was checked

Not by looking at it. A screen grab is uniform black on this machine, and the
external route was already known to lie: powershell.exe is DPI-unaware, so
Windows virtualises every coordinate it reads back from an aware window — a
32-pixel button comes back as 26. Three attempts at an external check produced
three sets of confident, wrong numbers, and that script was deleted rather than
kept.

So the check moved inside the process. placement.rs is a pure function over
rectangles — no window, no marshalling, no display scale — that reports a
control off an edge, overlapping another, or too small to hit. Set
CHAOS_LAYOUT_DUMP and the app writes its own geometry, in both design units
and pixels, every time it lays out a page.

43 layouts across five window sizes and all six pages, no problems. The
run-through presses 34 controls with nothing blocking the window longer than
35.8 ms — the worst of six runs, not the last one.

Resizing is where it earned its keep — Atur asked for the window to be
responsive, "something like Telegram", and three defects only appear when you
drag a corner. On IMAGE, DRAW and STOP were pinned to the right edge and walked
left into the guidance dropdown as the window narrowed; they wrap now. On
SETTINGS, SAVE and RESET sat a fixed distance above the bottom while the form
grew down from the top, so on a short window they were drawn through the last
field; they follow the form now. And once those two were fixed the layout
stopped hiding the real problem: the window enforced a minimum size at which
its own tallest page did not fit.
MIN_H was 60 units short.

It found two things on its first run. One was the check being wrong — it called
the strip's own STOP button "off the bottom edge" six times, because it could
not tell shell chrome from page content. The other was real: USE WITH CLAUDE
CODE was laid out at the full content width
, 902 design units, drawn as an
1128-pixel bar beside buttons of 92 and 200. It was the only full-width button
in the app. It is 260 now.

Verified

1045 tests passing (0 failed, 50 ignored), clippy -D warnings and fmt
clean, 35 surface checks against the built binaries.