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.
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
- Root SSH access to the head unit and root's private key. Tools such as
- A way to reach the head unit's SSH: the car's Wi-Fi hotspot (default
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,
- 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
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
- 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:
- On github.com: your picture → Settings → Developer settings →
- Name it, and pick an expiration (No expiration keeps the car working).
- Resource owner: your account, or the organisation that owns the
- Repository access: Only select repositories, and pick the private
- Permissions: add Contents, set to Read-only.
- Generate token and copy it (
github_pat_…); GitHub shows it once.
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
- Wi-Fi, such as a phone's hotspot: Settings → Wi-Fi. The car's own
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 (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
- A unique id, with a prefix (
acme_gauges). mguHmi:["ID7"],["ID8"]or both.requires(optional): other components it needs, installed first."mguInternet": trueinpackage.jsonif it needs internet.
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.