lurq

How it works

How lurq turns public signals into scores, confidence, and search.

lurq's scores are computed from public signals — never hand-written. This page sketches the pipeline from raw data to the answer your agent receives.

The pipeline

public APIs (npm, github, deps.dev, bundlephobia)
  → ingestion
  → scoring (health + quality + confidence)
  → summaries / usage guides
  → embeddings
  → postgres + pgvector  (hybrid lexical + semantic search)
  → { stdio MCP server, HTTP MCP service, CLI }

Each stage is idempotent and tolerant of a single source being down, so a flaky upstream API degrades one signal rather than failing the whole index.

Scoring axes

A package's composite score blends two axes:

  • Health — signals like maintenance cadence, adoption, reliability, and efficiency, drawn from release history, issue activity, dependents, and bundle size.
  • Quality — a complementary axis so a brand-new but well-built package isn't penalized purely for being young.

The two are combined with a tunable weight (composite.lambda). Operators can inspect the model with lurqrun weights and adjust it with lurqrun edit-weights — see the CLI reference.

Confidence

Confidence labels (proven, emerging, promising, unproven) reflect the strength of the discovered evidence, not popularity alone. This matters for newer dependencies: a package can be young and lightly used yet still be a sound recommendation, and lurq surfaces it with an honest confidence label rather than hiding it.

Retrieval is hybrid: lexical matching for exact names and keywords, combined with semantic (vector) search via pgvector for fuzzy, intent-based queries like "debounce a function." This catches both "I know the name" and "I know what I want it to do" cases.

Freshness

The index is refreshed on a schedule (lurqrun sync), and operators can proactively pull in new candidates with lurqrun discover. Every response includes a dataAsOf timestamp so your agent can reason about how current the evidence is.

On this page