Install and run
On this page
Tau runs on macOS, Windows and Linux. Get started is the short version; this page has the details: every installer, Linux specifics, updates, the tau command, the first start, and running Tau from a checkout.
Download#
Download the newest build for your platform from the
releases page: a .dmg or .zip on
macOS (arm64 and x64), a .deb and an .AppImage on Linux (x64), an NSIS
installer on Windows. These links always point at the newest stable release:
Mac with Apple silicon,
Mac with Intel,
Windows,
Debian and Ubuntu,
AppImage.
From 0.7.14 on, the macOS builds are signed with an Apple Developer ID and
notarized by Apple, so they open like any other app. The Windows installer is
not signed yet: until it is, SmartScreen may warn on the first launch (More
info → Run anyway). Earlier macOS builds were unsigned and have to be opened
from Finder's context menu once. From a checkout on a Mac,
npm run install:mac downloads the newest one, checks it against the
release's signature and SHA-512, and puts it into /Applications.
Linux#
On Ubuntu and Debian, install the .deb, with your software center or
sudo apt install ./Tau_<version>_amd64.deb. It puts Tau into /opt/Tau and
the application menu, brings Xvfb (for the invisible display) and pkexec (for
password dialogs) along, and links tau to the command line;
tau with anything else starts the app. It also installs an AppArmor profile,
/etc/apparmor.d/tau, that lets Tau's binary use user namespaces and nothing
more, the way Chrome and VS Code do on Ubuntu 24.04 and later: Chromium keeps
its sandbox there, and chrome-sandbox needs no root.
On other distributions, use the .AppImage. It needs FUSE 2 (libfuse2) and cannot
run as a service. Where the kernel restricts user namespaces (Ubuntu 24.04 and
later), electron-builder's launcher starts it without Chromium's sandbox; on a
system with apt, Tau then offers at start to install itself properly: it
downloads the .deb of the same release (checked against the release's
SHA-512), installs it after one password dialog, restarts from /opt/Tau with
your threads and settings, and offers to delete the AppImage. "Later" waits
for the next version. Without a desktop session that can show the password
dialog, it shows the one sudo apt install command to run instead. A copy
unpacked by hand (an extracted AppImage) runs, but cannot update itself.
Package managers#
Once they are set up, the package managers carry it too:
brew install --cask rasalas/tau/tau on macOS, winget install Rasalas.Tau on
Windows, yay -S tau-bin (or any AUR helper) on Arch Linux. How each is
published is in RELEASE.md.
Updates#
An installed Tau keeps itself current, with or without a window, from the
same releases page; no account or token is needed. Each
machine's host looks for a newer release on its update track two minutes after
it starts and then every six hours, downloads it in the background, checks it
against the release's SHA-512, and installs it once no turn has run for a
quarter of an hour; a background service then restarts into it. It never
installs while a turn runs. Settings → About shows the Tau of the machine you
are connected to, from a window, a browser or the phone: its version, whether
an update is available, downloading, waiting for turns or failed, Update
now, and Automatic updates for that machine. Settings → Machines shows
the same for every machine the window keeps, with Update. While a Tau
window runs on a machine, that window installs as before: it downloads on its
own and installs when you choose Restart or quit; Update now from elsewhere asks
it to. "Check for updates…" in the application menu asks on demand, and
Settings → General → Update track switches between stable releases and the
nightly build of main.
- Linux
.deb: the package brings a small update helper and a polkit rule, so members ofsudo,adminorwheel(or a grouptau-update) update without a password, also on a server with no desktop session. The helper installs nothing but a newertaupackage that matches the release's checksum. A.debfrom before the helper needs one update by hand:sudo apt install ./Tau_<version>_amd64.deb. - Linux AppImage: replaces its own file.
- macOS: replaces the app in place when it belongs to you (drag-installed into Applications); otherwise the Tau window installs it.
- Windows: the installer runs silently for your user.
- A copy unpacked by hand, or a checkout, says that it cannot update itself.
From a terminal, tau update updates this machine (--check only looks,
--status tells where it stands), and tau machines update <name> updates
another machine this computer keeps, over the same connection Settings →
Machines uses. The owner of a machine can stop paired devices from starting
updates there (Settings → About → Paired devices may update this machine).
Host updates has the design, the helper and
the threat model.
Build an installer#
npm install
npm run dist # this machine's platform; also dist:mac, dist:linux, dist:win
The artifacts land in release/. On a Mac, npm run install:mac -- --local
builds this checkout for the machine's architecture, unpacked, and puts the
app into /Applications.
The tau command#
tau app [path] opens a folder in the Tau that is running (the current
directory without a path) with a new thread's draft on screen, and brings the
window to the front. It finds the host through <userData>/host.json and
speaks to it with the host's own token;
TAU_USER_DATA points it at another instance, as it does for the app. Without
a running Tau it starts the app on that folder. The command is bin/tau.mjs
(bin in package.json) and needs Node 22 or newer. The .deb puts it on
your PATH as tau and runs it on Tau's own binary, so it needs no Node.
Elsewhere, link it yourself:
# a checkout
ln -s "$PWD/bin/tau.mjs" ~/.local/bin/tau
# an installed Tau on macOS (npm run install:mac prints this line)
ln -s /Applications/Tau.app/Contents/Resources/app.asar.unpacked/bin/tau.mjs ~/.local/bin/tau
npm run smoke:cli-app (after npm run build) drives it against a headless
host in temp folders.
The same command manages the host as a service (tau service, see
Hosts, machines and devices),
other machines (tau machines), updates (tau update) and packages of your
own (tau kit, see Writing a package).
First start#
A Tau without a single thread opens its welcome wizard (Onboarding,
kits/onboarding/); /welcome, or "Set up Tau…" in the palette, opens it again
later. It has three steps:
- Agents. Pi and how many models your Pi configuration signs in to, then
every other runtime Tau has (the Agent SDK runtime, Codex, Antigravity, and
any instance of them): installed or not, which version, signed in or not,
with the vendor's install or sign-in command, or a link to its card
under Settings → Providers. Each runtime answers through its own kit, so a
path set there counts. Below them, marked optional, Tools for pull
requests:
ghandglab, which Tau needs only to open pull and merge requests and show their checks. With Terminal Kit on, Install and Sign in run the command in a terminal you see: the wizard steps aside for it (a button in the title bar leads back), and returns and checks again when the shell ends; without it the command is there to copy. - Projects. The folders those CLIs and Pi worked in, newest first, each
with the conversations it has and when it was last used. Clones of one
repository (the same
origin) are one group with a checkbox for all of them; folders that are no repository are folded away under "Other folders". Linked worktrees, your home and temporary folders themselves, and anything in~/Downloads, Codex's scratch folders under~/Documents/Codexor Tau's worktrees folder are left out. Git repositories used in the last 30 days with three conversations or more are chosen for you; "Add a folder…" opens the project sources. - Conversations. The conversations those CLIs kept, grouped by folder, imported as threads of the runtime that ran them: the title and the visible text (the first prompt and the newest messages, 200 at most), no tool activity and no attachments. A thread continues by resuming the CLI's own session. Importing again skips what Tau already holds.
Each CLI's history is read from its own home (its config directory, or
CODEX_HOME for Codex), newest 500 sessions, files up to 16 MiB. Set
TAU_IMPORT_ROOTS to one or more directories laid out as
<dir>/<backend kind>/…, like the CLI's own home, and nothing else is read.
The dev instance sets it to .tau-dev/import-roots.
Windows#
Tau builds for Windows and the host has a Windows path wherever it assumed a
POSIX system: PATH comes from the registry instead of a login shell, commands
resolve through PATHEXT, .cmd shims start through cmd.exe, process trees end
with taskkill, the terminal opens PowerShell. Nobody has used it on Windows
yet; what is verified by tests only and what is known not to work is in
windows.md, with how to try it. Pi needs Git for Windows
there (its bash tool runs Git Bash).
Run from a checkout#
npm install
npm start
npm start performs the minified production build and opens the Electron app. For development, use npm run dev (Electron + Vite hot reload) or npm run dev:web (browser fixture preview); npm run start:existing opens the last production assets without rebuilding. Build and startup measurements are written to reports/build-report.json and reports/start-report.json; npm run build:budget and npm run start:budget enforce the local budgets. The initial workspace is this repository; use the project picker in the left sidebar to open another folder. Recent projects persist in Electron's user-data directory. What Tau takes from your machine (Pi's configuration, your shell's environment, the agent CLIs) is in Runtimes and tools.
For a UI-only browser preview with fixture data:
npm run dev:web
Start without Pi or desktop extensions to inspect or recover the minimal core:
npm run start:safe
The production renderer is minified and does not ship source maps unless TAU_SOURCEMAP=true is explicitly set. Review, Settings, optional panels, and Highlight.js languages are demand-loaded; their slots expose a Retry action if a chunk cannot be loaded.
npm run lint runs oxlint over the whole repository except dist/, dist-electron/ and node_modules/ (config in .oxlintrc.json: correctness and suspicious rules as errors, perf as warnings); an override turns no-await-in-loop and no-map-spread off under kits/, scripts/, src/main/ and .pi/, where sequential awaits and immutable per-element updates are the point, and keeps both on elsewhere. CI (.github/workflows/ci.yml) runs lint, typecheck, the full Vitest suite, and a production build on every pull request and push to main; .github/workflows/performance.yml stays the separate, slower gate for build/startup/renderer budgets, and .github/workflows/release.yml builds and publishes the artifacts of a v*.*.* tag (RELEASE.md).
This page is docs/install.md in Tau's repository.