Add Steam Wrapped - #220
Conversation
832efed to
15b5fc1
Compare
This is a substantial plugin and the structure is genuinely good: small focused modules, a clear split between the client-side tracker and the WebKit page, and the nav button clones Steam's own Browse button rather than restyling one from scratch, which is exactly the practice asked for elsewhere in this repo. Three things need attention before publication, and the first one I would not have found without opening the Store. 1. The Store entry point never appears for non-English users
const browseElement = candidates.find(
(element) => element.textContent?.replace(/\s+/g, " ").trim() === "Browse",
);If nothing matches, Steam localises that label. I fetched the Store front page in three languages and checked for the literal string:
I then confirmed it on a live client rather than leaving it as inference. With the Steam client switched to French and the Store page open ( So on a non-English client the match cannot succeed and the plugin silently does nothing at all. No error, no fallback, no entry point, and nothing in the console to tell the user why. The good news is that the fix is small, because the element itself is language independent. The French and in both languages it is the first child of its container. Anchoring on the first button of that nav row, or resolving the shared class through Two related observations from probing the live Store page, which make this worse rather than incidental: The four 2. No licenceThere is no LICENSE file, and 3. Data collection, retention, and disclosureThis is the part I would most want addressed, because the plugin's whole purpose is building a personal history and it does so quietly. Tracking starts at load, not at first use. Nothing bounds the history. window.localStorage.setItem(STORAGE_KEY, JSON.stringify({ version: 1, sessions: this.sessions }));There is no cap, no window, no pruning of old sessions, and the full array is re-serialised on every session start and end. The achievement history has the same shape. Over years this only grows, against a localStorage quota shared with Steam itself. There is no way to delete it. I grepped for a reset path; the only The README does not say any of it. It says "Locally tracked game sessions" and nothing more: not what is recorded, not where, not for how long, not how to remove it. For a plugin of this kind that paragraph is worth writing. One unnecessary credentialed request. await fetch(`https://store.steampowered.com/api/appdetails?appids=...`, { credentials: "include" });That is cross-origin, and To be fair on the overall picture, because this is the question a reviewer should answer plainly: only the app id ever leaves the machine, to Valve's own public API, and I found no telemetry, no analytics, and no third-party endpoint anywhere in the frontend or the WebKit code. Everything else is local. A shared-namespace key without a prefix. Two of the three keys are namespaced ( 4. Build and packagingNo pnpm lockfile. Only
Source maps are shipped to users. The production build emits
5. Smaller points
What I ran, and what I did notVerified: full source read, greps for network, storage and dynamic execution, the CI install and build sequence, the localisation of the Store nav label in four languages, Not done: I did not install the plugin, so I have not exercised the dashboard, the period selector, the histogram or the PNG export at runtime. Everything above was measured rather than inferred; where an early assumption of mine turned out to be wrong, and two of them were, I have reported the measured result instead. |
15b5fc1 to
b081939
Compare
|
@Norphirion Thank you for the detailed review and testing. I've addressed the reported issues in v1.1.1:
The Plugin Database CI build passes, and the PR now points to the v1.1.1 release commit. Thanks again for helping improve the plugin. |

Summary
Adds Steam Wrapped to the Millennium Plugin Database as a submodule.
Plugin repository:
https://github.com/wopln/Steam-Wrapped
Features