Modern web viewer for BMW WDS (Wiring Diagram System) data. Replaces the legacy Java applet-based system with a fast, responsive SvelteKit application.
- π Tree Navigation β hierarchical browsing with collapsible folders
- π Global Search β find diagrams and info pages by name instantly
- π History β quick access to recently viewed items
- β Favorites β bookmark frequently used diagrams/info pages
- π Collections β organize items into named collections
- πΌοΈ SVG Diagrams β interactive wiring diagrams with pan & zoom
- π Clickable Links β navigate between diagrams or trigger searches
- π·οΈ Label Scaling β adjust text size independently of zoom
- π¨οΈ Print Support β optimized print layout for diagrams
- π Markdown Rendering β technical documentation with images
- π Image Magnifier β Alt+hover to zoom into image details (5x, 300px lens)
- π Section Navigation β jump to headings via sidebar
- π Related Diagrams β quick links to referenced schematics
- π Dark Mode β system-aware theme with manual toggle
- π± Resizable Panels β drag to adjust tree/content split
- β¨οΈ Keyboard Shortcuts β efficient navigation
- πΎ PWA Ready β installable, works offline with cached data
wdsx/
βββ packages/
β βββ core/ # Shared TypeScript types
β βββ importer/ # CLI: WDS β JSON/SVG/MD converter
β βββ viewer/ # SvelteKit web application
βββ Dockerfile # Production container (nginx)
βββ docs/ # Additional documentation
- User Guide β visual walkthrough of all viewer features (with screenshots)
- Node.js 22+
- pnpm 9+
- BMW WDS source data (not included)
git clone https://github.com/emdzej/wdsx.git
cd wdsx
pnpm installThe importer converts legacy BMW WDS data into a modern web-friendly format.
pnpm --filter @emdzej/wds-importer exec wds-importer list-models \
--source /path/to/wds/release \
--language usShows all vehicle models available in your WDS source.
pnpm --filter @emdzej/wds-importer exec wds-importer import \
--source /path/to/wds/release \
--output apps/viewer/static/data \
--language usOptions:
| Option | Default | Description |
|---|---|---|
--source <path> |
~/WDS/release |
Path to WDS release folder |
--output <path> |
./data |
Output directory for converted files |
--language <code> |
us |
Source language folder (us, de, etc.) |
--models <list> |
all | Comma-separated model IDs (e.g., e46,e60,e90) |
--parallel <n> |
4 |
Number of parallel workers |
--tree-only |
false |
Import only tree data, skip shared files |
--dry-run |
false |
Validate without writing files |
--verbose, -v |
false |
Enable detailed logging |
Examples:
# Import all models
wds-importer import --source /mnt/wds/release --output ./data
# Import specific models only
wds-importer import --models e46,e90 --source /mnt/wds/release
# Add a new model to existing data (tree-only mode)
wds-importer import --models e60 --tree-only --output ./data
# Validate before actual import
wds-importer import --dry-run --verbose --source /mnt/wds/releasewds-importer validate --source /path/to/wds/release --verboseValidates source data integrity without writing files.
wds-importer stats --output ./dataDisplays summary of imported data (diagram count, info pages, etc.).
After import, the output directory contains:
data/
βββ models.json # Vehicle model list with metadata
βββ diagrams/
β βββ index.json # Diagram metadata index
β βββ *.svgz # Compressed SVG diagrams
βββ info/
β βββ index.json # Info page metadata index
β βββ *.md # Markdown documentation
βββ trees/
β βββ <model-id>.json # Navigation tree per model
βββ zi_images/
βββ *.png # Info page images
# Ensure data is imported first
pnpm --filter @emdzej/wds-importer exec wds-importer import \
--source /path/to/wds/release \
--output apps/viewer/static/data
# Start dev server
pnpm devOpens at http://localhost:5173
pnpm buildOutput: apps/viewer/build/ β serve with any static file server.
docker build -t wdsx:latest .docker run -d \
--name wdsx \
-p 8080:80 \
-v /path/to/data:/data:ro \
wdsx:latestAccess at http://localhost:8080
Volume Mount:
/dataβ Mount your imported WDS data directory here
version: '3.8'
services:
wdsx:
image: ghcr.io/emdzej/wdsx:latest
ports:
- "8080:80"
volumes:
- ./data:/data:ro
restart: unless-stoppedThe container uses nginx and expects:
- Static app files at
/usr/share/nginx/html(built-in) - Data files mounted at
/data
Health check endpoint: GET /health
| Key | Action |
|---|---|
/ or Ctrl+K |
Focus search |
Escape |
Close search / clear selection |
Alt + hover |
Activate image magnifier (info pages) |
- Framework: SvelteKit 2 + Svelte 5 (runes)
- Styling: Tailwind CSS
- Build: Vite + Turborepo
- SVG Interaction: Custom pan/zoom implementation
- Markdown: marked
- Container: nginx (Alpine)
Note: Original BMW WDS data is property of BMW AG and is not included in this repository. You must provide your own legally obtained WDS source files.
The Right to Repair movement advocates for consumers' ability to fix the products they own β from electronics to vehicles β without being locked out by manufacturers through proprietary tools, paywalled documentation, or artificial restrictions.
I build these tools because I believe repair is a fundamental right, not a privilege.
Too often, service manuals, diagnostic software, and technical documentation are kept behind closed doors β unavailable to individuals even when they're willing to pay. This wasn't always the case. Products once shipped with schematics and repair guides as standard. The increasing complexity of modern technology doesn't change the fact that capable people exist who can β and should be allowed to β use that information.
These projects exist to preserve access to technical knowledge and ensure that owners aren't left at the mercy of vendors who may discontinue support, charge prohibitive fees, or simply refuse service.
If you find this project useful, consider buying me a coffee β or sponsoring on GitHub.
Licensed under PolyForm Noncommercial 1.0.0 β free for personal and educational use, no commercial use permitted.