Skip to content

hotl — human on the loop

A terminal AI agent with guardrails you can see, a session log nothing rewrites, and any model you point it at — plus a tmux dashboard for every agent you run.

Nothing is ever lost

Sessions are append-only event logs: hotl resume continues one, hotl undo reverses the agent’s file changes via shadow-git snapshots, and context compaction adds a summary on top of history instead of rewriting it. Overview →

Context that stays slim

The window is spent on your task, not on ceremony:

  • Oversized tool results are evicted to files — a preview stays inline, the agent pages the rest back on demand
  • Compaction summaries precompute in the background from ~60% full and fold in at ~80% without pausing the session
  • The prompt prefix is byte-stable, so provider caches keep hitting
  • A per-turn meter shows how full the context actually is

Configuration →

You own the loop

Steer mid-turn without killing the run — queued steers apply at the next step. And approvals are a vocabulary, not a y/N:

  • allow, or allow with an edited input
  • deny with a message the model actually reads
  • answer as the tool yourself
  • allow-rules absorb the repetitive asks, so approval fatigue never trains you to say yes

Permissions & sandbox →

tmux-native, out of the box

hotl watch in a pane discovers every AI agent in your tmux session:

  • live status per agent, a ping when one blocks on you, enter jumps focus to its pane
  • Ctrl-h/j/k/l pane navigation composes with vim-tmux-navigator
  • vim hands welcome: the console’s input editor speaks motions, operators, and counts (vim_mode, on by default; Ctrl-e opens $EDITOR), and watch’s list speaks j/k/gg/G
  • the zsh plugin’s OSC-133 marks give watch clean command boundaries

Shell integration →

Any model, one env var

HOTL_MODEL=provider/model — Anthropic’s Messages API, or any OpenAI-compatible endpoint: OpenAI, Groq, a local Ollama server, or a gateway like LiteLLM. Gateways & key sources →

Standard protocols at the edges

An MCP client brings in external tools; hotl acp embeds the agent in any ACP-speaking editor — and your Claude Code skills (~/.claude/skills, plugins) load in place, no porting. MCP servers →

One config file, fail-closed

Everything hand-editable lives in a single config.toml — no permissions.toml/mcp.toml/hooks.toml sprawl:

  • precedence is always env var > config.toml > default, so CI can override anything without editing the file
  • a malformed file is ignored with a warning, never half-applied; a typo’d permission mode fails closed to ask
  • API keys never live in the file — env vars, or api_key_helper runs a command and uses its output
  • hotl setup writes a commented starter; hotl doctor checks the lot

Configuration →

A floor that never turns off

Every mutating tool call passes a permission gate, and bash runs under a kernel sandbox (Seatbelt on macOS, Landlock on Linux) that confines writes to the working directory. Writes to git hooks, shell rc, Makefiles, and agent-instruction files always stop and ask — in every mode. Permissions & sandbox →

Building on top of hotl, or pointing an agent at these docs? llms.txt is the machine-readable map.