Help us shape the future of Go! Take the 2026 Go Developer Survey

rivolt

module
v0.39.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 24, 2026 License: MIT

README

Rivolt

build release

Free, open-source tracker for Rivian owners: what your Rivian actually costs. Charging cost at your own rate, trips, efficiency and lease miles.

Try the demo (sample truck, no sign-in) · Use it at rivolt.dev (sign in with Google or GitHub) · Self-host: docker compose, Helm chart · Sign-up guide · MIT license

Now tab on the demo truck

Rivolt is an unofficial companion app for Rivian vehicles. It is not affiliated with, endorsed by or sponsored by Rivian.

What it does

  • Every charge and trip priced at your rate, with the source of each number shown (billed, home rate, network estimate, or entered by you).
  • Trip planner that estimates what a road trip will cost, with weather and efficiency analysis.
  • Lease miles: enter your allowance and term and see projected miles at lease return and the overage cost.
  • Efficiency (mi/kWh) broken down by temperature, speed and drive mode.
  • Software update alerts by push notification, with release notes.
  • Coming from ElectraFi? Import your history from its CSV export; see how.
  • Yours to keep: export your data as a zip of CSVs (charges with cost source, drives, trips) or download a full JSON backup, delete your data from Settings, or run your own copy.

Try the demo

demo.rivolt.dev is a stable, read-only demo on a generated sample truck: no sign-in, no Rivian account, and no real vehicle data. Browse every tab below the way you would on your own truck, and open the planner's sample trips to see a route with charging stops.

  • The numbers are made up (a home-charging month at $0.16/kWh); yours will differ.
  • Three public, simulated trip plans need no sign-in at all: rivolt.dev/sample-trips. Each lists every charging stop, the battery on arrival and departure, charge time and the estimated cost for a sample R1S, and opens in the demo planner.
  • A public worked example and a calculator for what it costs to charge a Rivian at home, with no sign-in and nothing leaving your browser: rivolt.dev/charging-cost. Every figure on it is an example.
  • To use it with your own truck, sign up at rivolt.dev with Google or GitHub (the beta has an account cap); see docs/SIGNUP.md. We recommend connecting an Authorized Driver account, so Rivolt never holds your primary Rivian login and you can revoke access from the Rivian app at any time.
  • Rivolt uses Rivian's unofficial API, so it can break. It is read-only (it can't control your truck) and in beta.

Five tabs

Rivolt is organised around five tabs: Now, Activity, Money, Plan and Truck. Now, Activity and Truck share one calendar scope (Week, Month, Year, All or a custom range), Money steps month by month, and the app follows your system light / dark setting (or the Appearance card in Settings).

Now — the truck at a glance

The current state on one card: battery as an arc with the charge limit marked on it, range, and whether the truck is parked, plugged in, charging or driving (live frames while it moves, slower when parked). Under it, the numbers for the scope you picked: miles since the last charge, miles, energy added, efficiency, cost, and an Idle awake tile that links to Truck. Below those, miles per day and a battery trend with charging and driving shaded behind the line, so you can see why the percentage moved.

Now

  • Comfort line. While the feed is live, one line reads what the truck says about the cabin: "Cabin 68°F · Pet mode on · Climate hold", or "Preconditioning". It disappears when the data is stale, so an old "Pet mode on" is never read as current.
Activity — every drive and charge

One day-grouped Feed of drives and charges, newest first, with Table and Map views of the same rows (the map shows Drives or Charges one layer at a time). Open any row for its detail page.

Drives. Distance, duration, average speed, energy used and cost. The detail page draws the road-snapped route (self-hosted Valhalla over a Protomaps basemap) coloured by speed, with time-aligned charts for speed, SoC, elevation, temperature, headwind and precipitation, and weather context for the drive's start hour from Open-Meteo when enabled. A "Low GPS accuracy" pill appears when the modem returned stale fixes or implausible jumps; its thresholds are admin-tunable.

Charges. Date, location, energy delivered, peak kW and cost. The detail page has the power curve, peak and average kW, session duration and, when the Parallax feed is available, the thermal split between energy into the pack and energy spent on battery conditioning. Sessions are bucketed Home / Public / Fast by clustering on coordinates and peak kW; home sessions price against your configured home rate, others against the cost Rivian reports.

  • Trailer connected. Drives record whether a trailer was connected (from the connector, so "trailer", never "towing"), you can correct a drive, and efficiency figures leave those drives out and say so: "Excludes N drives with a trailer".
  • Estimated energy, marked. If a Rivolt bug loses a charge's energy count, the kWh is worked out from the battery's change and shown as an estimate, "~12.3 kWh" with a note, and so is the cost that follows from it, on the feed, the charge page, Money's receipts, the month total, the statement email and the share card. Nothing estimated is ever shown as measured.

Activity

Money — what charging actually cost

A monthly statement: spend for the month, how it compares with the last one, and where the energy came from (Home, Away, DCFC) in dollars or kWh. Receipts list every session with its price and where that price came from, and anything estimated or unpriced is flagged rather than guessed (with a one-tap way to add the price). "About these numbers" spells out what is and is not included in the total.

Money

Off-peak hours and what moving charging would save

