Tares is the open-source platform for always-on AI agents.

Chat agents wait for a prompt. Tares agents wait for an event: every event from your systems lands on one timeline per thing, a trigger wakes an agent the moment it matters, and the finding it writes back is there for the next reader.

start on the cloudrun it yourselfuv tool install tares && tares up

What teams build with it.

What is in Tares.

Everything here is a page in the console, editable there.

Connect anything that emits events.

Prometheus, logs, alert webhooks, GitHub, Postgres, Vercel, OpenTelemetry, or any webhook. Every event is keyed to the thing it is about, from a connector card or a pasted snippet of YAML. connectors

sources:
metrics: prometheus, label: service
logs: docker logs, label: service
alerts: alertmanager webhook
# also: github, postgres, vercel, otlp,
# or any webhook you point at it

One timeline per entity, with triggers watching it.

Sources that share a key merge into one time-ordered timeline per service, repo or customer; the agent view shows the exact text an agent receives. Triggers watch the live view and fire on a condition, once, with a cooldown. triggers

api-server
api-server · service · last 90s · 3 sources + findings

T-63s  prometheus  checkout_p99_ms 640 -> 1180
T-58s  logs        POST /charge 500 "upstream retry limit" x214
T-41s  alerts      HighCheckoutLatency firing severity=page
T-9s   finding     by incident-first-look:
       Uncapped retries from the 01:50 deploy (PR #482).
       Cap at 3 or roll back.

This exact text is what an agent receives from one read call.

Agents that run inside Tares.

The agent runs inside Tares, reads the whole timeline, and writes its finding back onto it, tied to evidence lines. Pick a model per agent, opt it into tools from any external MCP server, and deliver findings to Slack or a signed webhook. tares agents

agenttriggerlast run
incident-first-lookalert-lands9m ago · ok
context_maintainercontext_changes19h ago · ok
create tares agent

Everything is available over MCP.

Everything the console can do is an MCP tool. Claude Code, Cursor or your own loop reads the same timelines, creates sources and views, and subscribes to triggers so it is woken instead of polling. Reads need no model key. connecting agents

claude mcp add --transport http \
tares http://localhost:8788/mcp
read(entity) one correlated timeline
query(view) ask anything
subscribe() be woken, not polled
create_source() wire it up from chat

From event to finding.

One real incident on one service's timeline, minute by minute.

  1. 02:03

    An event lands

    logs   POST /charge 500 "upstream retry limit"  x214
  2. 02:11

    Your alerting decides

    Prometheus keeps owning the thresholds. Tares only reacts to what fired.

    alerts HighCheckoutLatency firing  severity=page
  3. 02:11

    The trigger fires, once

    It saw the alert event land on the view it watches. A cooldown holds it there.

    trigger alert-lands → wakes incident-first-look
  4. 02:11

    The agent reads the whole story

    One read: the last 90 seconds of metrics, logs, deploys and alerts for this service. Not the alert alone.

    read(api-server) → 47 events · 4 sources
  5. 02:14

    The finding lands

    Written back onto the timeline next to the evidence, and delivered to #incidents.

    Uncapped retries from the 01:50 deploy (PR #482).
    Error rate and p99 follow the rollout window exactly.
    Next: cap retries at 3, or roll back.
  6. later

    The next reader starts ahead

    The finding is an event too. The next investigation, human or agent, opens with the last one's conclusion.

Run it in two commands.

# daemon + console → http://127.0.0.1:8787
uv tool install tares
tares up
# agent endpoint → http://localhost:8788/mcp
tares mcp
claude mcp add --transport http \
tares http://localhost:8788/mcp

The quickstart takes it from here. Rather not host it? Use the cloud.

Your first always-on agent, running tonight.

Common questions.

Does my data leave my machine?
No. One local DuckDB file. The only outbound traffic is what the agents you configure send to their model provider.
Do I need an Anthropic key?
Only for the built-in agents and Ask. MCP reads need none.
Is it read-only?
By default. Registering external MCP servers moves that boundary per agent, deliberately.
Does it replace Prometheus, Grafana, Datadog, or my alerting?
No. It ingests what they emit, correlates it, and reacts to what fired. Everything you run stays where it is.