Skip to content

Features

Tandem is the layer between your keyboard and the model — multi-project orchestration, real-browser automation, an Obsidian vault for memory, and a fleet dashboard that actually knows what your agents cost. Every bullet below maps to a registered feature in agents.json, a frontend route under frontend/src/app/, or a row in the master competitor matrix.

1. Task & project management

Markdown tasks, kanban, dependencies, retries, budgets — every project tracked in one place.

  • 7-stage pipeline (inbox → planning → human_turn → active → review → paused → done) drives every task file under tasks/*.md; status, priority, dependencies, retry counter and token budget live in YAML frontmatter — see tasklib.py and the /tasks + /kanban routes. (matrix: Task pipeline)
  • Hard task dependencies (blocked_by / blocks lists) plus auto-escalation: when attempts hits max_retries, status flips to paused and the assigned agent is cleared. (matrix: Task dependencies, Retry counter)
  • Per-task token budgets enforced by check_budget(); combined with goal tracking + streaks on /goals, you get a full PaperclipAI-style issue-management surface without an external tool. (matrix: Token budgets, Goal tracking)

2. Terminal & shell

Real native shell, tmux-persistent, multi-pane, 22 themes — your terminal lives where your work lives.

  • WebSocket terminal server (terminal-server.js, port 4201) runs node-pty against a real login shell; tmux session persistence means closing the browser does not kill the job. The surface lives at /terminal. (matrix: Integrated terminal, tmux persistence, Native shell)
  • Multi-pane grids (2 / 2×2 / 3×4 / 4×4) with drag-drop reorg via terminal-grid.tsx; same xterm.js + WebGL stack the heavy desktop competitors charge for. (matrix: Multi-pane grids, Drag-drop reorg)
  • 22 themes shipping today — Dracula, Gruvbox, Tokyo Night, Monokai, One Dark, Solarized Dark/Light, Catppuccin Mocha, Paper Sepia, Matrix Green, Sakura Bloom and the original 11 — defined once in frontend/src/lib/themes.ts. (matrix: 20+ themes)

3. Agent orchestration

19 named agents, per-agent ACL, worktree isolation, atomic claim — orchestration that survives a real fleet.

  • Roster declared in agents.json: COO, Architect, Executor, Verifier, Tracer, Vault, Website, Repo Scout, YouTube Scout, Code Reviewer, Security Reviewer, TDD Guide, Refactor Cleaner, Doc Updater, Build Error Resolver, Browser CDP, Codex CLI, Grok-Swarm, plus Spark templates — each with its own system_prompt, allowed_tools, allowed_dirs and MCP config. (matrix: Named agent roster, Per-agent ACL)
  • Atomic task claim via mc.py claim-task <id> <agent-id> (single-flight against SQLite); writing agents are forced into worktree isolation by .claude/hooks/enforce-worktree.sh and auto-snapshotted on completion by post-agent-snapshot.sh, so concurrent agents never collide on the working tree. (matrix: Atomic lock, Worktree isolation)
  • Live heartbeat + per-agent chat UI at /agents and /chats; chat panes route through the same terminal-server.js tmux substrate, so the agent’s stdout is yours to read at any time. (matrix: Heartbeat, Chat interface per-agent)

4. Security & governance

Localhost-only by default, approval inbox, append-only audit trail — every action is reviewable.

  • All three services (API 127.0.0.1:4200, terminal 127.0.0.1:4201, frontend 127.0.0.1:3000) refuse to bind 0.0.0.0; block-rm.sh blocks rm / find -delete outside /tmp/, and audit-trail tables (sessions, agent_spawns, approvals, provision_actions) have no DELETE endpoint by design. (matrix: Localhost-only)
  • Human-in-the-loop approval inbox at /approvals gates every agent action that touches money, the network, or the disk outside its allowed_dirs; backed by approvals rows in tandem.db and a frontend popover-driven approve/reject flow. (matrix: Approval inbox HITL)
  • Deterministic audit log: every task file carries an ## Activity Log section that tasklib.append_audit_log() writes to, and every session links back via mc.py link-session. Pair that with the /admin agent_restart_mode gate and you have a forensic trail you can replay. (matrix: Deterministic audit trail)

5. Browser & web automation

Real Chrome over CDP, your real logins, multi-daemon parallelism, skill-files per site — automation against the live web.

  • The browser-cdp/ package speaks Chrome DevTools Protocol over WebSocket against your actual logged-in Chrome — no stealth-browser fingerprint games, no separate profile to keep warm. Surfaced through the browser-cdp agent in agents.json and the /browser route. (matrix: Real-browser CDP, Real logged-in Chrome)
  • Multi-daemon mode runs N CDP daemons in parallel for fanout scraping; the lead-scraping pipeline under clients/lead-scraping/ drives this via core.http helpers (safe_get, scan_body) so every fetched byte hits the safe-scrape scanner before it reaches LLM context. (matrix: Multi-daemon parallel browsers)
  • Per-site skill files (selectors, login flows, post-recipes) live under skills/ and load by site; the /skills page surfaces them with loadouts and scope (global / local / project). (matrix: Skill files per site)

6. Knowledge & vault

Markdown is the source of truth — Obsidian vault, wiki ingestion, daily notes, weekly review, auto context.

  • The whole vault root (claude-brain/) is your Obsidian workspace; tasks are markdown files (not DB rows) so anything the agents write is immediately visible in Obsidian Bases, and anything you write in Obsidian is immediately visible to the agents. (matrix: Obsidian vault, Markdown as source of truth)
  • raw/wiki/ ingestion pipeline: safe-scrape.py lands sources in raw/, raw-content-scan.py classifies them, and ingest skills compile flat kebab-case wiki pages with YAML frontmatter — viewable at /wiki. (matrix: Wiki / knowledge base, Ingestion pipeline)
  • Daily notes auto-appended on session export, weekly review workflow on /weekly, and auto context management on /context — agents read their own working memory between turns instead of starting cold. (matrix: Daily notes, Weekly review, Auto context)

7. Integrations

Slack, Discord, Telegram, WhatsApp, webhooks, cron, CRM, local LLM — the connectors are already in the box.

  • Socials engine (socials/ subpackage, ~4848 LOC, declared in requirements-socials.txt) handles Slack, Discord, Telegram, WhatsApp, X, LinkedIn and YouTube posting through a unified compose+post adapter, surfaced at /socials. (matrix: Slack, Discord, Telegram/WhatsApp)
  • Webhook endpoints (/api/webhooks/*) drive inbound events into the agent fleet; the /webhooks page lets you register, replay and inspect each one. Scheduled jobs run via spark-scheduler.py (cron-style, stdlib only) and surface at /scheduled. (matrix: Webhooks, Scheduled jobs)
  • CRM at /crm is wired to the lead-scraping pipeline; local LLM at /local-llm talks to Ollama on 127.0.0.1:11434 (Spark workers default to qwen3.6:35b) for zero-egress inference. (matrix: CRM, Local LLM)

8. Dashboards & observability

Live fleet dashboard, real-time per-agent cost, heartbeat, per-agent chat — observability that matches the agent count.

  • /dashboard streams agent state, task queue depth, and approvals backlog in real time; /agentic and /orchestration drill into the per-agent fleet view. (matrix: Live fleet dashboard)
  • Per-agent cost tracking at /costs reads real Anthropic-shape token counts from claude --print JSONL transcripts — no estimates, no provider markup, every dollar attributed to the agent that spent it. (matrix: Per-agent cost tracking)
  • Pipeline status across the fleet at /pipelines and /activity; heartbeat surfaced both on the agent card and in the sidebar so a stuck agent is visible in one glance. (matrix: Pipeline status, Agent heartbeat)

9. Deployment

Self-hosted desktop or server, air-gapped by default — your machine, your bytes.

  • Tauri desktop .deb (tandem-desktop_<version>_amd64.deb) is the primary install path — one package, native window, backend auto-starts on launch and stops on close. README §“Install (Desktop App)”. (matrix: Self-hosted)
  • Server-only .deb (tandem_<version>_all.deb) runs as a systemd service for server peers, exposing the browser UI on 127.0.0.1:3000; same build pipeline, no Docker required. (matrix: Self-hosted server flavor)
  • Air-gapped by default: stdlib-only Python backend (no pip install at runtime), every service binds 127.0.0.1, and safe-scrape.py is the only sanctioned path to fetch external content. The build-deb scanner gate fails fast on any personal identifier before sha256 emission. (matrix: Air-gapped / on-prem)