Skip to content
New

Hummingbird, our first release is in production. Join the waitlist

Your software exists twice.

Once as the code you wrote. Once as the app that runs. Every bug lives in the gap between them. Descry is built to stand in it.

01 - The Gap

Everyone else has a map of files

The bugs that cost you a weekend don't live in the frontend or the backend. They live between them: a permission check written when there were two roles and there are now three. Both sides are correct on their own. Types pass, tests pass, nothing throws.

Nothing in your toolchain looks there. Diff readers never open the app. Sandboxes run a clean room, not yours. Unit tests see one repository at a time. Error monitoring gets the right answer three days late.

Descry has a map of your product

The click, to the network request, to the backend route, to the handler, to the line that failed. Nothing else joins those together, which is why nothing else can tell you why.

does deleting an invoice still work?

8 steps

Reading both repositories · 1,284 components · 412 routes

POST /api/invoices/:id is called from 3 screens

Booting your app on localhost:3000

Clicked Delete on invoice #4821

DELETE /api/invoices/4821 → 500

InvoiceRepository: null customerId

Reproducing to confirm…

Confirmed · InvoiceService.ts:118 · video + 3 more

Across the seam Local Reproduce Hand off

Two Halves. No Referee.

Your frontend and your backend each pass their own tests. Nothing checks the one place they meet.

Introducing

HummingBird

02 - The Rail

01 The Map Knows a column from a function

It knows a column
from a function.

Descry parses both repositories into one graph. Not files and symbols: database columns, endpoints, screens.

  • Fifteen typed node types
  • Both repositories, one graph
  • Reads OpenAPI or a live schema directly
Explore the map
Code map / both repositories 4 nodes

One column reaches three screens

02 The Run Your app, your machine, your data

It opens the app
and uses it.

A real browser signs in and clicks through. The browser and the backend are recorded at the same moment.

  • Runs on your database and your config
  • Both halves recorded together
  • Video of the whole run
Explore the run
Run / local Recording 00:18
localhost:3000/invoices

Invoices Signed in as acme@example.com

  • #4821Acme Corp$1,240.00
  • #4822Acme Corp$860.00
  • #7714Northwind$3,105.00
  • #7715Northwind$412.00
  • backendSELECT * FROM invoices
  • backendNo workspace_id in WHERE
  • result214 rows · 41 from other workspaces
03 The Report Reproduced, then reported

Nothing is confirmed
until it happens twice.

Every claim opens into the evidence behind it: the recording, the request, the query, the line.

  • Confidence is computed, not guessed
  • Traced to the line that caused it
  • Handed to your coding agent
Explore the report
Report / invoice list Confirmed

The invoice list is missing its workspace filter.

invoiceRepository.ts:88

Video 00:22 Request Query Source

Reproduced 2 of 2

Handed to Claude Code

03 - It Notices

You don’t have to remember to ask.

Descry watches the files you’re working in.

  • It offers, you don’t ask

    Change something and it offers to check it.

  • In its own words

    I noticed a feature update. Want me to review it and propose test cases?

  • Two answers

    Yes, or not now. That’s the whole interaction.

invoiceRepository.ts routes.ts schema.sql
  • 81// GET /api/invoices
  • 82export async function listInvoices(ctx) {
  • 83  const page = ctx.query.page ?? 1
  • 84  return db
  • 85    .from('invoices')
  • 86    .select('*')
  • 87    .limit(50)
  • 88    .orderBy('issued_at', 'desc')
  • 89}
api/core feat/list-refactor 3 files changed Descry · watching Descry · noticed a change

Descry

I noticed a feature update in api/core. Want me to review it and propose test cases?

Yes, this one’s critical Not now

04 - How it thinks

Several theories at once, all comparing notes.

Investigating · 4 theories 00:00
Failure POST /checkout/confirm → 500 · orders.customer_id was null on insert
  • null customerId reaching the repository

    Queued

    Queued

    +1 finding
  • migration left the column nullable

    Queued

    Queued

    +1 finding
  • frontend sending the wrong field name

    Queued

    Queued

    +1 finding
  • session expiry mid-request

    Queued

    Queued

    +1 finding

Shared context · 0 findings passed between theories

When something breaks, Descry doesn’t guess once and commit.

  • Several theories at once

    It splits the failure into candidate causes and investigates them at the same time.

  • Focused, parallel, sharing what they learn

    Each investigation can see what the others have already ruled out, so nothing gets checked twice and nothing works blind. Not one overloaded agent doing everything, and not isolated agents duplicating each other.

  • Contradicted theories are dropped

    And you’re told they were.

Three stacked layers: the Hummingbird layer at the bottom, the evidence and diagnosis above it, and your coding agents on top.

05 - Hand it over

Descry doesn’t fix your code.

Your coding agent already does that well.

  • Exactly what’s wrong

    The file, the line, the evidence, the diagnosis. So it fixes the right thing the first time.

  • One click

    Into Claude Code, Cursor or Codex.

Before anyone sees it

Every other tool in this category lives in the pull request after you’ve pushed, in front of your team. Descry is a desktop app. It runs at your desk, on the change you just made, before it goes anywhere.

06 - What’s supported

Ten Languages, One Map

Every stack parses into the same typed graph, so a route in Go and a component in React sit on the same seam. Plus two adapters that skip language parsing entirely: we read your OpenAPI contract or your database schema directly, because that’s cheaper and more accurate than inferring it.

  • Python Language FastAPI · Flask · Django · Pydantic 98%
  • TypeScript Language Express · koa-router · React 95%
  • Kotlin Language Ktor routing DSL 95%
  • OpenAPI Contract Reads a published contract directly Direct

See full matrix

Frequently asked questions

Things people ask before they try it.

  • No. Review tools read your change and give you an opinion. Descry runs your application and gives you evidence. Different questions, and you can use both.

  • Two ways. They run in a sandbox; Descry runs your real app with your real data. And their map knows files and functions, while Descry’s knows columns, endpoints and screens, which is why it can tell you which screen a column feeds.

  • Those are how you write a test. Descry decides which test is worth running, drives it, watches the backend at the same time, and traces the failure to the line.

  • No. Descry diagnoses; your coding agent fixes. Every finding hands off to Claude Code, Cursor or Codex with the file, line and evidence attached.

  • We test it two ways. We give it the same problem repeatedly and check whether it reaches the same conclusion: scattered answers mean guessing. And we run different models against the same task and compare. That’s how we decide which model handles which step.

  • On your machine. Descry is a desktop app. It boots your app locally, on your database and your config, before the change leaves your laptop.

Find out what your change actually did.

Hummingbird is our first release. Join the waitlist and help shape it.

Join waitlist