Every Tabby build on this machine
Explore this workspace.
Technical background
Settings → Builds lists the installed app, the webpack output this fork runs from, electron-builder output inside a checkout, frozen build slots and installer files — with live process counts, memory and uptime, size on disk, build time, arch, branch and provenance. Processes are attributed by executable path, because two builds both called Tabby.exe are otherwise indistinguishable.
The problem
Once there is more than one Tabby on the machine — the installed app, a source build, a frozen slot, an installer someone downloaded — nothing tells you which is which, which is running, which is stale, or what any of them cost on disk.
How it works
Settings → Builds lists every one of them, with live process counts, memory and uptime; size on disk, build time, arch, branch and provenance. Two tabs: the list, with a kind filter and a cards/table switch, and Options. Discovery is one walk of the search roots that classifies each directory — checkout, application directory, or neither — and stops descending as soon as it knows, because a build holds three thousand files nobody needs to list.
Settings
builds.searchRoots:['~/projects','~/Downloads','~/Tabby']Where to look.
~/Tabbyis a default because frozen slots live outside any checkout.builds.searchDepth:3How deep to descend before giving up.
builds.processPollMs:3000How often running processes are re-read.
builds.pauseWhenUnfocused:trueStop polling while the window is unfocused — it costs a subprocess.
builds.autoSize:trueWalk each build's size off the render path, one at a time, and cache it.
builds.autoDiagnose:trueHealth-check each build on every scan.
builds.watchForNewBuilds:trueOffer to switch when a newer slot or installed build of the same product appears. An installed release is never offered one, a build of the running commit or of an ancestor of it is not newer however recently it was copied, and only a slot that is not the active build can be deleted on the way out.
Details
- Processes are attributed by executable path, from one PowerShell call per poll.
tasklistcannot report a path, and two builds both calledTabby.exeare otherwise indistinguishable. Linux reads/procdirectly rather than spawningps. - Every
fscall here goes throughoriginal-fs, because Electron's patchedfsmounts an.asaras a directory and the first patched call on one opens the archive and keeps the handle for the life of the process. Sizing a build is such a call, so every packaged build the page listed was pinned by the renderer itself — and Delete then died on the archive it had pinned. Measured: a singlelstat,stat,accessorreaddirthrough the patchedfsis enough, and only a process that never touched the archive can remove it. - A Windows junction is not a directory to
lstat. A slot'sdata\pluginsis a junction into the shared plugin directory; Node reports it as a symlink, so the size walk skips it and a delete unlinks it rather than following it. Verified on a decoy, and confirmed by arithmetic. - Versions come from the executable's own version resource, not from a bundled plugin's
package.json— that stamp goes stale, and the installed 1.0.230 here still carries a 1.0.197 plugin stamp. rootfor a source build isapp/dist, never the checkout. Delete means "delete the build", so it must not be able to mean "delete the repo".- Delete on a running build quits it first with a WM_CLOSE so the app can save state, forces only after a grace period, and never offers to delete the build this window is running from.
- Arch is read out of the PE header, except for installers: an NSIS stub is a 32-bit executable whatever it installs, so there the file name wins.
What this does not claim
- The source catalogue records no separate caveats for this entry. The implementation and evidence above define its scope.