Postgres performance · Open source · Read-only · Deterministic

See the queries your ORM is actually running.

IndeX-Ray shows how Postgres will run each query on today's data and at 1000× the rows. Point it at a Postgres URL and it flags the queries that get slow as you grow, and the indexes that fix them.

What you get

See what Postgres actually does with your queries.

The three things a backend team usually can't see at once: the SQL your ORM really emits, how its plan changes as the data grows, and a CI check that catches the bad ones before they merge.

01 · Visibility

See the real queries your ORM emits.

Pull from a Postgres URL, or run the analyzer next to a database that isn't reachable from the internet. We surface every active query through pg_stat_statements and de-parameterize the ones your framework hid. With SQLCommenter, each query links back to the file, line, route, and controller that ran it.

142 active queries indexed
! 11 ORM-generated, never reviewed
GET /orders · orders_controller.rb:15
02 · Foresight

Predict performance at 10× and 1000× your data.

Most tools only tell you what's slow today. IndeX-Ray simulates how the planner's choices shift as your tables grow, so a query that's fine at 10k rows doesn't surprise you at 10M.

now (10k)  cost 24
10×  (100k) cost 8.4k
1000× (10M) cost 982k
03 · Gate

Catch regressions in CI, before they reach prod.

Add the GitHub Action. Every PR gets a comment with the queries it touched, the indexes they need, and a red X when a regression threshold is crossed.

14 queries · 0 regressions
1 missing index on orders.user_id
How is this different?

Built for what EXPLAIN can't tell you on its own.

There are a few other ways to look at Postgres performance. None of them cover all four of these at once.

EXPLAIN ANALYZE LLM "SQL copilots" Query Doctor
Sees the queries your ORM emits Manual, one query at a time Whatever you paste Yes, via pg_stat_statements
Predicts performance at 10×/1000× scale No, only today's data Unverified guesses Yes, simulated planner choices
Runs in CI on every PR No No Yes, via GitHub Action
Deterministic · no model calls Yes No Yes, AST-based
How it works

Three steps to your first query report.

No agents to install on prod. No new schema. You're inspecting queries 60 seconds* after docker run.

*Requires pg_stat_statements installed on your Postgres. First-time setup may take longer.

01
Connect

Run the analyzer

Pull the Docker image, point it at your Postgres. Read-only role, and we never write to your DB.

$docker run --pull always -p 2345:2345 \ ghcr.io/query-doctor/analyzer
02
Analyze

Point it at Postgres

Paste a connection string. We read pg_stat_statements, schemas, and statistics. We don't write.

postgres://[email protected]:5432/app
03
Ship

Block regressions in CI

Add the GitHub Action. Every PR gets a query report with red ✗ on missing-index regressions.

ci / query-doctor · 1 improvement available
On our radar

What's on our radar.

Not promises, just the gaps we know about and the things we're thinking about building. The list shifts as people tell us what matters. If something here speaks to you, or you have an idea that isn't here, come talk to us.

  • Team plan Shared dashboards, RBAC, SSO, seat billing.
  • Alerts Slack or email when a plan regresses.
  • MCP Analyzer in Cursor, Claude Code, and friends.
  • Query rewrites Semantically-equivalent SQL, generated from the AST.
  • Local-only mode The analyzer runs end-to-end on your machine. Nothing leaves your network.
  • PostGIS Plan reading for spatial indexes.
  • More extensions pgvector, pg_trgm, and the long tail.
  • Need something else? Tell us. We're small enough to actually build it. Talk to us
Pricing

Simple, honest pricing.

Free covers the playground, live queries, CI, and statistics for modeling your data at 10× or 1000× scale. Pro is for when two projects isn't enough.

Free · forever

Free

$0 forever

For learning and most day-to-day work. No card needed.

  • IndeX-Ray playground against your own schema
  • Inspect live queries via pg_stat_statements
  • Sync & modify statistics to model at 10M rows
  • Pre-deployment CI insights
  • Up to 2 projects
Pro · cancel anytime

Pro

$20 / month

For when two projects isn't enough: unlimited projects, with query rewrites on the way.

  • Unlimited projects, one per service, environment, or client
  • Query Doctor MCP server for analysis in your editor (soon)
  • Query rewrite suggestions (soon)
  • Unlisted shares (soon)
  • Everything in Free
Lifetime · $100 once Pay once for everything Pro does, forever. Plus a private channel with the maintainers and early input on the roadmap. Limited early-backer spots. Get lifetime access
Coming next Working at scale? A team plan with shared dashboards, SSO, and seat billing is shipping next. Talk to us
What we believe

How the analyzer works, and what it won't touch.

Read-only by design

The analyzer never writes to your database.

It connects with a read-only role and reads pg_stat_statements, schemas, and statistics. It never writes back.

Deterministic

No LLM in the loop.

Real code parses your queries and schemas into an AST and reasons about the plan. The same input gives the same answer every time, and you can read the rules it follows.

Open

The analyzer is open source.

We make money on the hosted IndeX-Ray product, not by gatekeeping the core. The analyzer is open source, so you can read the code, audit the output, and run it on your own machine.

See how your queries hold up at scale.

One docker run and a Postgres URL, and you're inspecting queries in about a minute.

We love databases.

Need a hand with a gnarly plan, or just want to talk Postgres? The Discord is small, friendly, and the maintainers hang out there daily.

Join the Discord