What Nightdesk writes to your machine, and how to remove it
Nightdesk reads a great deal and writes very little. Everything it does write follows four rules:
- Additive. It is added beside what you have, never in place of it.
- Clearly owned. You can tell which entries are Nightdesk’s by looking at them.
- Removable. Every item below has a way out, and this page names it.
- Composed, not replaced. Where a file belongs to a harness, Nightdesk asks that harness’s own command-line tool to change it instead of editing the file itself, because the harness rewrites that file constantly and would overwrite an edit anyway.
A fifth rule governs the hooks: hooks report, never gate. The hooks Nightdesk installs tell it what your sessions are doing. None of them can block a tool call, delay a turn, or change what an agent is allowed to do.
Apart from what this page lists, everything else on your machine is read-only to Nightdesk.
Installing the app
Section titled “Installing the app”scripts/install.sh puts a symlink at ~/.local/bin/fleet, pointing at the fleet tool inside
the app bundle. Running the installer is the consent.
To remove: delete the symlink with rm.
fleet integrate
Section titled “fleet integrate”This is the command that connects your harness to Nightdesk, and it is the one that writes the most. It shows you a diff and asks before each step; nothing is written until you confirm.
For Claude Code:
- Reporting hooks and a status-line tap in your Claude configuration — this is how the rail knows what your sessions are doing.
- The
openshim, a small script at~/.nightdesk/open-shim/open, and one PATH block in~/.zprofilethat puts its directory on PATH. The shim sends a bareopenof a pull request URL to a Nightdesk tab and hands every other invocation to the realopen. The block is gated on an environment variable Nightdesk sets when it spawns a terminal, so a shell Nightdesk did not start never sees the shim;~/.zprofileis the only dotfile involved, andintegrateis the only thing that writes it. Nightdesk rewrites the shim script itself each time it starts, so it always points at the copy of the app that is running. - The Nightdesk bridge, registered with
claude mcp add --scope user, which is what lets an agent call Nightdesk. Registering it through the CLI rather than editing~/.claude.jsonis the “compose, don’t replace” rule in action. - The same bridge in each of your profiles, so a session launched on a profile has it too.
For Codex CLI, as a separate consent step:
- Reporting hook entries in
~/.codex/hooks.json, one clearly owned entry per event, appended beside whatever is already there. - The bridge, registered with
codex mcp add.
Never written: Codex’s record of which hooks you trust. That stays yours — you trust the
entries yourself inside codex, under /hooks, and integrate prints the instruction rather
than doing it for you.
To remove: fleet unintegrate reverses all of it — the hook entries, the ~/.zprofile block
and the shim directory — using claude mcp remove and codex mcp remove for the bridges.
Nightdesk puts the shim back the next time it starts, so remove the app too if you want it gone
for good.
Launching with a profile
Section titled “Launching with a profile”The first time you launch a session on one of your profiles, Nightdesk creates that profile’s
configuration directory and the symlinks back to ~/.claude that make it work, and registers the
bridge inside it. The same happens on a restart, which resolves the session’s recorded profile the
same way.
Your consent is two things together: the profile entry you wrote by hand in spawn-profiles.json
naming that directory, and the launch press itself. The directory is created once and never edited
afterwards.
A Codex seat gets the same treatment one harness over: the launch press creates the seat’s home if
it is missing, writes the owned hook entries into its hooks.json, and registers the bridge there.
fleet integrate will run a consent pass for a seat whose home already exists, but it never
creates a Codex home.
Signing in to a seat is yours to do, per seat, and so is trusting its hooks.
To remove: delete a profile’s configuration directory with rm -r. For a Codex seat, run
fleet unintegrate — it takes out the hook entries and the bridge and leaves the seat’s own
sign-in alone; deleting the home itself would take your codex login for that seat with it.
Arming the stall nudger
Section titled “Arming the stall nudger”Arming the stall nudger registers Nightdesk as a Login Item, so an overnight watch survives a restart of your Mac. The arming toggle is the consent, and it is off by default, so nothing is registered until you arm it.
To remove: disarm the nudger, or remove Nightdesk under System Settings ▸ General ▸ Login Items.
Filing a task
Section titled “Filing a task”When you ask Concierge to file a task in a checkout whose task source is a to-do file rather than
GitHub issues, Nightdesk appends one line to that file — - [ ] and the title, at the end.
Asking for the task is the consent, and nothing else in the file is changed. A checkout backed by
GitHub issues gets an issue instead, and nothing is written to disk.
To remove: delete the line.
Things that are not Nightdesk’s
Section titled “Things that are not Nightdesk’s”Launching, attaching to or restarting a Codex session starts Codex’s own app-server daemon first, if it is not already running. The daemon is Codex’s process, not Nightdesk’s, and it outlives both the press and the session. What it leaves under the Codex home — a socket and a lock, a pid file and a log — is Codex’s too, and Nightdesk writes none of it.
To stop it: codex app-server daemon stop.
Nightdesk’s own files
Section titled “Nightdesk’s own files”Nightdesk keeps its own store and settings in its Application Support folder, including
spawn-profiles.json, the profile list you write by hand, and the small scripts your harness
runs to report to it. Removing the app and that folder leaves nothing of Nightdesk behind except
the items listed above, each with its own way out.