Changelog
Every release, from the first version to today. Each one also has its own page on GitHub Releases, with the download and its own banner.
Built to survive a redesign — plus smarter prices, a smart wishlist and catalog, library knowledge, seven languages everywhere, a privacy dashboard, automatic folder sync and calmer notifications
Resilience to site changes
- 🔧 Fixes what the redesign had broken, found by inspecting the live site: game-page prices — which GOG now prints with CSS, leaving a bare
2.99in the page text — are converted again and recorded in your price history (the page's currency is read from the class it puts on<body>); the game's genre is read from the site's own genre element again; cover badges appear on the new catalog's full-width tile covers; and the DRM-free banner sits at the bottom edge instead of covering the site's fixed header. - 🧭 One site adapter. Every lookup of gog.com's markup — game cards, prices, the game title, where the insights panel mounts — now goes through a single module that tries several strategies, most stable first (URL shape, page metadata, semantic hooks, class names, finally the text shape of a price). A layout change now degrades gracefully instead of silently switching features off.
- 🩺 "Check this page" in Advanced Options reports which lookups still work on the gog.com page you have open and which strategy found each one — the page path (no query string) and public store text only. Paste it into a bug report.
- Client-side navigation is detected explicitly (the old game's panel no longer lingers after you navigate away), and the page observer now survives the site swapping out its
<main>element — previously it would have been left watching a detached tree. - Prices written
19,99 €or split across several elements (<i>$</i>19.99) are recognized, and cover badges now appear on vertical tiles whose cover spans the full card width.
Look & feel
- 🎨 Native theme — reads gog.com's own background, text colour, accent (taken from its main call-to-action) and font each time a page loads, so badges and panels look like they belong there whatever the site looks like. Falls back to the default theme if the page can't be sampled.
Sync & integration
- ☁️ Sync across devices through a folder you choose (Dropbox, OneDrive, Google Drive, Syncthing — anything that already syncs a folder). The extension reads and writes one file,
gog-enhancer-sync.json, and merges tags, notes, play status, purchases, price alerts and price history from every browser pointed at it, resolving conflicts per record. Optional passphrase encryption. No server of ours and no new network permission — your folder is the whole transport. Needs the File System Access API (Chrome, Edge, Brave). - 🔎 Address-bar search: type
gog, press Tab, then a game name,tag:rpgorstatus:backlogto search your own library; Enter opens the game. - 📅 Refund-deadline calendar (
.ics) and 📝 Markdown export (grouped by play status, with #hashtags and notes) from the tag dashboard — both built on your device.
Convenience
- ⌨️ Keyboard navigation — J/K move between games on a grid and T tags the focused one; on a game page W adds it to your wishlist, N opens its note and A sets a price alert. Off by default; never acts while you're typing.
- 🖥️ System check on game pages compares the RAM requirement with what your browser reports. RAM only — browsers can't see your CPU, GPU or disk, and round the figure. If you type your own OS / processor / graphics card in Advanced Options, those are compared as plain text — an estimate, never a guarantee.
Deals & pricing
- 💸 "Is this discount real?" compares the struck-through base price with GOG's own "lowest price in the last 30 days" and with your tracked history, and says so when the base price looks inflated.
- ⏳ Offer countdown read from the offer's own end date — on the game page, as a badge on cards, and in the weekly digest.
- Price per hour of play (from the time-to-beat GOG already shows), the price in several currencies at once, a per-game sale rhythm (how often it drops, how deep, when the next one is likely), a comparison chart for 2–3 games, and "how much I saved" totals.
- National VAT presets for Germany, France, Spain, Italy, the Netherlands and Russia, next to the existing ones.
Wishlist & catalog
- 💖 Smart wishlist — sort by discount, distance from the tracked low, converted price or date added; filters for "near the low" and "ending soon"; a live total in the page header; grouping by tag or play status; and export to CSV, Markdown or
.ics. - 🗂️ Catalog tools — a bar above the grid: dim or hide games you already own, mark games not interested (hidden, with a restore switch), sort the 48 tiles on the page locally, compact or list density, saved filter presets (also in the command palette), select several tiles to tag or track at once, and a side-by-side comparison.
- ♾️ Endless scrolling (off by default). When you reach the end of the 48 tiles on a catalog page, the next page is added below it as the extension's own cards (cover, title, price, discount, a converted price). It asks GOG's own catalog API —
catalog.gog.com, the same call the site makes, reached under the page's normal cross-origin rules so Chrome shows no extra install warning — and continues only a list it can match to the one on screen, using the query the site itself transferred to the page. After 8 pages a Load more games button takes over. If GOG ever restricts that API, the feature simply stops appending; nothing else is affected.
Game page & library
- 🎮 Language check against the languages you care about, what changed since your last visit (price, rating, review count), a review filter, similar games you own, review-score summary, tag suggestions that also use GOG's own tags, and "open in" links to Steam, IsThereAnyDeal and PCGamingWiki — plain links, no requests.
- 📦 What a pack really contains. A bundle page lists its games in the page itself, so reading them costs no request; for other packs the extension asks GOG's product API (
api.gog.com) once per game page, sending only the numeric product id, and remembers the answer for 30 days. A pack that includes games you already own says so — and which ones. Hidden component entries that point back at the pack itself are filtered out. Switch it off under Catalog, wishlist & library. - 📅 Release-date calendar (
.ics) for the wishlisted games that haven't come out yet, from the release dates read off the game pages you've opened — and a wishlist card you can save as a PNG, drawn on your device. - 📰 Weekly digest as a web page — a Save as page button in the popup writes the digest (price alerts that hit, refund windows closing, wishlist drops) as a single HTML file you can keep or send.
- 📚 Learns your library as you browse — the site's own "IN LIBRARY" label on tiles and the owned status on game and wishlist pages are remembered locally; nothing is fetched. A refund is noticed only on a logged-in game page.
- 🎲 Weighted backlog roulette (favours well-rated, short and long-waiting games), a monthly "games to finish" goal, and Wrapped and collector cards saved as PNG — drawn on your device.
- 📝 Note version history, an Obsidian vault export (a
.zipwith one note per game, front-matter included), and CSV / line exports for Notion, Google Sheets and Trello. All files are made on your device.
Sync, backups & notifications
- 🔄 Folder sync runs on its own — when you open the dashboard and every 30 minutes — resolves a conflict by keeping the newer record and lists what it overwrote, and can keep dated backups (optionally encrypted) in the same folder, pruned to the number you choose. The background job only syncs when the browser still remembers your permission for the folder and the sync file isn't passphrase-encrypted (the extension never stores your passphrase); otherwise it waits until you open the dashboard or press Sync now.
- 🔔 Quiet hours and a one-summary-a-day mode, thresholds (smallest drop worth an alert, maximum price, only at the tracked low), alerts by tag, an optional season radar that notices a big sale starting, and a weekly digest that now lists offers about to end.
- 🔗 Optional webhook — also send notifications to a Discord-style or generic JSON address you own. Nothing is requested at install: typing an
https://address triggers one browser permission prompt for that single origin, only the notification text is sent, and the address is excluded from every export and sync. - Tag packs can be shared and imported (the import had been failing on every attempt before this release).
Look & feel, continued
- The game panel can be folded (remembered per section), docked beside the page on wide screens, and its sections reordered by dragging.
- Calm mode (no glow or animation), a one-click plain look that switches every injected style off, colour-vision palettes, text-size scaling for the extension's own UI, and settings profiles (minimal / full / accessible).
- The Native theme follows the site when it switches between light and dark, and a short tour opens after the update to show what's new and offer "Check this page".
Privacy & trust
- 🔒 A privacy dashboard in Advanced Options: every address the extension contacted (host and path, never the query), how often and whether it worked, what it keeps on your device and how big each part is, which extra site access Chrome has granted it (with a button to take the webhook's back), and one-click clear the request list / forget what it learned about my library.
- All network traffic now goes through one module that refuses any address not on its short allow-list, sends no cookies and no referrer, applies a time limit, and writes the local log the dashboard shows. A test fails the build if a permission or host changes without the privacy policy, the store listing and the website saying so, if anything outside that module calls
fetch, or if anything could load or run remote code. - 🩺 Failure log. When a feature stops working after a gog.com change, the popup shows a banner with Copy report and Report on GitHub (it only opens a page with the report filled in — you decide whether to send it). The report has no web addresses and no personal data.
Languages & accessibility
- 🌍 The tag dashboard, Advanced Options, popup and first-run wizard are available in all seven interface languages — English, Hebrew, Russian, Polish, German, French and Spanish — about 600 strings each, including sentences with highlighted words (translated as a whole so the word order can differ), Russian and Polish plural forms, and the dialogs. Hebrew is laid out right-to-left. What you wrote yourself (tag names, notes, game titles) is never translated. The store-translation overlay for gog.com's redesigned catalog, home page and filters was extended too.
- ♿ Keyboard and screen readers on the dashboard: a skip link and landmarks, tags that are focusable list items (Enter filters, Alt+↑/↓ reorders, with the new position announced), menus with arrow keys, Home/End and Esc, and the colour picker and filter builder as dialogs that hold focus and give it back.
Achievements, streaks & challenges
- 🏆 36 achievements in bronze, silver and gold (a few hidden until you earn them, and a Completionist one for the rest), a streak of days you've looked at gog.com, and three monthly challenges picked from a pool of six. All local, computed from what the extension already knows.
Firefox (experimental)
- 🦊
node scripts/build-firefox.mjsbuilds a Firefox variant (a background page in place of the service worker, an add-on id, and a statement that the developer receives no data); the zip is attached to the GitHub release. It is clean underweb-ext lintbut has not been run in a real Firefox. Folder sync needs an API Firefox doesn't have and says so on its card.
Under the hood
- An end-to-end suite now loads the real extension into Chromium and drives it against gog.com pages — synthetic ones in two deliberately different markup shapes, markup recorded from the live site, and (manually) the live public pages themselves. Run against the markup recorded from the live site, v3.0.0 failed 8 of those 11 checks (all but one for features it already had); this release passes all of them. It also caught two bugs the unit tests couldn't: badges silently vanishing on full-width covers, and prices becoming undetectable after the converter had annotated them.
- A new test loads each entry point's scripts in exactly the order
manifest.jsonand the HTML pages list them — nothing checked that before. - Each feature runs in isolation. A failing lookup used to skip every feature after it; now one broken feature is recorded (and shown in "Check this page") and the rest keep working.
- The end-to-end suite grew to cover the new catalog bar, wishlist tools and game-page facts against markup recorded from the live site, and it found two bugs the unit tests couldn't: a record that rewrote itself in a loop because
chrome.storagereturns keys in alphabetical order, and tile titles that swallowed the "IN LIBRARY" label. - New tooling: a performance budget on long catalogs (no pass over 150 ms at 48 tiles or 600 ms at 400, and the page must settle — the e2e suite caught a feature that re-triggered itself), a recorder that diffs the live site's structure against the last recorded one, screenshot regression for the panels and pages, a type-check of the popup, options and wizard scripts, a scheduled workflow that opens an issue when the live site stops matching, and a release script that refuses to tag with a stale changelog.
- Unverified: Firefox (no Firefox was available — only
web-ext lintwas run); folder sync against a real cloud-sync client; the webhook against a live endpoint; everything that needs a logged-in account beyond the page structure that was recorded (the logged-in checks exist but have not been run with a real account); and the translations, which no native speaker has reviewed. Please report anything that misbehaves.
The big one — deals, library tools, analytics, automation, accessibility, and gamification
Deals & pricing
- 🛒 Cross-store price comparison table on the game page — Steam, Epic, Humble Store, Fanatical, and GreenManGaming prices via the free CheapShark API, toggleable in the popup (on by default), plus a 0-100 deal score next to the "worth waiting?" verdict.
- The tag dashboard's sale-calendar panel predicts GOG's next likely discount window, blending your own tracked history with a known seasonal calendar.
- Wishlist value stat also shows the total cost if every wishlisted game were simultaneously at its own all-time low.
Library management
- 🎲 "What to play tonight" — a one-click random pick from your Backlog in the tag dashboard, optionally narrowed by genre, plus a "because you like X" recommendation strip built from your own tagged/finished games.
- 🔒 Encrypted backup — "Export everything" in Advanced Options offers a password-protected (AES-256-GCM, entirely on-device — nothing ever transmitted) backup alongside the plain JSON one.
- Tags CSV export/import round-trips play status (Playing/Backlog/Finished) too, not just tags and notes.
- "Share ↓" button in the tag dashboard exports the currently-filtered games as a single self-contained, read-only HTML page.
Analytics
- 📈 Real price-history chart in the tag dashboard — expand any tracked game's card to see its full chart, not just the game page's sparkline.
- 📊 Genre distribution chart — see which genres your tagged/tracked/status-marked games actually lean toward.
- 💰 Spending tracker — log a price alongside a purchase date on the game page's Refund window section; the dashboard totals it and can compare this month's spend against an optional budget (Advanced Options).
- Library year-in-review shows your "most patient purchase" (longest gap between first watching a game and buying it) and a multi-year snapshot trend.
Notifications & automation
- 📬 Weekly digest — a local "This week" panel in the popup summarizing refund windows closing soon, price-alert hits, and wishlist drops, plus a matching background job (Advanced Options → Background sync). Computed regardless of the desktop-notifications toggle, so it's useful even with notifications off.
- 🏷️ Auto-tag suggestions — untagged games in the tag dashboard show a one-click suggested tag based on GOG's own genre metadata, never applied without your click.
UX & accessibility
- 🎨 Custom theme editor — pick your own accent and background colors instead of the built-in palettes, plus a new high-contrast theme for maximum readability.
- 🔤 Dyslexia-friendly font option — an optional font stack + wider letter/line spacing across injected UI. No remote font downloads, ever.
- 🏷️ Quick-add-tag from any card — hover a game card on any listing page and tag it on the spot, no need to open the game's own page.
- 🔍 Discoverable filter picker in the tag dashboard's search box, plus a new
genre:search operator alongside the existingtag:/status:/lowest:/since:/snapshots:. - 📎 Note image attachments — attach one photo per game in the tag dashboard, downscaled on your device and stored locally (never leaves your machine).
Platforms
- 🦊 Firefox compatibility groundwork (experimental, unverified) and a new browser-support overview in the README — Chrome/Edge/Brave/Opera remain the fully-supported, tested targets.
Gamification
- 🏆 Achievements — a small set of local badges in the tag dashboard for tagging, tracking, and spending milestones, with a toast when a new one unlocks.
Wishlist deals, worth-waiting verdicts, and a big testing pass
New features
- 🔥 Wishlist deals in the popup — shows your top 3 wishlisted price drops (≥10% off each game's tracked peak), linking straight to the game.
- "Worth waiting?" verdict on the game-page price panel — a plain-language read on whether now looks like a good time to buy.
- Wishlist value stat + CSV export in the tag dashboard — totals the current price of every wishlisted game with tracked history.
- Ko-fi + Buy Me a Coffee alongside Patreon — three ways to support instead of one.
- Two more stale "v2.4" version badges fixed (onboarding wizard, options footer).
Under the hood
- Real test suites for
background.js,popup.js,options.js,onboarding.js— all four had zero coverage before. Extension-wide coverage: 23% → 55%. - Found and fixed two real bugs while writing those tests: a silently-dead
ensureDefaults(), and a CSS rule that showed "no results" on every Advanced Options page load. npm run typechecknow covers all ofcontent/andtags/, not justlib/.
content.js / tags.js module split, plus a feature round built on top
- ⌘K / Ctrl+K command palette — quick access to settings, the tag dashboard, and force-refreshes.
- Wishlist-wide price alerts — get notified when any wishlisted game drops off its tracked peak price, no per-game setup needed.
- Playing / Backlog / Finished status per game, separate from tags, filterable with
status:playing. - Auto theme that follows your system's light/dark preference.
- 7-language interface — English, Hebrew, Russian, Polish, German, French, Spanish.
- Search box in Advanced Options; undoable toast for tag deletion; design & reduced-motion polish.
- Under the hood:
content.jsandtags.jssplit from two giant files into a real module structure — the single riskiest refactor in the project's history, shipped as its own isolated, fully re-tested release.
Infrastructure audit: security, testing, CI/CD, architecture
- Storage writes now surface failures loudly instead of silently resolving; settings import runs the same migration pass a real upgrade would.
- GitHub Actions pinned to commit SHAs (supply-chain hardening);
npm auditadded to CI. - Test suite grew 44 → 118 tests, including direct regression coverage for the card-badge placement "hot zone."
- New
lib/genres.js,# @ts-check+ JSDoc typing forlib/. - Price-history storage now enforces a 2 MB total-size budget, evicting least-recently-updated games rather than growing unbounded.
Genre detection from the game page
- Visiting a game page now reads its actual "Genre:" field (Horror, Role-playing, Strategy) and caches the result per slug, falling back to the old keyword regex for anything else.
What's new panel
- The popup now shows a short "What's new" panel after an update, tracking which version you've last seen so you never miss (or re-see) an entry.
Smart prices & historical lows
- 💎 Lowest-price badge on cards at their tracked all-time low.
- Stale-rate warning + exact rate and age shown on converted prices.
- Tag-colour dot on cards you've tagged.
Repo restructure: extension/ + store/
- Housekeeping only. The repo root now cleanly separates the shippable extension from Web Store material and dev tooling.
Support links
- Donation links added in four unobtrusive spots across the popup, options, onboarding, and README.
Privacy cleanup of repo metadata
- Removed personal identifiers from tracked files; fixed stale version pills.
Security audit hardening
- Bounded the notification dedup log with a 90-day prune; defense-in-depth hex-color validation for tag colors interpolated into CSS.
i18n, price alerts, sale heatmap, tag packs
- Full Hebrew UI translation with an interface-language selector.
- Per-game price alerts with desktop notifications.
- Cover-art color sampling on the game-page panel; mini sparkline in the hover quick-look.
- Sale-calendar heatmap; shareable tag packs (export/import); advanced dashboard search operators.
Hover quick-look, year selector, dashboard polish
- Rich hover tooltip on game cards; year-in-review gets a year selector; sortable dashboard columns.
- Per-game JSON export; custom hex tag colors; history-depth control; storage-usage estimate.
Cross-currency wishlist filters, Light theme, polish
- Wishlist price filters now work in any locale; Light theme added; live theme preview; compact density toggle.
- First GitHub Actions CI workflow.
Tag management, themes, refund timer, notifications
- Four-theme picker; refund-window timer; library year-in-review; cross-currency conversion.
- Genre-aware cards; all-time-low celebration banner; sparkline sale markers; glassmorphism game panel.
- Wishlist filter bar; full tag management (color, rename, merge, drag-reorder, CSV import); markdown notes.
- Opt-in desktop notifications; verbose debug logging toggle.
Web Store readiness rename
- Renamed "GOG+" → "GOG Enhancer"; added
PRIVACY.md,LICENSE,STORE_LISTING.md.
Layout regression hotfix
- A prior release had forced
position: relativeon GOG's own card anchors, collapsing GOG's internal preview/carousel overlays into the card. Badges and era effects moved to the cover-image wrapper instead; de-duplicated by slug.
Security & privacy fixes
- Patched an XSS via tag names rendered through
innerHTML; removed an inlineonclick(Manifest V3 CSP); removed two pages fromweb_accessible_resources(a fingerprinting vector); rewrote the wishlist-badge scrape strategy.
Major rewrite
- Re-architected storage (sync vs. local split); live FX rates; price-history tracking; tag dashboard with CSV; wishlist toolbar badge; onboarding wizard; era-aware card styling; rich tooltips and toasts; expanded Hebrew dictionary; system fonts only.
Initial release
- Currency converter, refund badge, mod indicator, custom tags, wishlist filters, basic Hebrew, options page.