A Playnite extension that separates Xbox games you actually own from games you only played through Game Pass.
Playnite's Xbox library integration imports your play history, which mixes purchases together with Game Pass titles you no longer have access to. This plugin works out which is which and lets you decide what happens to each group.
Beta. Every action defaults to doing nothing. Run detection, read the report, and only then choose what you want changed.
Detection signs you in to your Microsoft account and reads your Store entitlements. Anything in your Xbox library with no matching entitlement was Game Pass access.
Entitlements are broader than purchases, so each one is classified:
| Verdict | Meaning | Counted by default |
|---|---|---|
| Bought | The SKU you hold can be purchased | Yes |
| In a bundle | Granted by something you bought, in the same transaction | Yes |
| Free to play | Every purchasable SKU lists at zero | Yes |
| No longer sold | No SKU can be bought any more, so ownership is assumed | Yes |
| You own add-ons | You hold DLC or another edition of the title | No |
| Gold or promo | A SKU that cannot be bought, with no matching purchase | No |
| Demo or trial | Flagged as a demo, or a Trial SKU | No |
You choose which categories count before each run. Games are then sorted into three groups, each with its own action: owned with a PC build, owned console only, and Game Pass.
Actions available per group: do nothing, tag only, hide, hide and tag, or (behind Advanced) delete and exclude from reimport.
- Install the
.pextfile, or extract the release into%AppData%\Playnite\Extensions\XboxOwnershipFilter - Restart Playnite
- Extensions → Xbox Ownership Filter: detect owned games
- Pick what counts as owned, sign in, and wait. The first run is slower because it looks up library entries that need edition matching.
- Read the summary, then open the manager to review before applying anything
Nothing in your library changes until you choose an action and press Save and apply.
Detection is a starting point, not an authority.
- Ticking a game marks it owned permanently, whatever detection thinks
- Unticking a detected game records "I do not own this" and that survives future runs
- The Source column shows whether a verdict came from you, from detection, or both
Three files, all in the plugin's data folder and all openable from the manager window:
- detection.csv — every entitlement, with the SKU, price, and reason behind each verdict
- unmatched.csv — every library entry detection could not account for, and what it tried
- audit.csv — every change this plugin has made to your library, appended over time
If something is classified wrongly, those first two files are what to attach to an issue.
Cloud streaming is not a category. Nothing in the Xbox or Store APIs exposes Cloud Gaming eligibility. Console-only titles are labelled as such because they cannot be installed on a PC, not because they cannot be played.
Delisted purchases resolve to owned. When no SKU of a product can be bought any more, a withdrawn purchase and an old giveaway look identical. Old purchases are far more common, so those count as owned. A Games with Gold title that has since been pulled from the Store will be counted incorrectly.
Add-on ownership is suggestive, not conclusive. People buy DLC for games they access through Game Pass, so the "owned add-ons" rule is off by default. Turning it on catches fragmented editions at the cost of marking those Game Pass titles owned.
Editions fragment. A game's PC and console builds can be separate products with separate ids. Most are reconciled by matching on title id or add-on parentage, but some will need a manual tick.
One region at a time. Store lookups use a single market, set under Advanced and defaulting to US. Pricing and availability are regional, so the wrong setting can misreport free-to-play titles.
Console entries need the Xbox plugin's console import enabled. Without it, console-only purchases never appear in Playnite and the owned-console group stays empty.
Sign-in happens in Playnite's embedded browser, on Microsoft's real sign-in page. The plugin never renders a credential form and never sees your password.
The access token lives in memory for the session and is never written to disk. There is no refresh token, so signing in again is a browser redirect that is usually silent because the webview keeps its cookies.
Nothing is sent anywhere except Microsoft's own Store endpoints. There is no telemetry.
Requires Visual Studio 2022 and .NET Framework 4.6.2. Open the solution and build. Close Playnite first, since it locks the output assembly.
See BUILD.md for details.
MIT. See LICENSE.
Please include:
- What you expected and what happened
detection.csvandunmatched.csv- The name of a specific game that was classified wrongly
A single misclassified game with its report rows is far more useful than a description of the overall result.
These reports describe your account's game entitlements and play history. They contain no credentials, but they are personal data: skim them before attaching and redact anything you would rather not share.
The manager's Advanced section can run the classification engine against a CSV of
manufactured entitlements: no sign-in, no network, nothing changes. See docs/SIMULATION.md.
This is also the fastest way to help diagnose a bug: rows that reproduce a wrong verdict are
a complete, shareable test case.