In Settings → Charging you can enter your off-peak hours yourself: several windows, weekday and weekend splits, windows that run past midnight, a rate for each, in your time zone. Rivolt uses them only for estimates; it does not contact your utility and cannot check them. With a schedule and a home rate set, Money shows an "Off-peak savings" card: what moving your home charging into your cheapest window could have saved, about $Y (estimate), from your own home charges. Sessions that could not move are left out and the card says how many. It is advice only: Rivolt never changes charging on the truck. A share card can carry one extra line, the percentage of your home charging that ran off-peak, behind its own switch that is off every time.

Month statement as a CSV

"Download CSV" on Money saves the month as a spreadsheet file: totals by cost type, home versus away, and one line per session, in your time zone. It is your own data, downloaded straight from your Rivolt; nothing is sent anywhere.

Share a month, a trip or a milestone

Any month, drive or milestone can become a square image you share from your phone or save. It is made on your device and shows figures only: no places, no map, no VIN and no dollars unless you switch on "Include cost" for that card. Rivolt never uploads or posts the image.

Plan — a map-first trip planner

This is the feature the app was built for. On a computer the map fills the right of the page and stays put while you work on the left; on a phone the map is on top and the trip sits in a sheet you drag up.

  • Route bar. From and To (with a swap button), departure, starting SoC on a slider, and a Plan button. Via-stops, target arrival SoC, drive mode and the adapter switch live under "More options".
  • Result. Rivolt asks Rivian's own planner for a route with charging stops and shows arrival SoC, trip cost, time, distance and charging time, with alternatives as a compact chooser.
  • Itinerary. Start, every charging stop and arrival as a vertical timeline. Open a stop for the charger and network, SoC in and out, charge time, energy and cost, and see it highlighted on the map (and the reverse).
  • Map. Self-hosted Protomaps basemap with the route, plus a charger overlay along the route corridor (distance to the polyline, not a bounding box) with DCFC / L2 / Hotels filters from NREL AFDC data.
  • Cost. Dollar figures come from your home rate, stop SoC deltas and each matched network's rate (your member rate where set), not from an LLM. When the operator wires an AI provider, short commentary on cost, efficiency, weather and the vehicle is added.
  • Saved trips and plan vs actual. Save a plan and reopen it exactly as planned. After you drive it, Rivolt lines up each day's plan against what was recorded: arrival time, energy charged, cost and arrival battery, day by day.
  • Re-plan from here. On a saved multi-day trip that's under way, re-plan the rest of it from the truck's current position and charge. The original plan is kept for comparison.
  • Avoid tolls, ferries or highways. A per-trip setting that applies to every day and is saved with the trip. Avoiding highways usually adds time and can add a charging stop.
Multi-day trips

Going further than a day? Add an overnight and Rivolt plans each day on its own: the start time, starting charge and arrival charge of each day follow from the day before, including whatever charging happens while you sleep.

  • Overnights are stops. Each overnight sits in the itinerary with the arrival time and charge, the hours parked, the charger you expect there (Level 2 at 7 kW by default, another power, or none) and the charge you'll leave with, capped at the limit you set.
  • Hotels with Level 2. The map's "Hotels with Level 2" filter shows hotels that list a Level 2 charger (NREL AFDC data). Pick one as the overnight and its listed power is used for the overnight estimate. Listed is not guaranteed: chargers can be in use, broken or guests-only, so check with the hotel before you rely on one.
  • Day by day. Each day is its own section with its date, departure time, legs, charging stops and arrival charge. If a day can't be routed, the days before it are kept and the error says which day to fix.
  • Campgrounds. On a long day, campgrounds with an electric hookup are suggested next to hotels (a "Campgrounds" chip and green pins on the map when the route has any). The outlet decides the planned power: a 50 A site is planned at 7.2 kW (estimate) with Rivian's Portable Charger, a 30 A site needs an adapter that isn't included with the truck and plans slow. Reservation is the campground's: listed, not guaranteed, and some parks don't allow EV charging, so ask first. Campground data: Recreation.gov (RIDB), CC BY 4.0; filtered by Rivolt.
  • Limits. Up to 10 points per day (start, vias, end) and 10 days per trip.

Every figure in a plan is an estimate built from your own truck's efficiency, the route and the chargers along it. Real charging speed, weather and traffic will differ.

Plan

Truck — health, sleep and drain

Parked drain, pack capacity and software version as the truck reports them, plus three cards that read only what your own truck sends:

  • Tires. Four pressures in psi and bar, front row first, with how old the reading is. A wheel is marked Low below 32 psi, or Low (Rivian) when the truck's own status says so; above that there is only the number, and Rivolt never calls a wheel OK. Your truck's correct pressure is on the placard on the driver's door.
  • Sleep health. The sleep card now opens with this week against your truck's own last 30 days: "Nothing unusual this week" or "Woke N more times than usual this week", with the counts. It compares the truck only with itself, never with other trucks, and offers no cause (Rivolt's own requests, a key nearby or a fault can all wake a truck). Until there are five recorded days this week and fourteen in the baseline it says so instead of guessing.
  • Software update. When the truck reports an update, the Vehicle card shows the version and the truck's own word for it: Downloading, Ready to install, Installing, with the reading's age. While it is installing and the feed is live, Now shows "Installing software 2026.38". No percentage yet (the scale is unconfirmed), no instruction, no alarm.

