← Back to home

Changelog

Release notes for the extension and the feed-cleanup rules. The version number matches the one on the extension's options → About page.

This project follows Semantic Versioning. The landing page footer and extension/manifest.json must use the same release version.

Release process

  1. Update the extension manifest and landing-page version together.
  2. Add release notes under a new version heading in this file.
  3. Run bun install --frozen-lockfile, bun run lint, bun run test, bun run build, and bun run extension:validate.
  4. Run bun run extension:package, followed by bun run extension:verify-zip.
  5. Install the ZIP in a clean Chrome profile and complete the release smoke test.
  6. Commit the release in a working state and create an annotated version tag. Do not rewrite published history.

[2.7.0] - 2026-11-07

Changed

  • Website redesigned end-to-end around one idea — show the product working instead of describing it: a live theme switcher in the hero recolors a CSS-built Facebook miniature with the extension's real palettes (including Arctic's light mode), and an interactive surface-transparency slider demonstrates the frosted wallpaper feature. Feature cards became a bento grid led by the five-layer coverage engine; a proof strip states only verifiable facts (12 themes, 5-layer engine, 0 network calls, free).
  • All download CTAs replaced with a single "Add to Chrome" action. The ZIP download is gone from the site: distribution moves to the Chrome Web Store listing (the button takes the store URL via a one-line STORE_URL constant and scrolls to the install note until the listing is live).
  • Site accent unified to the product's cyan (#22d3ee), so the landing page and the extension icon read as one brand; sticky glass nav, final CTA band, balance-wrapped headings, and reduced-motion support added.
  • The landing site is live, so FBC_SITE_ORIGIN is now wired to https://fb-customizer.vercel.app — the options → About tab shows the privacy, terms, support, and changelog links (all user-initiated tab opens; nothing is fetched). Release ZIP re-archived with the change.

[2.6.1] - 2026-11-01

Added

  • "Support" button in the popup footer, next to Settings — opens the developer's Ko-fi page in a new tab. Appears only while the donation URL is set; nothing is gated behind it, and it never prompts or nags.

Fixed

  • Website polish pass (audited against the design discipline): duplicate "Support" footer label relabeled to "Donate"; stale privacy-policy copy removed (daily counters no longer exist, the Lovable error-reporting helper is gone); feature-card emoji replaced with a consistent inline-SVG icon set; hero headline accent-word tell removed; the hero mock re-rendered in the current Cyberpunk palette; a share image (og.png) and theme-color added; fonts self-hosted via bundled variable fonts — the site no longer loads anything from Google Fonts, and the privacy policy now says so; skip-to-content link, main landmark, and visible keyboard focus added.

[2.6.0] - 2026-10-29

