Guide
Wake up to a performance report written by your own telemetry
· Ed Grosvenor
Last updated
Most performance work starts with a complaint. A customer says the dashboard feels slow, somebody opens a monitoring tool, and an afternoon disappears into graphs. By then the regression has usually been live for a week.
You can turn that around. Every morning, before you have opened your laptop, an agent has already read yesterday's telemetry, compared it with the day before, and written you a short report of what got worse, what got better and what is worth fixing next. If something in it matters, you reply with one sentence and the agent opens an issue or hands the work straight to Claude Code.
What you need
- Hone, deployed to your own infrastructure and receiving telemetry from your app.
- Claude Cowork, with the ability to run a task on a schedule.
- About fifteen minutes.
Hone rolls slow requests, slow queries, job durations, exceptions, outgoing HTTP calls and cache activity into daily aggregates, and it exposes all of it through an MCP server. The MCP server is what makes this work. Instead of scraping a dashboard, the agent asks your own database questions like "which query got slower after Tuesday's deploy?"
Step 1: Connect Cowork to Hone
Hone mounts its MCP server at /mcp by default (set HONE_MCP_PATH to move it). Add it to Cowork as a remote MCP server, using the API token from your Hone deployment:
{
"mcpServers": {
"hone": {
"type": "http",
"url": "https://hone.example.com/mcp",
"headers": {
"Authorization": "Bearer ${HONE_API_TOKEN}"
}
}
}
}
Before you schedule anything, ask Cowork a question by hand: "Using Hone, what were my five slowest endpoints yesterday?" If you get a real answer back, the connection works.
Step 2: Write the morning brief
The prompt is the whole product here, so be specific. Tell the agent what to compare, what counts as interesting, and how to format the result so you can read it on your phone:
Every morning at 6:30, use the Hone MCP server to compare yesterday's
daily aggregates with the 7-day average before it. Write a brief with
these sections, and skip any section that has nothing in it:
1. **Got worse** — endpoints, queries or jobs whose p95 duration rose
by more than 20%, or new exception types. Include the deploy that
preceded the change if Hone knows about it.
2. **Got better** — anything that improved by more than 20%. Say what
probably caused it.
3. **Worth fixing** — the three changes with the best payoff for the
effort: N+1 queries, missing indexes, cache keys that never hit,
slow third-party calls that could be queued.
4. **Numbers** — total requests, error rate, and the slowest endpoint.
Keep it under 300 words. Link every item to the endpoint or query
it is about. End by asking whether I want issues opened for any of it.
Save it as a scheduled task in Cowork.
Step 3: Read it over coffee
The brief skips any section with nothing in it, so two of the four are missing here.
Got worse:
GET /projects/{project}p95 went from 180ms to 740ms after yesterday's 16:05 deploy. 94% of the added time is one query ontasks, run once per project member.Worth fixing: the
reports:nightlyjob spends 41 seconds waiting on an external API that could run in parallel.
That first item is a textbook N+1, and it is exactly the kind of thing that slips through review because the page still works.
Step 4: Hand it off
Reply to the brief the way you would reply to a colleague:
- "Open an issue for the first one." Cowork writes the issue with the numbers, the query and the deploy that introduced it.
- "Fix it." The agent passes the task to Claude Code, which finds the loop and adds the eager load:
// Before: one query per member, on every page view.
$members = $project->members;
foreach ($members as $member) {
$member->open_tasks = $member->tasks()->whereNull('completed_at')->count();
}
// After: one query for everyone.
$members = $project->members()
->withCount(['tasks as open_tasks' => fn ($query) => $query->whereNull('completed_at')])
->get();
Tomorrow's brief tells you whether it worked, because the same endpoint shows up under Got better.
Why this works better on your own data
A hosted APM can send you a digest too. The difference is what the agent is allowed to do with it. Hone's data lives in your database, so there is no per-query pricing to ration and no retention window deciding what last quarter looked like. You can let the agent ask as many questions as it likes, every single morning, and the answers stay yours.
| Morning brief with Hone | Checking a dashboard | |
|---|---|---|
| When you find out | Before standup | When someone complains |
| Who does the comparing | The agent | You |
| Turning it into work | One reply | Copy, paste, write the issue |
Start with the prompt above, run it for a week, and then tune the thresholds. Most people end up tightening "more than 20%" once they see how quiet a healthy app is.
Changelog
- Published.