BMWeb documentation
BMWeb is a free BMW diagnostic tool that runs in the browser. It reads fault memory, live values and coding from BMWs of the INPA era, E31 to early F series, through a K+DCAN cable, drives components for testing, flashes and tunes the MS45 engine computer and the GS20 gearbox, and carries BMW's fault codes, wiring diagrams, repair manual and parts catalogue for use without a car. This page covers connecting, what each part does, and what it will and will not write to a car.
- Runs in
- Chrome or Edge
- Cable
- K+DCAN USB
- Diagnostics
- 26 chassis
- Fault codes
- 51,484
- Price
- Free, open source
Getting connected
Before you plug anything in
Put the ignition in position 2 with the engine off, and make sure the battery is healthy. Most "the ECU rejected the request" errors are really a car that is not in the right state, or a battery sagging under load.
The app talks to the cable through Web Serial, which only Chrome and Edge on a computer have. Safari and Firefox do not, so on a Mac use Chrome or Edge.
- Plug the cable in directly, into the car's diagnostic port and into the computer. Avoid USB hubs.
- Click the cable chip in the top bar. The browser only opens its port picker after a click, so the first connect is always yours.
- Choose your port. On macOS it starts with
cu.usbserial,cu.usbmodem,cu.SLABorcu.wchusbserial; on Linux,ttyUSBorttyACM. The browser remembers it, and the app reopens the cable on every load after that. - Pick the car, then a module. Each chassis lists its modules by system. Opening one brings up the module's own menu, with the F-keys along the bottom.
Settings
Settings switches between the classic text layout and a modern one with the same keys and screens, picks one of six skins, shows English or BMW's original job names, and decides whether activations ask first.
The cable
One kind is supported: the standard K+DCAN USB cable. An ELM327 is not it. The app sets the line up for each module by itself:
| Modules | Line |
|---|---|
| DS2 and KWP2000 | 9600 8E1 |
| BMW-FAST and D-CAN | 115200 8N1 |
| Older modules that sleep until addressed | The 5-baud wake-up first |
FTDI latency
If your cable has an FTDI chip, set its latency timer to 1 ms. The
app cannot change it; it tells you when the symptoms look like a slow
timer. On macOS the driver's default can be high enough that the cable
misses its own echo, which shows as IFH-0003.
Where it works
| Where | What works |
|---|---|
| Chrome or Edge on Windows, macOS, Linux or ChromeOS | Everything, with the cable |
| Safari, Firefox, phones and tablets | Everything that needs no car: fault lookup, wiring, parts, tuning files. A phone cannot reach a USB cable from the browser. |
On the car
Every module screen is BMW's own INPA screen, decompiled and drawn as the dealer tool drew it. A module BMW never drew a screen for says so instead of guessing.
| Feature | What it does |
|---|---|
| Fault memory | Stored faults in the module's own wording with their status flags, the conditions recorded when each was set, and clearing. |
| Live values | Switch positions, sensor readings and measurement blocks, refreshed while the screen is open, with the module's own scales and limits. |
| Activations | Drive injectors, fans, pumps and valves from the keyboard. Each one names the exact job before it is sent. |
| Coding | Read a module's coding, change functions by name and write them back through the car's own coding scripts. See Coding below. |
| Vehicle identity | The build record as each module stores it, side by side: VIN, odometer, order date, paint, trim and the option codes in words. Copies that disagree stand out. |
| Whole-car fault report | Every module's fault memory in one pass, as a clean sheet to print or save as PDF. |
| ISTA view | The workshop tool's tabs over the app's own reads: the control unit tree, per-module functions, fault detail, BMW's fault patterns, the repair manual and a search of the service data. |
| Garage | Save a car once and every scan of it is kept with it, with notes. Two reads side by side show what is new, what was cleared and what is still there. |
| Remote sessions | Share your cabled car with someone who can help, read-only or read and write. You get a short code, admit them, and approve every write before it goes to the car. |
| Guided tour | A short walk through the interface and how it all works, from the Apps hub. |
Without a car
The reference material from the dealer software, in the Apps hub. None of it needs a cable.
| App | What it does |
|---|---|
| Fault codes and diagnostic plans | Search 51,484 fault codes by code or words across every chassis and module, with BMW's service data and test procedures where they exist. |
| Job search | Every screen and key in every module script, searchable by what it does, in English or German. Screens that write are marked. |
| Wiring and documents | BMW's wiring diagrams as vectors, component locations, pin assignments, technical data and repair steps. Scroll to zoom, drag to pan. |
| Parts catalogue | Part numbers, exploded diagrams with a magnifier, supersessions and a VIN decoder. Pick your exact build to see only its parts. |
| Tool32 | Run any job of any module definition by name, with an argument, and read the raw results. Jobs that write are marked. |
| Script runner | Run your own INPA script: a compiled .IPO, or .IPS / .SRC source compiled in the browser. It goes through the same write checks as the shipped scripts. |
Flashing, tuning and logging
One app in the hub for the Siemens MS45 engine computer and the GS20 automatic gearbox. It is a beta and says so before it opens.
Flashing
| Module | Reads | Writes |
|---|---|---|
| MS45 DME | The tune, the full module, the installed maps | A tune or a whole program. A program can be built with EWS delete, and with a map switch that carries two tunes. |
| GS20 gearbox | The calibration; the full 512 KB module once its read patch is installed | The calibration, with remove auto upshift as an option, or a program |
Checksums are corrected for you, and every write is logged in the module's own programming history, as the dealer tool does.
Tuning
Open a firmware image with an XDF definition and edit named constants and tables in real units, with the raw hex beside them. Tables can be set, scaled, interpolated and smoothed, and shown as a 2D graph or a 3D surface. Comfort mode lists the common MS45 values under plain names. Saving writes a file on your computer, never the car.
Live tuning
On an MS45 running the live-tune program, LIVE ON puts every edit onto the running engine as you make it, and a live cursor marks the cells the engine is reading. Beside the editor you can open the fault memory, the learned adaptations (each clearable on its own), a rev gauge and live values. Tick Save to ECU and the DME keeps the tune at key-off.
Logging
Comfort lists the readings that matter under plain names; Expert offers every read-only job of every module. Each reading gets a chart while you drive, and runs are kept in History and export as CSV. A replay scrubs through a run, and Map mode paints the path the engine took across a table from your tune. A DME reset during a run is kept as a black box.
Supported cars
| Part | Covers |
|---|---|
| Diagnostics | 26 chassis: 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 and RR1 |
| Wiring diagrams | 15 chassis: E38, E39, E46, E52, E53, E60, E63, E65, E70, E83, E85, E87, E89, E90 and F01 |
| Parts catalogue | 246 chassis, from the E3, E9, E12 and E21 through the current G series, plus the i models, the K series motorcycles and Rolls-Royce |
| Flashing and tuning | The Siemens MS45 DME and the GS20 automatic gearbox |
How much each chassis covers depends on how many modules it has: an E65 carries 96 module definitions, an E60 91, an E90 61, an E46 55, an F30 19. A parts lookup needs no car, so it reaches far beyond the diagnostics.
Writing and safety
Reading is open. Anything that changes the car asks first, and a refused write sends nothing at all.
Every job is checked before it runs
A job the app does not recognise is treated as a write, not as safe, and a blocked write is stopped before a single byte reaches the car. A permanent write (an EEPROM change, a service reset) always asks, whatever the setting. In a remote session, the car's owner approves each write.
Activations
Activations ask first by default and say which kind they are: a test that holds until you change it back or leave the screen, or a permanent write that stays. Leaving an activation screen releases anything still held.
Coding
A coding write is an EEPROM write, and on a module that controls the immobiliser or the airbags a mistake can stop the car starting. So every coding write:
- lists every change and waits for you to choose Write to car;
- is refused unless the app has proved which variant and coding index the module is;
- saves the module's current coding before anything is sent;
- re-reads the module afterwards and reports any byte that did not land.
Your changes are laid over what was just read from the module, never over a blank image. Modules that are coded in numbered blocks rather than by address are refused for now.
Flashing
Take a full read first
Flashing erases and rewrites the program and calibration in the module. Before you write anything, take a full read and keep the files somewhere safe: it is the only guaranteed way back. Keep a battery charger on, the ignition on and the engine off, and do not unplug or close the page until it reports success.
Flash only files meant for exactly this module and program version. Options such as EWS delete change what the car protects against; know what they do before you tick them.
Working offline
The app installs to the home screen or the dock and keeps working without a connection. Everything it reads is a static file, so once it is cached there is no server to be unreachable.
For a copy that never touches the network, every
release has
self-contained builds: unzip one and open index.html.
| Build | Size | Has |
|---|---|---|
| offline | about 1 GB | Diagnostics, coding, the fault lookup with its service data, the ISTA view, tuning definitions and the wiring diagrams |
| offline-no-wiring | about 850 MB | The same without the diagrams |
| offline-complete | about 9 GB | Adds the parts catalogue and the repair manual for every chassis. Too large for a GitHub release, so it is on Hugging Face, linked from each release's notes. |
Troubleshooting
The errors people actually hit, and what each one means.
| Message | Code | What it means |
|---|---|---|
| No cable connected | Plug the cable directly into the computer rather than through a USB hub, and check the car end is fully seated. | |
| Security access denied | Engine off, ignition in position 2, healthy battery. The security seed is random, so a retry sometimes works where the first attempt did not. | |
| The ECU rejected the request | conditions_not_correct | The module refuses because the car is not in the state the job needs. Ignition position 2, engine off. |
| The cable is not hearing itself | IFH-0003 | The K line is half duplex, so the cable should hear an echo of what it sends. Either a connection is loose or the FTDI latency timer is too high. Reseat both ends, then check the latency is 1 ms. |
| No response from the ECU | IFH-0009, IFH-0018 | Nothing answered. Usually the module is not fitted to this car, is not powered in this ignition position, or is on a bus this cable does not reach. |
| Damaged answer | IFH-0019 | Something replied, but the reply did not survive the wire. Nearly always electrical: a marginal cable, a bad ground or a low battery. |
| App error, not the car | Nothing needs checking on the vehicle. The fault is in the software. |
Limitations
- Flashing covers two modules: the MS45 DME and the GS20 gearbox. Other modules can be read and coded, not flashed.
- Coding refuses block-coded modules, such as the E46 body module (GM5) and light module (LSZ), until the way the factory tool addresses their blocks is confirmed.
- A phone cannot use the cable. Everything that needs no car still works there.
- If the wrong coding keyword table is matched, it returns plausible but wrong keywords instead of failing loudly. Treat unexpected coding readouts with suspicion.