Releases: SysAdminDoc/GLP-Ultra
Release list
GLP Ultra v3.8.3
The GitHub project is now GLP-Ultra. This release updates every userscript and package URL to the new address, rewrites the README around current installation paths, and aligns the GitHub, extension, userscript, and package descriptions. Chrome, Firefox, and standalone userscript builds are attached.
GLP Ultra v3.8.2
Thread and forum pages now use a responsive card-based reading layout with clearer type and stronger hierarchy across every theme. OP navigation stays inside the toolbar and no longer duplicates after settings are reapplied. Includes fresh Chrome, Firefox, and standalone userscript builds.
GLP Ultra v3.5.0
GLP Ultra v3.5.0
SysAdminDoc/GLP_Userscript — the roadmap's risk table has named these mitigations since Phase 3
with nothing behind them. This is the four that were still missing, and the defect found while
implementing the fifth.
Fixed
A failing site got hammered as fast as it could refuse. The fetch queue stamped its
rate-limiter clock only after a successful response. So on a run of failures the elapsed time
kept growing, the computed delay went negative, and the one-second floor between requests stopped
applying exactly when it mattered — a thread watcher with twenty threads on it emptying its queue
into a site that was already saying no.
Both outcomes stamp the clock now, and a refusal also backs off: the server's own Retry-After
when it sent one, otherwise exponential from the caller's floor, capped at a minute so an outage
cannot park the queue for hours. Consecutive failures and the remaining backoff are reported in
diagnostics, so a watcher that has gone quiet says why.
Added
Safe mode, so custom CSS cannot lock you out of the settings that undo it. Pasting
* { display: none !important } into Custom CSS hid the settings panel along with the page — it
measured 0px wide — and the setting is saved, so reloading brought the same page straight back.
There was no way to reach the control that would remove it.
Two layers now. The recovery surfaces are re-asserted after the user's rules at a specificity
their scoped selectors can reach, which covers the blanket-rule footgun. Deliberately
out-specifying that is still possible, so safe mode drops custom CSS entirely — and it is
reachable from two places page CSS cannot touch: the userscript manager's menu, and the extension
popup, which is a separate document.
GLP Ultra takes precedence over Dark Reader. Two dark themes over one page wash out the
accents each palette was measured against, and it reads as a theme bug rather than as two
extensions disagreeing. Uses <meta name="darkreader-lock"> — Dark Reader's own documented
opt-out, which it honours live rather than only at load — and removes it again the moment GLP
Ultra stops theming, so switching it off hands the page back instead of leaving it light.
The settings payload an upgrade is about to prune is banked first. Loading keeps only the keys
the current schema declares, and the first save after that writes the pruned object back — so
anything a predecessor stored under a name this build does not know disappeared with the upgrade,
silently. One copy of the pre-upgrade payload is now kept and offered back from the recovery shelf
with an undo. It is mirrored to chrome.storage, because a recovery artifact that dies when site
data is cleared is not much of one.
Verification
189 runtime checks, up from 173, driving the unpacked extension against the real captures.
Each of the above is asserted by doing the thing rather than by reading the code: pasting the
blanket rule and measuring the panel that should have vanished, reloading with safe mode on
because a reload is the first thing anyone locked out will try, serving 429 Retry-After: 7 to
the thread the watcher polls, and restoring a banked payload to watch a pre-upgrade value come
back. Every one of them was run against the bug restored, and fails there.
Install
Artifacts are unsigned by design.
- Chrome / Edge / Brave: download
glp-ultra-v3.5.0.zip, unzip, thenchrome://extensionsDeveloper mode > Load unpacked > pick the unzipped folder.
- Firefox: download
glp-ultra-firefox-v3.5.0.zip, unzip, thenabout:debugging>
This Firefox > Load Temporary Add-on > pickmanifest.json. - Userscript: install
glp-ultra.user.jsin Tampermonkey or Violentmonkey.
GLP Ultra v3.4.0
GLP Ultra v3.4.0
SysAdminDoc/GLP_Userscript — the three drift items the 3.3.0 design pass left open, and four
defects the gates written for them found on their first run.
The gate that should have existed already
npm run shots rendered every surface in every theme and nothing ever read the result, which is
exactly how five surfaces stayed blue through ten palettes. The harness now paints each surface
under two deliberately opposite palettes, requires it to actually move, and checks its text
clears 4.5:1 on both. On its first run it caught a toolbar whose colours depended on which
optional features were switched on.
The build also rejects a custom property that references itself, in both the bare and the
var(--x, fallback) form — the fallback is not consulted, so both are cycles.
Fixed
- Every semantic colour in the product was dead. 3.3.0 wrote
--glpx-success/
--glpx-warning/--glpx-dangerasvar()references to themselves. A cyclic custom
property is invalid at computed-value time, so all 19 readers fell back to inherit and success,
warning and error toasts, danger buttons and every state chip painted in the surrounding text
colour. The border was still there, just the wrong colour, which is why nothing looked broken. - The settings footer was clipped off the bottom of the panel. At 900x700 it sat 207px past
the panel's edge, and the panel clips its overflow, so Reset, Recovery, Diagnostics, Export,
Import, Close and Save were all off screen with no scrollbar to reach them. The body reserved a
hardcoded88vh - 184pxfor chrome whose height depends on whether the footer wraps. - Touching any setting turned every quote border black. That setting's default is
var(--glpx-accent), an<input type="color">coerces what it cannot parse to#000000, and
reading the panel back is what saves it — so an unrelated checkbox did the damage. - The thread toolbar changed colour depending on which features were on: two of them each shipped
a full copy of its chrome, and whichever came last won. - One token,
--glpx-border, had two definitions, so page content and product chrome drew
different lines depending on which side of<body>the element was on.
Changed
- The last five surfaces read the shared tokens — watch digest, tag picker, quick-search
panel, lightbox, toast stack. The quick-search panel was#1a1a2eon#4a4a6a, a blue-purple
box on all ten palettes. The ghost control every small button uses is named once and tinted
with the accent, so a toolbar button belongs to its theme at rest, not only on hover. - The settings footer is grouped by job — destroy | inspect | move data — with a rule between
each and daylight around Reset, which used to sit against Export in a row of seven.
Verification
npm run verify — 173 runtime checks driving the unpacked extension against the real captures,
plus the gates, both builds, and structural manifest checks. Thirteen of those are new
assertions on the settings panel, which previously had two.
A download that never arrives is now one failed check rather than an uncaught throw; two runs
died on a slow export and took the ~40 later checks with them. The chrome.storage mirror check
polls for its settled state instead of sleeping 1.5s and hoping.
Install
Artifacts are unsigned by design.
- Chrome / Edge / Brave: download
glp-ultra-v3.4.0.zip, unzip, thenchrome://extensionsDeveloper mode > Load unpacked > pick the unzipped folder.
- Firefox: download
glp-ultra-firefox-v3.4.0.zip, unzip, thenabout:debugging>
This Firefox > Load Temporary Add-on > pickmanifest.json. - Userscript: install
glp-ultra.user.jsin Tampermonkey or Violentmonkey.
GLP Ultra v3.3.0
GLP Ultra v3.3.0
SysAdminDoc/GLP_Userscript — a design-system pass over every surface, and the layout defects
that looking properly at each one turned up.
One theme, the whole product
The palette exposed eight values while the interface it was meant to theme carried 87 hardcoded
literals. Picking Alien Green or Blood recoloured the forum and left every control the script owns
— settings panel, toasts, diagnostics, recovery shelf, chips — sitting there in the same blue. It
read as two products stapled together.
There is now one token layer, emitted first and derived from the chosen palette: surfaces, text,
borders, semantic colour, radius, elevation, focus ring. The accent is also published as an RGB
channel, so the existing rgba() rules could be repointed at it without changing a single alpha
value. Semantic colours stay fixed on purpose — success has to be green on the Blood theme.
The options page and the popup are separate documents that cannot read that layer, so the palette
travels with the generated schema. Three surfaces, one theme.
The settings panel is navigable now
140 controls across 23 sections had a search box and nothing else. It gains a section rail, an
Only changed filter, a live match count, a real empty state, a dot on every row that differs
from its default — echoed in the section header and the rail — and per-section reset with undo.
Fixed
- The thread toolbar rendered as a 92px vertical stack of nine wrapped buttons pinned to the
right edge..msgtitleis a div parented straight to a<tr>, so inserting after it made the
toolbar a child of that<tr>as well, and a div is not table content. Anchored outside the
table it is the horizontal toolbar it always meant to be. - About 450px of dead space above the first post, mostly rows the ad removal had emptied.
- The OP previous/next buttons were unthemed yellow and floated on top of the author column.
- The author column stacked one action chip per line; mute, block and tag were three sizes and
three colour stories inches apart. - Nav links rendered as a bare vertical list of underlined text.
- Diagnostics and the recovery shelf covered the settings panel that launches them, rail and
buttons included. They hand the screen over now, and offer the way back. - The nav's theme picker went stale when the theme changed from anywhere else.
Verification
npm run verify — 138 runtime checks driving the unpacked extension against the real captures,
plus the gates, both builds, and structural manifest checks.
The visual work was verified by looking at it, not by reading CSS: the new npm run shots
captures all eight surfaces across all ten themes into dist/ui-shots/. That is also what caught
the options page rendering unstyled — a fault in the screenshot router, which was aborting the
extension page's own CSS, rather than in the page.
Install
Artifacts are unsigned by design.
- Chrome / Edge / Brave: download
glp-ultra-v3.3.0.zip, unzip, thenchrome://extensionsDeveloper mode > Load unpacked > pick the unzipped folder.
- Firefox: download
glp-ultra-firefox-v3.3.0.zip, unzip, thenabout:debugging>
This Firefox > Load Temporary Add-on > pickmanifest.json. - Userscript: install
glp-ultra.user.jsin Tampermonkey or Violentmonkey.
GLP Ultra v3.2.0
GLP Ultra v3.2.0
SysAdminDoc/GLP_Userscript — one engine building the MV3 extension, the userscript, and the
Firefox variant.
Quote backlinks, a noise budget, media actions, accessibility controls, shareable packs, and
optional settings sync — plus six fixes, three of which were things the new features found.
Fixed
- A tab could come up styled with every feature dead. The shim reads
chrome.storageat
document_start; when the mirrored copy differed from localStorage it pushed the difference
straight into the engine, which began its feature run against a body the parser had not filled
yet and marked the run done. The real page was never touched — CSS injected, body flagged
active, no post numbers, no toolbar, no error anywhere. Startup now waits for the document. - Seven settings did nothing until the next page load. Back-to-top, both infinite scrolls, the
scroll progress bar, thread previews, quick search, and auto-refresh had no apply handler
because theirinitwould have stacked duplicates. Each now guards re-entry. - Unmuting your last muted user left their posts hidden until a reload. The mute pass returned
early on an empty list, skipping the cleanup that takes the class off. Switching the feature off
entirely had the same effect. Found by the noise budget disagreeing with itself. - Auto-refresh kept counting down in a background tab, stacking refreshes against the moment
the tab came back. - An image still loading was treated as chrome and skipped by the lightbox, the gallery, and the
new media actions:naturalWidthis 0 until an image loads, and the shared predicate
measured it during a document-idle pass.
Added
- Quote backlinks. GLP marks each post with a
reply<id>permalink and each quote with a
"Quoting:" footer, which is enough to reconstruct who answered whom — an edge the site only
exposes forward. A post now lists the replies that quoted it; hovering a chip shows an excerpt,
clicking scrolls to it and flashes it, and a quote whose target is on the same page gains an
in-page jump. - Noise budget. A toolbar chip counts what is being kept off the page — ads removed, muted and
blocked posts, keyword hits, image-only replies, hidden and pinned threads, collapsed quotes —
and opens a breakdown leading to the recovery shelf. Every figure but the ad count is read off
the live DOM, so it cannot drift from what is actually hidden. - Save / Open / Copy link on post images. Saving fetches the blob so the file keeps its real
name; a hotlinked third-party image cannot be fetched from a content script, so it falls back to
opening the image and says why. - Accessibility controls. Reduce Motion, High Contrast, and Larger Click Targets, emitted last
in the stylesheet on purpose — a theme that beats the motion or contrast setting is a bug. - Shareable packs. A theme pack carries the look, a filter pack carries mutes, blocks, and
keyword rules. Importing a filter pack adds — lists unioned, keywords merged — so a pack
someone else wrote can never delete your mutes. - Optional settings sync (off by default). Settings only, never the user lists, arbitrated by
a stamp so the most recent change wins.
Verification
npm run verify — syntax and policy gates, the selector registry against the real captured GLP
pages, both builds, structural manifest checks for Chrome and Firefox, and 136 runtime checks
(up from 83) driving the unpacked extension in Chromium against those captures.
New gates were bait-verified: reverting each fix makes its checks fail. One check was found
passing for the wrong reason — a missing element made both sides of a comparison -1 — and the
behaviour it claimed to cover is now recorded as unobservable here rather than left as
reassurance. Firefox remains gated structurally only.
Install
Artifacts are unsigned by design.
- Chrome / Edge / Brave: download
glp-ultra-v3.2.0.zip, unzip, thenchrome://extensionsDeveloper mode > Load unpacked > pick the unzipped folder.
- Firefox: download
glp-ultra-firefox-v3.2.0.zip, unzip, thenabout:debugging>
This Firefox > Load Temporary Add-on > pickmanifest.json. - Userscript: install
glp-ultra.user.jsin Tampermonkey or Violentmonkey. The popup, options
page, network-level ad blocking, and settings sync are extension-only.
GLP Ultra v3.1.0
GLP Ultra v3.1.0
Watcher, recovery, diagnostics, context-menu actions, a Firefox build — and a fix for silent
data loss that affected every extension user.
Fixed — settings, mutes, blocks, tags, and hidden threads reset on every reload
In the extension build only, every stored value came back as its default after a page load, with
no error anywhere. The engine is written against Tampermonkey semantics: it serializes before
every GM_setValue and parses after every GM_getValue. The MV3 shim parsed on read as well, so
the engine parsed an already-parsed object, threw, and fell back to defaults inside its own
catch. The shim now returns exactly what was stored, and the runtime harness reloads the page
and asserts that both a setting and the mute list survive.
Upgrading does not recover values lost before this release — they were never written back.
Added
- Thread watcher. Watch a thread and it is polled through the shared rate-limited fetch
queue, walking to its last page before counting posts so an unread delta means new replies
rather than a new page. The digest shows unread counts, last-checked age, and failed-check
state; hidden tabs pause background checks by default; the toolbar badge shows the unread
total. - Recovery shelf. One surface listing hidden threads, muted users, blocked users, and the
filters currently hiding things — each restorable on its own, from any route. Hidden threads
now remember their titles. - Diagnostics panel. Route, active features, settings changed from defaults, per-feature
worst-run timings, fetch queue state, recorded errors, and selector health, with a Copy button.
Selector health reports whether each registry surface is carried by its primary selector or a
fallback — the early warning for site drift. - Context-menu actions. Hide this thread, Mute this user, Tag this user, Preview this image,
Export this thread. Each reports why nothing happened instead of failing quietly. - Update notices. After a version change, the settings a build added are named, computed by
diffing the stored payload against the defaults. - Firefox build.
npm run package:firefoxproduces the Gecko variant. Everything but the
manifest is identical to the Chrome build.
Also in this release: thread export to Markdown / HTML / JSON with a media manifest, mute match
modes (exact, contains, regex), private notes on tagged users, a local trust overlay, full data
backup and restore, media privacy mode with click-to-load embeds, X/Twitter embed normalization,
and hover image previews.
Also fixed
mainNav's primary selector.topnav.topnav_mainmatches neither captured GLP page, so that
surface had been resolving through fallbacks all along;.mainpagenavlinksis the primary now.
The thread route no longer expects a site-wide main nav it does not have.- The image lightbox added a document click listener on every
initand never removed one, so
re-enabling the feature stacked another copy.
Verification
npm run verify — syntax and policy gates, selector registry against the real captured GLP
pages, both builds, structural manifest checks for Chrome and Firefox, and 83 runtime checks
driving the unpacked extension in Chromium against those captures.
Firefox is gated structurally only: the runtime harness drives Chromium, and Firefox cannot load
a temporary MV3 add-on from the command line without further tooling.
Install
Artifacts are unsigned by design.
- Chrome / Edge / Brave: download
glp-ultra-v3.1.0.zip, unzip, thenchrome://extensionsDeveloper mode > Load unpacked > pick the unzipped folder.
- Firefox: download
glp-ultra-firefox-v3.1.0.zip, unzip, thenabout:debugging>
This Firefox > Load Temporary Add-on > pickmanifest.json. Grant the host permission from the
add-on's permissions tab if you want the network-level ad blocking. - Userscript: install
glp-ultra.user.jsin Tampermonkey or Violentmonkey. The popup,
options page, and network-level ad blocking are extension-only.