We already ran the install.

Say what you need. Get the package that works in your environment, with a receipt showing where and when it was verified. An empirical fact, not a plausible guess.

try it: pick an intent, watch it resolve:

the problem

The environment
is the constraint.

A library never installs in isolation. It lands in an environment (a runtime version, a libc, an architecture) that already has opinions. Three things go wrong, in the order you hit them.

choosing

Which package even does this? You ask around, guess, pick the one with the most stars, and hope it's still the right call this year.

installing

It resolves on your laptop and dies in CI. Wrong wheel, missing headers.
A transitive dep that needs a runtime you don't have.

maintaining

Dependencies don't sit still. What worked last quarter breaks on the next minor version, and you find out in prod.

guess a packagewrong importbreaks on muslsearch the errortry an alternateguess again…
libregistry: one callone verified answerone receipt.

why it's different

A plausible guess,
or an empirical fact.

Claude, GPT and Cursor answer this from training data, frozen in time. pip and npm answer from a static 1:1 table. Neither one ran anything.

an LLM / pip
$ pip install postgres
 not the package you meant

> "use psycopg2"
# no version. no env. no proof.
  • ·frozen at training time
  • ·one answer, no confidence, no runner-up
  • ·doesn't know your environment
  • ·no evidence it ever ran
libregistry
resolve "async postgres" @ py3.12/arm64
 asyncpg 0.29.0  verified 42h ago
  ranked · env-exact · footguns · receipt
  • empirically current, re-run on a schedule
  • ranked candidates, scored
  • resolved for your exact env cell
  • carries a receipt: where and when it ran

Everyone hands you an answer. We hand you an answer with proof it was actually run: which environment, and how long ago.

how to use it

One call.
A verified answer.

Send an intent and your environment. The receipt above is this JSON, rendered. Agents call it inline.

POST /v1/resolve
$ curl -s libregistry.com/v1/resolve \
  -H 'content-type: application/json' \
  -d '{"intent":"async postgres",
       "env":{"python":"3.12","platform":"linux/arm64","libc":"glibc"}}'
{
  "resolved":   { "package":"asyncpg", "version":"0.29.0",
                  "import":"import asyncpg" },
  "candidates": [ {"package":"asyncpg","match":0.91},
                  {"package":"psycopg","match":0.62} ],
  "footguns":   [ "pools don't survive fork; create after workers start" ],
  "evidence":   { "status":"verified_ok", "cell":"python:3.12-slim",
                  "age_hours":42, "grade":"harness" }
}

Pass a partial env and the response tells you what it assumed.
Pass an impossible one and it returns unresolvable with the constraint that failed, never a plausible-looking guess.

what we already know

The answer doesn't
go stale.

A model answers from a snapshot taken once, at training time.
We re-run the harness on a schedule, so what you get back reflects the packages as they are now, in the environment you asked about. Not scraped. Not inferred. Executed.

every cell
not just the popular one
version history
we notice when a release breaks something
failure reasons
when it won't work, you get the why

Every resolve adds a row. Ask something we have never run and we run it, so the next person asking your question gets a better answer than you did. So do you, the next time.