The sleep chart shows idle-awake time per day (the car awake while parked and not charging), with a warning when it keeps waking up again within a minute.

Truck

With enough history, Truck shows two trends for your own truck: monthly efficiency (pack-side mi/kWh) and the usable pack capacity estimated from your charges (not tracked on the R2 yet). Both come from your recorded data only and are labelled estimates; they appear once there is enough history to say anything, and never compare you with other owners.

Range near a temperature

From your own drives and the weather data recorded with them, Rivolt shows the range band your truck has actually delivered near a given outside temperature, so a cold morning is not a surprise. It is a summary of your history, not a forecast, and it needs at least 5 drives and 50 miles near that temperature before it shows.

Parked drain, asleep or awake

The parked-drain card splits each loss by when it happened: while the truck was asleep or while it was awake. Both figures are estimates from the readings the truck sent while parked.

On a phone, and in light

The same tabs work at phone width, and the main tabs have a light theme.

Plan on a phone Now on a phone

Now in light


Rivolt on iPhone (TestFlight)

A native iPhone app is in internal testing. Access is by invitation from the maintainer through TestFlight, with no public link and no App Store listing yet, so most people will use the web app above for now.

What it does today:

  • Now — charge level, range, what the truck is doing and how fresh that is, with a switcher when you have more than one truck.
  • Widgets — charge and range on the Home Screen and the Lock Screen. A widget that can't refresh says how old its numbers are instead of looking current.
  • Notifications — charging complete, software updates and anomalies, plus the plug-in reminder and milestones if you turn them on in Settings on rivolt.dev. Apple's push service sees only your phone's push address and a generic 'Rivolt update'; the words are fetched from Rivolt when it arrives.

Signing in uses a browser sheet on rivolt.dev, the same sign-in as the web app, followed by one confirmation page ("Sign in to the Rivolt iPhone app?": tap Continue), so the app never sees your password and keeps only a revocable session token in the iPhone Keychain. Signing out removes it, and you can revoke it from the web. The app is read-only like the rest of Rivolt: it never sends anything to your truck.

If you run your own server, "Other server" on the sign-in screen accepts an https address and checks that it is a Rivolt server; your server turns app sign-in on with RIVOLT_APP_CALLBACK_URL=rivolt://auth. Notifications from the App Store build come only from rivolt.dev, since they need Rivolt's own Apple key.

See ios/README.md for how it is built and tested.


Settings — everything in one place

