How it works

From performance debt to a clear next step.

Connect your systems, rank the daily cost and track what changes after a fix.

Connect the systems you run.

An agent on each machine discovers services and reads access logs and database statistics. The infrastructure map shows connections; coverage checks identify sources that still need configuration. See how coverage works.

Duration × frequency = cumulative cost.

For a query, 40 milliseconds multiplied by 90,000 executions is 3,600 seconds of query execution per day. Per-day rates use the observed period. These totals describe accumulated time, not elapsed wall-clock time or guaranteed financial savings; overlapping work should not be interpreted as separate customer waiting time.

One list

Everything slow on one scale, ordered by what it costs you

Endpoints, queries, PHP stalls, queued jobs and scheduled commands, all priced the same way. Use the daily cost to compare priorities across the application.

Every cost counted once

One request seen by nginx and by OpenTelemetry is one request. One statement reported by your ORM and by its driver is one statement. One query seen by the application and by performance_schema is one query. Slowpoke removes the duplicates instead of adding them up, otherwise nobody would trust the totals.

Down to the line of code

With a framework package, every query points at the line that ran it, like OrderController.php:42. Never at a file inside vendor/, node_modules/ or site-packages/.

Background work counts too

A queued job nobody watches and a nightly command that overlaps the backup cost real time on real machines. They sit in the same list as your slowest endpoint, priced the same way.

Query doctor

Real EXPLAIN plans, in plain language

The agent runs EXPLAIN next to your database, in a read-only transaction, and only on statements it has already seen on that machine. The server never chooses the SQL. It reports what it found in words a tired engineer can act on at 6pm.

Full table scans

With the exact index to add and the row count before and after it: 1.2M rows read to return 20, then 24 rows read to return 20.

N+1 queries

The route that triggers them, how many times per request, and the line of code that runs them in a loop.

The quiet ones

A number compared with a text column, so the index is never used. A LIKE '%abc' that can only scan. An OFFSET 48,000. The query plan helps explain why they are slow.

Twelve named diagnoses, each with the fix it suggests

full table scan N+1 queries number compared with a text column sorting without an index temporary table function() on a column in WHERE LIKE starting with % OR across different columns SELECT * on a wide table pagination with a deep OFFSET COUNT on a big table NOT IN (SELECT ...)

MySQL 5.7 and 8, MariaDB, and PostgreSQL. Statements stored without their values still get a plan on PostgreSQL 16 and newer, using a generic plan.

Verify the result after the work ships.

The most costly issues become missions with an owner and a target. A mission closes when its cost stays down across consecutive measurement windows. Check the history alongside traffic: lower usage can also reduce daily cost. Regressions are linked to deploys so the team can investigate.

Make the case for the work

A report the wider business can follow.

Share the daily debt, completed missions and effort estimates. Use the evidence to explain why a performance task deserves a place in the next sprint.

Sample project shown; your results depend on your workload.

Slowpoke debt report showing daily costs and priorities for a sample project

See what to fix first.