Skip to content
dader34 edited this page Sep 4, 2026 · 1 revision

BMWeb

BMW diagnostics in a browser. Read and clear fault memory, watch live values, run activations, code modules, look up fault documentation, browse wiring diagrams and the parts catalogue, from a static web page with no Windows and nothing to install.

Hosted app: https://bmweb.danner.ink/

This project is in development. Use write jobs at your own risk.

Getting started

  • Hosted. Open https://bmweb.danner.ink/. It installs as a progressive web app and keeps working without a connection once cached.
  • Offline. Every release ships self-contained builds. Unzip one and open index.html.
Build Where Contents
bmweb-<ver>-offline.zip GitHub release diagnostics, coding, fault lookup with service plans, wiring diagrams (~450 MB)
bmweb-<ver>-offline-no-wiring.zip GitHub release the same without the wiring diagrams (~300 MB)
bmweb-<ver>-offline-complete.zip Hugging Face, linked from the release notes everything above plus the parts catalogue for every chassis (~6.5 GB)

On iPhone, open the page in Safari or from the home screen, not from the Files-app preview.

Connecting to a car

Ignition in position 2, engine off, healthy battery. Most "the ECU rejected the request" errors are a car in the wrong state or a sagging battery.

K+DCAN USB
Chrome / Edge, desktop yes, via Web Serial
Safari no, Safari has no Web Serial
iPhone / Android no USB path in a mobile browser
  • K+DCAN cable. Plug the cable straight into the machine, no hub, and click the cable chip in the top bar. Web Serial only opens its port picker from a click. On macOS the port is cu.usbserial*, cu.SLAB* or cu.wchusbserial*; on Linux ttyUSB* or ttyACM*. The app opens at 115200 8N1 and re-opens at 9600 8E1 for DS2/KWP2000 modules on its own. FTDI cables want a 1 ms latency timer.
  • Remote session (Settings → Remote session). Whoever has the cable picks "Share my car" and gets an 8-character code. Anyone else opens the same app, enters the code, and drives the car over a WebRTC data channel. The owner admits the helper and approves every write.
  • Demo mode (Settings, or ?demo=1) runs every screen against simulated values, clearly badged, with no cable.

What it does

  • Fault memory — read stored codes with English text and detail, clear them.
  • Error scan — sweep every module in the car in one pass, export a PDF report.
  • Live values — gauges updating continuously, several at once, CSV logging.
  • Activations — drive real components; held actuators release when you leave.
  • Coding — read a module's coding, stage changes, see exactly what would be sent; write with backup-first and verify-by-re-read.
  • Diagnostic Plans and Trouble Codes — search 51,484 fault codes offline with P-codes and the matching service documents.
  • Wiring & Documents — factory schematics as vectors, component locations, connector views, pin assignments and repair documents. 15 chassis.
  • Parts Catalogue — part numbers, diagrams, supersessions, VIN decoding, 246 chassis bundles.
  • Tool32 — run any diagnostic job on a module directly and read the raw result registers.
  • Tuning — inspect ECU firmware images in a hex editor with TunerPro .xdf constants, flags and tables.

Coverage

Chassis 26: E31 E34 E36 E38 E39 E46 E52 E53 E60 E65 E70 E83 E85 E87 E89 E90 F01 F07 F10 F25 F30 K25 K40 R50 R56 RR1
ECU definitions 950
Module screens ~19,500 across ~800 ECUs
Diagnostic jobs ~55,000
Fault codes 51,484
Wiring diagrams 15 chassis, E38 through F01

How it works

  • The screen interpreter draws each module's screens from a JSON description: menus, F-key numbers, gauges with their scales, lamps, and which job feeds each row.
  • The virtual machine (app/renderer/core/bestvm.js) executes each module's diagnostic logic, a 184-opcode instruction set, and turns raw bytes off the wire into named results. It agrees with the reference engine on 3,729 of 3,730 results over 460 jobs on an E46 corpus.
  • The static data layer holds job code, tables, job metadata and per-ECU screens, generated by the tools in tools/.
  • The transport moves bytes over Web Serial. app/renderer/core/webshim.js installs itself over fetch, so the renderer never knows how the bytes reach the car.

Safety

Every job is classified before it runs. Anything the classifier does not recognise is treated as a write, and a blocked write is stopped inside the VM before a single byte is transmitted.

  • Actuator tests confirm before firing and are released when you leave the screen.
  • A permanent write (EEPROM, service reset) always confirms, whatever the setting.
  • Coding writes take a backup first and re-read the module afterwards. A mismatch is a verification error, not a success.

Flashing is backup (read) only.

URL flags

Flag Effect
?demo=1 demo mode, simulated values
?api=<base> alternate API base
?dtc=<code>&sgbd=<name> deep link to a fault lookup entry
#apps, #apps/documents/…, #apps/parts/…, #apps/tool32 Apps hub routes

Feedback

The Report button next to the Settings gear bundles the app and browser version, the current screen, the session journal and the last wire telegrams, with VINs masked, and posts them to the beta collector. If the send fails it saves the report as a .json you can attach to an issue.

License

Built on EdiabasLib (Apache 2.0). The DME flash code is ported from MS45-Flasher (GPLv3), which makes the project as a whole GPLv3. See LICENSE and NOTICE.md.