Threat model: single trusted user on their own machine, server bound to loopback. SquadCue refuses to start on a non-loopback host — there is no authentication layer, by design, until one exists.
127.0.0.1/localhost; IPv6 is rejected because the TrustedHost allowlist is IPv4/hostname-only); TrustedHost + Origin/Sec-Fetch-Site checks against DNS-rebinding/CSRF; request body size cap.writefile nodes are contained to the user’s home root via resolve().relative_to() (no substring tricks).shell nodes refuse `` template interpolation — upstream data cannot flow into command strings.fetch nodes resolve the host and reject loopback/private/link-local/reserved addresses, and do not follow redirects. (Known gap: the check resolves the name once and urllib resolves it again to connect, so a DNS-rebinding/TOCTOU window exists.)--permission-mode plan, not just prompt text. Plan mode is the CLI’s own read-only control — an upstream mechanism we rely on, not a sandbox SquadCue provides. Self-heal and issue-dispatch agents run gated: their risky tool calls pause into the approval inbox.ANTHROPIC_API_KEY is stripped from child process environments (including session relaunch) so subscription CLIs don’t silently switch to API billing.It is a supervision workflow for agents you already trust to run on your machine. Understand what it does not stop:
Bash call can start sub-processes (curl | sh, Python, another CLI) that never pass the hook again.disableAllHooks, managed policies); a run whose settings drop the hook is simply unguarded. The hook itself fails closed (malformed input, unreachable server, internal errors, and timeouts all end in deny), but it can only decide calls that reach it.POST /api/approvals/{id}/decide and approve on your behalf; responded_via is client-supplied. Loopback binding is the only boundary.allow_tools on canvas claude nodes, and the Telegram ! prefix. All of these run --dangerously-skip-permissions.Read, Grep, Glob, LS, TodoWrite, TodoRead, NotebookRead, BashOutput, ListMcpResourcesTool). WebFetch/WebSearch/Task require approval — but an approved Read still lets the agent load secrets into model context, which then rides along with any later approved network access. Approval controls actions, not information flow.mc.db (the audit log) on your machine.The Employees tab lists Claude Code sessions from claude_projects (default ~/.claude/projects) — the directory where the Claude Code CLI stores conversation logs. SquadCue scans this local directory: it globs session *.jsonl files, reads the first 80 lines of up to 40 recent files to extract each session’s working directory and opening message, and parses a session’s full history when you open its chat. Session-derived endpoints (discovery, chat history, chat send) return the first-launch disclosure / a 403 until consent is recorded in data/sessions_consent.json; decline and they stay off. The consent flag is a UX acknowledgment, not a security control — any process running as your user could write the flag file or read the transcripts directly. Point claude_projects elsewhere to scan a different (or empty) directory. SquadCue uploads none of it; content reaches your AI provider only when you chat.
Approval requests, run logs, and flow state live in plain JSON/JSONL/SQLite files inside the repo directory — greppable, deletable, yours.
Documented deliberately rather than hidden — pull requests welcome:
ANTHROPIC_API_KEY, child processes inherit your environment (an allowlist is planned).readfile nodes can read any file your user can — treat flow definitions as trusted config.shell node uses PowerShell.fetch SSRF guard has the resolve-twice TOCTOU window described above.Report issues via GitHub Issues.