Tailtab README

The project's README from github.com/Stocist/Tailtab. As one markdown file: README.md.

Tailtab

Tailtab

A Tailscale node for each browser profile. Different profiles can sit on completely different tailnets at the same time.

CI License: BSD-3-Clause Go 1.27 tailscale.com v1.102.3 Platform: macOS · Edge · Zen Status: experimental

Tailtab popup, dark theme    Tailtab popup, light theme

What it does

How it works

flowchart LR
  B[Browser profile] -->|proxy rules| E[Tailtab extension]
  E <-->|native messaging| H[tailtab host<br/>Go + tsnet]
  E -->|127.0.0.1:port<br/>with credential| P[Loopback proxy<br/>HTTP + SOCKS5]
  P --> H
  H -->|WireGuard| T((Tailnet))

The basic setup is pretty simple.

The extension talks to a small Go host through native messaging. That host embeds tsnet, which means the host itself becomes the Tailscale node. It then exposes an authenticated HTTP/SOCKS5 proxy over loopback for the browser to use.

Chromium gets pointed at the proxy through a PAC script. Firefox decides whether to proxy each request itself. Both browsers use the same routing rules, with a shared fixture there to make sure the implementations do not slowly drift apart.

More detail is in docs/architecture.md.

Install

One command installs the host under your home directory and registers it with the browsers on the machine. No root or admin.

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/Stocist/Tailtab/main/scripts/install.sh | sh

Windows (PowerShell):

irm https://raw.githubusercontent.com/Stocist/Tailtab/main/scripts/install.ps1 | iex

When upgrading on Windows, close all browsers that use Tailtab before rerunning the installer. It refuses to replace a running host rather than stopping your browser connections.

Both download the latest release, verify it against SHA256SUMS, and run tailtab install. Set TAILTAB_VERSION to pin a release. Then add the extension:

The host binary is not notarised or code-signed yet, so macOS may need a right-click Open the first time and Windows may show a SmartScreen warning. Linux and Windows hosts pass the same end-to-end smoke test in CI as macOS but have had less real use; reports welcome.

Chrome Flatpak on Linux needs both artifacts inside its sandbox. Use the opt-in Chrome Flatpak installation, not the native-browser one-liner above.

Build from source

You will need Go 1.27, Node 22, and either Microsoft Edge or Zen.

git clone https://github.com/Stocist/Tailtab.git && cd Tailtab
./scripts/build.sh
bin/tailtab install

build.sh builds the host binary and an unpacked extension for each browser.

install then writes the native-messaging manifests for Edge, Zen/Firefox and Chrome, pointing them at that binary.

If you move the repo afterwards, just run install again. bin/tailtab uninstall removes the files Tailtab added.

Load the extension in Edge
  1. Open edge://extensions.
  2. Turn on Developer mode.
  3. Click Load unpacked and select extension/dist/chromium/.
  4. Check that the extension ID is kejfineblfbjfolkgjkancapnpknomod. This is fixed by the key in the manifest.
  5. After rebuilding Tailtab, reload the extension from this page.

Edge likes to keep the old background worker around even after the browser restarts, so the popup shows a warning if the extension and host are out of sync.

Load the extension in Zen / Firefox
  1. Download tailtab-<version>.xpi from the latest release. It is signed by Mozilla for self-distribution, so it installs permanently.
  2. Open it in the browser (drag it onto a window, or File > Open File…) and accept the install prompt.
  3. If you want Tailtab in private windows, enable Run in Private Windows from about:addons.

For development, load extension/dist/firefox/manifest.json from about:debugging#/runtime/this-firefox with Load Temporary Add-on… instead. Firefox removes temporary extensions when the browser closes, so that one has to be loaded again after a restart.

Once that is done, open the popup and hit Connect.

Tailtab opens the normal Tailscale login page in a tab. Approve the node and the popup should switch to Connected, showing the tailnet, device name and assigned address.

From there:

http://wiki/ can reach a machine called wiki on your tailnet.

https://github.com still goes straight to the internet.

That is basically the idea.

A closer look

Account switcher   Exit node selected   Machine search

Security

There is a more complete write-up in docs/security.md, but the important bits are:

Status

Tailtab is still experimental, but it is at the point where I can actually daily drive it on macOS with Edge and Zen.

It is not in an extension store yet, so setup is still manual.

Chrome and Firefox should work with the existing implementations, but I have not properly tested them yet.

