Omahub
← All plugins
T

OmaRivian

by Tim Pearson

Read-only Rivian battery, charging, security, climate, location, and vehicle status in the Omarchy bar.

Security review

No obvious issues detected

Deterministic scan — not a security guarantee

None
Risk level
None
Analyzed commit
ccc92fc
Scanned
4 weeks ago

No potentially dangerous behavior detected in the analyzed commit.

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

Low
AI risk level
Low
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
ccc92fc
Reviewed
4 weeks ago

The deterministic scan found no issues, and the reviewed source matches the plugin's read-only, consent-oriented description: no vehicle-control commands, bounded and redirect-resistant network access, token storage in the Secret Service, plain-text QML rendering, and opt-in location handling. Residual risk comes from the sensitive nature of the Rivian account credentials and vehicle location data, not from destructive or obfuscated code.

  • The plugin authenticates to Rivian's private, unofficial API and stores session tokens in the Secret Service; these tokens may carry broader vehicle authority than the widget itself uses, so keyring protection is a real dependency.
  • Location data is disabled by default and removed when disabled, but enabling it writes coordinates to local state and can open the user's map application, which is sensitive behavior and should remain clearly user-controlled.
  • The repository's install/update flow tracks the default branch rather than a pinned commit, so this review covers the analyzed commit but not any future unpinned HEAD after approval.
How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/ttiimmaahh/omarivian --enable
Widgets #quickshell

OmaRivian

CI GitHub release

A read-only Rivian status widget for the Omarchy Quattro bar. Click the Rivian-inspired mark to see your vehicle's configured artwork, battery and range, charging, closures and locks, cabin climate, optional location, software, odometer, and last-contact information.

[!WARNING] OmaRivian uses Rivian's private, unsupported owner API. It is not affiliated with or endorsed by Rivian and may stop working when that API changes. Although OmaRivian ships no vehicle-control operations, the account session it stores may have broader authority. Protect your desktop keyring accordingly.

Project status

OmaRivian is an early-development 0.x release. Expect continued testing and interface or API changes while marketplace verification and broader vehicle coverage progress.

R2 telemetry is validated against the maintainer's vehicle. The legacy R1 path is intentionally retained, but the maintainer does not own an R1 and cannot fully validate it firsthand. R1 owners are especially welcome to test the widget and report model/year, missing fields, or regressions through GitHub issues.

Highlights

  • Compact bar panel inspired by mobile vehicle widgets
  • Automatically inherits the user's active Omarchy colors, typography, spacing, and display scaling
  • Rivian-provided artwork matching the vehicle model, paint, wheels, and configuration
  • Multiple-vehicle switcher
  • Honest stale and offline states with last-known data
  • Read-only request allowlist—no unlock, climate, charging, or wake commands
  • Password and one-time code entered in a terminal, never in QML or process arguments
  • Tokens stored in Linux Secret Service, not shell.json or plaintext files
  • Location disabled by default and omitted entirely from the local state file

Screenshots

Bar widget

<p align="center"> <img src="docs/images/omarivian-bar.png" alt="OmaRivian bar icon showing a synthetic 64 percent charge" width="100"> </p>

The compact charge label is optional. Enable it from the settings gear in the panel header, through Omarchy's bar settings, or run:

omarchy bar set io.github.ttiimmaahh.omarivian showChargeInBar true --json

Vehicle panel

<p align="center"> <img src="preview.png" alt="OmaRivian vehicle panel populated with synthetic demo telemetry" width="420"> </p>

All visible identity, location, and telemetry values in these screenshots are synthetic demo data.

Requirements

  • Omarchy 4 with the Quattro shell
  • Python 3.10+
  • secret-tool from the libsecret package
  • An unlocked Secret Service provider such as GNOME Keyring or KWallet
  • A Rivian owner account with at least one vehicle

No Python packages are required; the helper uses only the standard library.

Install

Install directly from GitHub:

omarchy plugin add https://github.com/ttiimmaahh/omarivian.git --enable

The widget defaults to the right side of the bar. Click its Rivian-inspired mark, open the settings gear in the panel header, and choose Link account. OmaRivian opens a terminal for email, hidden password, and MFA input. The password and MFA code are never saved.

To run linking manually from the plugin directory:

./tools/omarivian link

Usage

  • Left/right click: open or close the panel
  • Middle click: refresh status
  • R: refresh while the panel is open
  • Escape: return to vehicle details from settings, or close the panel from details
  • Tab / Shift-Tab: switch between adjacent Omarchy panels

Use the in-panel vehicle pills to switch cars. The selected vehicle alone is refreshed, reducing calls to the unofficial API.

Configuration

The percentage and location options are available from the settings gear in the panel header. All options can also be configured from Omarchy's bar settings or set on the widget entry in ~/.config/omarchy/shell.json:

Setting Default Description
refreshIntervalSec 900 Refresh interval. Enforced minimum: 300 seconds.
showChargeInBar false Show battery percentage beside the car icon on horizontal bars.
locationEnabled false Include current coordinates in widget state and show the map action.
unit automatic imperial, metric, or blank for automatic.

Location is sensitive and disabled by default, including after a clean installation. Enable it from the settings gear in the panel header, through Omarchy's bar settings, or run:

