Close crop of the rear wing and chrome VOLVO badge of a yellow Volvo Close crop of a rain-beaded Volvo iron mark on a dark grille
Norra app icon
A native macOS app · for your Volvo

Your Volvo.
In the menu bar.

Battery, range and charging status — always one glance away. It taps you on the shoulder when charging finishes, and stays out of the way the rest of the time.

Norra

Free & open source · macOS 13+ · Apple silicon & Intel

Signs in with Volvo ID in your browser, keeps the session in the Keychain, and talks to nothing but Volvo's own API.

Refresh while idle5 min

Battery and range quietly update every five minutes.

Refresh while charging60 s

Once you plug in, Norra checks every minute so the numbers keep up.

Trackers and third parties0

Your data travels between your Mac and Volvo — nowhere else.

Notifications

It tells you when it matters.

Norra compares each refresh with the last one, so a banner only shows up when something actually changed — plugged in, finished, or the charger threw an error. Nothing else pings you, and each of the three is its own switch in Settings.

Sent the moment the car starts charging.
When the battery is full — even if your Mac went to sleep in the meantime.
If the charger reports a fault, so you don't wake up to a half-empty battery.
On the desktop

The same car, without the click.

One widget in three sizes, reading what the app already fetched — including the studio render of your exact car. Keep scrolling to size it.

Volvo EX30
77%
381 km
Idle 5h ago
Volvo EX30 · 2025
77% 381 km
Idle 5h ago
Volvo EX30 · 2025
CX 41 927
Idle
77% 381 km
ChargerDisconnected
Odometer3.097 km
Updated 5 hr ago

Why Norra

Small. Native. Yours.

Glanceable state of charge

Battery %, range, charging status and time-to-full. You choose what the menu bar shows.

Charging notifications

A quiet nudge when charging starts, completes, or the charger reports a fault. Nothing else, ever.

No password to store

You sign in on Volvo's own site; Norra only ever holds the token it gets back, in the macOS Keychain, and resumes with it.

Official API only

OAuth2/OIDC with PKCE against Volvo's own endpoints. No third-party servers, no analytics, no tracking.

Lock and unlock

Lock, unlock, honk and flash from the menu — if you grant those scopes at sign-in. Off by default, and unlock asks first.

Open source

MIT licensed, pure AppKit, no Electron, no SwiftUI, no background services. make app and you have it.

The studio render of your exact configuration — paint, wheels and all —
fetched straight from Volvo and shown at the top of the menu.

Get started

Build it yourself.

Norra talks to Volvo's official API, which means credentials — and Volvo issues those per application, to you. So there is no download: you register once, build once, and it is yours.

  1. Register — create an application at developer.volvocars.com and set its redirect URI to http://localhost:9631/callback. Free for non-commercial use. The API key is issued at once; the client ID follows Volvo's review.
  2. Build — clone it and run one make target.
    git clone https://github.com/jonasjersborg/norra && cd norra && make app
    Needs macOS 13+ and the Xcode Command Line Tools (xcode-select --install).
  3. Sign in — paste your key, enter the VIN, and approve Norra in the browser window Volvo opens. The VIN is in the Volvo Cars app under your car's details, and on the registration papers.
Questions

The usual four.

Will my Mac warn me when I open it?

The first launch wants a right-click → Open, because you built it yourself rather than downloading a notarized copy. After that it opens like anything else.

Where do I find my VIN?

In the Volvo Cars app, under your car's details. It's also on the registration papers, and stamped in the corner of the windscreen on the driver's side.

Where do my Volvo details go?

Nowhere but your own Mac. You sign in through your browser on Volvo's own site, so Norra never sees your password — only the token Volvo hands back, which lives in your keychain. There's no Norra account and nothing in between.

How do I update it?

git pull && make app. There is no in-app updater — you built it, so you update it the same way.