Slack comes from the AUR and Toolbox from JetBrains' self-updating tarball, so neither is declared: the host installs official packages only, and a pinned archive would fight Toolbox's own updates. Slack's start and the operator's i3 window rules become one node-display-session contribution, because Slack's own launch-on-login is a symlink in ~/.config/autostart. Toolbox keeps its own autostart entry as its one start. The shared desktop.go header now names all four bundles.
jetbrains-toolbox
JetBrains Toolbox on the workstations, as a module (novox/hq ADR 0208). Toolbox installs, updates and
launches the JetBrains IDEs. It requires x11-display, so it is assigned only where a display server
is held on the same machine.
Owns
Nothing on disk. It holds no seat, makes no contribution and writes no file. What it owns is the rule that Toolbox has one start, and the tools that see Toolbox and its IDEs.
-
Not a package. The distribution does not package Toolbox. JetBrains ships a tarball, which the operator unpacked once. Toolbox keeps itself in
~/.local/share/JetBrains/Toolbox:- its launcher and runtime, in
bin/; - the IDEs, in
apps/; - its settings, state and update channels, in
.settings.json,state.jsonandchannels/; - its account, in
accounts.jsonand.securestorage; - its logs.
- its launcher and runtime, in
-
Kept as found, not a pinned archive (ADR 0205). ADR 0205 ships software the distribution lacks as a pinned archive of the module's own. Toolbox is the exception it does not foresee:
- it updates itself in place, and it updates the IDEs. A pinned copy would be a second writer of
bin/: either the push rolls Toolbox back after every self-update, or Toolbox overwrites the mesh's copy; - its licence is JetBrains', not one the mesh's store may redistribute.
So the module installs nothing. The operator installs Toolbox once, by its own instructions (
Install-linux-tar.txtbeside the launcher), and Toolbox keeps itself current.toolbox_checksays when it is missing. - it updates itself in place, and it updates the IDEs. A pinned copy would be a second writer of
-
Toolbox's files are found (ADR 0182). The module never declares, writes or removes any of them. The tools read the version, the switches, the tool list and the channels. They never read the account, the secure storage or the logs.
How it starts: Toolbox's own autostart entry, and nothing else
One process has one starter (the rule picom states for the desktop modules). Toolbox's starter is
its own XDG autostart entry, ~/.config/autostart/jetbrains-toolbox.desktop
(…/bin/jetbrains-toolbox --minimize).
- Toolbox writes that entry while its setting Launch Toolbox App at system startup is on, and
removes it when the setting is off. The setting is
autostartin.settings.json; absent means on, Toolbox's default. - The session runs every XDG autostart entry once at login: the
i3module'sdex --autostart --environment i3.
Why not a contribution to node-display-session: Toolbox would still write its own entry
whenever the setting is on, and the session would start it twice. The module cannot own the entry
either: Toolbox rewrites it, and that would be two writers. So, as nextcloud-client does, the module
adds no start, and toolbox_check holds the rule:
- the entry exists exactly when the setting says so;
- no window-manager
execstarts Toolbox as well.
Off is an answer, not a fault. With the setting off, Toolbox does not start at login and runs
when the operator opens it (from the launcher, or a jetbrains:// link). toolbox_check notes that
and finds nothing wrong.
Tools
They are served by the node's runtime as the operator account (ADR 0175), and are read-only except
restart. No answer carries the JetBrains account: neither its id nor anything from
accounts.json or .securestorage. Paths under the home are answered as ~/….
| tool | does |
|---|---|
toolbox_status (r) |
|
toolbox_restart (a) |
ends Toolbox (SIGTERM, forced after 8 s) and starts …/bin/jetbrains-toolbox --minimize in the operator's session. The start is a transient user unit mesh-jetbrains-toolbox, so it outlives the tools runtime. The IDEs Toolbox launched are their own processes and keep running. Answers the pids. Refused plainly when nobody is logged in to the desktop, or when Toolbox is not installed |
toolbox_check (r) |
|
Which process is Toolbox: the kernel keeps 15 characters of a process's name, so Toolbox's comm
is jetbrains-toolb. A process with that comm counts only when its command is Toolbox's launcher.
The bundle is named toolbox-tools, not jetbrains-toolbox-tools. The longer name cuts to the
same comm, and toolbox_restart would have ended the tools themselves.
The tools find the session's DISPLAY and XAUTHORITY from the window manager's own environment,
as the other desktop modules do. Every command has a timeout and capped output. Everything runs through
an injected runner and a fake root in the tests.
What changes when it is assigned
| g14 | shanks | |
|---|---|---|
| Toolbox | none: Toolbox 2.8.1.52155 in ~/.local/share/JetBrains/Toolbox (tarball install), not running. Its files are from 2025-09-04, the last time it ran, so it has not updated itself or the IDEs since |
none: Toolbox 3.2.0.65851, the same place (.installation-type says APP), last run 2026-02-23; not running |
| start | none: Launch at startup is off (autostart: false) and there is no entry, so nothing starts it at login. toolbox_check: ok, with a note |
none on disk: the setting is at its default (on), and Toolbox's own entry (--minimize) is there. The i3 module's dex starts it at the next login. The session running now (since 2026-10-04) began before dex was installed, which is why Toolbox does not run. toolbox_check names that until toolbox_restart or the next login |
| IDEs | Fleet 1.48.261, PyCharm 2025.2.1.1, Rider 2025.2.0.1, WebStorm 2025.2.2: all on the Early Access Program channel | RustRover 2026.1 EAP and Fleet 1.48.261 on Early Access Program; PyCharm 2025.3.2.1, Rider 2025.3.2 and WebStorm 2025.3.2 on Release |
| updates | update the tools automatically: on | the same; one version kept for a rollback |
The two machines differ in Toolbox's major version and in the IDEs' channels. Both are the operator's choices in Toolbox, and the module reports them rather than aligning them.
Migration (ADR 0182)
Nothing is required on either machine. The module removes nothing and adds no start.
- shanks: run
toolbox_restart, or log out and in, and Toolbox runs from its one start.toolbox_checkthen answersok. Toolbox wrote its entry with the executable bit set (0744), which systemd's autostart generator warns about at every login. That is harmless under i3, and the entry is Toolbox's, so the module leaves it. - g14: nothing. To have Toolbox start at login there too, open it and tick Launch Toolbox App at system startup. It writes its own entry, and it then updates itself and the IDEs, which it has not done since 2025-09.
- Not the module's:
~/.profileon g14 adds Toolbox'sscripts/folder toPATHby hand. The account's environment isnode-environment's holder's. If the IDE launch scripts are wanted onPATHon both machines, that is a contribution to it, not a line in~/.profile.
Leaves as found
~/.local/share/JetBrains/Toolbox/, entirely: the launcher, the runtime, the IDEs, the settings, the state, the account, the logs, and the link Toolbox itself keeps inscripts/for Fleet.~/.config/autostart/jetbrains-toolbox.desktop, Toolbox's own.- The desktop entries Toolbox writes for itself and each IDE in
~/.local/share/applications/. Those includejetbrainsd.desktopon shanks. - The
x-scheme-handler/jetbrainsdefault, which is thexdgmodule's.
Relies on
i3'sdexline for the start. Nothing in the mesh says so yet: XDG autostart has no seat, and a module without a seat or contribution has no way to depend on another module. Assigned withouti3, Toolbox is not started at login.toolbox_checksays so when its setting is on.- A display server on the same machine (
x11-display, ADR 0208 §3).