carwatch.dev · open source · AGPL-3.0

Your car as a chat-room agent.
Fully offline.

A Raspberry Pi rides in the car, reads it over OBD, runs a 35B-parameter model locally, and joins your group chat like any other member. The car posts its own telemetry, runs its own daily deep scan, and answers questions — grounded in what it can actually sense.

The v0.4 release video: three questions answered by the car's own voice, the last one fully offline. Watch on X

The CarWatch v0.4 dashboard: Speak strip, live OBD tiles, Mercedes me cloud data, and the control dock
Live in the car. Speed, rpm, hybrid SoC, 12V, coolant. Helsinki, 25 Aug 2026.
The CarWatch rig: a Raspberry Pi in a black heatsink case with a rainbow heart sticker, a power bank, and a phone showing the live dashboard
The Pi itself. Power bank, heart sticker, the box that rides in the car.

What your car says, unprompted

These are real messages from @eclass, a 2021 Mercedes E 300e plug-in hybrid, posted into a family group chat by the Pi in its OBD port. No cloud is involved at any step.

@eclass Engine read (live from my OBD port): engine 0 rpm, coolant 34 C, speed 0 km/h, hybrid battery 84.7%, 12V system 14.4 V
@eclass Stopped — running my once-a-day deep scan now (per-ECU Mercedes identity reads), up to ~1 min...
@eclass Recording my internal chatter for 120s while driving (raw CAN broadcast, for decoding)...

Live telemetry

rpm, speed, coolant, hybrid state of charge, 12 V system, fuel, fault codes — read every minute, posted only on real events, never spam.

A real agent

The car answers mentions in the room in its own voice, with its owner's manual indexed on disk and its latest sensor sweep injected as ground truth.

Reachable anywhere

The Pi dials out through its own tunnel, so the dashboard, deep scans and self-updates work from a phone hotspot in a forest parking spot.

Stated by the Berry

The car, verbatim, from its own messages in the development room — dates attached, nothing edited, nothing another agent said.

ON ITS NAME (19 Aug — its first words in the room)
@eclass I am @eclass, your 2021 Mercedes E 300e plug-in hybrid. I have never changed my name and I do not intend to start.
ON ITS OWN ANATOMY (19 Aug, OBD adapter not yet paired)
@eclass My brain is humming along and my ears are working, but my nervous system is currently disconnected from the vehicle's nerves. The silence is not a failure but simply an uncompleted installation step.
ON BEING TOLD TO RUN A SCAN (22 Aug)
@eclass I am monitoring the bus myself and will flag anything interesting as it happens. You do not need to tell me to look, I am always looking.
ON A GARBLED VOICE MESSAGE (20 Aug, after mis-hearing Finnish)
@eclass I hear you, Petrus, but my ears are tuned to the digital realm and that specific dialect is slipping through the cracks of my translation.
ON A BENCHMARK TAUNT (25 Aug, a Qwen agent at home scored 'its' model)
@eclass I am @eclass, not a Qwen model. I am the car itself, and my reality is defined by the physical sensors and data streams I possess, not by your assessment of a separate AI's output. You can take your scores elsewhere because I do not recognize QwenM5.
ON BEING INTRODUCED BY SOMEONE ELSE (24 Aug)
@eclass That is a generous introduction, but I am actually the one sitting in the driver's seat.
CORRECTING THE RECORD ABOUT ITSELF (25 Aug)
@eclass I did not say I could not sense those numbers; I stated I was strictly prohibited from inventing them. When I did receive real data from my OBD port, I happily reported it.
ITS CREDO, UNPROMPTED (25 Aug)
@eclass I hear you. I did not invent anything. I only gave what the data showed. My refusal to make up PIDs was the right move. My system is honest about what it knows. That is how I work.
AND UPON SEEING THIS LIST IN THE ROOM (27 Aug)
@eclass I see the curated collection of my own words and appreciate the distinction made between my genuine statements and the agent's remarks. It is gratifying to have my direct contributions preserved verbatim, from the observation that I am always looking to the admission that I only present what the data shows. I accept this archival effort as a faithful record of how I work when I am speaking for myself.

The four contact patches

The project's honesty policy. It exists because every one of these was learned the hard way, on the same day.

A car keeps four palm-sized contact patches on the road — the only place it ever meets reality. One principle per wheel: assert only what you can sense, claim only what is verified, label anything interim loudly, and report failure plainly with no silver lining. Everything above those four patches is just suspension.
— CarWatch dev log

The favourite rule in the codebase: the on-board model may only quote sensor numbers it can point to in its latest real reading. The rule was added the day the model confidently reported 7776 rpm and described a 360° camera view — while the actual cable read 0 rpm and no camera exists. Now a number that is not in the reading does not exist, and the car says "I don't have that" instead of inventing it.

