A tool that turns SPL's PSU Tier List (a Google Sheet) into a userscript that injects coloured Tier badges directly onto power-supply listings on PCPartPicker (all regions) and Tweakers.net, so you can judge PSU quality at a glance.
Badges show match confidence: a solid badge is a confident match, a dashed
Tier X? badge is a likely match. Click any badge for full specs, the
confidence score, and other candidate matches.
Warning
Manufacturer naming is inconsistent across the tier sheet, PCPartPicker and Tweakers (and those three disagree with each other). The matcher is good but false positives/negatives happen β always confirm on the official spreadsheet before buying. The badge confidence and "other possible matches" list are there to make disagreement visible rather than hidden.
The easiest way is the official store listing for your browser β one click, with automatic updates. Prefer not to use a store? Manual and userscript options are below.
|
π¦ Get it for Firefox |
π’ Get it for Chrome |
- Firefox β Add to Firefox from Mozilla Add-ons (AMO).
- Chrome β Add to Chrome from the Chrome Web Store.
- Brave, Edge, Opera, Vivaldi & other Chromium browsers β install straight
from the Chrome Web Store link above β these browsers accept
Chrome Web Store extensions directly. Notes:
- Brave: open the Chrome Web Store link, click Add to Brave. If prompted, allow Chrome Web Store extensions (Brave enables this by default).
- Edge: open the link in Edge; the first time you may see a banner to Allow extensions from other stores β click it, then Add to Chrome β Add extension.
- Opera: install Install Chrome Extensions first, then use the Chrome Web Store link.
- Go to the Releases page.
- Download the signed
psutier-extension.xpifile. - Open Firefox, drag and drop the
.xpifile into the browser (or pressCtrl+O/Cmd+Oand select it) to install it. No extension manager required!
- Download
psutier-extension.zipfrom the Releases page and extract it. - Open
chrome://extensions,brave://extensions, oredge://extensions. - Toggle Developer mode on (top-right).
- Click Load unpacked and select the extracted folder.
- Install a userscript manager:
- Brave / Chrome / Edge (Chromium): install Violentmonkey (or Tampermonkey) from the Chrome Web Store.
- Firefox: install Violentmonkey/Tampermonkey from Add-ons.
- Brave/Chrome only β enable user scripts (required since Chromium tightened
Manifest V3): open the extension's Details, and turn on "Allow User
Scripts" if shown; on older builds toggle Developer mode on
brave://extensionsinstead. (One-time step.) - Download the latest
psutier.user.jsfrom the Releases page β your manager will offer to install it.
Tweakers' own custom CSS carries the tier badges with no extension or userscript manager at all β just enable the shared snippet:
βΆ Enable the snippet on Tweakers β toggle it on and reload the Pricewatch.
It's Tweakers Pricewatch only (no PCPartPicker) and a static snapshot of the tier list β new products / tier changes appear when the snippet is updated.
To (re)generate it yourself (or build a different variant), see
tools/README-tweakers-css.md:
- boxed (default, ~40 KB) β filled tier pills, matching the extension's look.
- lite (~37 KB) β colored tier letter only.
- popup β pills plus a hover spec popup, abusing
::beforecontent.
Finally, visit a PCPartPicker PSU listing or the Tweakers Pricewatch and look for the badges.
Google Sheet ββgviz CSVβββΊ fetch_sheet.py βββΊ psu_tier.csv
β
parse_tier_list.py βββββΊ psu_data.json
β
βββ src/matcher.js (matching engine, single source of truth)
βββ src/adapters.js (per-site DOM extraction)
βββ data/normalization_rules.json (declarative tuning)
βββ src/userscript.template.js (UI)
β
generate_userscript.py βββΊ psutier.user.js
- Data source is the sheet's
gvizCSV export (stable columns, no HTML scraping, no third-party Python deps). - Matching (
src/matcher.js) tokenizes the product name and each candidate model and scores a weighted token overlap. It also uses the storefront's structured columns as signals, not just the name: wattage and form factor (ATX vs SFX) are hard filters, and efficiency disambiguates variants. When a name is too thin to score on its own (e.g. "NZXT C750" β just "c"), those signals resolve it by constraint (wattage + efficiency + form factor). The winning score is the confidence shown on the badge. This is the single source of truth β the userscript and the test suite run the exact same code. - There are no hardcoded per-product hacks. Naming quirks are fixed by editing data, not code (see below).
Edit data/normalization_rules.json:
aliasesβ rewrite incoming product names (e.g. ASUS"850G"β"850 gold").stripβ remove descriptors that differ across sources and never identify a model (ATX version tags, the80+prefix, β¦); applied to both sides.generic/noiseβ words that score low / are dropped.thresholds/weightsβ confidence bands and scoring balance.
Add a case to tests/corpus.json, run npm test, done.
Add one entry to src/adapters.js:
{ id, match, selector, filter?, extract, insertBadge }, where extract(row)
returns { name, wattage, efficiency, formFactor, modular } (pull as many of
those from structured columns as the site exposes β the matcher uses them).
Prerequisites: Python 3 (standard library only) and Node.js 20+.
This repo uses uv for Python.
git clone https://github.com/FeikoWielsma/psu-tier-userscript.git
cd psu-tier-userscript
npm installBuild + test (deterministic, no network β uses the committed data snapshot):
python test_suite.py # build + lint + typecheck + run npm test
npm run check # eslint + tsc --checkJs + tests
npm test # just the JS tests
npm run lint # ESLint (src, tests, tools)
npm run typecheck # tsc --checkJs (type inference, no JSDoc needed)
uvx ruff check . # Python lintRefresh data from the live sheet and rebuild:
python generate_userscript.py --updatenpm testβ offline, deterministic, CI-safe:tests/test_matching.jsruns the real matcher overtests/corpus.json(hand-labelled cases, incl. verbose real PCPP names) against the committedtests/fixtures/sample_psu_data.json.tests/test_adapters.jsruns the real adapters over saved HTML fixtures vialinkedomβ including full real PCPartPicker pages intests/fixtures/pcpp/(100 rows each) to catch name/wattage extraction and DOM drift.tests/test_coverage.jsruns the matcher over ~900 real, deduplicated product names (tests/fixtures/pcpp-products.json) and asserts it never throws and overall match coverage stays above a floor. (A full listing includes many genuinely unrated units, so <100% is expected.)
- Live browser (local, on demand β never in CI):
These do a handful of normal page loads with pauses β not bulk scraping.
npx playwright install chromium # once npm run capture # refresh tests/fixtures/*.html npm run smoke # inject the script, report matches # drive Brave instead of bundled Chromium: node tools/live_capture.mjs --smoke --browser-path "C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe" --headed
- CI (
.github/workflows/ci.yml): runsnpm test(the deterministic gate), does a non-fatal live fetch/parse structure check, then builds and uploads the userscript artifact. - Release (
.github/workflows/release.yml): pushing av*tag runs the tests, builds from the latest sheet, and publishes a GitHub Release withpsutier.user.js.
- Data: SPL's PSU Tier List.
- PCPartPicker and Tweakers.net for the platforms this enhances.
Not affiliated with PCPartPicker, Tweakers, or the spreadsheet maintainers.


