CoOp:Anything
Search any game and see how much of it you can play with friends: every co-op mod, its stage, quality and community rating.
Check which of your Steam games can run on an Android phone or handheld with DroidDeck, GameNative, or GameHub Lite. Your files stay on your device.
GamesHTML · PythonGitHub @notadevperseOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Check your Steam library to see which of your games run on an Android phone or handheld. Every game is rated for DroidDeck, GameNative, and GameHub Lite using public data: ProtonDB, GameNative reports, and anti-cheat lists. Runs in your browser; nothing is uploaded.
Taken from the repository README
Loading the full README.
Read the full README ↗By notadevperse · github.com/notadevperse/pocket-library
Check which of your Steam and GOG games you can play on an Android phone or handheld (an AYN Odin or Thor, a Retroid Pocket, an Anbernic, and so on) with DroidDeck, GameNative, or GameHub Lite. You get a page with every game in your library: how demanding it is, what players report, and how well it plays with touch, filterable by your Steam collections and playtime. Games you own on GOG are tagged GOG.
Try it: notadevperse.github.io/pocket-library. Tap Try an example library to see it straight away, or open your own Steam and GOG files.
Each option is a bookmark that works on a Steam or GOG page you already have open and saves a file to your Downloads. It sends nothing anywhere, and the file holds no account ID. Use option 1, option 2, or both: option 1 gives playtime, and option 2 adds the date you got each game. Option 3 adds your wishlist, and option 4 your GOG games. The readable code for all four is in pocket-library/bookmarks/.
Option 1: games and playtime. Works on your own games page even if your profile is private.
javascript:(() => { const help = 'Open your Steam games page first (steamcommunity.com/my/games/?tab=all), wait for your games to show, then click this bookmark again.'; function save(fileName, data) { const link = document.createElement('a'); link.href = URL.createObjectURL(new Blob([JSON.stringify(data)], { type: 'application/json' })); link.download = fileName; document.body.appendChild(link); link.click(); link.remove(); } try { const pageData = JSON.parse(window.SSR.renderContext.queryData); const owned = pageData.queries.find(q => q.queryKey[0] === 'OwnedGames'); const games = owned.state.data.map(g => ({ appid: g.appid, name: g.name, minutes: g.playtime_forever || 0 })); save('steam-games.json', { source: 'pocket-library', kind: 'games', saved: new Date().toISOString(), games: games }); } catch (err) { alert(help); } })();
steamcommunity.com/my/games/?tab=all, sign in if asked, and wait for your games to show.steam-games.json.Option 2: licenses, with dates. Lets the page sort by newest. Steam shows licenses 100 to a page, so it reads each page in turn, which takes a few seconds. It has no playtime, and some licenses are bundles or extras rather than games, so only the ones that match a game are used.
javascript:(async () => { const help = 'Open store.steampowered.com/account/licenses/ while signed in to Steam, then click this bookmark again.'; const pauseMs = 400; const maxPages = 200; function save(fileName, data) { const link = document.createElement('a'); link.href = URL.createObjectURL(new Blob([JSON.stringify(data)], { type: 'application/json' })); link.download = fileName; document.body.appendChild(link); link.click(); link.remove(); } function isoDate(text) { const d = new Date(text); if (isNaN(d)) { return text; } const two = n => String(n).padStart(2, '0'); return d.getFullYear() + '-' + two(d.getMonth() + 1) + '-' + two(d.getDate()); } function licensesOn(page) { const rows = [...page.querySelectorAll('table.account_table tr')].filter(r => r.querySelector('td.license_date_col')); return rows.map(row => { const cells = row.querySelectorAll('td'); const nameCell = cells[1].cloneNode(true); nameCell.querySelectorAll('div').forEach(d => d.remove()); const method = row.querySelector('td.license_acquisition_col'); return { name: nameCell.textContent.replace(/\s+/g, ' ').trim(), date: isoDate(cells[0].textContent.trim()), method: method ? method.textContent.trim() : '' }; }); } let page = document; let licenses = licensesOn(page); if (!licenses.length) { alert(help); return; } const seen = new Set([location.href]); for (let n = 1; n < maxPages; n++) { const next = page.querySelector('a.license_paginator_next'); const url = next && next.href; if (!url || seen.has(url)) { break; } seen.add(url); await new Promise(done => setTimeout(done, pauseMs)); const response = await fetch(url, { credentials: 'same-origin' }); page = new DOMParser().parseFromString(await response.text(), 'text/html'); const more = licensesOn(page); if (!more.length) { break; } licenses = licenses.concat(more); } save('steam-licenses.json', { source: 'pocket-library', kind: 'licenses', saved: new Date().toISOString(), licenses: licenses }); })();
store.steampowered.com/account/licenses/ and sign in if asked.steam-licenses.json.Option 3: your wishlist. Shows which games on your Steam wishlist could run on your device, before you buy them. It asks the Steam store for your own wishlist (one request, the same one the store makes to mark wishlisted games). The file holds only the games' Steam numbers; games outside Pocket Library's list show as Unknown.
javascript:(async () => { const help = 'Open store.steampowered.com while signed in to Steam, then click this bookmark again.'; function save(fileName, data) { const link = document.createElement('a'); link.href = URL.createObjectURL(new Blob([JSON.stringify(data)], { type: 'application/json' })); link.download = fileName; document.body.appendChild(link); link.click(); link.remove(); } try { if (location.hostname !== 'store.steampowered.com') { throw new Error('not on the store'); } const response = await fetch('/dynamicstore/userdata/', { credentials: 'same-origin', cache: 'no-store' }); const data = await response.json(); const wishlist = [...new Set((data.rgWishlist || []).map(String))]; if (!wishlist.length) { alert('No wishlist found. Your wishlist may be empty, or you may not be signed in. ' + help); return; } save('steam-wishlist.json', { source: 'pocket-library', kind: 'wishlist', saved: new Date().toISOString(), wishlist: wishlist }); } catch (err) { alert(help); } })();
store.steampowered.com and sign in if asked.steam-wishlist.json.Option 4: your GOG games. Adds the games in your GOG library, matched to Pocket Library's list by name and tagged GOG. A game you own on both stores shows once. DroidDeck and GameNative can sign in to GOG and load your library. GameHub Lite's GOG support isn't documented, so it isn't suggested for games you own only on GOG. It asks GOG for your own library, 100 games to a page, with a short pause between pages. GOG has no playtime to share, and games whose names don't match show as Unknown.
javascript:(async () => { const help = 'Open www.gog.com while signed in to GOG, then click this bookmark again.'; const pauseMs = 400; const maxPages = 100; function save(fileName, data) { const link = document.createElement('a'); link.href = URL.createObjectURL(new Blob([JSON.stringify(data)], { type: 'application/json' })); link.download = fileName; document.body.appendChild(link); link.click(); link.remove(); } if (location.hostname !== 'www.gog.com') { alert(help); return; } let games = []; try { for (let page = 1; page <= maxPages; page++) { if (page > 1) { await new Promise(done => setTimeout(done, pauseMs)); } const response = await fetch('/account/getFilteredProducts?mediaType=1&page=' + page, { credentials: 'same-origin' }); const data = await response.json(); games = games.concat((data.products || []).map(p => ({ id: String(p.id), name: String(p.title || '') }))); if (!data.totalPages || page >= data.totalPages) { break; } } } catch (err) { alert(help); return; } if (!games.length) { alert('No GOG games found. Your library may be empty, or you may not be signed in. ' + help); return; } save('gog-games.json', { source: 'pocket-library', kind: 'gog', saved: new Date().toISOString(), games: games }); })();
www.gog.com and sign in if asked.gog-games.json.Optional: your Steam collections. They're in a file called cloud-storage-namespace-1.json on the same computer:
C:\Program Files (x86)\Steam\userdata\<number>\config\cloudstorage\~/Library/Application Support/Steam/userdata/<number>/config/cloudstorage/~/.steam/steam/userdata/<number>/config/cloudstorage/If there are several numbered folders, use the newest.
steam-games.json, steam-licenses.json, or both), your GOG games (gog-games.json), or all of them, plus your Steam collections and wishlist if you want them. With a wishlist, My games and Wishlist at the top switch between the two. You can also drag the files onto the page.That's it. Next time you open the website, your library is still there. Open new files to update it, or tap Save a copy of this page to keep a file that works offline. The game data is refreshed once a month, and games that changed in the latest data say what changed.
To use your library on your phone too, open the files there (send them to yourself), or open the saved copy.
Look up any game. The website also has a search box for any game with a ProtonDB report, about 34,500 games, whether you own it or not. It needs no files. Type a name, a Steam app ID, or paste a Steam store link. GOG games show up by name when they're also sold on Steam. Each result says how many ProtonDB reports it's based on, because many games have only a few.
Pocket Library started as a late-night chat with a friend about emulation on their new phone. What was once a Claude skill now runs in any browser; Claude is still there as an optional extra for games without data.
Claude adds two things: it judges games the data doesn't cover, and it keeps a private copy of your page in Claude that it updates when you ask. It works with a free Claude account.
Set up Claude once:
pocket-library-skill.zip.Then ask:
Start a chat, attach the files, and say the line. For updates, include your Pocket Library link so Claude updates that page instead of making a new one.
| What | Attach | Say |
|---|---|---|
| First fill | steam-games.json and/or steam-licenses.json; optionally gog-games.json, steam-wishlist.json, and the collections file | Fill my Pocket Library. My device is a [phone or handheld]. |
| New games | a fresh steam-games.json or steam-licenses.json | Update my Pocket Library games: [link] |
| Collections | a fresh collections file | Update my Pocket Library collections: [link] |
| Wishlist | a fresh steam-wishlist.json | Update my Pocket Library wishlist: [link] |
| GOG games | a fresh gog-games.json | Update my Pocket Library GOG games: [link] |
| New device | nothing | I have a new device, a [phone or handheld]. Update my Pocket Library: [link] |
| The three apps | nothing | Check the latest DroidDeck, GameNative, and GameHub Lite releases and update my Pocket Library: [link] |
| Compatibility | nothing | Re-check compatibility for my games and update my Pocket Library: [link] |
| Everything | your files | Refresh everything in my Pocket Library: [link] |
Not sure of your model? On a phone it's in Settings → About phone. Claude looks up its chip and graphics. Snapdragon chips with Adreno 730 graphics or newer are fully supported: recent flagship phones, the AYN Odin 2, and the AYN Thor. Older Snapdragons, such as the Retroid Pocket 5's, are partly supported. Most Anbernic devices, and other devices with MediaTek, Unisoc, Exynos, or Tensor chips, use Mali, Immortalis, Xclipse, or PowerVR graphics, which DroidDeck doesn't support. On those, the page shows Medium and Heavy games one step heavier.
Each game gets a weight, from Steam's minimum requirements, and separate reports from players.
The list covers 11,064 Steam games: Steam's top sellers, about 2,160 Steam Deck Verified games, and every game that had 5 or more ProtonDB reports as of October 2026. Of these, 10,814 are backed by data. GOG games are matched to the list by name, so a game sold only on GOG usually shows as Unknown. On the website, games outside the list show as Unknown; Claude can judge them for you. Look up any game searches a bigger list, every game with at least one ProtonDB report, and gives a ProtonDB verdict from even 1 report, with the count.
With Claude, re-checking compatibility downloads about 475 MB of public data, checks your whole library against it in seconds, and has Claude look at the few games the data flags. It never crawls Steam or any app's servers. Each request counts toward your Claude usage limits.
Best effort at the time of publishing. Specifically:
index.html: the website. It's made from pocket-library/template.html by scripts/make_web.py; edit the template, not this file.lookup.json: the list for Look up any game, made each month by scripts/make_lookup.py. Only the website uses it, so it isn't in the skill.screenshots/: the pictures at the top, from the example library.fonts/: the website's fonts, Chakra Petch and IBM Plex, both under the SIL Open Font License (the license files are in the folder).pocket-library-skill.zip: the skill to upload to Claude.pocket-library/: the same skill unzipped, so you can read it:
SKILL.md: the instructions Claude follows.template.html: the blank page.ratings.json: the 11,064 starting entries. The format is described at the top of scripts/ratings.py.example-library.json: the example library, about 100 well-known games with made-up playtime, plus a short wishlist.apps.json: the three apps' latest versions.bookmarks/: readable code for the four bookmarks.scripts/:
build.py fills the page.fetch-sources.sh downloads the public data, and evidence.py checks games against it.make_bookmarks.py turns the bookmark code into one line.make_web.py makes the website, and make_zip.py makes the skill zip.check_apps.py looks up the apps' latest releases.changes.py says in plain words what changed for each game in a refresh.make_lookup.py makes lookup.json for the website's Look up any game.tests/: checks that run on every change (python3 -m unittest discover tests)..github/workflows/: the check on every change, and the monthly data refresh, which re-downloads the public data, re-checks every game, notes what changed for each game, rebuilds the lookup list, updates the app versions, and opens a pull request to approve.No skill? Attach the files in pocket-library/ to your chat along with your own files, and add "Follow SKILL.md."
The code and page are under the MIT License: free to use, copy, and change, as long as copies keep the license notice crediting notadevperse. Provided as-is, without warranty.
The website bundles Chakra Petch (trimmed to the weights the page uses) and IBM Plex (IBM's own Latin web files, unchanged), both under the SIL Open Font License 1.1.
ratings.json and lookup.json (the list behind Look up any game) are built partly from these open datasets:
ratings.json and lookup.json are shared under the ODbL as well: you can use and change them freely, as long as you credit the sources and share changed versions under the same license. lookup.json is mostly ProtonDB data and says so in its license field.Pocket Library would be guesswork without these people. Thank you to everyone who writes ProtonDB reports and to the ProtonDB maintainers for publishing them openly; to the GameNative team and every player who rates a game in the app; to PCGameBenchmarks for sharing its requirements data; to the AreWeAntiCheatYet contributors for tracking anti-cheat; to Fronkon Games for the Steam Games Dataset; and to the DroidDeck, GameNative, and GameHub Lite developers for making PC games playable on Android at all. Entries were compiled, and the code written, with help from Claude.
Not affiliated with Anthropic, Valve, Steam, GOG, DroidDeck, GameNative, GameHub, GameSir, ProtonDB, PCGameBenchmarks, AreWeAntiCheatYet, or Fronkon Games. Steam is a trademark of Valve Corporation, and GOG is a trademark of GOG sp. z o.o.
CHANGELOG.md