tsk-tsk: keeping your agents out of trouble
Delegate development tsk tasks to YOLO mode AI agents running in sandbox containers. tsk auto-detects your toolchain and builds container images for you, so most projects require very little setup. Agents work asynchronously and in parallel so you can review their work on your own schedule, respecting your time and attention.
- Assign tasks using templates that automate prompt boilerplate
tsk copies your repo and builds containers with your toolchain automatically
- Agents work in YOLO mode in parallel filesystem and network isolated containers
tsk fetches branches back to your repo for review
- Review and merge on your own schedule
Each agent gets what it needs and nothing more:
- Agent configuration (e.g.
~/.claude or ~/.codex)
- A copy of your repo excluding gitignored files (no accidental API key sharing)
- An isolated filesystem (no accidental
rm -rf .git)
- A configurable domain allowlist (Agents can't share your code on MoltBook)
Each agent runs in an isolated network where all traffic routes through a proxy sidecar, enforcing the domain allowlist. Beyond network restrictions, agents have full control within their container.
Supports Claude Code and Codex coding agents. Docker and Podman container runtimes.

Installation
Requirements
- Rust - Rust toolchain and Cargo
- Docker or Podman - Container runtime
- Git - Version control system
- One of the supported coding agents:
Install tsk
# Install using cargo
cargo install tsk-ai
# Or build from source!
gh repo clone dtormoen/tsk-tsk
cd tsk-tsk
cargo install --path .
Claude Code users: Install tsk skills to teach Claude how to use tsk commands directly in your conversations and help you configure your projects for use with tsk:
/plugin marketplace add dtormoen/tsk-tsk
/plugin install tsk-help@dtormoen/tsk-tsk
/plugin install tsk-config@dtormoen/tsk-tsk
/plugin install tsk-add@dtormoen/tsk-tsk
See Claude Code Skills Marketplace for more details.
Quick Start Guide
tsk can be used in multiple ways. Here are some of the main workflows to get started. Try testing these in the tsk repository!
Interactive Sandboxes
Start up sandbox with an interactive shell so you can work interactively with a coding agent. This is similar to a git worktrees workflow, but provides stronger isolation. claude is the default coding agent, but you can also specify --agent codex to use codex.
tsk shell
The tsk shell command will:
- Make a copy of your repo
- Create a new git branch for you to work on
- Start a proxy to limit internet access
- Build and start a container with your stack (go, python, rust, etc.) and agent (default: claude) installed
- Drop you into an interactive shell
After you exit the interactive shell (ctrl-d or exit), tsk will save any work you've done as a new branch in your original repo.
This workflow is really powerful when used with terminal multiplexers like tmux or zellij. It allows you to start multiple agents that are working on completely isolated copies of your repository with no opportunity to interfere with each other or access resources outside of the container.
One-off Fully Autonomous Agent Sandboxes
tsk has flags that help you avoid repetitive instructions like "make sure unit tests pass", "update documentation", or "write a descriptive commit message". Consider this command which immediately kicks off an autonomous agent in a sandbox to implement a new feature:
tsk run --type feat --name greeting --prompt "Add a greeting to all tsk commands."
Some important parts of the command:
--type specifies the type of task the agent is working on. Using tsk built-in tasks or writing your own can save a lot of boilerplate. Check out feat.md for the feat type and templates for all task types.
--name will be used in the final git branch to help you remember what task the branch contains.
--prompt is used to fill in the {{PROMPT}} placeholder in feat.md.
Similar to tsk shell, the agent will run in a sandbox so it will not interfere with any ongoing work and will create a new branch in your repository in the background once it is done working.
Add --branch main to start from a specific branch's committed state instead of your current working tree. This is useful when you want to launch a task from a different branch without switching to it.