Plan Guard sets streaming limits per user or per plan on your Emby server, enforces them while people watch, and detects accounts that are shared with other people, for example a paid account used in several homes at once.
What it does
- Limits per user or per plan: simultaneous streams, quality at home and away from home (bitrate), maximum resolution, and whether transcoding is allowed.
- Enforcement: a message, stopping the playback, or signing the device out.
- Hard to get around (from version 0.1.2): the stream limit counts the real playback requests per sign-in and title, including direct file, download and HLS requests, so a second sign-in with the same device or a player that does not report playback no longer gets around it. The quality cap also applies to direct requests. The client's address comes from the connection;
X-Forwarded-Foris trusted only from the proxies you list, and you can treat every client as away from home. - Library Guard (from version 0.1.2): Emby does not check a user's allowed libraries when an app asks for a title directly by its id. Plan Guard answers "not found" for titles the user cannot see (details, series and season lists, playback, streaming, download). Administrators and Share Links guests are not affected; you can turn it off on the plugin page.
- Shared-account detection: the same account used from different places and networks at the same time, and "impossible travel".
- Works with Cashier: every paid plan gets its own limits profile automatically.
- Activity log and admin pages.
Requirements
- Emby Server 4.10.1 or newer.
- Optional: Cashier, for limits profiles per paid plan.
What it sends where
- Geolocation database: uses the database already downloaded by Security Notifications or Access Log; if none exists, downloads DB-IP Lite (
download.db-ip.com, no account, CC BY 4.0) at plugin start (refreshed at start after 35 days), only if sharing detection is on (on by default). Download only; IP geolocation happens locally. - No other external connection besides the licensing client. Pages load no external resources.
- Actions towards clients (on your server): message, stop playback, sign-out (token revoked), optional device block (off by default). Default action on sharing: notify only.
- Plus the licensing client, the same in every plugin: see Licensing and privacy in our plugins.
IP Geolocation by DB-IP. The DB-IP Lite databases are licensed under CC BY 4.0.
Stored locally:
state/access.json: per-session accesses (user, device, IP, local/remote, playing or not, time, approximate coordinates, ASN, city/country), at most once every 2 min per combination; kept 31 days, max 20,000 records.state/actions.json: action log (time, user, device, title, step, reason), max 500. Sharing alerts also appear in the server's activity log.- Profiles and assignments in the plugin configuration;
geoip/*.mmdbdatabases.
Client compatibility
- Stream and bitrate limits are synced into the server's native settings: 🟢 any client.
- Emby can't refuse playback before it starts, so enforcement is reactive: message → Stop → sign-out. ✅ Emby Web ignores Stop, so the firm stop is sign-out (end-to-end 13/13). From version 0.1.2, direct play above the profile's quality cap is refused.
- Clients without remote control (e.g. Infuse, Kodi, DLNA) are signed out directly (by design; ✅ simulated via API; ❔ not tested on the real apps). Messages show only in clients with remote control.
- Native Emby apps (Android, iOS, Android TV, Samsung, LG, Roku, Apple TV): ❔ not tested (real-device matrix in progress).
Legend: ✅ verified (end-to-end or on-device test) · 🟢 server-side, works with any client (by design, no client-specific test) · ➖ not applicable · ❔ not tested.
Licensing
One license per Emby server. Monthly, yearly or lifetime, or included in the Emby bundle. Free 30-day trial. The plugin is licensed under our EULA.
Plan Guard is our own code, written from scratch by MediaLab Works; it contains no third-party code. The location data comes from DB-IP and is downloaded by your server.