A five-tab layout for the per-user controls:

  • Account — Rivian connection (with the optional dedicated Authorized Driver setup documented in docs/SIGNUP.md).
  • Vehicle — vehicle profile (pack capacity), display units, home location.
  • Charging — home $/kWh rate + currency, your off-peak schedule, preferred public networks (with each network's membership plans as it lists them, its source and the date it was last checked), trip planner defaults.
  • Notifications — per-device push subscription with per-event toggles (see below).
  • Data — ElectraFi CSV import + danger zone (full JSON backup, reset).

Notifications — web push

Web Push (VAPID), per-device subscribe. Enable once on each device you want pinged, pick which events you care about, and Rivolt delivers an OS-level notification on the next matching event. Currently wired: charging session completes (with the final SoC + kWh added in the body). Plug-in reminders and anomaly alerts have the plumbing — event sources land next.

  • Left open (opt-in, off by default). A push to web push and the iPhone app when a door, the frunk, the liftgate, the tailgate or the tonneau has been open for 15 minutes after the truck is parked and left: "The frunk and a door on your R1S have been open for 15 minutes." Windows are not included. One alert per episode, and it can be missed if the truck is offline. It says nothing about safety; it only tells you something is open.

Sign up

See docs/SIGNUP.md for an end-to-end walkthrough of:

  • signing up directly,
  • connecting your Rivian account (with the dedicated Authorized Driver account approach we recommend),
  • importing your history from ElectraFi,
  • configuring your home charging cost,
  • planning your first trip.

Your first day

A new account gets a short card on Now: set your home rate, add a lease, turn on alerts. The first recorded charge becomes a card with its kWh and cost at your rate, and a one-time card points at three things most people haven't switched on: charge-done notifications, the lease tracker and the monthly statement email. Setup reminders by email stop as soon as Rivolt has data from your truck, and every reminder email has a one-click unsubscribe.


What's checked on the R2

Rivolt supports the R2. This is exactly what has been confirmed on real R2s, so you know what to trust.

  • Checked on real R2s: drives · charges and plug-in · charge limit · battery, range and odometer · location · cabin and battery temperature · tire pressure · sleep and park state (since the October fix the R2 reports its power state on nearly every reading, so sleep, standby and parked show as they do for an R1) · reported battery capacity. Sleep health still needs 14 baseline days, so an R2 reads "Not enough history yet" until it has them.
  • Shown as an estimate: time to full charge (Rivian's own countdown, labelled "estimate"). Power state can take a minute to appear after Rivolt reconnects.
  • Not on the R2 yet: trip charge target · why a charge stopped · camp and pet modes · Rivian's parked-energy breakdown · smart-charging status. Each appears once it has been confirmed on an R2.

Outside temperature doesn't come through for any truck; Rivolt can look it up from weather data if you turn that on (off by default). Something looks wrong on your R2? Open an R2 report: no VIN or location needed.


Data ownership

  • Your Rivian credentials are AES-GCM sealed and decrypted only in-memory at request time. Disconnect Rivian in one click.
  • AI features (when enabled by the operator) are powered by an install-wide provider — OpenAI, Anthropic, or Google Gemini — configured from the admin UI. Each user's drive / trip context is sent to that provider only at the moment a recap or trip analysis is generated; nothing is mirrored to a third-party service in between.
  • All your drive, charge, and trip data is exportable as JSON from Settings → Data, and deletable from the same page.
  • Read-only against the Rivian API. Rivolt sends commands to no Rivian endpoint, period. It can't unlock doors, start charging, or change drive mode. Telemetry only.

Stack

  • Single Go binary + embedded SPA. Distroless multi-arch container image; the same binary serves API + static assets.
  • Go 1.25, chi router, pgx-backed database/sql, coder/websocket for the Rivian feed, webpush-go for VAPID.
  • Postgres with Row-Level Security, monthly partitioning on vehicle_state, envelope-encrypted secrets in user_secrets. Multi-tenant from day one: every data-plane store carries user_id, every query filters on it, every request pins app.user_id so RLS does the final enforcement at the DB.
  • React 19 + TypeScript + Vite + Tailwind v4 for the SPA; TanStack Query for the data layer; uPlot for time-series charts; Leaflet + protomaps-leaflet for maps.
  • Optional AI providers — OpenAI, Anthropic, or Google Gemini, selected install-wide by the operator from the admin UI. Hot-swappable; calls go to the chosen provider only when an AI feature actually runs (trip analysis, drive recap).
  • Optional street-level address search. Set RIVOLT_PHOTON_BASE_URL to a Photon geocoder to search home and trip locations by street address. Without it, trip and place search is city-level (via Open-Meteo) and the home address field is hidden; home can still be set from a charge's location or by coordinates. Self-host Photon (it serves OpenStreetMap data), e.g. http://photon.photon.svc.cluster.local in-cluster, or point it at komoot's public server https://photon.komoot.io, which Rivolt is compatible with (it calls /api/?q=). With the public server every search, including a home address a user types, is sent to komoot, who ask for fair, light use and guarantee nothing.

Status

In production at rivolt.dev. The demo at demo.rivolt.dev runs on generated data, and a preview at preview.rivolt.dev tracks main.

Release notes for every version are at rivolt.dev/changelog, with an Atom feed at /changelog.atom, and on the GitHub releases page. The version in the app's footer links to its release on GitHub.

See docs/ROADMAP.md for what's queued and docs/ARCHITECTURE.md for the load-bearing design decisions.


License

Core is MIT-licensed. Some future add-ons may ship under a separate commercial license; details will be published alongside each add-on.

"Rivian" is a trademark of Rivian Automotive, Inc. Rivolt is an independent, community-built project with no affiliation to, endorsement by, or partnership with Rivian. Reference to Rivian is for descriptive purposes only.

Use at your own risk. Rivolt relies on unofficial access to Rivian's APIs and may break at any time.

Directories

Path Synopsis
cmd
replay command
Command replay runs a captured frame stream (JSONL) through the recorder offline and prints the drives it produces — a hand-debugging companion to the replay-harness unit tests.
Command replay runs a captured frame stream (JSONL) through the recorder offline and prints the drives it produces — a hand-debugging companion to the replay-harness unit tests.
rivolt command
Command rivolt is the single-binary server for the Rivolt Rivian companion.
Command rivolt is the single-binary server for the Rivolt Rivian companion.
sampletruck command
Command sampletruck writes the generated sample-truck corpus (the demo's truck) as replay-format JSONL, one frame per line, and prints a summary to stderr.
Command sampletruck writes the generated sample-truck corpus (the demo's truck) as replay-format JSONL, one frame per line, and prints a summary to stderr.
internal
adminaudit
Package adminaudit records admin actions: who did what to whom, when and from where.
Package adminaudit records admin actions: who did what to whom, when and from where.
adminhealth
Package adminhealth builds the read-only "is everything OK?" summary for the admin home: firing alerts (Alertmanager), the kill switch, Rivian call health over the last 24 h, streaming vs leased vehicles, disk, backup age and version.
Package adminhealth builds the read-only "is everything OK?" summary for the admin home: firing alerts (Alertmanager), the kill switch, Rivian call health over the last 24 h, streaming vs leased vehicles, disk, backup age and version.
adminonly
Package adminonly is the startup contract of the admin deployment (RIVOLT_ADMIN_ONLY=true, admin.rivolt.dev): the same image as the public site, serving only the admin surface behind Cloudflare Access, and running no background work.
Package adminonly is the startup contract of the admin deployment (RIVOLT_ADMIN_ONLY=true, admin.rivolt.dev): the same image as the public site, serving only the admin surface behind Cloudflare Access, and running no background work.
ai
Package ai hosts the hot-swappable LLM provider adapters (OpenAI, Anthropic, Google Gemini) used across Rivolt: weekly digest, trip planning, charging strategy, and anomaly explanations.
Package ai hosts the hot-swappable LLM provider adapters (OpenAI, Anthropic, Google Gemini) used across Rivolt: weekly digest, trip planning, charging strategy, and anomaly explanations.
aibudget
Package aibudget enforces a per-user daily cap on LLM-backed calls (trip advice, drive efficiency).
Package aibudget enforces a per-user daily cap on LLM-backed calls (trip advice, drive efficiency).
analytics
Package analytics hosts local, deterministic analyses over the user's driving and charging history.
Package analytics hosts local, deterministic analyses over the user's driving and charging history.
api
Package api wires the HTTP surface for Rivolt.
Package api wires the HTTP surface for Rivolt.
appauth
Package appauth is the server side of the native app's sign-in (iOS design §2): the app never handles a password or an IdP token.
Package appauth is the server side of the native app's sign-in (iOS design §2): the app never handles a password or an IdP token.
appleid
Package appleid keeps the link between a Rivolt account and its Sign in with Apple identity (App Store 4.8; architect's design, DA-approved Oct 24): the identity's stable `sub`, which Apple's server-to-server notifications use to name the user, and the refresh token, kept only so deleting the account can revoke it.
Package appleid keeps the link between a Rivolt account and its Sign in with Apple identity (App Store 4.8; architect's design, DA-approved Oct 24): the identity's stable `sub`, which Apple's server-to-server notifications use to name the user, and the refresh token, kept only so deleting the account can revoke it.
appsettings
Package appsettings is the install-wide key/value store backing the AI provider configuration (and any future install-scoped setting).
Package appsettings is the install-wide key/value store backing the AI provider configuration (and any future install-scoped setting).
archive
Package archive holds the telemetry archive's building blocks (N19, telemetry-archive-design.md): per-user data keys and the encrypted stream every archive object is written in.
Package archive holds the telemetry archive's building blocks (N19, telemetry-archive-design.md): per-user data keys and the encrypted stream every archive object is written in.
archive/s3
Package s3 is a minimal S3 client for the telemetry archive: put, get, delete and list objects in one bucket, path-style, signed with AWS Signature Version 4 over the real payload hash (never UNSIGNED-PAYLOAD).
Package s3 is a minimal S3 client for the telemetry archive: put, get, delete and list objects in one bucket, path-style, signed with AWS Signature Version 4 over the real payload hash (never UNSIGNED-PAYLOAD).
auth
Package auth owns Rivolt's session-level authentication: the /api/auth/* endpoints, the cookie format, and the middleware that resolves an authenticated user into request context.
Package auth owns Rivolt's session-level authentication: the /api/auth/* endpoints, the cookie format, and the middleware that resolves an authenticated user into request context.
bg
Package bg tracks the process's fire-and-forget goroutines (a re-auth email, a close hook's push, a detached write) so shutdown can wait for them, bounded, instead of closing the database under them.
Package bg tracks the process's fire-and-forget goroutines (a re-auth email, a close hook's push, a detached write) so shutdown can wait for them, bounded, instead of closing the database under them.
cfaccess
Package cfaccess verifies the Cloudflare Access JWT that fronts the admin deployment (RIVOLT_ADMIN_ONLY).
Package cfaccess verifies the Cloudflare Access JWT that fronts the admin deployment (RIVOLT_ADMIN_ONLY).
changelog
Package changelog serves Rivolt's release notes: the hand-written notes of each release, as published on its GitHub Release, for the /changelog page and the Atom feed.
Package changelog serves Rivolt's release notes: the hand-written notes of each release, as published on its GitHub Release, for the /changelog page and the Atom feed.
chargers
Package chargers serves the chargers.pmtiles archive from the rivolt API: the entire ~10 MB file is fetched once at startup (or first request), parsed in-memory, and queries against it run fully server-side.
Package chargers serves the chargers.pmtiles archive from the rivolt API: the entire ~10 MB file is fetched once at startup (or first request), parsed in-memory, and queries against it run fully server-side.
charges
Package charges persists derived charge sessions.
Package charges persists derived charge sessions.
clientip
Package clientip decides which address a request really came from.
Package clientip decides which address a request really came from.
config
Package config holds runtime configuration for rivolt.
Package config holds runtime configuration for rivolt.
crypto
Package crypto is Rivolt's in-process key-wrapping layer.
Package crypto is Rivolt's in-process key-wrapping layer.
db
Package db owns the Rivolt Postgres connection pool, the shared migration runner, and a handful of identity helpers used by every store.
Package db owns the Rivolt Postgres connection pool, the shared migration runner, and a handful of identity helpers used by every store.
dcfcrates
Package dcfcrates owns the DCFC network table used by trip planning.
Package dcfcrates owns the DCFC network table used by trip planning.
demo
Package demo seeds and identifies the public read-only demo account (B7).
Package demo seeds and identifies the public read-only demo account (B7).
drain
Package drain computes the fleet's parked-drain metrics from the persisted vehicle_state history and exposes them to Prometheus (D1, the instrument for the battery-drain experiment's Gate A).
Package drain computes the fleet's parked-drain metrics from the persisted vehicle_state history and exposes them to Prometheus (D1, the instrument for the battery-drain experiment's Gate A).
drives
Package drives persists derived drive sessions.
Package drives persists derived drive sessions.
electrafi
Package electrafi imports TeslaFi / ElectraFi polling-dump CSV files into Rivolt's drives and charges stores.
Package electrafi imports TeslaFi / ElectraFi polling-dump CSV files into Rivolt's drives and charges stores.
elevation
Package elevation looks up altitude (meters above sea level) for arbitrary lat/lon coordinates against the Mapzen Terrarium DEM (https://github.com/tilezen/joerd/blob/master/docs/formats.md#terrarium).
Package elevation looks up altitude (meters above sea level) for arbitrary lat/lon coordinates against the Mapzen Terrarium DEM (https://github.com/tilezen/joerd/blob/master/docs/formats.md#terrarium).
email
Package email sends transactional mail via the Resend HTTP API.
Package email sends transactional mail via the Resend HTTP API.
engage
Package engage is the one door for every non-transactional message (a plug-in reminder, a weekly recap, a milestone): it decides whether a message may go out at all and makes sure each one goes out at most once.
Package engage is the one door for every non-transactional message (a plug-in reminder, a weekly recap, a milestone): it decides whether a message may go out at all and makes sure each one goes out at most once.
flags
Package flags owns the DB-backed operational flag table (migration 0003_flags.sql).
Package flags owns the DB-backed operational flag table (migration 0003_flags.sql).
geocoding
Package geocoding wraps Open-Meteo's free geocoding endpoint (https://geocoding-api.open-meteo.com/v1/search) for forward- geocoding text input → lat/lon.
Package geocoding wraps Open-Meteo's free geocoding endpoint (https://geocoding-api.open-meteo.com/v1/search) for forward- geocoding text input → lat/lon.
hydra
Package hydra is a thin admin-API client for Ory Hydra.
Package hydra is a thin admin-API client for Ory Hydra.
identity
Package identity holds the two install-wide switches that decide how much an email address is trusted when it identifies an account.
Package identity holds the two install-wide switches that decide how much an email address is trusted when it identifies an account.
idp
Package idp defines the UserProvider interface — the single contract between Rivolt's API layer and whichever identity backend is deployed.
Package idp defines the UserProvider interface — the single contract between Rivolt's API layer and whichever identity backend is deployed.
insights
Package insights computes read-only breakdowns of the user's own recorded data.
Package insights computes read-only breakdowns of the user's own recorded data.
kratos
Package kratos provides admin-side provisioning of Ory Kratos identities via the Kratos admin API.
Package kratos provides admin-side provisioning of Ory Kratos identities via the Kratos admin API.
leases
Package leases coordinates per-vehicle ownership across multiple rivolt pods so each vehicle is subscribed by exactly one process.
Package leases coordinates per-vehicle ownership across multiple rivolt pods so each vehicle is subscribed by exactly one process.
ledger
Package ledger builds the server-side money statement (the Money tab and, eventually, every cost/energy total in the SPA) from recorded charges and drives.
Package ledger builds the server-side money statement (the Money tab and, eventually, every cost/energy total in the SPA) from recorded charges and drives.
leftopen
Package leftopen sends the left-open alert: an opt-in push when a door, the frunk, the liftgate, the tailgate or the tonneau has stayed open for OpenFor after the truck was parked and left (DA's ruling, Sprint 8 item 4).
Package leftopen sends the left-open alert: an opt-in push when a door, the frunk, the liftgate, the tailgate or the tonneau has stayed open for OpenFor after the truck was parked and left (DA's ruling, Sprint 8 item 4).
logging
Package logging provides a context-aware slog handler and helpers for stamping per-request fields (request_id, user_id, vehicle_id, trace_id) onto every log line emitted while serving a request, without requiring callers to thread the logger through.
Package logging provides a context-aware slog handler and helpers for stamping per-request fields (request_id, user_id, vehicle_id, trace_id) onto every log line emitted while serving a request, without requiring callers to thread the logger through.
maps
Package maps wires same-origin reverse-proxies that let the SPA reach self-hosted map services (Valhalla for routing + map matching, an nginx-served PMTiles bundle for vector basemaps) through the existing rivolt origin and session cookie.
Package maps wires same-origin reverse-proxies that let the SPA reach self-hosted map services (Valhalla for routing + map matching, an nginx-served PMTiles bundle for vector basemaps) through the existing rivolt origin and session cookie.
metrics
Package metrics owns the application's Prometheus instrumentation.
Package metrics owns the application's Prometheus instrumentation.
milestones
Package milestones notices when a vehicle passes one of a few round numbers (1,000 miles recorded, 1 MWh charged at home, 100 charges, halfway through the lease, and a personal-best efficiency on a long drive), keeps a dismissible card for each, and pushes it to the devices that turned milestones on.
Package milestones notices when a vehicle passes one of a few round numbers (1,000 miles recorded, 1 MWh charged at home, 100 charges, halfway through the lease, and a personal-best efficiency on a long drive), keeps a dismissible card for each, and pushes it to the devices that turned milestones on.
offpeak
Package offpeak is the user's electricity schedule: the times of day (in their own time zone) at which their plan charges a different rate, and the checks that keep a schedule well formed.
Package offpeak is the user's electricity schedule: the times of day (in their own time zone) at which their plan charges a different rate, and the checks that keep a schedule well formed.
oidc
Package oidc adds an OIDC sign-in path alongside the static operator credential and the trusted-proxy header in internal/auth.
Package oidc adds an OIDC sign-in path alongside the static operator credential and the trusted-proxy header in internal/auth.
onboardmail
Package onboardmail sends the welcome email and the setup reminders: at most three emails per user ever (one welcome, two reminders), only to a verified address, only until the truck is connected and sending data, and never after the user opted out.
Package onboardmail sends the welcome email and the setup reminders: at most three emails per user ever (one welcome, two reminders), only to a verified address, only until the truck is connected and sending data, and never after the user opted out.
otadetails
Package otadetails keeps each vehicle's OTA release details (current and available software version, release-notes link) fresh from Rivian's getOTAUpdateDetails: once a day per vehicle and when a monitor connects, never per request.
Package otadetails keeps each vehicle's OTA release details (current and available software version, release-notes link) fresh from Rivian's getOTAUpdateDetails: once a day per vehicle and when a monitor connects, never per request.
overnight
Package overnight suggests where to sleep at the end of a planned day: hotel Level 2 chargers from the NREL listing near the point where the day's drive budget runs out.
Package overnight suggests where to sleep at the end of a planned day: hotel Level 2 chargers from the NREL listing near the point where the day's drive budget runs out.
packhealth
Package packhealth derives an "effective pack capacity" per qualifying charge session.
Package packhealth derives an "effective pack capacity" per qualifying charge session.
passkeys
Package passkeys is Rivolt's WebAuthn: passkeys as a second way to sign in to an email account, next to the password (Sprint 10; DA-approved design).
Package passkeys is Rivolt's WebAuthn: passkeys as a second way to sign in to an email account, next to the password (Sprint 10; DA-approved design).
passkeys/passkeytest
Package passkeytest is a software authenticator for tests: enough of one to make attestations ("none") and assertions that the WebAuthn library accepts, with the flags, origin and counter under the test's control.
Package passkeytest is a software authenticator for tests: enough of one to make attestations ("none") and assertions that the WebAuthn library accepts, with the flags, origin and counter under the test's control.
planleg
Package planleg caches planner calls and caps how many a user can make.
Package planleg caches planner calls and caps how many a user can make.
plugreminder
Package plugreminder sends the "Plug in tonight?" push: an opt-in, once a day, when the truck is parked at the saved home place, not plugged in, and below the SoC the user set.
Package plugreminder sends the "Plug in tonight?" push: an opt-in, once a day, when the truck is parked at the saved home place, not plugged in, and below the SoC the user set.
privacy
Package privacy holds repository-wide checks that keep real people's data out of the source tree.
Package privacy holds repository-wide checks that keep real people's data out of the source tree.
push
Package push handles Web Push subscriptions and notification delivery.
Package push handles Web Push subscriptions and notification delivery.
ratelimit
Package ratelimit implements the global upstream token bucket gating outbound calls to Rivian's GraphQL gateway.
Package ratelimit implements the global upstream token bucket gating outbound calls to Rivian's GraphQL gateway.
recap
Package recap turns a finished drive into a short natural-language narration ("Trip recap") via the operator-configured LLM provider.
Package recap turns a finished drive into a short natural-language narration ("Trip recap") via the operator-configured LLM provider.
receipts
Package receipts syncs what Rivian actually billed for each charging session (its Charging history) next to our own estimate.
Package receipts syncs what Rivian actually billed for each charging session (its Charging history) next to our own estimate.
repair
Package repair holds one-off data repairs run from the rivolt CLI.
Package repair holds one-off data repairs run from the rivolt CLI.
repair/chargeenergy
Package chargeenergy repairs the energy of AC home charges the recorder under-recorded.
Package chargeenergy repairs the energy of AC home charges the recorder under-recorded.
repair/phantom
Package phantom is the repair for phantom (stale-copy) live charges: rows the recorder fabricated from a replayed previous-session total, with no power and no SoC change behind them (architect's scratchpad/phantom-charges.md; devils-advocate's audit).
Package phantom is the repair for phantom (stale-copy) live charges: rows the recorder fabricated from a replayed previous-session total, with no power and no SoC change behind them (architect's scratchpad/phantom-charges.md; devils-advocate's audit).
repair/r2
Package r2 rebuilds the drives and charges of a vehicle whose vehicleState gear was unusable (R2 before #214: the gear stayed at the last D/R for days, so drives never closed and no charge opened).
Package r2 rebuilds the drives and charges of a vehicle whose vehicleState gear was unusable (R2 before #214: the gear stayed at the last D/R for days, so drives never closed and no charge opened).
retention
Package retention runs the daily sweeps that delete personal data once it has outlived its purpose: expired sessions (IP and User-Agent) and waitlist requests.
Package retention runs the daily sweeps that delete personal data once it has outlived its purpose: expired sessions (IP and User-Agent) and waitlist requests.
rivian
Package rivian is Rivolt's adapter to the unofficial Rivian owner-app GraphQL API.
Package rivian is Rivolt's adapter to the unofficial Rivian owner-app GraphQL API.
samples
Package samples persists raw vehicle_state polling snapshots.
Package samples persists raw vehicle_state polling snapshots.
secrets
Package secrets is the persistence layer on top of [`internal/crypto`](../crypto).
Package secrets is the persistence layer on top of [`internal/crypto`](../crypto).
sessions
Package sessions is the source-of-truth store for authenticated user sessions.
Package sessions is the source-of-truth store for authenticated user sessions.
settings
Package settings persists app-level configuration (AI provider keys, charging cost, Rivian session) in the shared Postgres database.
Package settings persists app-level configuration (AI provider keys, charging cost, Rivian session) in the shared Postgres database.
signupgate
Package signupgate implements RIVOLT_SIGNUP_DISABLED: an install-wide switch that closes every path that can create a new account on its own (the /signup page and API, access requests, OIDC and Kratos first sign-in).
Package signupgate implements RIVOLT_SIGNUP_DISABLED: an install-wide switch that closes every path that can create a new account on its own (the /signup page and API, access requests, OIDC and Kratos first sign-in).
signuprequests
Package signuprequests manages the pre-account waitlist: someone visits /signup without an invite, fills the "request access" form, and lands as a pending row that an admin later approves (minting a single-use magic-link signup token) or rejects.
Package signuprequests manages the pre-account waitlist: someone visits /signup without an invite, fills the "request access" form, and lands as a pending row that an admin later approves (minting a single-use magic-link signup token) or rejects.
statement
Package statement builds and sends the monthly statement email (scratchpad/statement-email-spec.md): pure rendering from the ledger's own Monthly, the signed unsubscribe token, the preference and send-state store, and the idempotent hourly job.
Package statement builds and sends the monthly statement email (scratchpad/statement-email-spec.md): pure rendering from the ledger's own Monthly, the signed unsubscribe token, the preference and send-state store, and the idempotent hourly job.
syntheticplan
Package syntheticplan is the deterministic trip planner that stands in for the gateway on installs that have no Rivian access (preview): a Valhalla route, an energy model, and charging stops picked from the DC fast-charger archive.
Package syntheticplan is the deterministic trip planner that stands in for the gateway on installs that have no Rivian access (preview): a Valhalla route, an energy model, and charging stops picked from the DC fast-charger archive.
tracing
Package tracing wires the OpenTelemetry trace SDK with an OTLP/HTTP exporter pointed at Grafana Tempo.
Package tracing wires the OpenTelemetry trace SDK with an OTLP/HTTP exporter pointed at Grafana Tempo.
tripadvice
Package tripadvice wraps the operator-configured AI provider to generate plain-language observations about a Rivian trip plan: charging stop summary, arrival SoC commentary, adapter warnings, and drive-mode suggestions when the plan looks sub-optimal.
Package tripadvice wraps the operator-configured AI provider to generate plain-language observations about a Rivian trip plan: charging stop summary, arrival SoC commentary, adapter warnings, and drive-mode suggestions when the plan looks sub-optimal.
tripmultiday
Package tripmultiday orchestrates a multi-day trip plan over the trip planner (Rivian's planTripWithMultiStopV2, or the replay planners on installs with no Rivian access).
Package tripmultiday orchestrates a multi-day trip plan over the trip planner (Rivian's planTripWithMultiStopV2, or the replay planners on installs with no Rivian access).
tripprofile
Package tripprofile derives an energy-consumption multiplier from a user's editable VehicleProfile (wheel size, tire type, roof / rear accessories, default cargo).
Package tripprofile derives an energy-consumption multiplier from a user's editable VehicleProfile (wheel size, tire type, roof / rear accessories, default cargo).
trips
Package trips persists per-user named trip templates for the planner.
Package trips persists per-user named trip templates for the planner.
tripweather
Package tripweather corrects a Rivian trip plan's per-waypoint SoC curve for weather conditions Rivian's planner doesn't see.
Package tripweather corrects a Rivian trip plan's per-waypoint SoC curve for weather conditions Rivian's planner doesn't see.
vehiclelease
Package vehiclelease holds a vehicle's lease terms and computes where the driver stands against the mileage allowance.
Package vehiclelease holds a vehicle's lease terms and computes where the driver stands against the mileage allowance.
weather
Package weather enriches a drive with the conditions at its start point and time.
Package weather enriches a drive with the conditions at its start point and time.
web
Package web embeds the built Vite web app into the Go binary.
Package web embeds the built Vite web app into the Go binary.
weekly
Package weekly is the opt-in weekly recap email: on Monday morning, last week's miles, energy, cost and efficiency, and lease pace if the user tracks a lease.
Package weekly is the opt-in weekly recap email: on Monday morning, last week's miles, energy, cost and efficiency, and lease pace if the user tracks a lease.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL