Skip to content

Latest commit

 

History

18 Commits

Folders and files

Repository files navigation

🇺🇸 English  ·  🇷🇺 Русский

Tabs Outliner — Firefox + Chrome (localized)

Session manager & hierarchical tab tree
Unofficial fork with Firefox support, English / Russian UI, and a single shared codebase

Get it on Firefox Add-ons   Latest GitHub release

🦊 Install from Mozilla Add-ons · 📦 Download GitHub release (ZIP)


Fork of the original Tabs Outliner by Vladyslav Volovyk, with:

  • One shared codebase (extension/) for both browsers
  • Chrome / Chromium — Manifest V3
  • Firefox — Manifest V2 + browser_specific_settings
  • i18n — English + Russian (_locales/en, _locales/ru) + language switcher
  • Build scripts for unpacked loads and zip packages

Not an official distribution. Original extension is commercial. Use at your own risk. Support the original author if you need the official product.


Repository layout

extension/                 # single source tree (load after build)
  manifest.chrome.json     # Chrome / Edge / Brave / Chromium (MV3)
  manifest.firefox.json    # Firefox (MV2)
  background_v3.js         # MV3 service worker entry (Chrome)
  background.js            # main background logic
  _locales/en|ru/          # translations
  tree/, img/, backup/, …
scripts/build.mjs          # copies extension/ → dist/* + picks manifest
dist/                      # generated (gitignored)
  chrome/
  firefox/
  *.zip                    # when using npm run pack

There is no single manifest.json that both stores accept as-is: Chrome needs MV3 (service_worker, action, …), Firefox needs MV2 background scripts and a Gecko id.
The code is unified; the build step writes the right manifest.json into dist/chrome or dist/firefox.


Build

Requires Node.js 18+ (no npm install needed).

# both browsers → dist/chrome + dist/firefox
npm run build

# one target
npm run build:chrome
npm run build:firefox

# same + zip archives in dist/
npm run pack

# CI: EN/RU key parity + all data-i18n / getMessage keys present
npm run check:locales

GitHub Actions (release zips)

On every published GitHub Release the workflow .github/workflows/release.yml runs:

  1. npm run pack
  2. Uploads tabs-outliner-chrome-v*.zip and tabs-outliner-firefox-v*.zip as workflow artifacts
  3. Attaches the same zips to that Release

You can also run it manually: Actions → Release packages → Run workflow.

Example:

git tag v1.4.167
git push origin v1.4.167
# then create/publish a Release for that tag in the GitHub UI
# (or: gh release create v1.4.167 --generate-notes)

Install (unpacked / temporary)

Chrome / Edge / Brave / Chromium

  1. npm run build:chrome
  2. Open chrome://extensions
  3. Enable Developer mode
  4. Load unpacked → select dist/chrome

Firefox

  1. npm run build:firefox
  2. Open about:debugging#/runtime/this-firefox
  3. Load Temporary Add-on… → choose dist/firefox/manifest.json

Temporary add-ons are removed when Firefox restarts. Permanent sideloading requires signing or a developer profile.


Translations

Strings live under extension/_locales/<code>/messages.json.

Registry of UI languages (switcher + CI):

  • extension/_locales/locales.json — must list every folder that has messages.json

UI pages use data-i18n / data-i18n-title and i18n-helper.js.
Options → Interface language is built dynamically from locales.json (Auto + all codes).

Adding a language (e.g. Spanish)

# 1. Copy base catalog
cp -r extension/_locales/en extension/_locales/es

# 2. Translate extension/_locales/es/messages.json

# 3. Register in locales.json:
#    { "code": "es", "nativeName": "Español" }

# 4. Verify (same check as GitHub Actions)
npm run check:locales

CI fails if:

  • a locale folder is missing from locales.json (or vice versa);
  • any locale’s keys differ from English base;
  • a data-i18n / getMessage('…') key is missing from the base catalog.

Cross-browser notes

Unified source includes Firefox-safe patches that also work on Chrome:

  • chrome.action ↔ browserAction bridge
  • structured-clone-safe messaging (JSON strip for ports)
  • tabs.update({ active: true }) instead of deprecated selected
  • optional identity.email filtered on Firefox
  • guards for missing webkitRequestFileSystem / tree rows

Chrome package uses manifest.chrome.json (MV3 + background_v3.js service worker).
Firefox package uses manifest.firefox.json (MV2 persistent background scripts + Gecko id tabsoutliner-port@nikita.local).


Original project


License / disclaimer

Original code and trademarks belong to the original author.
This repository is an unofficial localization/compatibility fork for personal and educational use.
You are responsible for compliance with the original license and store policies.

About

I forked Tabs Outliner (originally from the Chrome Web Store) and added new features: i18n support for easy translation, and Firefox compatibility

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages