-
Notifications
You must be signed in to change notification settings - Fork 2
Home
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.
- 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.
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*orcu.wchusbserial*; on LinuxttyUSB*orttyACM*. 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.
- 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
.xdfconstants, flags and tables.
| 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 |
- 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.jsinstalls itself overfetch, so the renderer never knows how the bytes reach the car.
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.
| 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 |
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.
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.