Changed

  • Renamed to **"FB Customizer — Themes, Dark Mode & Wallpaper for Facebook"** across the manifest and site, following Chrome Web Store search research: the store's algorithm weighs the extension name above everything, and "dark mode" + "wallpaper" are the highest-demand queries this category gets — the previous name missed both.
  • Manifest description rewritten as a keyword-grounded 132-character summary (the store's search-result snippet).

[2.5.1] - 2026-10-29

Added

  • "Rate us" buttons (popup footer and options → About) that open the Chrome Web Store reviews tab, and a "Support development" donation button in options → About. Both stay hidden until their URLs are set (FBC_STORE_URL / FBC_DONATE_URL in extension/storage-keys.js) — the store URL is filled at Chrome Web Store submission, the donation link whenever the developer sets one up. Never gated behind payments and never nagged with popups.

[2.5.0] - 2026-10-29

Changed

  • **The literal sweeper now classifies colors instead of enumerating them.** It repaints any opaque *neutral* background (greys/whites within a small channel delta) with the themed surface and pairs it with themed text when the element's own text color is also a neutral literal — polarity-correct (light themes only repaint dark text, so white text on photos and accent buttons stays white). Chromatic colors (badges, reactions, brand marks), translucent scrims, and pure-black stages are never touched. This catches every current and future grey/white literal automatically, ending the enumerate-and-patch cycle for neutral leaks.

Added

  • Form fields and composers follow the theme: inputs and textareas get the themed surface and text, composers (role="textbox") get themed text, placeholders render in the muted color, and editables show an accent caret.

[2.4.1] - 2026-10-29

Fixed

  • Hover tooltips now follow the theme: role="tooltip" surfaces join the scoped variable stack, and the tooltip box plus its arrow are painted with the themed surface and text (unlike dialogs, a themed background is correct here — there is no intentionally-black stage). The tooltip's mid-grey literal (#3E4042 family) also joins the literal sweeper's set as a fallback.

[2.4.0] - 2026-10-29

Added

  • **Literal sweeper**: a live dump proved that profile-header bands are painted by compiled class rules with hardcoded literal greys (rgb(36, 37, 38)-family) while the theme's variables resolve correctly at the same elements — no variable mapping can reach those, and the classes are obfuscated. The content script now scans surfaces on idle time and tags elements whose computed background matches a leak literal (greys and Facebook blues, both palettes) with a themed class. Scans are idle-scheduled, throttled to one per 1.5 s, deduplicated per element, and the themed paint lives in the injected stylesheet — so disabling the extension restores the original look with no cleanup.
  • A structural paint-over for the known profile-header band combo (from the dump), so the band is themed on first paint without waiting for the sweeper; the sweeper remains the durable fallback if Facebook rotates the class names.

[2.3.2] - 2026-10-29

Fixed

  • Profile pages (and any surface with an embedded polarity island) now follow the theme. Facebook nests __fb-light-mode / __fb-dark-mode classes on interior elements — confirmed in a live profile-header dump, where the cover-photo controls carry a full light-mode token stack inside the dark-mode page — and that local stack beat the root-level remap by inheritance. The themed variable stack is now re-emitted on those islands and their subtrees (scoped to body descendants so the page-root mode class can't widen it).

[2.3.1] - 2026-10-28

Fixed

  • The hover cards on group and profile names (the "Link preview" popups) stayed stock: their surfaces are painted deeper with inline literals from Facebook's **2026 dark palette** — #252728 / rgb(37, 39, 40), #1C1C1D wash, #65686C hover grey — which the earlier sweep list (built around the older #242526 family) did not include. Those literals are now swept to the themed surface, and the new palette's grey secondary text (#B0B3B8) maps to the themed muted color so text hierarchy is preserved.

[2.3.0] - 2026-10-28

Fixed

  • Dialogs, menus, and side trays now theme correctly. A live variable dump on facebook.com showed that Facebook re-declares its entire theme-variable stack (34 tokens: --card-background, --surface-background, --accent, --secondary-text, --web-wash, --divider, --comment-background, …) on wrappers inside those surfaces, and the closer declaration beats our html/body-level remap. The full stack — semantic variables and the FDS scale, each in its correct light/dark polarity — is now re-emitted with !important on every element inside dialog, menu, and complementary subtrees (bounded to those surfaces for performance).

Added

  • Tokens discovered in that dump are now mapped: popover backgrounds, the Messenger tray header/rows/actions (--mwp-*), outgoing chat bubble color, radio and badge colors.
  • The 2026 Facebook rebrand blue (rgb(8, 102, 255)) joins the inline blue sweep alongside the legacy blues.

[2.2.1] - 2026-10-28

Fixed

  • Layer surfaces — the post dialog, the Menu, Chats and Notifications trays, the account menu, and watch-page comments — are painted by Comet with inline background-color literals (rgb(36, 37, 38)-family in dark mode, white/grey in light mode) rather than variables, so the FDS mapping from 2.2.0 could not reach them. Inline-literal sweeps now repaint those backgrounds to the themed surface, near-black inline text to the themed text, and — in dark themes — the white text family as well. In light themes white text stays white (correct on photos and accent buttons).

[2.2.0] - 2026-10-28

Fixed

  • Theme coverage extended to the parts that stayed stock: comments, modals and dialogs, dropdown menus, tooltips, and settings popups. Three root causes addressed:

- Facebook's FDS design-system tokens (--fds-white, the --fds-gray-* scale, --fds-blue-*, --fds-black) are now remapped — comments and dialogs are built from these, and none were covered before. - The FDS mapping is emitted under Facebook's own __fb-dark-mode / __fb-light-mode classes, so each token gets the polarity-correct value (--fds-white is text in Facebook's dark mode but background in its light mode). - The core variable remap is now declared at both html and body level, so Facebook's mode-class and body-level declarations can't outrank it.

  • Dialog, menu, tooltip, and listbox text now follows the theme. Their backgrounds are deliberately never forced — the photo viewer's black stage stays black.

[2.1.0] - 2026-10-28

Changed

  • Full UI redesign of the extension surfaces around a shared design-token system: one accent, a blue-tinted neutral ramp, system type at a small-surface scale, and **light and dark variants that follow the browser** (both designed separately, previously dark-only).
  • The popup is a fixed 360px, instant-render surface: state first ("Customizing this tab · Midnight"), the master switch as the primary control, and theme paint-strip chips in a three-per-row grid that fits all twelve themes without scrolling.
  • The options page replaces its dashboard sidebar with a sticky header and segmented tab bar (inline SVG icons, no emoji), a single centered 680px column of flat bordered sections, and a visually separated danger zone for "Reset all settings".

Added

  • Toolbar badge that passively shows when customizing is off ("OFF"), synced from settings and persistent across service-worker restarts.

[2.0.0] - 2026-10-28

FB Customizer is now an appearance-only extension: it changes how Facebook looks and nothing else.

Removed

  • The entire feed-cleanup engine and everything attached to it: the sponsored/suggested/Reels/PYMK/groups/keyword rules, the cleanup CSS and observers, hidden-post placeholders, the "Pause rule" and safe-mode controls, the keyword filters UI, the hidden-post counter, and the daily counters in storage. The extension no longer reads, analyzes, or filters any feed content.
  • The cleanup-focused planning documents (docs/IMPROVEMENT_PLAN.md, docs/WEAKNESS_AUDIT.md).

Changed

  • Product name and copy now say "Themes & Appearance" everywhere (manifest, popup, options, landing page, Store listing draft).
  • The privacy policy is simpler and stronger: the extension injects a stylesheet generated from your settings and reads none of the page's content.
  • Onboarding rewritten for theming (theme → make it yours → presets); About describes the theming scope.
  • Existing stored settings keep working: cleanup-related keys are ignored and dropped on the next save.

[1.3.0] - 2026-10-27

Added

  • "Copy diagnostics" in the popup: one click copies the extension/Chrome versions, detected surface, feed/article counters, and per-rule hide counts — never post text, URLs, or page content. Beta reports should attach it by default.
  • Live engine status in the popup ("Watching home feed · 42 posts seen", or "Safe mode — cleanup paused").
  • Safe-mode quick toggle in the popup (previously buried in the options page).
  • First-run onboarding: fresh installs land on a three-step "Getting started" sheet (theme → cleanup → safe mode), skippable and re-runnable from options → About.
  • Supported-surface matrix in options → About; new beta tester guide (docs/BETA_TESTER_GUIDE.md).

Changed

  • Hidden-post placeholders now use real buttons for "Show" and "Pause rule" (keyboard reachable), and popup/options show visible keyboard focus rings, honor prefers-reduced-motion, and label their icon-only remove buttons for screen readers.

[1.2.0] - 2026-10-27

Fixed

  • Sponsored posts whose "Sponsored" label renders as an SVG icon with no text (confirmed against a real feed ad) are now detected through Facebook's own structural ad tags — data-ad-rendering-role, data-ad-preview, and data-ad-comet-preview — which appear only on ads, work in every locale, and cannot be obfuscated away. Text and aria-label matching remain as fallbacks.

Added

  • Surface detection layer: the engine now knows which Facebook surface it is on (home feed, Video tab, Reels, Marketplace, Groups, other) and scopes cleanup accordingly. Feed rules run on the home feed and the Video tab; profiles, login, and settings pages get no rules at all.
  • "Right sidebar" rule returns as a home-feed-only, **off by default** toggle — with a regression test guaranteeing role="complementary" is never hidden on the Reels tab or any other surface (the 1.0.3 lesson, codified).

[1.1.0] - 2026-10-27

Added

  • Primary buttons with inline Facebook-blue backgrounds ("Post", "Join", "Add friend") now follow the theme, with button text color computed from the accent's luminance so light accents stay readable.
  • The Facebook variable remap is now an audited, commented allowlist nearly twice as wide: dialogs, menus, toasts, comment boxes, disabled buttons/icons, and hover/pressed states follow the theme.
  • Scrollbars and text selection follow the palette.
  • Wallpaper v2: while a wallpaper is set, the main page columns become blurred glass (strength slider 35–100%) so the wallpaper is actually visible and text stays readable; browsers without backdrop-filter fall back to the opaque background.

Changed

  • Text-size scaling now uses the root font-size instead of body { zoom }, removing the sticky-header and dialog misalignment class of issues at 85–130%; at 100% Facebook's own base is left untouched.
  • Options → About now states that Marketplace, Gaming, and Messenger panels are only partially themed.

[1.0.4] - 2026-10-27

Fixed

  • Settings saves can no longer fail silently: every write goes through one path that reads the latest stored state, merges field-level, checks the chrome.storage.sync 8 KB per-item byte budget, and reports failures — the popup shows the error in its status line and the options page toasts and reverts controls to the last saved state.
  • Sponsored matching now compares whole "·"-separated header segments: very long page names followed by "· Sponsored" are hidden (the old 60-character cap missed them), while pages whose name merely contains the word ("Sponsored Fishing Trips") are not.
  • Every [role="feed"] on a page is observed and cleaned, not just the first one; disconnected feeds release their observers.
  • The header-label fallback for suggested/Reels/PYMK/groups rules now reads the header link's visible span text (decoy-safe), so rules keep matching when labels are plain spans rather than headings or aria-labels.
  • The content script's "Pause rule" writes are field-fresh instead of overwriting settings with a stale full copy.

Added

  • Options shows a live settings-size line under Keyword filters ("Settings use X KB of the ~8 KB sync budget").

[1.0.3] - 2026-10-26

Removed

  • The "Right sidebar" cleanup rule introduced in 1.0.2. Facebook reuses role="complementary" for side panels on other surfaces — notably the Reels tab's comments panel — so hiding it globally cut off comments there. Home-feed scope is restored to the 1.0.1 shape; a surface-scoped sidebar rule may return later, off by default.

[1.0.2] - 2026-10-25

Fixed

  • Sponsored posts are now detected on live Facebook, which renders the "Sponsored" label as per-letter spans mixed with decoy letters inside aria-hidden spans. The matcher rebuilds the header's visible text and matches the word there.
  • Clicking "Show" on a post hidden by a CSS-covered rule (Sponsored, Suggested, Reels, PYMK, groups) now actually reveals it: the pre-hide selectors exclude articles marked as revealed.

Added

  • New "Right sidebar" cleanup rule (on by default): hides the right rail with its ads, People You May Know, and contacts modules via role="complementary" / RightRail selectors.

[Unreleased]

Changed

  • Removed the Lovable editor integration: the site now builds from an explicit Vite config instead of @lovable.dev/vite-tanstack-config, and the Lovable-only client error-reporting shim is gone. TanStack devtools remain available in dev via the direct @tanstack/devtools-vite dependency.
  • The site deploys to Vercel (Nitro vercel preset): import the repo in Vercel or run bun run deploy with the Vercel CLI.

[1.0.1] - 2026-10-24

Added

  • Public privacy policy, terms of use, support page, and this changelog on the landing site, linked from the site footer.
  • Options "About" tab now shows the runtime version and links to the policy, terms, changelog, and support.

Changed

  • Removed the unused activeTab permission after a permission audit; the extension now requests only storage plus the Facebook desktop host permission.
  • Extension validation now rejects unaudited permissions and any network or remote-URL usage in extension code.

[1.0.0] - 2026-10-22

Changed

  • Made all current appearance and feed-cleanup features free.
  • Removed local Pro, trial, and license-key behavior pending a future real entitlement service.