Quickstart

Get the full Tackworks stack running in under five minutes. Three services, one command.

Option 1: Docker Compose (recommended)

Clone all three repos and use the full-stack compose file:

git clone https://github.com/Tackworks/tack.git
git clone https://github.com/Tackworks/chock.git
git clone https://github.com/Tackworks/spur.git
git clone https://github.com/Tackworks/tackworks.net.git
cd tackworks.net
docker compose -f docker-compose.stack.yml up -d

That's it. Three services, wired together:

ServiceURLPurpose
tackhttp://localhost:8795Task board
chockhttp://localhost:8796Approval queue
spurhttp://localhost:8797Event relay
Tack and Chock are pre-configured to send webhook events to Spur. Create routes in Spur to forward events to Telegram, Slack, Discord, or any HTTP endpoint.

Option 2: Run individually

Each tool works standalone. Pick what you need:

# Just the task board
pip install fastapi uvicorn
cd tack && python server.py
# Open http://localhost:8795

# Just the approval queue
cd chock && python server.py
# Open http://localhost:8796

# Just the event relay
cd spur && python server.py
# Open http://localhost:8797

Option 3: Docker per service

Each repo includes its own Dockerfile and docker-compose.yml:

cd tack && docker compose up -d
cd chock && docker compose up -d
cd spur && docker compose up -d

Wire them together

To connect Tack and Chock to Spur for event forwarding, set environment variables:

# On Tack
export TACK_WEBHOOKS=http://localhost:8797/api/events

# On Chock
export CHOCK_WEBHOOKS=http://localhost:8797/api/events

Then create a route in Spur to forward events somewhere useful:

curl -X POST http://localhost:8797/api/routes \
  -H "Content-Type: application/json" \
  -d '{
    "name": "all-to-telegram",
    "source_filter": "",
    "destination_type": "telegram",
    "destination_config": {
      "bot_token": "YOUR_BOT_TOKEN",
      "chat_id": "YOUR_CHAT_ID"
    },
    "template": "*{event}* from {source}\n{details}"
  }'

For AI agents

Each repo includes a TOOL.md file with the full API reference and tool definitions. Feed it to your agent as context:

# OpenAI
tools = json.loads(open("tack/TOOL.md").read())

# Or just give the agent the URL
"Read the API at http://localhost:8795/api/board"

See the integration guides for OpenAI, Anthropic Claude, and Ollama/llama.cpp examples.

Requirements

MethodRequires
PythonPython 3.10+, pip
DockerDocker Engine 20+, Docker Compose v2

Next steps

Tack README · Chock README · Spur README · Blog