SpadeIDE

Security model

What is protected, what is not, and why — stated plainly, because a tool that hands out a shell on your machine owes you that.

The boundary is pairing

A paired iPad can open a terminal on your host. That is the product, not a flaw. It also means pairing is the security boundary — everything else is accident-prevention layered on top of it.

How pairing is guarded:

The session

The filesystem sandbox — and what it is not

Opening a folder as a project grants write access to it. Everything else is read-only, path traversal is rejected, symlinks that escape are refused, and reads and writes are capped at 32 MiB.

This is accident-prevention, not containment. A paired device already has a login shell, so it can reach anything that Unix account can reach. The sandbox stops mistakes and misbehaving clients; it is not a barrier against a device you have deliberately trusted. Revoking the device is the control that matters.

A system install adds Unix login on top of pairing: each tablet signs in once with username and password (over the already-encrypted session; the password is never stored), then the file API is jailed to that home (including rewriting root-owned files inside it). The terminal is still that user, never root — same groups as a normal login. Deleted account / password change invalidates the bind. See user vs system and on the iPad.

Remote access

Off by default. While it is off, the agent makes no outbound connections at all.

With it on, three properties hold, and they are the reason the design looks the way it does:

Agents register under a handle derived from the pairing secret that rotates hourly, so the server does not learn a durable identity. It does still see IP addresses, timing and volume — blinding removes the stable name, not the network metadata. Prefer to trust nobody? Run your own.

No inbound port

Remote access exists so you never have to forward a port. The agent dials out. Forwarding 7422 puts your host's listener in front of the entire internet and gains you nothing — if you are doing it, turn on remote access and stop.

Credentials

Git runs non-interactively on your host with your own credential helpers and SSH keys. A push that needs a password fails with a clear message instead of hanging, and you finish it in the terminal. SpadeIDE never asks for, stores or transmits a git credential, and AI CLI API keys stay on the host too.

Reporting something

If you find a problem in any of this, please report it privately before publishing, and you will get a straight answer about severity and timeline.