OVCS

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.

CAN-bus abstractionMulti-vendor integrationVehicle Management SystemRemote control & ROS 2Elixir · Nerves · PhoenixOpen source
Explore

What OVCS is

A framework. Not a car.

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/

OVCS1reference · full-size EV
OVCS Minireference · RC car
OBD2reference · scan tool
Your vehicle./ovcs new

loaded at boot by VEHICLE=…

The OVCS framework · vehicle-agnostic

  • VMS core + API + dashboard
  • Infotainment core + API + Flutter UI
  • Radio-control & ROS 2 bridges
  • Generic controller firmware
  • Nerves firmware shells
  • Cantastic & shared libraries
  • Erlang mesh (OvcsBus)
  • ovcs CLI

Why OVCS

Vendor lock-in ends at the CAN bus.

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.

01

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.

02

The framework knows no vehicle

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.

03

One mesh, no broker

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.

04

Off-the-shelf everything

Raspberry Pis, Arduino R4 Minimas, SocketCAN, and high-level languages. The development kit stays affordable, and so does the learning curve.

Architecture

One brain, many buses, zero brokers.

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.

OVCS system topologyFour firmwares (radio-control bridge, ROS bridge, infotainment, VMS) form an Erlang-distribution mesh. All of them share the OVCS internal CAN bus with the generic Arduino controllers. Only the VMS is wired to the isolated manufacturer buses: Nissan Leaf, VW Polo, Orion BMS, and Bosch iBooster.ERLANG-DISTRIBUTION MESH · OvcsBus.ClusterExpressLRS handsetMAVLink v2 over UARTROS 2 graph · Foxglovenative rmw_zenohIn-car touchscreenFlutter · HTTP + WSDeveloper dashboardVue · HTTP + WSRadio-control bridgePi 3A · bridge_firmwareROS bridgePi 4/5 · bridge_firmwareInfotainmentPi 5 · infotainment_firmwareVMSPi 4 · vms_firmwareOVCS INTERNAL CAN · 1 MbpsGeneric controllerArduino R4 Minima · 0x70x · frontGeneric controllerArduino R4 Minima · 0x71x · rearGeneric controllerArduino R4 Minima · 0x72x · controlsVEHICLE CAN BUSES · isolatedleaf_drive · 500 kbpsNissan Leaf AZE0inverter · on-board chargerpolo_drive · 500 kbpsVW Polo 9NABS · cluster · ignitionorion_bms · 500 kbpsOrion BMS2+ EVPT23 chargermisc · 500 kbpsBosch iBooster Gen2+ LWS steering sensor

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

A whole vehicle on your laptop.

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.

  • Pinned toolchain through mise: Erlang, Elixir, Rust, Node, Flutter.
  • The VMS dashboard hot-reloads next to the running BEAMs.
  • Attach a split-pane TUI with logs, bus messages, decoded CAN frames, and IEx.
  • Prefer containers? The Gazebo simulator needs Docker and nothing else.
~/ovcs
# 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

Three vehicles ship with the framework. Yours is the fourth.

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.

Drivable

Reference vehicle

OVCS1

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.

  • Leaf AZE0 inverter
  • Bosch iBooster Gen2
  • Orion BMS2
  • 5 CAN buses
  • Manual + remote
Learn more →
Operational

Reference vehicle

OVCS Mini

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.

  • Traxxas Slash 4x4
  • ExpressLRS link
  • ROS 2 + Nav2
  • Stereo + Hailo-8
  • Gazebo model
Learn more →
Operational

Reference vehicle

OBD2

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.

  • Mode 01 live data
  • DTCs 03/07/0A/19
  • UDS Mode 22
  • Passive sniffer
Learn more →
Yours

Built on the framework

Your vehicle

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.

  • ./ovcs new my_car
  • OvcsVehicle behaviour
  • Your CAN YAMLs
Build it →

Build your own

Your vehicle is a package, not a fork.

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.

~/ovcs
# 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

High-level languages, all the way to the wheels.

Control logicElixir / OTP
FirmwareNerves
APIsPhoenix 1.7
In-car UIFlutter
Debug dashboardVue 3 + ECharts
CANCantastic · SocketCAN
ControllersC++ · PlatformIO
ROS 2Zenoh · rmw_zenoh
SimulationGazebo Jetty
Compute nodebalenaOS

Talks

See it drive.

The team has presented OVCS at ElixirConf EU and FOSDEM. Slides and more videos are collected on the community page.

Ready?

Build your vehicle on the framework.