Architecture: the eve agent runtime on port 2000 writes workflow events to Postgres on port 5433 running in Docker, executes code in per-session Docker sandbox containers, and exports OTLP traces to the dashboard on port 4000, which also reads run state directly from Postgres over SQL.
Run AI agents on your own machine.
One command gives you the whole stack. Free, open source, and your data stays in a database you own.
One command sets it all up, then offers to start it for you.
It asks you a few questions, then builds the project and sets up a password for your dashboard. When it finishes it prints the last three commands to run. Turn everything off and back on whenever you like, because your agents carry on from where they stopped.
- agent
- :2000
- dashboard
- :4000
- postgres
- :5433
npx evestack create
… asks a few questions, saves your settings, installs everything
docker compose up -d postgres
✓ evestack-postgres-1 | database system is ready to accept connections
npm run db:bootstrap
✓ Schema created.
npm run dev
✓ eve dev ready on http://localhost:2000
✓ [world-postgres] Re-enqueued 2 active run(s) on startup
evestack
Sessions
33
Turns
119
Tokens in/out
182K/53K
Model spend
$0.06
Infrastructure
$0.00
Which sessions failed in the last hour?
None. Every session completed cleanly. The longest ran 41.0s with 13 tool calls.
What did the deploy email session cost?
Deploy summary email ran 3 turns with 5 tool calls in 18.2s, costing $0.0034 in model spend. Infrastructure: $0.00.
GitHub
evestack · webhooks + checks
OpenAI
openai/gpt-5-mini · key sk-…4f2a
Slack
#agent-runs · notifications
Everything you need, already wired together
Agents that survive a restart, run code safely, work to a schedule, and ask before they do anything you would not want.
Nothing gets lost
Every step is saved to your database the moment it happens. Shut it down mid conversation, or reboot the machine with agents halfway through a job, and they pick themselves back up where they stopped.
35 run_created
36 step_started
37 ai.streamText
38 step_completed
No hosting bill
The database, the sandbox and the dashboard all run on your machine, so there is nothing to bill. The only thing you pay for is the AI model, and you can run that locally too.
$0.00infrastructure / month
Your prompts stay private
Flip one setting and the words in your conversations never leave the agent. You still get timings and token counts, just not the content.
EVESTACK_TRACE_CONTENT=off
prompt: ••••••••••••
result: ••••••••
See every step it took
Open any conversation and follow exactly what happened: each turn, every tool the agent reached for, and every call it made to the model, with what went in and what came back.
agent.session
└ agent.turn
└ agent.step
└ ai.streamText
└ ai.streamText.doStream
It asks before it acts
Mark any tool as needing permission. The agent stops and waits while you approve or deny it in the dashboard, and every decision is recorded.
send_email wants approval
approvedenyRuns while you sleep
Give an agent a schedule and it works on its own. Every run is kept, so you can see what happened at 3am, and you can pause one without taking anything else down.
heartbeat0 * * * *
last run 41m ago ok
next in 19m
Watch your agents. Step in when it matters.
Every conversation your agents have, read straight out of your own database. What they did, what it cost, how long it took, and when a run goes wrong you can turn that exact run into a test.
evestack
Observability
Observability/Monitors
Runs
Error 0%
Session duration
p5015.8sp7520.8sp9536.6sp9940.1s
41.0speak
Session
Tokens
Duration
Cost
Write a detailed 1500-word essay about the history of database indexing.
8,827
41.0s
$0.0077
Use your agent tool to delegate this subtask to a subagent…
15,926
28.4s
$0.0021
Deploy summary email to the team
15,011
18.2s
$0.0034
Draft release notes for v0.4.0
13,531
16.9s
$0.0031
evestack observability: 8 runs in the last 12 hours, 0 errors. Median session duration 15.8s, p95 36.6s, peak 41.0s (the 1500-word essay session). Span tree: agent.session → agent.turn → agent.step → ai.streamText → ai.streamText.doStream → agent.turn.terminal.
It waits for you
Mark a tool as risky and the agent will not use it until you say so. Approve or deny it in the browser, and the decision is written down.
send_email
{ "to": "team@…", "subject": "Deploy done" }
send_email
{ "to": "team@…", "subject": "Deploy done" }
send_email
{ "to": "team@…", "subject": "Deploy done" }
Connect the tools you already use
Sign in once from the dashboard and your agent can use Gmail, GitHub, Slack, Notion, Linear and about a thousand more.
Connected tools: Gmail, GitHub, Notion, Linear, Google Calendar, Stripe, HubSpot, Jira. The agent executes Composio tool calls such as GMAIL_SEND_EMAIL, GITHUB_CREATE_AN_ISSUE, GMAIL_FETCH_EMAILS, GITHUB_SEARCH_REPOS.
Four pieces, all on your machine
The agent does the work. Postgres remembers every conversation. Docker keeps any code the agent runs inside a box where it cannot touch the rest of your computer. The dashboard shows you all of it, and none of it talks to the outside world.
Architecture: the eve agent runtime on port 2000 writes workflow events to Postgres on port 5433 running in Docker, executes code in per-session Docker sandbox containers, and exports OTLP traces to the dashboard on port 4000, which also reads run state directly from Postgres over SQL.
docker-compose.ymlThe whole setup is one Docker file
name: evestack
services:
postgres:
image: pgvector/pgvector:pg17
environment:
POSTGRES_DB: ${POSTGRES_DB:-evestack}
ports:
dashboard:
build:
context: .
depends_on:
postgres:
condition: service_healthyagent/agent.tsSessions saved to Postgres, talking to the model directly
import { openai } from "@ai-sdk/openai";
import { defineAgent } from "eve";
const workflow =
process.env.WORKFLOW_POSTGRES_URL
? { world: "@workflow/world-postgres" }
: undefined;
const model = openai(
modelId,
);
export default defineAgent({
model,
experimental: { workflow },
});agent/instrumentation.tsTen lines, and the dashboard can see everything
import { registerOTel } from "@vercel/otel";
import {
defineInstrumentation,
} from "eve/instrumentation";
export default defineInstrumentation({
setup: ({ agentName }) => {
registerOTel({
serviceName: agentName,
traceExporter:
new OTLPHttpJsonTraceExporter({
url: endpoint,
}),
});
});name: evestack
services:
postgres:
image: pgvector/pgvector:pg17
environment:
POSTGRES_DB: ${POSTGRES_DB:-evestack}
ports:
dashboard:
build:
context: .
depends_on:
postgres:
condition: service_healthyThe whole setup is one Docker file
import { openai } from "@ai-sdk/openai";
import { defineAgent } from "eve";
const workflow =
process.env.WORKFLOW_POSTGRES_URL
? { world: "@workflow/world-postgres" }
: undefined;
const model = openai(
modelId,
);
export default defineAgent({
model,
experimental: { workflow },
});Sessions saved to Postgres, talking to the model directly
import { registerOTel } from "@vercel/otel";
import {
defineInstrumentation,
} from "eve/instrumentation";
export default defineInstrumentation({
setup: ({ agentName }) => {
registerOTel({
serviceName: agentName,
traceExporter:
new OTLPHttpJsonTraceExporter({
url: endpoint,
}),
});
});Ten lines, and the dashboard can see everything
Run it yourself, or pay someone to run it
Both options use the same open source framework underneath. It is called eve, and Vercel builds it. The difference is whose computer your agents run on, and who can see what they are doing.
A hosted service
evestack on your hardware
Runs on
- A hosted service
- Someone else's servers
- evestack on your hardware
- Your machine, server, or cluster
Where conversations are stored
- A hosted service
- Their platform
- evestack on your hardware
- A Postgres database you own
How long history is kept
- A hosted service
- Set by the provider
- evestack on your hardware
- As long as you keep the rows
Dashboard
- A hosted service
- Included, and it watches
- evestack on your hardware
- Included, and it can also act
Who can reach your data
- A hosted service
- You and the provider
- evestack on your hardware
- You
Setup
- A hosted service
- Deploy to their platform
- evestack on your hardware
- One command, then four more
| A hosted service | evestack on your hardware | |
|---|---|---|
| Runs on | Someone else's servers | Your machine, server, or cluster |
| Where conversations are stored | Their platform | A Postgres database you own |
| How long history is kept | Set by the provider | As long as you keep the rows |
| Dashboard | Included, and it watches | Included, and it can also act |
| Who can reach your data | You and the provider | You |
| Setup | Deploy to their platform | One command, then four more |
Your agents, on your hardware.
Five commands and it is running on your machine.
Or read the documentation first. It covers how the pieces fit together, how to run this on a server rather than a laptop, and how to fix it when something breaks.