All docs pages: Security and privacy

Security and privacy

What Wanigan protects, and what it does not

In short

Wanigan keeps its core, its keys and its phone access to you and the devices you pair, and it shows every permission prompt exactly as it is asked. It does not sandbox your agents: they run as you, with your permissions, as they would in your own terminal.

On this page

Report a problem privately

Please don’t open a public issue for a security problem. Report it privately from the repository’s Security tab instead.

  1. Open the Security tab

    Go to the repository’s security policy on GitHub.

  2. Report a vulnerability

    Choose Report a vulnerability. Only the maintainer sees it.

  3. Say how to see it

    Give the steps to reproduce it and your macOS, Claude Code and Codex versions.

Wanigan 2 is in beta and maintained by one person. You’ll get a reply as soon as possible, and credit in the fix if you want it.

What it does on your Mac

  • Its data lives in ~/Library/Application Support/Wanigan 2/ (the demo’s in Wanigan 2 Demo/). Nothing from a previous Wanigan installation is opened.
  • Nothing is written into your projects to make Wanigan work. Hooks, instructions and the wanigan command are handed to each session when it starts. Copying a skill, adding a project’s MCP server or installing the live view’s site helper writes into the project only on your click, after showing exactly what changes.
  • A core process keeps running after you quit, so your sessions keep going. It exits by itself ten minutes after the last session ends with no window open, unless phone access is on.
  • Wanigan has no account, no cloud and no telemetry. It calls two services itself, each only once you ask: GitHub, to see whether a newer version is out, and TypeSafe, for Jev, once you give it a key.
  • Everything else is the command-line tools you already use, run as you: claude, codex, gemini and gh, LM Studio’s lms if you run models on your Mac, and tailscale if you use Wanigan on your phone.

What it protects

ProtectionWhat it means
The core is localIt listens on a socket in a data folder only your user can open, never on the network.
Every caller has a tokenThe window holds yours. Each session gets its own, and its wanigan command can act only as that session, inside its project. An agent can never approve a card.
The window is untrustedIt reaches the core only through one narrow bridge, can call only your methods, and the core checks what it sends.
Keys stay putA TypeSafe key for Jev is kept readable by your user only and never sent back to the window. Sign-in checks ask each tool who is signed in, without reading or copying its credential files.
Phone access is off until you turn it onThen a separate gateway listens on 127.0.0.1:47832, reached through your own private Tailscale network. Each phone is paired once and can be cut off at once.
Permission prompts show what is really askedThe exact command, with hidden and lookalike characters spelled out. The decision is still yours.

What it does not protect

  • Agents run as you. Claude Code, Codex and Gemini CLI have your permissions, as in your own terminal. Wanigan watches and records them; it does not sandbox them.
  • A phone allowed to act can run work as you. It can start sessions and type into terminals. Protect the paired device and your Tailscale access; the list of what a phone may call is not a sandbox for what is typed into a terminal.
  • Anything already running as your user can read Wanigan’s data folder and talk to its core. Wanigan is not a boundary against your own account.
  • The app is not notarized. A build you make yourself is signed ad hoc on your Mac. Build from source you have read, or check a download against its published SHA-256.

In depth

The core and its tokens

The core is the process that owns the database and every terminal. It listens on a Unix socket inside a data folder with mode 0700, so only your user can open the folder, and the socket itself is 0600.

Every caller presents a token. The window holds the owner’s. Each session gets its own when it starts, and the wanigan command in that session can use only the methods marked session in the ACCESS map in src/shared/protocol.ts, only inside its project. The owner, and paired phones allowed to act, can approve a card; an agent session cannot.

The window is treated as untrusted. It reaches the core only through window.wanigan, can call only owner methods, and the core validates everything it sends.

Phone access

Phone access is off by default. Turned on, it starts a separate HTTP gateway on 127.0.0.1:47832; its optional Tailscale mount serves /wanigan over HTTPS on your private network. The setting persists across core restarts.

  • A single-use pairing code grants a phone its own token. Phone methods have an explicit allowlist, and acting needs that phone’s Can act permission.
  • A phone can read the list of accounts, but never change accounts, settings, git, keys or pairing.
  • Forgetting a phone blocks its token and closes its event streams. After a request’s body arrives, the gateway checks the token and Can act again just before it acts, so a held request cannot keep a permission revoked while it was arriving. Work already started may carry on after revocation.
  • A pairing code works once, for ten minutes; after ten wrong codes in a minute, pairing waits. Each phone’s key is kept on the Mac only as a hash.

Keys, accounts and settings

Account discovery checks file names. Sign-in checks ask each CLI who is signed in, without reading or copying Claude Code’s or Codex’s credential files. A TypeSafe key for Jev is saved readable by your user only and is never sent back to the window.

For Gemini CLI, Wanigan reads your Gemini settings and trusted folders and never writes back to them. Into its own Gemini home it copies your sign-in method, your trusted folders, and only the MCP servers that hold nothing that could be a credential: every environment and header value must be a reference such as $TOKEN, with nothing key-like in a command line, address or other setting. When in doubt a server is left out, and the MCP view says why without showing the value. It never copies Gemini’s credential files or anything that looks like a key, token or password.

Plugin manifests, MCP files and skill folders a plugin names are checked against the installed plugin’s own folder before they are read. Anything that points outside it is left unknown, or left out with a note, while the healthy ones still show. These checks are not an atomic filesystem transaction and do not exclude another program writing at the same moment.

The live view’s boundaries

  • Only the project’s own local site is opened. A hosted environment is read-only: its own private session, never the helper’s token, its certificate checked as any browser would, and only requests that read. Wanigan asks a hosted site for nothing in the background.
  • The page’s DevTools are the page’s own, with none of Wanigan’s privileges.
  • A recording never keeps what is typed in a password field, or a request’s body, headers, cookies or query. A snap’s blur replaces the pixels before the picture is kept or sent.
  • Voice input turns speech into text on your computer: the audio never leaves it. Only Wanigan’s own window may use the microphone; a site in the live view never can.
  • The site helper is written into the site only when you install it, after showing what it writes and runs. It is kept out of git and removed on your click.

More on each: the site helper, Snap and Record, Compare and Local and Live.