omarchy bar set io.github.ttiimmaahh.omarivian locationEnabled true --json

Changing location from the panel automatically refreshes the vehicle. When location is disabled, coordinates are not requested and are removed from ~/.local/state/omarivian/state.json. When enabled, coordinates are sent to OpenStreetMap only if Open in maps is clicked. If the panel shows Not reported, Rivian did not provide a location during that refresh; a sleeping or offline vehicle may report it after reconnecting.

Security and privacy

The QML panel invokes a narrow local helper. That helper contains only:

  • Authentication operations required to establish a session
  • getUserInfo to enumerate vehicles
  • GetVehicleState to read an allowlisted set of legacy R1 status fields
  • A bounded, read-only ParallaxMessages snapshot for missing R2 lock, closure, power-state, cabin-climate, and opt-in location fields
  • getVehicleImages to discover Rivian's configured, display-only vehicle render

There is no generic query CLI and no vehicle command implementation. Session tokens are stored under the omarivian application label through Secret Service. Each scheduled or manual refresh checks the access token's expiry before requesting data and renews it if expired or within five minutes of expiry. This avoids relying on Rivian's error labels: expired tokens can produce a generic INTERNAL_SERVER_ERROR rather than an authentication error. Decoded expiry is only a scheduling hint, not authentication proof, and is never written to the status cache.

Explicit authentication failures still trigger renewal and one retry, including for opaque tokens without readable expiry. Each poll performs at most one renewal and saves rotated credentials immediately, before further API work. Polling continues while the panel is closed; after downtime, the next poll renews an expired access token. No separate daemon or saved password is required. A revoked or expired refresh token still requires Link account; temporary network/keyring failures can recover on later polls. Last-known data and local artwork remain available, marked stale, including after a shell restart.

Authenticated HTTP requests reject redirects and cross-origin responses, and network, keyring, state, and preference reads have strict byte limits.

The sanitized state cache is mode 0600 and contains vehicle status plus identity summaries; full VINs are never written. Vehicle artwork is downloaded only from Rivian-controlled HTTPS hosts into ~/.cache/omarivian/vehicle-artwork, using mode 0700 directories and mode 0600 image files. QML loads the local file and never contacts Rivian directly. Unlinking removes that artwork cache.

OmaRivian does not collect analytics, operate a relay, or retain location history. Avoid posting state files or screenshots containing location information.

Unlink and remove

Unlink, under the settings gear in the panel header, requires confirmation and deletes the saved keyring session. You can also run:

./tools/omarivian unlink
omarchy plugin remove io.github.ttiimmaahh.omarivian

Removing the plugin does not automatically delete Secret Service entries or the local status cache; unlink first. To erase the non-secret cache afterward:

rm -rf "${XDG_STATE_HOME:-$HOME/.local/state}/omarivian" \
       "${XDG_CACHE_HOME:-$HOME/.cache}/omarivian"

Development

Omarchy scaling conventions

The shell derives typography and layout density from the user's theme and display preferences. QML contributions should:

  • Use Style.font.* for text and icon sizes.
  • Use Style.space(...) or semantic Style.spacing.* tokens for dimensions, margins, padding, gaps, controls, and hairlines.
  • Use Style.bar.* for bar geometry and fittedContentWidth / fittedContentHeight for panels.
  • Avoid manual device-pixel-ratio scaling and raw visual pixel sizes; reserve unscaled numbers for ratios, opacity, timing, and source-image crop fractions.

An importable, secret-free Postman collection and example environment for the same read-only API surface are in postman/. Rivian's private owner API uses its own GraphQL session/token flow rather than a documented OAuth 2.0 service.

GitHub Actions runs the Python and JavaScript tests plus Omarchy manifest validation and QML linting on every pull request, push to main, and release tag.

omarchy plugin validate .
qmllint -I "$OMARCHY_PATH/shell" BarWidget.qml Panel.qml
python3 -m unittest discover -s tests -p 'test_*.py'
node tests/model.test.js

For local shell testing, use the checkout helper. It validates the plugin, replaces an installed release with a symlink to this Git checkout, waits for Omarchy discovery, and enables it so saved source changes hot-reload:

./tools/local-plugin install
./tools/local-plugin status

Remove only the local symlink, or replace it with a clean clone pinned to the latest stable release tag:

./tools/local-plugin uninstall
./tools/local-plugin release
# Or validate a specific release:
./tools/local-plugin release v0.2.0

Switching modes preserves Secret Service credentials and cached state. Use the panel's Unlink action separately only when intentionally testing clean account onboarding.

To compare what Rivian actually returns against what the panel decides, dump the raw responses for the linked account:

./tools/dump-sample-data
# Include coordinates in the dump:
./tools/dump-sample-data --location

This writes vehicles.json, vehicle-state.json, parallax-state.json, and the derived normalized-vehicle.json to sample-data/. The dump is unredacted account data—VIN, vehicle identifiers, and optionally coordinates—so the directory is git-ignored and written with owner-only permissions. Nothing in the shipped plugin reads it.

Credits

The API behavior was independently implemented using public, unofficial community references including rivian-python-client (MIT) and Riviamigo (GPL-3.0) as documentation. No source from Riviamigo is included in this repository.

License

MIT. See LICENSE.