A free, open-source CAN database editor.
Draw signals on the bit layout, keep the map in git, and get DBC, PDF, Excel and C code from one file.
CAN 2.0A/B · CAN FD · SAE J1939 · CANopen · Windows, Linux, VS Code
Try it on your DBC · Why not just DBC · Installation · Outputs · Documentation
Your CAN interface is described three times: in a spreadsheet or a Word document for the team, in a DBC for the bus analyzer and in the firmware's headers. Sooner or later they disagree, and nobody knows which one is right. mapcan keeps the interface in one YAML file and generates the rest from it, so they cannot drift apart. The file is reviewed in pull requests like code, and every mistake (overlapping signals, clashing IDs, unknown receivers) is reported with its line before anything is built.
Already have a DBC?
pipx install "mapcan[desktop]" # or the Windows installer below
mapcan import dbc vehicle.dbc # → vehicle.yaml
mapcan validate vehicle.yaml # what your DBC got wrong, with lines
mapcan build vehicle.yaml -o build/ # PDF, Excel, HTML, DBC, C and Python at once
mapcan app vehicle.yaml # edit it on the bit layout
You keep your tools: the DBC exported back works in CANalyzer, SavvyCAN, PCAN-View and Wireshark.
Why not just a DBC file?
| DBC | Spreadsheet / Word | mapcan | |
|---|---|---|---|
Readable git diff, review in pull requests |
partly: editors reorder the file | no | ✅ comments and order are kept |
| Overlaps, clashing IDs, unknown receivers caught | in some editors | no | ✅ as you type and in CI |
| J1939 PGNs and addresses, CANopen node IDs and PDOs | attributes by convention | free text | ✅ part of the format |
| A specification for people (PDF, Excel, HTML) | no | ✅ written by hand | ✅ generated |
C pack/unpack for firmware, Python for test benches |
with third-party tools | no | ✅ |
| Works in CANalyzer, SavvyCAN, Wireshark | ✅ | no | ✅ exports DBC |
| One system split into several files | no | separate files, kept in sync by hand | ✅ includes |
Who it is for
- Firmware engineers: generated C with IDs, enums, structs and
pack/unpack, no dynamic memory. - Test and validation: a Python module with the same frames for test benches, and a DBC for the analyzer.
- Systems engineers and leads: one reviewed source of truth, and a PDF or Excel specification for suppliers and customers, also in Russian and to ESKD/GOST.
Installation
| Platform | How |
|---|---|
| Windows | mapcan-X.Y.Z-setup.exe from Releases: no Python or administrator rights needed |
| Linux x64 | mapcan-X.Y.Z-linux-x64.tar.gz from Releases: run mapcan/mapcan-app or mapcan/mapcan |
| Any OS, Python 3.12+ | uv tool install "mapcan[desktop]" or pipx install "mapcan[desktop]" |
| VS Code | The extension from the Marketplace or Open VSX: it installs mapcan by itself |
| CI | pip install mapcan (the core) or the Docker image ghcr.io/ordu1453/mapcan:<version> |
Optional parts, the Windows installer, offline installs, moving from canmap
Optional parts. pip install mapcan is the core: validation, DBC, EDS, Markdown, HTML, C and Python
code, enough for CI and firmware builds. Extras add web (the editor in a browser), pdf, xlsx, lsp
(the language server for editors), desktop (the app with all its exports) and all. A command that
needs a missing part says which one to install.
Windows installer. It adds mapcan to the Start menu, the desktop and "Open with" for .yaml files,
and optionally the mapcan command to PATH. A double-clicked map opens in the window already running,
and the editor announces new versions. The portable mapcan-X.Y.Z-windows-x64.zip needs no install. The
installer is not code-signed, so SmartScreen may warn: More info → Run anyway.
Offline. On a machine with access, pip wheel . -w wheelhouse; copy the folder and run
pip install --no-index --find-links wheelhouse mapcan.
From canmap. The tool used to be called canmap. The Windows installer upgrades it by itself; with
uv or pipx, uv tool uninstall canmap and install again. Settings move from ~/.canmap to ~/.mapcan;
maps need the key mapcan: 1.
Quick start
mapcan app # the editor in its own window
Click New map… and pick a template (CANopen, J1939, CAN with explicit IDs or empty), or open one of the examples. Add devices, frames and signals in the tree and draw signals on the frame's bit layout; mistakes show up as you type. On the command line:
mapcan validate my-map.yaml # errors with file, line and column
mapcan build my-map.yaml -o build/ # every output at once
Outputs
| Output | Command | |
|---|---|---|
| 📄 | PDF: title page, contents, bit diagrams, tables (also ESKD/GOST) | mapcan export pdf |
| 📊 | Excel: addressing, contents, bit layouts, changes | mapcan export xlsx |
| 📝 | Markdown for a README or wiki, HTML with search | mapcan export md / html |
| 🔌 | DBC for CANalyzer, SavvyCAN, PCAN-View, Wireshark | mapcan export dbc |
| 🧩 | EDS of each CANopen device | mapcan export eds |
| ⚙️ | C: IDs, enums, structs, pack/unpack; no dynamic memory |
mapcan gen c |
| 🐍 | Python module for tests and test benches | mapcan gen py |
| 🔀 | Comparison of two versions, changelog | mapcan diff |
| 📥 | A map from an existing DBC | mapcan import dbc |
Documents are produced in English or Russian, with your logo and templates; docs/cli.md has every command, the generated C code and the customization.
Editors
The mapcan app (mapcan app, or mapcan serve in a browser) edits a map in forms that adapt to the
protocol and on the bit layout: drag across free bits to add a signal, drag a signal to move it. It
checks the map as you type, previews every output and compares versions from git. Files keep their
comments and formatting, so a diff shows only what you changed. More in docs/web.md.
VS Code with the mapcan extension checks maps as you type and adds the Map view, the Node panel with the bit layout, hovers, quick fixes, rename, export and the map's history (vscode/README.md). Any editor with a YAML language server completes keys from the JSON Schema.
A map
mapcan: 1
document:
title: Electric vehicle example map
version: 0.1.0
language: en
buses:
- name: powertrain
bitrate: 500000
protocol: can
devices:
- name: bms
frames:
- name: bms_status
id: 0x100
length: 8
cycle_ms: 100
receivers: [vcu]
signals:
- {name: pack_voltage, byte: 0, encoding: float, unit: V, min: 0, max: 1000}
- {name: pack_current, byte: 4, encoding: float, unit: A, initial: 0}
- name: vcu
The examples cover each protocol: minimal.yaml (every kind of signal in one CANopen frame), j1939.yaml, canopen-node.yaml (PDOs mapped to CiA 402 objects), vehicle-can.yaml (explicit IDs, CAN FD, multiplexing) and tractor/ (a map in two files).
Documentation
- Map format: every field, the rules, included files, versioning.
- Command line: commands, validation, generated code, document customization, DBC import.
- Web editor: the app, browser mode and its security, keyboard shortcuts, HTTP API.
- VS Code extension: features, settings, commands.
- PDF templates: ESKD/GOST details, logos, fonts, custom templates.
- CI: validating maps and building outputs in a pipeline.
- Contributing and Architecture: setup, tests, releases, how the code is organized.
Roadmap
The 1.0 milestone holds what comes before the format is declared stable. Next is a live bus: adapters, log decoding and replay, a monitor of signal values and a simulator (dashboard issues). Ideas and bug reports are welcome in issues.
License
mapcan is free and open source under the Apache License 2.0, copyright 2026 Ali Ordu (NOTICE). Files generated from your map (code, DBC, documents) are yours to use under any terms, including closed-source firmware. The format specification is under CC BY 4.0, and the JSON Schema and the examples under CC0 1.0: anyone may build tools for the format. Bundled components are listed in THIRD_PARTY_NOTICES.md.
If mapcan helps your project, a star or a citation (CITATION.cff) is much appreciated.
Metadata
Release files for mapcan 0.23.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mapcan-0.23.1.tar.gz | 5.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mapcan-0.23.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.1 MB
Release files / mapcan-0.23.1.tar.gz
| Download URL | mapcan-0.23.1.tar.gz |
|---|---|
| Size | 5.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f8bb29bd745a1b8a738999939c9d0692f3ca72a07bba03744ae056a9b3a8ffa5
|
|
BLAKE2b-256 checksum How to use checksums |
deee16a43f05b8f7630fa4c11dd3b17aba1b2981cf79e8e30b78d5b20e9d45b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / mapcan-0.23.1-py3-none-any.whl
| Download URL | mapcan-0.23.1-py3-none-any.whl |
|---|---|
| Size | 2.0 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4f07f473274aede8caaf6003aa03ff997c0b3e4eb8851a35a29b4939da5fcde2
|
|
BLAKE2b-256 checksum How to use checksums |
107822086fb1a1a55bb616b63f35e6b725bcb70db47e6c06183da1ea965f3289
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log