IGTech
Collect electrical readings from an ESP32 at home and turn them into useful charts, date-range statistics, and consumption-based cost estimates without paying for additional infrastructure.
Loading
A hobby web app for finding Steam games, saving a shortlist in the browser, and checking US-store prices and discounts.
From Steam search to a personal shortlist
SteamSaverFind
Next.js route handlers · Steam Store APIs
Save
App IDs · browser localStorage
Compare
Current USD prices · discounts · detail pages
Browser → /api/steam/search → Steam storesearch
Choosing a result saves its App ID to the local My Games list.
Saved or Featured IDs → /api/steam/appdetails → deal cards
TanStack React Query loads game details for the library. Featured IDs come from a static curated list.
/game/[appId] → server fetch → Steam appdetails → detail page
The server fetches game content for the detail page; browser controls handle saving and sharing.
In this case study
I built SteamSaver as a solo hobby project to keep an eye on game prices without adding accounts, a database, or Steam login. The first public deployment was on October 3, 2023. A major refresh on July 24, 2026 added the search-to-save workflow, library filtering and sorting, game detail pages, and updated branding and SEO.
Make it easy to find Steam games, keep a personal shortlist, and see which titles are on sale. The goal was a small browser-based tool, without an account system or integration with a user's Steam wishlist.
Search Steam titles and save their App IDs to My Games in the browser. The library combines saved games with a separate curated Featured catalog, fetching current prices and discount information. Users can filter by name or publisher, show games on sale, and sort by price, discount, or name. Detail pages provide an overview, screenshots, supported platforms, requirements, and a link to Steam, with save/remove and sharing controls.
Proxy Steam through Next.js. Route handlers avoid client-side CORS restrictions, but upstream availability and rate limits still affect the app.
Store the shortlist in the browser. localStorage avoids an account system and application database. The tradeoff is no cross-device synchronization, and clearing browser storage removes the list. It is separate from an official Steam wishlist.
Use one pricing region. US-store requests keep currency and price comparisons consistent, but those prices may differ from what a visitor pays in their own region.
Fetch details per game. Parallel requests and short revalidation keep the implementation straightforward. Larger lists create more upstream requests.
Use Steam's rich detail content. Rendering store HTML preserves the supplied formatting and makes that external markup a trust boundary to account for.
The Next.js App Router serves the interface and route handlers that proxy Steam Store search and app-details requests. The browser library uses TanStack React Query to load details, while individual game pages fetch on the server. Helpers normalize free, discounted, bundle-only, and unavailable pricing. Requests use the US store region for consistent USD pricing. Saved App IDs stay in localStorage; the Featured catalog is a static list. The app includes theme selection, page metadata, a sitemap, robots configuration, an Open Graph image, and Vercel Analytics.
The deployed app supports the full search, save, browse, filter, and game-detail workflow, including sharing or opening a title on Steam. An author-provided Vercel Analytics snapshot for a 30-day production window recorded 38 visitors and 47 page views. These are small usage figures from that snapshot, not a growth or business-impact claim.
My Games belongs to the browser and is not synchronized with Steam or other devices. There is no price history, price alert, or notification system. Prices reflect the US store, and game data depends on Steam's HTTP APIs. The project has linting and hosted analytics, but no automated test suite or CI workflow was reported in the repository brief.
Collect electrical readings from an ESP32 at home and turn them into useful charts, date-range statistics, and consumption-based cost estimates without paying for additional infrastructure.
Make the connected-device information shown by my router accessible without repeating the same manual login and navigation. I wanted to retrieve device addresses and make router interactions programmable through the interface that was available.