Releases: SysAdminDoc/RES-Slim
Release list
RES-Slim v0.15.1
Old.reddit-focused fork of Reddit Enhancement Suite. Chrome MV3 + Firefox MV2. 494 contract tests. Bundles everything since v0.14.1 (v0.14.2, v0.15.0, v0.15.1).
New: theme old.reddit (v0.15.0)
- New
pageThememodule (disabled by default) — an opt-in dark/OLED skin for old.reddit with selectable palettes: OLED Black, Graphite, Midnight, Catppuccin Mocha, Tokyo Night, Rosé Pine. Options for an accent colour (visited links / flair outlines), decluttering page chrome (ads, banners, redesign opt-in, gold prompts, promoted posts), subtle rounded corners, and a collapse-to-hover sidebar. Palette is CSS-variable-driven and ships in the document_start stylesheet with a cached early-apply to avoid a flash of un-themed Reddit. Fully reversible. Enable it under "Old Reddit theme" in the settings console and pick a palette.
Fixes
scrollRestore(v0.14.2) — no longer restores a saved scroll position on listing pages, which could land you at the bottom of a subreddit / home feed on load. Scroll memory is now scoped to comment threads only; subreddit fronts, the home feed, and user/search pages always load at the top.
Removed
- The
.res-commentNavToggle"Navigate by" hover button thatcommentNavigatorinjected into comment pages (v0.15.1). The comment navigator panel itself is unchanged and still appears when its "show by default" option is enabled.
Install
- Chrome/Chromium: download
RES-Slim-v0.15.1-chrome.zip, unzip, then load the unpacked folder via chrome://extensions (Developer mode -> Load unpacked). - Firefox:
RES-Slim-v0.15.1-firefox.zip(MV2) via about:debugging -> Load Temporary Add-on.
RES-Slim v0.14.1
Old.reddit-focused fork of Reddit Enhancement Suite. Chrome MV3 + Firefox MV2. 482→487 contract tests. This is the first tagged release since v0.12.7 and bundles the v0.13.0, v0.14.0, and v0.14.1 work.
v0.14.1 — bugfix
commentHighlightsno longer highlights every comment on the first visit to a thread. It now only highlights on a genuine revisit (comments posted since your last view); the first visit is recorded silently so later visits work as intended.
v0.14.0 — resilience, security, and features
Security: fixed a wiki-TOC DOM-XSS in comment preview, origin-gated the settings-console postMessage handler, sanitized notification messages through DOMPurify, added a CSV formula-injection guard on exports, a fail-closed ReDoS guard on user filter regexes, an http(s)-only guard on the background proxies, and upgraded DOMPurify 3.1.6 → 3.4.11.
Resilience: Reddit .json 403/429 responses now surface a single throttled notice instead of failing silently (auto-refresh backs off on 429); streamable/redditgallery handlers degrade cleanly on bad responses; the rate limiter releases its slot on synchronous throws; imgurFlatten default mirror updated to a live instance.
New modules (all disabled by default): fencedCodeBlocks (triple-backtick rendering + local highlighter), editedCommentDiff (Arctic Shift/PullPush original-vs-current diff), repostDedupe (URL/thumbnail dedupe), cleanLinkCopy (tracking-param-stripped permalink copy). Plus cobaltDownloader multi-instance failover with a localhost-companion fallback, and a gallery n/total counter.
Dependencies: esbuild 0.23.1 → 0.25.10, dayjs → 1.11.21.
v0.13.0 — settings console
Command-center settings console redesign: three-zone desktop shell (module library, focused workspace, persistent utility rail) with staged-change controls, theme/density/motion controls, and import/export.
Install
- Chrome/Chromium: download
RES-Slim-v0.14.1-chrome.zip, unzip, then load the unpacked folder via chrome://extensions (Developer mode → Load unpacked). - Firefox:
RES-Slim-v0.14.1-firefox.zip(MV2) via about:debugging → Load Temporary Add-on, or install unsigned in a build that permits it.
v0.12.7 — senior-engineer refactor pass
No new modules — bug hunt + hardening + UX consistency pass across the v0.10–v0.12 modules shipped during the autonomous-loop sprint.
Highlights
- New
lib/utils/buttonStatus.js— sharedflashStatushelper with WeakMap timer dedup. Consolidates 7 modules' inline setTimeout label-flips (cobaltDownloader,galleryZip,localCompanion,savedBackup,voteHistory,mediaArchiveManifest,commentTreeExport). - Lazy
rateLimiterrefill — interval now starts on firstschedule()and stops when bucket is full + queue/active empty. Closes a per-page background-tick leak. - Granular
arcticShiftfailures — distinguishesrate-limited/network/server-error/bad archive response/not in archiveinstead of folding into a flat "not in archive" label. dragResizepointercancel + window-blur teardown — drag cleanup no longer leaks listeners when the tab loses focus or the OS steals the pointer.userTaggerEsc-close + single active popover — only one popover open at a time; Esc dismisses; deferred outside-click handler guards against teardown races.botCollapsereveal-button now drives label off the live.collapsedclass — stays in sync with reddit's native[-]/[+]toggle.filterRulescollapse-for-posts degrades todim(posts have no native collapse on old.reddit).data-rsm-filter-hitis now space-separated and dedupes IDs.redgifsLayoutFixper-Thing scoped observers — replaces the previous body-wide MutationObserver. Dramatically less work on busy listings.- IDB-promise reset on failure —
voteHistory+mediaArchiveManifestno longer break permanently on a transient IndexedDB hiccup. cobaltDownloaderhost merge —eligibleHosts()now merges defaults + custom list (was replacing).res.json()wrapped in try/catch.galleryZipjszip retry — cached promise resets on rejection so a transient CDN failure doesn't permanently break the button.commentTreeExport— deadincludeAllChildren: falseoption branch removed.
Fixture hygiene
- Privacy outbound-URL snapshot regenerated; regen helper at
scripts/regen-privacy-snapshot.mjsfor future use. expectedHostCountbumped 86 → 88 (mastodon + threads from v0.11.11).threadshost permissions added to both chrome + firefox manifests.
Verification
- 358/358 tests green.
- Chrome + Firefox production builds clean.
Install
- Chrome / Brave / Edge: Load unpacked from
dist/chrome/(recommended — Chromium 75+ rejects self-signed CRX withCRX_REQUIRED_PROOF_MISSINGregardless). The.crxis provided for completeness and works in enterprise-policy installs. - Firefox: Load
res-slim-firefox-v0.12.7.zipviaabout:debugging→ "Load Temporary Add-on".
SHA-256 sums in SHA256SUMS-v0.12.7.txt.
RES-Slim v0.4.0
Comprehensive QA Audit + Settings Console Rebuild
Settings Console Rebuild (new)
- Full two-panel layout with independent sidebar and workspace scrolling
- Search workspace fixes and search-results rendering corrections
- Mobile and deep-link behavior improvements
- Save/discard state and staged-count UX fixes
- Disabled-module accessibility: options pane becomes inert, controls behind scrim are no longer keyboard-focusable
- Localization cleanup for the rebuilt settings UI
- Right-panel toggle fix: legacy RES toggle CSS no longer leaks into the console; toggles correctly centered and sized
Build System
- Fixed
noSourcemapparameter name mismatch (Firefox/Opera always got sourcemaps) - Wrapped async builds in
Promise.all(previously exited before completion) - Fixed
undefinedtoken injection forbrowserMobileMinVersion - Removed dead
chromebeta/edge/operatargets with missing manifests
Manifests
- Removed dead
webRequestpermission (Chrome MV3) - Removed redundant
script-src-elemfrom Chrome CSP - Removed unused
cookies/identitypermissions from Firefox MV2
Modules
- Added missing
module.includetofixImageLinksanddownloadButtons(ran on options page) - Fixed
archiveLinksUnddit URL double/r/bug - Fixed
reddEyehideFlaggedusing bare.collapsedclass instead of clicking expand toggle - Fixed
viewDeleteddetached-DOM check usingthing.entryinstead ofthing.element - Fixed
nextTopCommentduplicate button injection on re-navigation
Settings Console (QA fixes)
- Fixed
a.targetconcatenation bug (produced invalid_blank _parent) - Fixed
noreferertypo →noreferrer(7 occurrences, 3 files) - Fixed table keycode options dropping
metaKeybit (4-element array instead of 5)
CSS & Dependencies
- Removed 26 dead SCSS imports for stripped modules — 50KB smaller
res.css(282KB → 232KB) - Removed dead
suncalcandfavico.jsdependencies
Install
- Chrome: Download the
.crxor loadRES-Slim-v0.4.0-chrome.zipunpacked viachrome://extensions - Firefox: Load
RES-Slim-v0.4.0-firefox.zipas a temporary add-on viaabout:debugging
RES-Slim v0.3.9 — rewrite nightwatch test fixtures for RES-Slim modules
Housekeeping release. No runtime changes — only the stale nightwatch test suite gets rewritten.
What changed
The upstream RES tests/settingsConsole.js referenced modules that were stripped from this fork in v0.1.0: accountSwitcher, keepLoggedIn, quickMessage, wheelBrowse. The tests could not run against RES-Slim regardless of CI state — they were dead fixtures from the fork. A prior session had started updating selectors to match the v0.3.6 global-save layout but left the module references pointing at things that don't exist.
Remapped each test to a module that actually ships in RES-Slim:
| Test | Upstream module | RES-Slim replacement |
|---|---|---|
| Boolean option | accountSwitcher.keepLoggedIn |
commentDepth.commentPermalinks |
| Enum option | accountSwitcher.dropDownStyle |
absoluteTimestamps.format (locale/iso) |
| Text option | quickMessage.defaultSubject |
commentDepth.defaultCommentDepth |
| Table option | accountSwitcher.accounts |
commentDepth.subredditCommentDepths |
| Disable module | wheelBrowse |
autoExpand |
| Discard reset | accountSwitcher.keepLoggedIn |
commentHighlights.borderOnly |
| Nested click | #res:settings/accountSwitcher |
#res:settings/commentHighlights |
| Dependent option | commentQuickCollapse.leftEdgeColor |
unchanged — this module survived |
commentDepth was the only viable target for the table test because it's the only RES-Slim module with type: 'table' (the subredditCommentDepths table with list + text + text sub-fields). Table input IDs follow the ${optionKey}_${field.name}_${rowIndex} pattern — #subredditCommentDepths_commentDepthCommentDepth_1 for the first newly-added row, _0 for the persisted row after refresh.
Selectors already use the v0.3.6 global-save layout (#RESGlobalSave, #RESGlobalStageBar, #RESGlobalDiscard, .is-saved, .is-dirty). Nothing else to port.
Still no CI
The nightwatch suite has never been wired into a CI workflow and this release doesn't change that. The suite is kept in-tree for forward consistency — if someone revives the test infrastructure later, the selectors and module references will already be pointing at things that actually exist. Running it locally still requires nightwatch + a browser + a live reddit.com session.
Install
CRX (signed, auto-updates from prior RES-Slim CRX installs — same extension ID)
Download res-slim-chrome-v0.3.9.crx and drag into chrome://extensions with Developer mode enabled.
Zip (unpacked)
Download RES-Slim-v0.3.9-chrome.zip, extract, and load unpacked from chrome://extensions.
Verification
yarn oncecleanyarn eslint tests/settingsConsole.jscleannpx flow check0 errors
RES-Slim v0.3.8 — settingsNavigation click handler and URL parser fixes
Five real bug fixes to settingsNavigation. These were sitting uncommitted in the working tree (work-in-progress from a prior session) and got triaged as part of the v0.3.7 audit cycle — the four original fixes are solid, plus one additional regression I caught during verification.
Fixed
Click interceptor
-
Modifier clicks — the click handler previously only respected
ctrlKey, so cmd-click (macOS), shift-click, and alt-click on a settings link would still intercept and open the console instead of honoring the modifier's native behavior (open in new tab, etc.). Now checks all four modifier keys. -
Nested click targets — the old check
e.target instanceof HTMLAnchorElementbroke if the user clicked an icon or span inside a settings link. Now walks up viae.target.closest('a'). -
target="_blank"anchors — the interceptor now skips anchors that explicitly opt into a new tab. Previously those got hijacked into the embedded console.
parseHash / makeUrlHash
-
Proper URL encoding — the old code used a regex match + literal
%20string replace, which only handled spaces and broke on any other URL-encoded character. Now usesencodeURIComponent/decodeURIComponentfor a proper round-trip. Also internally normalizes the legacy#!settingsprefix so both old and new links parse to the same result. -
Prefix match vs substring match — [caught during verification against the existing test URLs]. The initial fix sliced the hash at position 14 (length of
#res:settings), so a URL like#res:settings-redirect-standalone-options-page/accountSwitcher(a distinct test-harness route that happens to share#res:settingsas a literal prefix) was getting parsed with-redirect-standalone-options-pageas the moduleID. Fixed by requiring the prefix to be followed by/or end-of-string before treating the remainder as a path.
Verified with
Edge-case test harness in a node one-liner:
"#res:settings" => {}
"#res:settings/" => {}
"#res:settings/commentHighlights" => {"moduleID":"commentHighlights"}
"#res:settings/commentHighlights/color" => {"moduleID":"commentHighlights","optionKey":"color"}
"#res:settings/commentHighlights/expire%20days" => {"moduleID":"commentHighlights","optionKey":"expire days"}
"#!settings/autoExpand" => {"moduleID":"autoExpand"}
"#!settings" => {}
"#something-else" => {}
"" => {}
"#res:settings-redirect-standalone-options-page/accountSwitcher" => {}
All cases return the expected result — URL encoding round-trips (expire%20days → expire days), both hash styles parse, and the prefix-substring trap returns empty instead of a bogus moduleID.
Not shipped in this release
The tests/settingsConsole.js diff is still uncommitted. It's a mechanical selector refresh (#moduleOptionsSave → #RESGlobalSave, workspaceStageStatus → RESGlobalStageBar, .optionsSaved → .is-saved) plus two new tests — but it references upstream RES modules (accountSwitcher, keepLoggedIn, quickMessage, wheelBrowse) that were stripped from RES-Slim in v0.1.0. Shipping the selector sync on tests that can't actually run against this private fork would just propagate stale fixtures. Those tests need a separate rewrite against modules that actually exist in RES-Slim; out of scope for a bug-fix release. There's also no CI wiring, so they're never executed regardless.
Install
CRX (signed, auto-updates from prior RES-Slim CRX installs — same extension ID)
Download res-slim-chrome-v0.3.8.crx and drag into chrome://extensions with Developer mode enabled.
Zip (unpacked)
Download RES-Slim-v0.3.8-chrome.zip, extract, and load unpacked from chrome://extensions.
Verification
yarn oncecleanyarn eslint lib/modules/settingsNavigation.jscleanyarn stylelintcleannpx flow check: 0 errors
RES-Slim v0.3.7 — QA audit on v0.3.6 + second-look on v0.3.5 modules
Full comprehensive audit on v0.3.6 settings console transformation + a second-look pass on the v0.3.5 module fixes. Three parallel Explore agents surfaced findings; I verified each one against the source, filed false positives, and fixed the confirmed bugs.
Fixed
Settings console (v0.3.6 regressions + rough edges)
- Filter chip ARIA — the v0.3.6 templates shipped
role="tab"+aria-selectedon each chip, which is an incomplete ARIA tab pattern (would needrole="tabpanel",aria-controls, and arrow-key navigation between chips to be compliant). Switched to the correct semantic for toggle-style filter buttons:role="group"on the container +aria-pressedon each chip. .moduleRowTogglethumb asymmetry — off-statemargin-left: 2pxsat 2px from the left edge, but on-statemargin-left: 16pxsat 4px from the right edge instead of 2px. Track 34 − thumb 14 − 2 = 18, so on-state should be 18px. Fixed.- Responsive 680px breakpoint — the v0.3.6 media query applied
justify-content: centerto.globalSaveButton/.globalDiscardButtonat narrow widths. Those are non-flex buttons (display: inline-block), sojustify-contentdid nothing. Switched totext-align: center. - Empty filter state — when a filter matched zero modules the entire sidebar list went blank with no explanation. Added a placeholder: dashed-border card with "No modules match this filter." and a "Show all modules" reset button that fires
setModuleFilter('all'). - Stale
$moduleOptionsScrimreference —drawConfigOptionsonly reassigned this jQuery wrapper when the current module actually had options. For no-options modules, the variable kept pointing at a detached div left over from the previous module, and subsequentupdateCurrentModuleStatecalls silently mutated a ghost. Fixed by clearing it toundefinedbefore the create/skip branch. - Category
.activevs.is-expandeddesync — manually collapsing the currently-highlighted category left the.activehighlight in place, reading visually as "this category is still selected" while its content was hidden. Now drops.activeon manual collapse.
Modules (second-look on v0.3.5)
viewDeleted— the restore flow awaited a pullpush.io fetch, then wrote the archived body intothing.entry.querySelector('.usertext-body .md')without re-checking that the comment was still in the live document. With infinite-scroll now live in v0.3.5, it's realistic for the comment to be detached mid-ajax. Now re-queries after the await, bails ifdocument.contains(thing.entry)is false, and also guardstrigger.remove().hideGifComments— the module detected gif-only comments correctly but then just added the.collapsedclass, which does nothing visually on old.reddit. Reddit's collapse is driven by a JS click handler that rewrites the DOM into a one-line stub AND adds the class; adding the class alone leaves the comment fully expanded. Now clicks the.expandtoggle to run Reddit's native collapse logic, falling back to class-only if the toggle isn't present.
Agent false positives I verified and did NOT fix
The agents flagged several issues that turned out to be non-problems after verification:
nextTopComment"off-by-one invisibleIndex" — the bounds are correctly clamped byMath.max(0, ...)/Math.min(len-1, ...).downloadButtons"double-button injection" — theexpando.querySelector('.res-slim-download-btn')guard insidedecorate()makes the rAF + setTimeout double-fire idempotent.currentColor"spec case violation" — the agent got it backwards; stylelint-config-standard REQUIRES lowercasecurrentcolorand I fixed this in v0.3.6 after a stylelint failure.saveAllStagedOptions"race with autostageDebounce" — after commit, re-staging the same values is a no-op becausestage.addcompares against the committed state.commentHighlights"unboundedstore.getAll()" — 10% probabilistic prune at thread load on bounded storage; not a real issue at realistic thread counts.- Collapsed category with filtered-out children "doesn't re-expand" — this is correct behavior; the user collapsed it manually, it should stay collapsed.
Install
CRX (signed, auto-updates from v0.3.5/v0.3.6 CRX installs — same extension ID)
Download res-slim-chrome-v0.3.7.crx and drag into chrome://extensions with Developer mode enabled.
Zip (unpacked)
Download RES-Slim-v0.3.7-chrome.zip, extract, and load unpacked from chrome://extensions.
Verification
yarn oncecleanyarn eslint lib/cleanyarn stylelintcleannpx flow check: 0 errors (first time this repo has flow-clean since the fork; the pre-existingscrollIntoView({ block: 'nearest' })error turned out to be stale cache)- Playwright visual verification at 1400×900 and 650×900: confirmed toggle thumb symmetry (OFF 2px left / ON 2px right), filter empty state card, dirty stage bar coloring, responsive save/discard button centering, and active filter chip highlight
RES-Slim v0.3.6 — Settings console UX transformation
Settings console UX rework. No functional module changes in this release — only the settings page itself.
What changed
Sidebar
- Categories no longer accordion-collapse. Every category stays expanded by default so the full 45-module list is always scannable. Click a category header (chevron flips) to collapse just that one — siblings never collapse under the user. This was the single biggest friction point: selecting a module in one category used to close every other category, forcing users to re-find their place every time they wanted to jump between groups.
- Inline toggle switch on every module row. No more navigate-then-toggle two-click dance. Flip modules on/off directly in the sidebar without loading their options workspace.
alwaysEnabledmodules (Menu, Version, etc.) show a lock dot instead of a toggle. - Filter chip row (
All / On / Off / Modified) above the module list with live counts. Lets you see just the modules you've touched before saving, or just the disabled ones, without scrolling.
Header
- Global Save + Discard + stage-status bar in the top header, replacing the per-module workspace Save button. Unsaved changes are visible and actionable from any module you're viewing.
- Dirty state renders warning-colored with a live count: "3 changes staged across 2 modules"
- Saved state renders success-colored with a pulse animation on commit
- Discard button appears alongside when the stage is dirty and hard-resets via
Options.stage.reset()
- Dropped the
/r/Enhancementsidebar link (wrong for a private fork that explicitly stripped upstream RES), the "Settings" eyebrow, and the marketing subtitle. Header is now a single clean title row.
Internals
- New shared
toggleModuleEnabled(id)function is the single entry point for enable/disable. Both the sidebar inline toggle and the workspace toggle call it. Global save/discard also call it when re-syncing the sidebar after a commit. - New
syncSidebarModuleState(moduleID, enabled)keeps the sidebar toggle visually in sync with stage + commit operations without a full re-render. - Removed dead selectors from
options.scss:#moduleOptionsSave,.workspaceStageStatus,.moduleActionRow,.moduleWorkspaceEyebrow,#RESConsoleSubredditLink,.consoleEyebrow,.consoleSubtitle. - Added:
.globalStageBar,.globalSaveButton,.globalDiscardButton,.filterChips,.filterChip,.filterChipCount,.moduleRow,.moduleRowToggle,.moduleRowLock,.categoryButtonChevron,.sidebarFooter.
Install
CRX (signed, auto-updates from prior RES-Slim CRX installs — same extension ID)
- Download
res-slim-chrome-v0.3.6.crx. - Drag and drop into
chrome://extensionswith Developer mode enabled.
Zip (unpacked)
- Download
RES-Slim-v0.3.6-chrome.zipand extract. - Load unpacked from
chrome://extensions.
Verification
yarn oncecleanyarn eslint lib/options/cleanyarn stylelintcleannpx flow check: 1 pre-existing error only (scrollIntoView({ block: 'nearest' })— flow-bin 0.84dom.js.flowout of date, the value is spec-valid)- Preview rendered in playwright at 1200×1500 to validate layout, spacing, filter chip counts, dirty-state colors, category expand state, inline toggles, lock dot on alwaysEnabled modules
RES-Slim v0.3.5 — QA audit pass
Comprehensive QA audit pass. No new modules; existing ones get correctness fixes.
Fixed
High impact
disableSubredditStyles:ref=typo (should berel=) left half the selector dead, and inline<style title="applied_subreddit_stylesheet">blocks were never being matched at all. Module now reliably strips both external and inline subreddit CSS.infiniteScroll: appended posts bypassed RES's watcher system, soselectedEntry,commentHighlights,subredditBlacklist,showImages, andhovercould silently skip anything loaded past the first page. Now callsregisterPage()on each appended.thing.- Settings console keycode modal: focusing a keycode field and then closing the console without pressing a key left the window-level
keydownlistener armed — it would eat innocent keystrokes on the main page (and throw when querying the destroyed console). Fixed by resettingcaptureKeyon blur. - Settings console save path:
Options.stage.commit()was not wrapped intry/catch. A throwingonSaveSettingshook orModules.setEnabledfailure left the stage dirty while the UI flashed "All changes saved". Failures now surface via notification and the stage is preserved for retry.
Medium
absoluteTimestamps,userProfileSearch,restoreSubCounts: addedmodule.include = ['r2']so they stop running on the extension's own options page.fixProcessingImg: guarded the tree walker against a detached comment body after the ajax resolves (could happen across infinite-scroll nav or DOM churn); alsoCSS.escape's the image-id interpolation.markAllRead: if no modhash can be found, fail loudly withNo modhash ✗instead of firing a POST that Reddit silently 403s while the button cheerfully reports "All marked read".restoreSubCounts: replacedbox.innerHTML = parts.join('<br>')with DOM APIs.
Low
fixImageLinks: MutationObserver hoisted to module scope so it isn't orphaned.
Install (Chrome / Edge / Brave)
- Download
RES-Slim-v0.3.5-chrome.zip. - Extract anywhere.
- Open
chrome://extensions, enable Developer mode, click Load unpacked, select the extracted folder.
Verification
yarn oncecleanyarn eslint lib/cleannpx flow check: 1 pre-existing error onscrollIntoView({ block: 'nearest' })(flow-bin 0.84dom.js.flowis out of date —'nearest'is spec-valid)
RES-Slim v0.3.4 - Settings workspace refinement
Another UX refinement pass on the settings workspace, authored via Codex.
Changes
lib/options/settingsConsole.js— further behavior refinements (+119 lines)lib/options/options.scss— ~500 lines of styling updateslib/options/templates.js— console template adjustments to matchlib/modules/search.js— settings-search simplification (-52 lines)lib/core/options/stage.js— small staging layer additions
No module additions or behavior changes. Module count unchanged at 45.
Install
- Chrome/Edge: drag
res-slim-chrome-v0.3.4.crxontochrome://extensions(Developer mode), or load the .zip unpacked. Extension ID28d1c92ee72e3b2f56327d428e883526(stable). - Firefox:
res-slim-firefox-v0.3.4.xpiviaabout:debugging, or load the .zip unpacked in Dev/Nightly.
License: GPL-3.0 (inherited from upstream RES).