Steam games you'll actually like and don't already own. Website, Windows app, or run it yourself.
See the codeFind Steam games you'll actually like and aren't already playing. Sign in with your Steam account and it learns your taste from your library, weighted by how much you've played each game, then ranks the current sales (or the whole catalog) by how well each game matches you, with a "because you played …" explanation on every card. Everything you own is hidden. Play on a Steam Deck or Steam Machine? One switch keeps only the games Valve rates Verified or Playable there, and every card shows its rating.

![]() | ![]() |
![]() | ![]() |
![]() | ![]() |

| Phone | Filters | Basket | Tablet |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| What you need | Best for | |
|---|---|---|
| Website | A browser | Trying it right now, on any computer or phone |
| Windows app | Windows 10 or 11 | Everyday use; works with private Steam profiles |
| Run it yourself | Node.js 20.11+ | Running everything on your own machine, or tinkering |
Open https://steamdeal.vercel.app. Nothing to install. Sign in through Steam, paste your own Steam Web API key, or browse as a guest. Signing in through Steam needs your profile's Game details set to Public. Using your own key does not. On a phone or tablet, use your browser's Add to Home Screen to keep it as an app. The layout adapts to the screen: on phones the games become a compact list under a slim top bar, the filters open as a side sheet, and the view toggles scroll away with the content.
The app has two jobs.
Steam-Deals-Setup.exe
from the latest release and run it.
Windows SmartScreen will warn that the publisher is unknown (the installer is not code-signed yet):
choose More info → Run anyway. It installs for your user account; no admin rights needed.The X button hides the app to the tray so syncing keeps running; quit from the tray menu, or turn that off in Settings. Clicking the tray icon minimizes the window, or brings it back. The steamdeal.vercel.app/app page explains all of this for people who arrive from the website.
Download the code (green Code button → Download ZIP, or git clone), then in that folder:
npm install
Then either:
npm start
to run the desktop app from source (built and tested on Windows; Electron should also run it on macOS and Linux), or:
npm run web:local
to run the website on your own machine at http://localhost:3000. No accounts needed. The API-key and
guest options work straight away. To turn on "Sign in through Steam" locally, create a file named .env
in the folder with your own key and any long random string:
STEAM_API_KEY=your-32-character-key
SESSION_SECRET=any-random-string-at-least-32-characters-long
Two toggles at the top:
Basket. Press + on any game to collect sales. The basket shows the subtotal, what you're saving, an estimated tax for your state or province (Steam adds US and Canadian sales tax at checkout; elsewhere prices already include it), and the total. Nothing is purchased by Steam Deals: you review and pay in Steam's own checkout, in the Steam app, the website, or on your phone, since the cart belongs to your account.
It remembers.
Filters live in the left sidebar: minimum discount and rating, minimum review count, Steam Deck / Machine only (on: only games Valve rates Verified or Playable on Steam Deck or Steam Machine; off: every game. Cards carry a Deck ✓ / Machine ✓ badge for Verified and ~ for Playable, and the details panel lists every published rating), tags, hide-owned and wishlist-only. Click any card for details, a score breakdown, and why it matched you, plus buttons to open the store page in your browser or in the Steam client.
How the taste profile works. The app reads your library with playtime, picks the games you've played most (plus everything played in the last two weeks), and builds a weighted profile of Steam's store tags from them. Each candidate game's tags are compared against that profile relative to the whole catalog, so ubiquitous tags like "Singleplayer" don't count for much while distinctive ones do. The profile is re-checked on every launch and refresh: when your library or hours change, it's rebuilt, so it keeps up with what you're playing now. Tags for games it has already seen are cached, so a rebuild is a handful of requests. You can collapse the "Your taste" panel with Hide.
Deal score = 40% discount + 35% positive-review percentage + 25% popularity, where popularity is the review count on a fixed log scale (1,000 reviews = 50, a million or more = 100), so a game's score doesn't change with what else is loaded. In All-games mode the discount term drops out. The For-you ranking blends taste match and deal score; the "Taste over deal" slider in Settings sets the mix. All weights are adjustable.
Settings also has the store region and language (prices follow the region) and the scan depth: 3,000, 10,000 or 25,000 most-popular items, or everything on sale (about 70,000 items, two to three minutes). Results stream in as pages arrive, so the first cards show up in about a second at any depth.
%APPDATA%\Steam Deals. Sign out wipes the session. It talks only to Steam,
plus steamdeal.vercel.app for two things: one request to guess your state or province for the basket's tax
estimate (nothing stored), and, only once you pair a device, the shared basket (a random pairing key, game
ids, names and prices, and which of them are in your cart; never account details). "Unpair all devices" in
the app deletes that shared basket from the site.Not affiliated with Valve Corporation. Steam is a trademark of Valve Corporation.
Requires Node 20.11 or newer.
npm install
npm start # run from source
npm run check # lint, import check and unit tests
npm run dist # check, then build release/Steam Deals Setup x.y.z.exe
The interface is plain ES modules shared by the desktop app and the website, split into small files by
layer: pure logic (unit-tested), data loading, shared widgets and views. The Windows app's main process is
split the same way (window, tray, deep links, IPC handlers per feature, the cart-sync engine).
ARCHITECTURE.md maps every folder; SPEC.md describes the design in detail.
Website (web/): static page plus serverless functions on Vercel's free Hobby plan. web/src/web-api.js
(with web/src/browser-api/) implements the same interface the desktop preload exposes, backed by web/api/*. Deal pages are cached at
Vercel's edge for three hours, so every visitor shares one scan. "Sign in through Steam" is Steam's OpenID
login; it is enabled when the project has STEAM_API_KEY and SESSION_SECRET (32+ chars) set as
environment variables. A visitor's own API key stays in their browser and is passed through to Steam only.
npm run web:local # run the website locally (plain Node, no accounts)
npm run web:build # assemble web/public from the shared sources
npm run web:deploy # check, build and deploy to production (needs `vercel login` and a linked project)
scripts/make-icon.py regenerates the icon (needs Python with Pillow). scripts/cdp.mjs drives a running
instance over the DevTools protocol for screenshots and inspection when started with --remote-debugging-port=9222.
Steam games you'll actually like and don't already own. Website, Windows app, or run it yourself.
See the codeFind Steam games you'll actually like and aren't already playing. Sign in with your Steam account and it learns your taste from your library, weighted by how much you've played each game, then ranks the current sales (or the whole catalog) by how well each game matches you, with a "because you played …" explanation on every card. Everything you own is hidden. Play on a Steam Deck or Steam Machine? One switch keeps only the games Valve rates Verified or Playable there, and every card shows its rating.

![]() | ![]() |
![]() | ![]() |
![]() | ![]() |

| Phone | Filters | Basket | Tablet |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| What you need | Best for | |
|---|---|---|
| Website | A browser | Trying it right now, on any computer or phone |
| Windows app | Windows 10 or 11 | Everyday use; works with private Steam profiles |
| Run it yourself | Node.js 20.11+ | Running everything on your own machine, or tinkering |
Open https://steamdeal.vercel.app. Nothing to install. Sign in through Steam, paste your own Steam Web API key, or browse as a guest. Signing in through Steam needs your profile's Game details set to Public. Using your own key does not. On a phone or tablet, use your browser's Add to Home Screen to keep it as an app. The layout adapts to the screen: on phones the games become a compact list under a slim top bar, the filters open as a side sheet, and the view toggles scroll away with the content.
The app has two jobs.
Steam-Deals-Setup.exe
from the latest release and run it.
Windows SmartScreen will warn that the publisher is unknown (the installer is not code-signed yet):
choose More info → Run anyway. It installs for your user account; no admin rights needed.The X button hides the app to the tray so syncing keeps running; quit from the tray menu, or turn that off in Settings. Clicking the tray icon minimizes the window, or brings it back. The steamdeal.vercel.app/app page explains all of this for people who arrive from the website.
Download the code (green Code button → Download ZIP, or git clone), then in that folder:
npm install
Then either:
npm start
to run the desktop app from source (built and tested on Windows; Electron should also run it on macOS and Linux), or:
npm run web:local
to run the website on your own machine at http://localhost:3000. No accounts needed. The API-key and
guest options work straight away. To turn on "Sign in through Steam" locally, create a file named .env
in the folder with your own key and any long random string:
STEAM_API_KEY=your-32-character-key
SESSION_SECRET=any-random-string-at-least-32-characters-long
Two toggles at the top:
Basket. Press + on any game to collect sales. The basket shows the subtotal, what you're saving, an estimated tax for your state or province (Steam adds US and Canadian sales tax at checkout; elsewhere prices already include it), and the total. Nothing is purchased by Steam Deals: you review and pay in Steam's own checkout, in the Steam app, the website, or on your phone, since the cart belongs to your account.
It remembers.
Filters live in the left sidebar: minimum discount and rating, minimum review count, Steam Deck / Machine only (on: only games Valve rates Verified or Playable on Steam Deck or Steam Machine; off: every game. Cards carry a Deck ✓ / Machine ✓ badge for Verified and ~ for Playable, and the details panel lists every published rating), tags, hide-owned and wishlist-only. Click any card for details, a score breakdown, and why it matched you, plus buttons to open the store page in your browser or in the Steam client.
How the taste profile works. The app reads your library with playtime, picks the games you've played most (plus everything played in the last two weeks), and builds a weighted profile of Steam's store tags from them. Each candidate game's tags are compared against that profile relative to the whole catalog, so ubiquitous tags like "Singleplayer" don't count for much while distinctive ones do. The profile is re-checked on every launch and refresh: when your library or hours change, it's rebuilt, so it keeps up with what you're playing now. Tags for games it has already seen are cached, so a rebuild is a handful of requests. You can collapse the "Your taste" panel with Hide.
Deal score = 40% discount + 35% positive-review percentage + 25% popularity, where popularity is the review count on a fixed log scale (1,000 reviews = 50, a million or more = 100), so a game's score doesn't change with what else is loaded. In All-games mode the discount term drops out. The For-you ranking blends taste match and deal score; the "Taste over deal" slider in Settings sets the mix. All weights are adjustable.
Settings also has the store region and language (prices follow the region) and the scan depth: 3,000, 10,000 or 25,000 most-popular items, or everything on sale (about 70,000 items, two to three minutes). Results stream in as pages arrive, so the first cards show up in about a second at any depth.
%APPDATA%\Steam Deals. Sign out wipes the session. It talks only to Steam,
plus steamdeal.vercel.app for two things: one request to guess your state or province for the basket's tax
estimate (nothing stored), and, only once you pair a device, the shared basket (a random pairing key, game
ids, names and prices, and which of them are in your cart; never account details). "Unpair all devices" in
the app deletes that shared basket from the site.Not affiliated with Valve Corporation. Steam is a trademark of Valve Corporation.
Requires Node 20.11 or newer.
npm install
npm start # run from source
npm run check # lint, import check and unit tests
npm run dist # check, then build release/Steam Deals Setup x.y.z.exe
The interface is plain ES modules shared by the desktop app and the website, split into small files by
layer: pure logic (unit-tested), data loading, shared widgets and views. The Windows app's main process is
split the same way (window, tray, deep links, IPC handlers per feature, the cart-sync engine).
ARCHITECTURE.md maps every folder; SPEC.md describes the design in detail.
Website (web/): static page plus serverless functions on Vercel's free Hobby plan. web/src/web-api.js
(with web/src/browser-api/) implements the same interface the desktop preload exposes, backed by web/api/*. Deal pages are cached at
Vercel's edge for three hours, so every visitor shares one scan. "Sign in through Steam" is Steam's OpenID
login; it is enabled when the project has STEAM_API_KEY and SESSION_SECRET (32+ chars) set as
environment variables. A visitor's own API key stays in their browser and is passed through to Steam only.
npm run web:local # run the website locally (plain Node, no accounts)
npm run web:build # assemble web/public from the shared sources
npm run web:deploy # check, build and deploy to production (needs `vercel login` and a linked project)
scripts/make-icon.py regenerates the icon (needs Python with Pillow). scripts/cdp.mjs drives a running
instance over the DevTools protocol for screenshots and inspection when started with --remote-debugging-port=9222.