Skip to content

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.

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.

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 open shim, a small script at ~/.nightdesk/open-shim/open, and one PATH block in ~/.zprofile that puts its directory on PATH. The shim sends a bare open of a pull request URL to a Nightdesk tab and hands every other invocation to the real open. 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; ~/.zprofile is the only dotfile involved, and integrate is 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.json is 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.

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 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.

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.

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 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.