One shelf for every game you own, arranged however you want.
Download for Windows · Windows 10/11, no dependencies
The installer isn't code-signed, so SmartScreen will warn on first run — "More info" then "Run anyway".
Windows 11 with Smart App Control enabled will refuse to run it at all. Smart App Control blocks unsigned executables that carry a Mark of the Web — which anything downloaded from here does — and unlike SmartScreen it offers no override. That is the feature working as designed. Until Shelf is signed, the options are to build it yourself (a locally built installer carries no Mark of the Web) or to install it on a machine where Smart App Control is off.
Turning Smart App Control off is not a recommendation: it cannot be turned back on without reinstalling Windows.
Games end up scattered across Steam, Epic, the Xbox app, and a few loose installers, and none of those launchers will show you the others. Shelf scans all of them, puts every game in one grid, and lets you organize it your own way instead of by whoever happens to be selling it.
Early. The scanner works; the UI is being built.
Working now
- Steam — reads
libraryfolders.vdfandappmanifest_*.acf, including games on secondary drives. Pulls install size and last-played time. - Epic — reads the launcher's
.itemmanifests. Filters out DLC and plugins, which Epic lists alongside actual games. - Xbox / Microsoft Store — enumerates
C:\XboxGamesand resolves each one to a launch AUMID via the shell. - Ubisoft, Riot, Rockstar, Roblox — none of these publish a readable library
format, but all of them register an uninstaller, and that uninstaller carries
the ID the launcher needs to start the game. Siege's uninstall string ends
in
uplay://uninstall/635, so it launches withuplay://launch/635/0.
Each source is scanned independently, so one broken launcher doesn't take the whole scan down with it. Titles that appear in more than one place — Steam games also register uninstallers — are attributed to whichever scanner has the better metadata.
- Collections — group games into your own shelves that cut across launchers, because "co-op with friends" is a more useful category than "bought on Epic". Drag a game onto a shelf, or right-click it for a checklist. A game can sit on as many shelves as you like.
- Every installed application, on its own tab. Start Menu shortcuts plus Store
packages, filtered by folder and target type rather than by guessing at
names — control panels and admin consoles live in known places and point at
.msc, not.exe. - Artwork for everything, not just Steam. Four strategies, best first: Steam's portrait art by appid, then by name for games that also ship on Steam but were installed elsewhere, then whatever logo a Store package carries, then the 256px icon embedded in the executable.
- Appearance settings — nine preset colors or any color you like via a wheel or hex code, five fonts, three tile sizes, and your own background image from a file or a web address, with an adjustable scrim.
- An announcements menu, fed by a JSON file in this repository.
- Hiding, because a list of 70+ apps needs it. Right-click to hide, and a Hidden view to put things back.
- Updates in place. New releases are found on launch and install from inside the app.
Collections are stored in library.json in the app's user data directory,
written via a temp file and rename so an interrupted save can't destroy the
shelves you already had.
Next
- Remembering how long you've played things
- Per-collection sort orders
Shelf reads notices.json from this repository on launch and shows anything new
in the bell menu. Publishing a notice is a commit — there is nothing to deploy
and no server involved.
The easiest way is the bundled tool. Double-click Broadcast.bat, or:
npm run broadcast
Type a title and message, press Publish, and it writes the feed, commits and
pushes for you. It edits the working copy it lives in, so it needs no token of
its own — pushing uses whatever git credentials the machine already has. It
stages only notices.json, so unrelated edits sitting in the working copy are
left alone.
Editing the file by hand works just as well:
[
{
"id": "unique-string",
"title": "Shown in bold",
"body": "Optional. Printed as plain text, never as markup.",
"date": "2026-08-27"
}
]Newest first. id is what tracks whether someone has read it, so changing an
existing id marks it unread for everyone again — give each notice a fresh one.
Being offline is the normal case for a launcher, so a failed fetch shows
nothing rather than an error.
npm install
npm run dev
To build a real installer instead — Start menu entry, desktop shortcut, no terminal involved:
npm run package
That writes release/Shelf Setup <version>.exe (~78 MB). It's unsigned, so
Windows SmartScreen will warn on first run; "More info" then "Run anyway".
Or skip the app and just exercise the scanners from the terminal:
npm run scan # list every game found, with source and size
npm run launch -- siege # start one by partial name
npm install can leave node_modules/electron/dist with only a locales
folder. The download is fine — the cached zip is complete — but extract-zip
can fail silently on Windows and still exit 0. Extract it by hand:
Expand-Archive "$env:LOCALAPPDATA\electron\Cache\*\electron-v*-win32-x64.zip" `
-DestinationPath node_modules\electron\dist -Force
"electron.exe" | Out-File node_modules\electron\path.txt -Encoding ascii -NoNewlineInstallers are built by GitHub Actions from a tagged commit, not on anyone's
machine — pushing a v* tag builds and publishes it. The workflow refuses to
run if the tag and the version in package.json disagree, because the updater
reads the version from the package and a mismatch would ship a release nobody
is ever offered.
Free code signing for release builds is provided by SignPath.io, with a certificate from the SignPath Foundation. (Application pending — until it is approved and in place, installers are unsigned and Windows will say so.)
Committers and reviewers: the project maintainer, @spladoof. Release builds are produced only by the GitHub Actions workflow in this repository, from a tagged commit.
Shelf has no accounts, analytics or telemetry, and your library never leaves your machine. See PRIVACY.md for what does get requested and why.
MIT. See LICENSE.
Node 24, Electron, React. Windows only for now — the scanners read Windows-specific launcher paths and the registry.