Chrome Flatpak on Bazzite has a contributor-tested setup; this is not comprehensive browser coverage.

Known limitations and security gaps are tracked in docs/security.md#known-gaps.

Development

./scripts/test.sh        # gofmt-clean Go, vet, tests, and the extension suite
./scripts/build.sh       # bin/tailtab + extension/dist/{chromium,firefox}

The extension tests load background.js and popup.js as-is into a stubbed browser environment with fake timers.

That lets the test suite cover things like proxy setup and teardown, reconnect backoff, split-tunnel routing and popup behaviour without needing to launch a real browser every time.

The host can also be driven manually. Native messaging is just 4-byte little-endian length-prefixed JSON over stdin/stdout.

Acknowledgements

The original idea and native-messaging structure are based on Tailscale's own ts-browser-ext experiment. Two files adapt code from it under the same BSD-3-Clause licence.

tailchrome takes a similar approach and was also useful to look through while building this.

Thanks to @Hajfi for reporting the Chrome Flatpak installation gap and documenting a working sandbox-compatible layout in #2.

License

BSD-3-Clause.

Tailtab (Stocist/Tailtab)

Searching Database…

Что это?Tailtab даёт каждому профилю браузера собственный узел Tailscale, так что разные профили (или даже разные аккаунты Tailscale/Headscale) могут одновременно находиться в совершенно отдельных tailnet, тогда как остальная часть машины остаётся нетронутой.
Это расширение для браузера или отдельное приложение?Это пара: небольшое расширение для браузера Chrome, Edge, Firefox или Zen плюс крошечный фоновый хост на Go, устанавливаемый на вашу машину. Хост встраивает библиотеку tsnet из Tailscale и становится настоящим узлом tailnet; расширение просто общается с ним через native messaging.
Как это запустить?Запустите однострочный установщик (shell-скрипт на macOS/Linux, PowerShell на Windows), который скачивает хост, сверяет его с SHA256SUMS и регистрирует манифесты native messaging без root и прав администратора, затем загрузите соответствующее расширение: подписанный .xpi для Firefox/Zen или распакованный zip для Chrome/Edge через режим разработчика.
Нужно ли что-то ещё, кроме установщика, например аккаунт Tailscale?Нужен аккаунт Tailscale (или Headscale/другой координационный сервер, который вы укажете), чтобы войти из всплывающего окна; сборка из исходников вместо бинарников из релизов дополнительно требует Go 1.27 и Node 22.
Есть ли подводные камни установки или шероховатости?Бинарник хоста пока не нотаризован и не подписан, поэтому на macOS при первом запуске нужно открыть его через правый клик, а Windows показывает предупреждение SmartScreen; Chrome и Firefox протестированы не так тщательно, как macOS/Edge, а Chrome Flatpak на Linux требует отдельного пути установки с учётом песочницы.
Уходят ли какие-то из этих данных с моей машины способами, которые я не контролирую?Да, одна часть: встроенная библиотека tsnet загружает свои логи в Tailscale, и сейчас нет поддерживаемого способа это отключить.
Что здесь реально означает split tunneling по умолчанию?Через Tailtab идёт только трафик, предназначенный для вашего tailnet (имена MagicDNS, .ts.net, CGNAT-диапазоны tailnet и маршруты, анонсируемые пирами); любой другой запрос из этого профиля браузера уходит с машины обычным путём, так что обычный сёрфинг никогда не зависит от подключённого Tailtab.
Как работают exit-узлы для каждого профиля?Вы выбираете exit-узел для одного профиля браузера во всплывающем окне, и публичный веб-трафик этого профиля идёт через него, а приватные диапазоны остаются локальными. Если exit-узел исчезает, Tailtab блокирует трафик, а не даёт ему утечь напрямую.
Почему бы просто не использовать обычное приложение Tailscale?Стандартный клиент Tailscale даёт всей машине одну идентичность. Tailtab позволяет каждому профилю браузера нести собственные ключ узла, состояние и tailnet, так что можно запускать несколько аккаунтов или tailnet бок о бок, не трогая ничего остального на компьютере.
Можно ли использовать свой контрольный сервер вместо серверов Tailscale?Да, страница настроек позволяет направить Tailtab на координационный сервер Headscale (или любой совместимый), и следующий вход уже пойдёт через него.
Creator
Stocist
Size
1.4 MB
Stars
216
Age
1mo
Commits · 90 Days