Isolate every manufacturer bus
Parts from Nissan, Volkswagen, Bosch and Orion use overlapping CAN IDs. OVCS keeps each maker on its own bus and lets one node, the VMS, translate between them.
Open Vehicle Control System
An open-source framework for vehicle embedded systems — making parts from different brands speak one language. Your vehicle is a package built on it.
What OVCS is
OVCS provides everything a vehicle's embedded control system needs and knows nothing about any particular vehicle. A vehicle is one package that tells the framework which components, buses, controllers and screens this car has.
OVCS1, OVCS Mini and OBD2 are the three reference vehicles that ship with the framework. They prove it on real hardware and show you how a package is written. Building your own vehicle requires none of them.
Vehicles · vehicles/
loaded at boot by VEHICLE=…
The OVCS framework · vehicle-agnostic
ovcs CLIWhy OVCS
OVCS started in 2024 at Spin42 with a question: can a car be built from the best parts of several makers, orchestrated by high-level code on cheap boards? The OVCS1 reference vehicle answers yes. The framework behind it is designed around four ideas.
Parts from Nissan, Volkswagen, Bosch and Orion use overlapping CAN IDs. OVCS keeps each maker on its own bus and lets one node, the VMS, translate between them.
The cores, firmware shells and libraries contain zero vehicle-specific code. Your vehicle is a separate package with its supervision tree, CAN topology and Nerves targets. One env var selects it.
Every firmware BEAM joins a single Erlang-distribution cluster. A broadcast on the VMS reaches every bridge, on a laptop with virtual CAN or on the car's LAN.
Raspberry Pis, Arduino R4 Minimas, SocketCAN, and high-level languages. The development kit stays affordable, and so does the learning curve.
Architecture
The VMS is the only node wired to the manufacturer buses. Everything OVCS-native shares one internal CAN bus, and every firmware BEAM talks to the others over plain Erlang distribution. The diagram shows the framework as the OVCS1 reference vehicle configures it; your vehicle chooses its own buses and components.
Worked example: the OVCS1 reference vehicle. Boxes are framework components; the buses and manufacturer parts on the right are what this vehicle declares.
Read the architecture overview or the OVCS1 hardware breakdown.
Quickstart
No hardware needed. The CLI creates virtual CAN interfaces and spawns one BEAM per firmware, exactly the topology that runs on the car. Boot a reference vehicle first, then your own the same way.
# install the pinned runtimes and build the CLI $ mise install && mise run cli $ ./ovcs doctor # → toolchain, nerves_bootstrap and vehicle packages checked # vcan + one BEAM per firmware, joined in one cluster $ ./ovcs run ovcs_mini # → [vms] on :4000 · [bridge-…] BEAMs · dashboard add-on on :5173 # in another terminal: logs · bus · CAN · IEx $ ./ovcs attach ovcs_mini
Reference vehicles
Each is a self-contained package under vehicles/, and nothing in the framework treats them specially. Read them as worked examples of the vehicle contract. None of them is required to build your own.
Reference vehicle
vehicles/ovcs1 · VEHICLE=Ovcs1
A 2007 Volkswagen Polo converted to electric with a Nissan Leaf drivetrain, a Bosch iBooster, an Orion BMS, and three Arduino controllers. The vehicle that uses every side of the framework: five isolated buses, infotainment, both bridges.
Reference vehicle
vehicles/ovcs_mini · VEHICLE=OvcsMini
A Traxxas 4WD RC car on the same framework: VMS, radio-control bridge, ROS bridge, stereo perception on a Hailo-8. The smallest drivable vehicle, and the one the Gazebo simulator models.
Reference vehicle
vehicles/obd2 · VEHICLE=Obd2
A vehicle with no drivetrain at all. Plug the VMS into any car's diagnostic port and it becomes an OBD2 / UDS scan tool: live data, trouble codes, VIN, DID discovery, on the framework's own dashboard.
Built on the framework
vehicles/my_car · VEHICLE=MyCar
One command scaffolds a working package. Declare your components, buses and controllers; the framework supplies everything else. No reference vehicle is involved.
Build your own
A vehicle package implements the OvcsVehicle behaviour and bundles a VMS composer, an optional infotainment composer, optional bridge firmwares, and its CAN topology. The framework loads it at boot; nothing in the cores changes. Scaffold one, replace the example components with the drivers your hardware needs, and run it.
# scaffold a vehicle package under vehicles/my_car $ ./ovcs new my_car --vms-target ovcs_base_can_system_rpi4 # edit lib/my_car/vms/composer.ex and priv/can/vms.yml # then boot it on virtual CAN like any other vehicle $ ./ovcs run my_car $ ./ovcs build my_car vms
Stack
Talks
The team has presented OVCS at ElixirConf EU and FOSDEM. Slides and more videos are collected on the community page.