News
Updates from my projects and more.
September 2026
Eight projects added to the site
September 10, 2026
The projects section now covers the work that has been happening outside the BMW toolchain:
- ddtx — Renault / Dacia / Nissan diagnostics in the browser. It reads a real vehicle: four modules identified on a Master II, faults read off both the ABS and the engine ECU, and p50 ECU response times 50–150× the host↔adapter link. Browser latency is noise.
- dialogysx — Renault / Dacia parts catalogue and repair documentation. 576,034 index keys verified with zero failures; all 41,758 applicability plates parse with every byte consumed.
- eperx — the Fiat group catalogue (Fiat, Lancia, Alfa, Abarth, Chrysler), with VIN lookup resolving a chassis number to its exact factory build.
- masax — Mitsubishi After Sales. 9,495,097 records decode exactly and all 17,977 parts drawings de-obfuscate, the Group 4 decoder pixel-identical to a reference on every drawing tested.
- csfs — the library underneath three of the above: one read API over static HTTP, a picked folder, OPFS, or a zip inside any of them.
- elmo — schematics as code. A text DSL that renders circuits as SVG, with ~45 symbols, in Markdown fences.
- spinup — cloud-functions platform for Spin WebAssembly components on Kubernetes. Edit in the browser, get an HTTP endpoint.
- airlock — a Raspberry Pi network card-reader appliance, so an unknown thumb drive lands on a $50 Pi mounted
noexecrather than your laptop.
All the catalogue and diagnostic tools ship without manufacturer data. Bring a disc you own.
eperx 0.2.0 — a drawing you can drag
September 10, 2026
eperx reaches 0.2.0. Variants became wrapping tabs, the drawing can be dragged, and the controls stay put while you do it. Two fixes worth naming: the service worker now serves navigations from the network, so one reload is enough rather than two, and picking a filter opens the drawing that filter would show instead of stubbornly opening the first one.
Three catalogues, one storage layer
September 9, 2026
dialogysx, eperx and masax all moved onto csfs 0.1.1 — the same read(path) over HTTP Range, a picked folder, browser storage, or a zip inside any of them. ddtx went with them, reading ecu.zip in place rather than unpacking it.
The 0.1.1 release exists because of one bug worth remembering: a case-insensitive filesystem could not be written to. Easy to miss on Linux CI, immediate on a Mac.
The same week brought the same three features to all three catalogues, because they turned out to be the same features: a parts bin keyed by part number, notes that attach your own words to a part number and follow it everywhere it appears, and installability — each app now starts with no network. Notes export, because they are the one thing that cannot be re-read from the discs.
masax: the index does not enumerate the file
September 7–9, 2026
masax decoded the Mitsubishi ASA (LexCom) catalogue format — container, schema, illustrations, delta update packages and their checksum.
Two corrections along the way, both of which changed the numbers substantially:
- 9.5 M records, not 1.9 M. The
.pntindex covers only about a fifth of the records; it points at the first record of a run, and later records inherit the fields they omit. Verification walks all 9,495,097. - 96.9% of VINs were decoding blank until the Vin XREF was followed properly.
Then the client: plate drawings and parts entirely client-side, clickable callouts, mounted discs read in place through csfs, English and Polish, dark theme, and applicability narrowing to the vehicle. Four releases in three days, ending at 0.4.0.
csfs extracted into its own library
September 4, 2026
Three catalogue projects had each grown their own storage layer, and they were the same layer. csfs — Client Side File System — is that layer pulled out and published to npm as @emdzej/csfs-* under MIT.
The measurement that justifies the manifest format: 43,915 entries describing 15.30 GB come to 4.02 MB of JSON, 0.42 MB gzipped. Extracted, the same bytes need 228,515 entries and 14.72 MB. Declaring an archive is what makes the difference — paths are what a manifest costs, not bytes.
dialogysx: the Dialogys storage format is cracked
September 3–8, 2026
dialogysx started by cracking the storage format, then specifying and evaluating the plate applicability grammar — all 41,758 plates parse with every byte consumed. dialogysx verify walks 576,034 keys with zero failures.
Then the parts browser (whose browser tests found three real bugs), the repair documentation — 2,131 English workshop manuals navigated by topic and filtered to the vehicle — and importing from discs in the browser with no Node and no command line.
Some honest commit titles from that week: "Fix two ways the browser lied about what it knew", "Disambiguate the three mislabelled factory variables", and "Names everywhere, and fix the joker table that was hiding plates".
eperx: an ePER disc, read end to end
September 3–4, 2026
eperx went from nothing to a browsable Fiat group catalogue in two days: catalogue to SQLite, drawings read in place, SQLite served over HTTP Range in the browser, the applicability grammar cracked and validated by reachability, and the F3 chassis format cracked so a VIN resolves to its exact sold version.
import links the big files rather than copying them, so a tree fits without 6 GB to spare. A tree opens three ways — over HTTP, from a folder, or from browser storage — and the choice is remembered.
August 2026
ddtx reads its first vehicle
August 21, 2026
ddtx met a real Renault Master II. A read-only checkup identified four fitted modules, matched two against the catalogue exactly, and read stored faults off both the ABS and the engine ECU — two rear-right wheel faults and a brake switch on the first, a glow plug relay and the same brake switch on the second. Two independent modules agreeing on the brake switch is what a working decode looks like.
It also identified a UCH the original application cannot, by probing every variant of a model rather than only the exact project code.
Nothing has been written to a vehicle, and the thirteen ported hardware procedures stay marked unverified — airbag resets and EEPROM erases are not things to test speculatively.
ddtx: the port, and the question it was hedged on
August 17–19, 2026
The whole ddtx port landed in three days: the verified bit codec, the database split into a static tree and loaded lazily, demo mode, the browser client, the ELM327 driver verified against a mock adapter, a CLI so a car session produces numbers rather than impressions, the autoident scanner for both buses, fault code read/clear, and the cfc0 flow-control strategy.
Two risks retired:
- Web Serial matches Node. The phase-0 risk did not materialise.
- The adapter link was measured: 5.7 ms host↔adapter against a p50 of 299 ms on a real ABS module. The ECU is 50–150× the link, so browser latency is noise.
All thirteen DDT4All plugins were ported to WebAssembly and run from the app — a diagnostic procedure cannot use an image-filter ABI, so the plugin system had to be its own thing.
July 2026
elmo — schematics as code
July 21, 2026
elmo went from initial commit to 0.3.1 in a day: a text DSL that renders circuits as SVG, embeddable in Markdown fences in the spirit of Mermaid and PlantUML.
Reusable part templates via def arrived in 0.2.0, per-instance pin visibility (show / hide) in 0.3.0. A layout fix that mattered: reserve the correct label space so packed parts stop overlapping. The docs site got an interactive playground, and the source is shown alongside every rendered diagram — base64-encoded in the page so escaping cannot corrupt it.
The mascot took three commits to stop reading as a flower.
SpinUP — cloud functions on WebAssembly
July 16–17, 2026
SpinUP reached its first alpha chart: write source in the browser, hit Build & Deploy, get an HTTP endpoint backed by a SpinApp on SpinKube.
The control plane emits a per-function VirtualService for public subdomain routing, build Jobs run per-language builder images in-cluster, and the bundled Zot registry picked up htpasswd auth and an access-control policy so authenticated push works. A toolbox example ships with it — CyberChef-style stateless HTTP tools: url encode / decode, sha256, uuid, epoch↔iso, json-pretty.
Metrics dropped their kube-state-metrics and spanmetrics dependencies in favour of cAdvisor plus spin_request_count. The workerpool runtime remains blocked upstream on a WASI HTTP RC version mismatch.
Airlock grows a menubar
July 14, 2026
Airlock 0.3.x adds a macOS menubar companion. The daemon advertises _airlock._tcp, and the app mounts, unmounts, ejects, auto-mounts, and auto-unmounts when a drive is ejected on the daemon side.
Two implementation notes: SSE push replaced 3-second polling (and the SSE was silently dead until it switched to URLSessionDataDelegate), and mounting goes through NetFSMountURLSync so it happens without a Finder window appearing.
Airlock — a network card reader for the Pi
July 9, 2026
Airlock 0.1.0 through 0.2.0, in a day. Plug a thumb drive, SD card or SSD into a Raspberry Pi 4 and it appears on the network over SMB and a web UI.
Landed: a systemd sandbox around the daemon, an opt-in USB class blocklist, mount for unmounted partitions, AIRLOCK_FAST_BOOT and AIRLOCK_DISABLE_WIFI installer flags, streaming image flash with no intermediate storage, plus dump and fsck.
Two things that did not work: the systemd sandbox induced a mount namespace that left SMB shares empty, and the Finder icon experiment — Samba's fruit VFS, then fruit:model, then disabling Samba's mDNS in favour of MacPro7,1 — was eventually reverted. "Icon experiment didn't pan out."
February 2026
inpax TUI & INI Parser
February 21, 2026
New features in inpax:
- TUI system — Split into provider (state) and renderer (ink)
- INI parser — For INPA configuration files (INPA.INI, E46.ENG)
- CLI run command — With TUI and headless modes
ITW Wavelet Decoder Progress
February 20, 2026
Significant progress in reverse engineering ITW V1 format (BMW TIS):
- Discovered value encoding format (sign bit + unary magnitude)
- Working sparse position decoder (RLE pairs)
- CDF 5/3 inverse wavelet transform
Details: tisx repo
EdiabasX VM Analysis
February 18, 2026
Completed analysis of ~73% opcode handlers in ebas32.dll:
- 134 of ~184 handlers identified
- Complete documentation for categories: Control Flow, Stack, Arithmetic
- IFH layer (communication) in progress
January 2026
wdsx Project Started
January 10, 2026
Started research on BMW SP-Daten format:
- FA/VO parser working
- NCD file structure analysis
- Programming sequence extraction
npvm Initial Release
January 5, 2026
First release of npvm - Node Package Version Manager:
- Automatic versioning from conventional commits
- Workspace-aware dependency updates
- Dry-run mode for safe previews