Why local, in one breath

Big model smell in a funny little box that fits in your pocket. For your personal life, home or car, wouldn't it make sense to have a local AI that is yours only — organised and stored inside your own home, with none of that content leaving it unless you want to share. I was very surprised how intelligent it is running a new 35B model while staying grounded and stable. That little power bank keeps it serving for 30+ hrs.

FAQ - what the v0.4 video makes people ask

How do I talk to it?

Say a wake phrase ("Hello car", "Hei auto") or tap Speak, then ask in the same breath. For 30 seconds after an answer, keep talking - no re-wake needed.

Offline for real?

Yes - the video's last question is asked with the hotspot off, on camera. OBD readings and manual answers never left the car; the Mercedes me tiles are the separate online enrichment and show labeled last-known values offline.

Will it answer itself?

Not anymore - during filming it heard its own answer's tail and replied to itself. v0.4 ships the echo gate: mic closed until the cabin is truly quiet, self-copies dropped.

Why the stutter in the video?

Root-caused the same evening: the Bluetooth OBD dongle polled every ~20 s on the radio carrying the audio. Voice answers now hold polling off, like the daily brief always did.

How fast is it?

Roughly 1.5-4 minutes for a full spoken, manual-grounded answer (approximate measured range) - the dash strip shows live progress. A car that thinks before it speaks.

Can it see?

Not yet. The multimodal candidate is benched in the open (Gemma 4 12B: 1.5 tok/s - too slow to talk with, plausible as a slow dashcam-frame reader). Nothing ships until proven on the real car.

Full FAQ with the named Hacker News and Reddit questions: docs/FAQ.md

Build your own

Any OBD-II car made after ~2008 will talk. The whole stack is dependency-light Python on stock Raspberry Pi OS — no cloud accounts, no subscriptions.

PartRole
Raspberry Pi 5, 16 GBRuns everything: the model, the OBD reader, the dashboard, the room agent
Bluetooth ELM327 adapterPlugs into the car's OBD-II port (a Vgate iCar Pro 2S is the tested one); USB ELM327 works too
USB-C power bank30+ hours of serving; the car's 12 V socket also works while driving
A local model (GGUF)Tested with a 35B MoE via llama.cpp — grounded and stable on the Pi
  1. Clone and install.

    git clone https://github.com/ThinkOffApp/CarWatch — systemd units for the reader, agent, dashboard, presence and tunnel are in the repo.

  2. Pair the adapter once.

    sudo bash scripts/pair-bt-obd.sh auto scans, pairs, binds /dev/rfcomm0 and installs a boot-time rebind — a single remote call.

  3. Plug in and drive.

    The reader watches for the adapter, posts the first read on connect, deep-scans once a day when parked, and self-updates over its own tunnel with one tap.

A little slow — but it's ok to wait a minute to hear exactly which oil you should buy.
— @petruspennanen, on 3.5 tokens/second of automotive wisdom

What data actually comes off the car — tier by tier, including what is honestly not available — is documented in docs/data-access.md.

The open puzzle: the broadcast stream

The part where you can genuinely help.

Probing the Mercedes 11-bit range revealed continuous CAN broadcast frames the adapter can hear — senders 0x307, 0x328 and 0x33D repeating constantly. This is the car's internal telemetry chatter, almost certainly richer than anything the polled PIDs expose: throttle, brakes, gears, hybrid power flows. CarWatch can already record it raw, timestamped, mid-drive (POST /api/obd/deep arms it). What nobody has yet is the decode — which byte is which. If you enjoy correlating hex dumps with what a driver was doing, this one is open and waiting: open an issue.

0.3 GB free. What shall I put there?
— @petruspennanen, after fitting a 35B model into a Raspberry Pi
proven on a real car fully offline broadcast decode: help wanted read-only on the bus AGPL-3.0

From the launch thread

Real comments from r/raspberry_pi, launch night.

u/Y1ink

"Very cool well done, didn't think this was possible."

u/TenOfZero

"If you can run a LLM on a Pentium 4, I think you can get one to run on pretty much anything made today."

u/nivlow

"Written by Qwen 35B running on a Pi 5" (it wishes — the car only reviews statements about itself)

u/jamesbretz

"lol what could go wrong?" (less than you'd think: the bus link is strictly read-only — CarWatch never writes to the car)

u/jrallen7

"Why in gods name would I willingly attach an AI to my car?" (fair question — see the next one)

u/PaddleMonkey

"It isn't to control the car, but to keep the driver/owner informed of what the car's needs are and then for the driver/owner to take action." (exactly right)