Skip to content

Repository files navigation

chromium-tabscroll

Chromium overlay tooling for browser pain points that got worse in 2026: horizontal tab scrolling, saner runtime defaults, privacy/hardening launch profiles, AI/model-download opt-out guidance, adblock/extension-manifest notes, and CI checks that catch upstream drift.

It does not vendor a full Chromium checkout. The repo stays small: self-authored overlay files, anchored integrator edits, runtime profiles, policy samples, docs, and a free-CI build pipeline.

Background

Chrome had a horizontal tab-scrolling feature behind chrome://flags/#scrollable-tabstrip from Chrome 75 (June 2019). It never shipped enabled on stable. On 2025-11-25, commit ef29babd ("Removing Tab Scrolling feature", Eshwar Stalin, reviewed by David Pennington and Alison Gale, bug 414802341) deleted the whole subsystem, +49 / -4,654 across 35 files. It shipped in Chromium 144, January 2026, taking scrolling out of Chrome, Brave, and every Chromium browser at once.

Google's reason: the old code "relied on outdated code that couldn't be maintained alongside the new one being built." The tabstrip is being unified (see kTabStripUnification, kVerticalTabs), and the six-year-old scrolling implementation was in the way.

Why a rewrite, not a revert

Reverting ef29babd brings back code written for the pre-2025 tabstrip. It fights the current architecture and breaks on the next upstream roll. The tabstrip is now an interface (TabStripRegionView) with concrete backends (HorizontalTabStripRegionView over BaseTabStripRegionView). This project adds scrolling as a new, additive layer that plugs into the current horizontal backend, behind its own feature flag, so it survives rebases.

The old removal diff is kept in reference/ for study only.

Layout

src/            new source files (self-authored, dropped into the tree as an overlay)
integration/    thin patches wiring the new files into BUILD.gn + the region view + flags
config/         reduced-cost build args, runtime profiles, policy samples
scripts/        apply-patches.sh, reclaim-disk.sh
docs/           adblock, AI opt-out, and performance-default notes
.github/        the free-CI build pipeline
reference/      the original removal diff, for reference only
PLAN.md         the re-implementation design

Runtime profiles

Use the profiles against any Chromium-like binary while the full fork build is warming in CI:

./scripts/print-flags.sh base performance privacy no-ai
CHROME=/path/to/chrome ./scripts/launch-chromium.sh

Profiles live in config/runtime-flags/ and are intentionally composable. The printer merges repeated --enable-features and --disable-features switches so later profiles do not accidentally wipe out earlier feature lists.

Useful combinations:

./scripts/print-flags.sh base compatibility
./scripts/print-flags.sh base performance
./scripts/print-flags.sh base privacy no-ai
./scripts/print-flags.sh adblock-friendly

Building on free CI (fully free, no setup)

No paid runners, no paid storage, no access token. A cold Chromium build is ~20-40 CPU-hours and won't finish in one free 6-hour job, so the pipeline splits it across runs:

  • Disk. The build runs on /mnt (the ~65 GB ephemeral disk), and scripts/reclaim-disk.sh frees another ~30 GB on root.
  • Compile cache. A lean, symbol-free component build keeps the sccache under the free 10 GB Actions-cache cap, so it persists between runs without eviction. Each run replays cache hits fast and pushes the compile frontier forward, so progress is monotonic and the build converges over a few runs.
  • Continuation. A schedule (cron, every 6h) wakes the build and it resumes where the last run stopped. Press "Run workflow" to advance sooner. When the binary is done it's uploaded as the chrome-tabscroll-linux artifact and a marker short-circuits further runs.

The whole thing runs on free GitHub-hosted minutes for public repos. See .github/workflows/build.yml.

Local build

export CHROMIUM_SRC=/path/to/chromium/src
./scripts/apply-patches.sh
cp config/args.gn "$CHROMIUM_SRC/out/Default/args.gn"
cd "$CHROMIUM_SRC" && gn gen out/Default && autoninja -C out/Default chrome

Toggle at runtime with chrome://flags/#horizontal-tab-scrolling.

The same feature can also be toggled with:

--enable-features=HorizontalTabScrolling
--disable-features=HorizontalTabScrolling

Pain-point docs

  • docs/performance-defaults.md explains the build/runtime defaults.
  • docs/ai-opt-out.md tracks AI/model-download feature names and drift checks.
  • docs/adblock-manifest.md documents MV2/MV3 extension-manifest constraints and managed-policy samples.

Source of truth is chromium.googlesource.com; the code was read from the read-only github.com/chromium/chromium mirror.

About

Horizontal tab scrolling for Chromium, rewritten against HEAD after Google removed it in M144.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages