cd ../blog
#tesla#navigation#georgia#cloudflare#maplibre

Tesla Won't Route You in Georgia, So I Built Navigation That Does

Tesla's navigation has no routing in Georgia. I built a map for the car browser: OSRM routing, 3D terrain, voice guidance and Google Maps links from a phone.

Jaba Macharashvili 6 min read

In this post
  1. What I actually wanted
  2. The pieces, and why each one
  3. Everything is fine until you tilt the camera
  4. The 2018 Model 3 problem
  5. Sending a place from your phone
  6. What it looks like now
  7. What I’d tell you if you’re doing the same thing

TeslaNaviGeorgia: a red car following a glowing route line across a dark map grid

TeslaNaviGeorgia lives at tesla.jaba.ge, and the code is on GitHub. Open it in a car browser or on a phone. Here is why it exists.

I’ve been driving Teslas for years, and in all that time the best screen in the car has never once told me where to turn.

Fifteen inches of glass in the middle of the dashboard, a beautiful map on it, and no routing at all. Tesla doesn’t sell cars in Georgia, so the country never got it. You can watch your own dot drift across the map, but you can’t ask the car to take you anywhere.

So the ritual never changed. Phone clamped to a vent, Google Maps on five inches, and the big screen sitting there like expensive décor. I’d drive up to Kazbegi, one of the great roads anywhere, squinting at a phone while a proper display did nothing.

The car has a web browser, though. That’s the whole idea behind this project.

What I actually wanted

The things the phone was already doing, moved onto the screen that’s in front of me:

  • search a place in Georgia and get a route
  • turn-by-turn directions with voice
  • something that works on the mountain roads, where the interesting driving is
  • a way to send a place from my phone, because that’s where links arrive

The map, with terrain, running in the car browser

The pieces, and why each one

Everything here is free or close to it, since this is a hobby project for me and a few friends.

The map is MapLibre GL with tiles from OpenFreeMap. OpenStreetMap coverage in Georgia is good, better than I expected on small roads, and OpenFreeMap serves the vector tiles at no cost.

Routing comes from the public OSRM server, which does what Tesla won’t: give me a route across Georgia, with turns and distances. Search is Photon, also free, restricted to a bounding box around Georgia so that typing “Rustaveli” doesn’t offer me a street in Kyiv.

The whole thing is hosted on Cloudflare Workers, static files plus a small Worker that proxies the APIs. It costs nothing, it’s fast from here, and a git push deploys it. The Worker also caches routes and searches, and hides things the browser shouldn’t see. It ended up solving a problem I didn’t expect, which was elevation tiles.

Everything is fine until you tilt the camera

A flat map is easy. A driving view is not.

I wanted the Google Maps feeling, where the map tilts, turns with you, and zooms in before a turn. My first version updated the camera once per GPS fix, which looked exactly as bad as it sounds, a lurch every second. What fixed it was thinking of the camera as a chase camera instead of a thing that moves when a position arrives: a 60fps loop where the camera eases toward a target, and the target sits a few hundred metres ahead of the car, so the road you’re about to drive fills most of the screen.

Then I added real terrain, because the mountains are the reason I drive here.

Gudauri with elevation data, before I learned what happens close up

That’s when the screen went black. With a tilted camera near the ground, the hill the car is standing on fills the entire view. You’re inside the mountain. The elevation data that makes Kazbegi look spectacular from above makes the driving view useless, so terrain now switches off above a certain zoom and hillshading carries the relief instead. Google does the same thing. I just had to discover why.

The driving view, tilted, rotating with you, 3D buildings in Tbilisi

The 2018 Model 3 problem

I tested in a 2024 Model Y. Smooth, lovely, terrain and all. Then I opened it in a 2018 Model 3 and got a blank screen with the buttons floating on top.

That car’s browser has no WebGL 2, which the current version of MapLibre requires. Nothing in the code was wrong. The map engine simply refused to start, silently.

I fixed that twice over. The page now says what happened instead of showing an empty map, and there’s a /check.html page listing what that browser supports. And the app checks the screen before it loads anything:

  • WebGL 2: current MapLibre, terrain, 3D buildings, 60fps camera
  • WebGL 1 only: older MapLibre, no terrain, no buildings, camera capped at 10fps
  • neither: a clear message rather than a black rectangle

Same routing, same voice, same everything else. The old car gets a lighter version of the same app, automatically.

Sending a place from your phone

This is the part I use most, and the part that surprised me by being the hardest.

Links arrive on the phone. Someone sends you a restaurant in Google Maps, you’re standing next to the car, and typing a URL on a car touchscreen is miserable.

So the car shows a four-letter code and a QR code. You scan it, paste the Google Maps link on your phone, and the place appears in the car.

The car showing its pairing code and QR

The phone page: paste, enter the code, send

Two things had to be solved.

Short links first. A maps.app.goo.gl/... address contains no coordinates, it’s a redirect. The browser can’t follow it across origins, so the Worker does. It follows the redirects server-side and pulls the coordinates out of the final URL, and it only accepts Google, Apple and Waze hosts so it can’t be turned into a fetch-anything proxy.

Then storage. I started with Cloudflare KV as the mailbox between phone and car. In testing, a place sent from the phone was still not readable a minute later, because KV is eventually consistent and caches misses. That’s fine for config and useless when you’re sitting in the car waiting for a pin to show up. I moved it to D1, where the car reads it back instantly, and the place is deleted the moment the car collects it.

What it looks like now

Press Start and the camera flies down from the whole-route overview into the driving view. The panel shrinks to a single bar with the next turn, and you tap it if you want the details. Voice tells you about a turn at 800 m, 200 m and as you reach it. Leave the route and it re-routes itself.

There’s also a road updates layer I can publish to by editing one JSON file: closures, works, chargers. That’s the part Google is bad at here. The Jvari Pass closes for snow and you find out from a Facebook group, not from your navigation.

What I’d tell you if you’re doing the same thing

The car browser is more capable than people assume. WebGL, geolocation, speech synthesis, it’s a real browser, and the limits come from the old hardware rather than the idea.

Test on the oldest device you care about, early. I built three features on top of an engine that one of my cars couldn’t run at all.

Make failures visible. A blank screen tells you nothing, and the ten minutes I spent on an error panel and a capability check saved hours of guessing.

Pick the storage that matches the interaction. Eventually consistent is a lovely property right up until a human is waiting.

The whole thing costs nothing to run, deploys on push, and finally makes use of the screen I paid for. It’s at tesla.jaba.ge if you want to try it, with the source at github.com/jaba0x/tesla-navi-georgia. Allow location access, and tap the phone button to send yourself a place from Google Maps.

Not affiliated with Tesla, Inc. Just a driver who wanted the map to work.


Follow along. New posts show up on the RSS feed. I also share my projects on GitHub, MakerWorld and LinkedIn.

← All posts

Got it working, or stuck? [email protected]