Profile
Back to NewsBack
GitHub Trending 7 min
Reader Mode
robertnisipeanu/mgu-store: App store for BMW iDrive 7 / iDrive 8 head units: install and update apps from GitHub repos, URLs and USB sticks

robertnisipeanu/mgu-store: App store for BMW iDrive 7 / iDrive 8 head units: install and update apps from GitHub repos, URLs and USB sticks

4 hours ago

mgu-store

An app store for BMW iDrive 7 and iDrive 8 head units (MGU). Browse, install, update and remove apps on the car's screen, from GitHub repositories, web addresses or a USB stick.

It installs:

  • the Store app;
  • the updater, which downloads and installs what the Store asks for;
  • the deploy tool, which performs and can roll back every install;
  • app privacy, which keeps installed apps out of the head unit's reports to BMW;
  • the renderer, which draws the Store and other apps' graphics;
  • Python, for apps the head unit builds from source;
  • the internet uplink, for internet through a USB adapter, an LTE stick, a tethered phone or Wi-Fi.
iDrive 8 is tested in an emulator only, not yet on a real car. On iDrive 8, installs and removals take effect at the next head-unit restart.

Screenshots

The Store: apps and head-unit tools from every source.

!The Store page, listing installed tools and the apps available from the sources

An app's page, with its source, version and Install.

!The page of the Drag Timer app, with its version, source and an Install button

Installed: the apps and tools on the head unit.

!The Installed page, listing the installed apps and head-unit tools with their versions

Settings: sources, Wi-Fi, accounts and phone access.

!Settings, with the default sources, Wi-Fi, Accounts and Check now

Adding a GitHub repository: pick its releases, tags or a branch.

!Adding a GitHub repository as a source, offering Releases, Tags and its branches

Requirements

  • A computer (Windows 10/11, macOS or Linux) with
Node.js 18 or newer and the OpenSSH client.
  • Root SSH access to the head unit and root's private key. Tools such as
idrive7-8-ssh-root set it up over an ENET cable.
  • A way to reach the head unit's SSH: the car's Wi-Fi hotspot (default
address 172.16.222.97), ENET, or any other SSH route.
  • The car parked and on stable power until the install finishes.

Install

Connect the computer to the head unit (the car's Wi-Fi hotspot or an ENET cable), then run the installer with root's SSH key:

# macOS, Linux
curl -fsSL https://raw.githubusercontent.com/robertnisipeanu/mgu-store/main/deploy/mgu-install.js | node - first-install --identity ~/.ssh/mgu_root_key
# Windows PowerShell
irm https://raw.githubusercontent.com/robertnisipeanu/mgu-store/main/deploy/mgu-install.js -OutFile mgu-install.js; if ($?) { node mgu-install.js first-install --identity $HOME\.ssh\mgu_root_key }

It needs Node 18 or newer, finds the head unit by itself and says which connection it used. Restart the head unit when the installer asks. The Store's tile then appears among the car's apps, and every later update comes through the Store.

| Option | What it does | |---|---| | --identity | root's private SSH key | | --host

, --port | reach the head unit at this SSH address instead (port 22 unless given); for an SSH config alias, give its port with --port | | --user | SSH user (default root) | | --ssh-opt | an extra ssh -o option, e.g. ConnectTimeout=30; repeatable. Through a jump host, give --host too: --host --ssh-opt ProxyJump= | | --token | asks for a GitHub token, for private repositories | | --no-uplink | leaves out the internet uplink | | --no-renderer | leaves out the renderer |

Using the Store

The side menu has four pages:

  • Store: apps and tools from your sources, with their state (installed,
update available, restart pending, …).
  • Installed: what is installed, with Update and Update all.
  • USB: what a plugged-in USB stick offers.
  • Settings: sources, Wi-Fi, accounts, phone access, Check now and
Restart head unit.

Open an app or tool to install, update or remove it. Updates never install on their own. Tools marked Restart pending take effect after a head-unit restart (Settings → Restart head unit).

Sources

The Store comes with these sources: this repository, idrive7-apps and idrive-apps (with the renderer that draws on the instrument cluster and the HUD, and the CarPlay map on the instrument cluster).

To add one: Settings → Add source, then type owner/repo, a GitHub link, or the https:// address of a catalog.json. For a GitHub repository, pick what to follow from what it has: Releases, Tags or one of its branches.

On iDrive 8, Add source and Add token open the Store's on-screen keyboard while mgu-render draws the Store. On the Store's widget screens (no mgu-render), typing doesn't work yet on iDrive 8: add sources and tokens from the phone page or the computer, or use Sign in with GitHub.

Private repositories

Add an account in Settings → Accounts:

  • Sign in with GitHub: scan the QR code, enter the code on your phone
and sign in. The repository also needs the mgu-store GitHub App installed.
  • Add token: a GitHub token. Typing it on the phone page or with
node mgu-install.js token --identity on the computer is easier than on the car.

Creating a token:

  1. On github.com: your picture → Settings → Developer settings →
Personal access tokens → Fine-grained tokens → Generate new token.
  1. Name it, and pick an expiration (No expiration keeps the car working).
  2. Resource owner: your account, or the organisation that owns the
repositories. One token covers one owner.
  1. Repository access: Only select repositories, and pick the private
repositories the car should read.
  1. Permissions: add Contents, set to Read-only.
  2. Generate token and copy it (github_pat_…); GitHub shows it once.
An organisation may have to approve the token first. For a repository of someone else's account, use a classic token with the repo scope instead.

Phone page

Settings → Phone access → On shows a QR code. Scan it with a phone on the car's hotspot to see sources, installs, errors and logs, and to add sources and accounts with the phone's keyboard. Turn it off when done.

Internet

The internet uplink gives the updater and apps that need it internet through:

  • a USB Ethernet adapter;
  • an LTE stick (e.g. Huawei E3372h);
  • an Android phone with USB tethering;
  • an iPhone with Personal Hotspot on, kept unlocked (tap Trust when
asked); its USB music playback stops while it tethers;
  • Wi-Fi, such as a phone's hotspot: Settings → Wi-Fi. The car's own
hotspot and wireless CarPlay keep working beside it. On iDrive 7 units with a Broadcom radio, WPA3-only networks can't be joined.

The Store shows Online once connected.

Offline: USB stick

A car without internet installs and updates from a USB stick. On the computer:

node mgu-install.js usb-repo <stick> [github:owner/repo | <catalog URL> | <folder> | <package file> ...]

Without inputs it copies this repository's newest release. Plug the stick into the car and use the USB page.

Publishing your apps

Any GitHub repository or HTTPS address can be a source, in one of three layouts:

| Layout | What the repository has | |---|---| | Releases | built @.tgz (or .mgu) packages attached to GitHub releases | | Catalog | a catalog.json listing each package (in a release named catalog, or at any HTTPS address) | | Repo tree | an mgu-repo.json; the head unit builds the apps from source |

Every app needs:

  • No BMW SDK files. The head unit links apps against the SDK already on
it.
  • A unique id, with a prefix (acme_gauges).
  • mguHmi: ["ID7"], ["ID8"] or both.
  • requires (optional): other components it needs, installed first.
  • "mguInternet": true in package.json if it needs internet.
docs/PUBLISHING.md has the full guide and examples.

Development

Each component's README covers its build and tests. deploy/README.md has the full installer reference (every command, including token --list/--remove) and deploy/hu, which installs components from a checkout; release/README.md covers releases.

License

Copyright (C) 2026 Robert Nisipeanu and IterioDev. GPL-3.0-or-later (LICENSE). Third-party parts keep their own licences: THIRD_PARTY_NOTICES.md.

Chat with me