npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

genter-cli

v0.3.0

Published

Resolver for AI agents: a question resolves to where its answer is written, read again every time. No keys, no packages. CLI, MCP server and library.

Readme

On its own, an agent guesses its way to an answer, and a memory layer hands it a copy that goes stale when your docs change. Genter resolves a question to the place its answer is written, a file and its lines or a page, and reads it again every time you ask.

See it in a second

npx genter-cli demo

No install, no key, no account: it runs on a temp folder.

$ genter ask "which port does the staging pooler use?"
  [1] docs/deploy.md:3-5 · Deploy › Staging
  Staging deploys every Tuesday from `main`. The pooler listens on port 6432.

Someone edits docs/deploy.md: Wednesday, port 5433. Nobody tells Genter.

$ genter ask "which port does the staging pooler use?"
  Since the last look: docs/deploy.md changed.

  [1] docs/deploy.md:3-5 · Deploy › Staging
      changed since the last look
  Staging deploys every Wednesday from `main`. The pooler listens on port 5433.

  A memory that kept a copy at the first question still answers:
  "Staging deploys every Tuesday from `main`. The pooler listens on port 6432."

Use it

On your folder. It searches the folder you are in:

npx genter-cli ask "how do we deploy?"

In your agent. Claude Code:

claude mcp add genter -- npx -y genter-cli mcp

Cursor, Windsurf, Codex, VS Code or any MCP client:

{ "mcpServers": { "genter": { "command": "npx", "args": ["-y", "genter-cli", "mcp"] } } }

Your agent gets genter_find (the passages that answer, read now, with path:lines), genter_remember (a note it finds later, with its date), genter_add (a folder, a file or a website) and genter_sources.

In code. No dependencies:

import { createLocal } from "genter-cli/local";

const genter = createLocal();
await genter.add("./docs");
const { results, changes } = await genter.find("how do we deploy?"); // [{ place: "docs/deploy.md:3-5", text, facts }]

How it resolves, and why it stays current

  • Each file or page is an Anchor: one read with a fixed argument (FILE_READ docs/deploy.md). Genter keeps where it is, its headings, its dates and a digest of it, never a copy of its text.
  • Every question reads the sources again. A changed file is answered from its new text, changed since the last look; a deleted one is gone and answers nothing; one marked Deprecated: replaced by [v2](v2.md) brings v2 right after it.
  • Taking a folder in calls no model: 200 files in 0.2 s. With no key, nothing leaves your computer.

Benchmarks

DriftBench: the docs of a 40-person company, 61 edits over two months, the same 65 questions before and after them, top 5 passages.

| | needs | before the edits | after the edits: current answer | after the edits: stale answer | | -- | -- | -- | -- | -- | | genter | nothing | 80% | 77% (89% of the changed facts) | 0% | | an index built once, same ranking | nothing | 80% | 34% (11%) | 42% | | genter --semantic | an embeddings key | 92% | 88% (92%) | 0% | | an index built once + vectors | an embeddings key | 92% | 42% (8%) | 43% | | mem0 2.2.1, docs not added again | an LLM key, 35 packages, 277 LLM calls to take the docs in | at most 73%¹ | at most 3 of 32 changed facts¹ | 18 of 28 old values kept¹ |

¹ What mem0's memory holds at all, an upper bound for any search over it: its searches did not run (the key ran out of credits). Results.

LoCoMo and LongMemEval, the conversational-memory benchmarks: is the evidence among the passages Genter finds? Words only, no key, no model.

| | questions | evidence in the top 5 | all of it in the top 5 | a search | | -- | -- | -- | -- | -- | | LoCoMo | 1,536 | 84.5% | 72.0% | 3 ms | | LongMemEval-S | 470 | 96.6% | 82.3% (knowledge updates: 98.6%) | 110 ms |

This is retrieval, Genter's own job. Answers judged with each benchmark's own prompt (the numbers memory layers publish): node bench/convo/run.mjs --answer with a key. Results.

Commands

| | | | -- | -- | | genter demo | see it on a temp folder | | genter ask <question> | the passages that answer, read now (the current folder, the first time) | | genter add <folder\|file\|url> ... | search these from now on | | genter remember <text> | keep a note in ~/.genter/notes.md; edit it as you like | | genter sources · genter forget <...> | what is searched; stop searching one | | genter mcp [folder\|url ...] | all of it for your agent, over stdio | | genter login <token> · genter logout | also find in your apps (below) |

--json, --limit N. Hidden files, .gitignored files, lockfiles, keys and anything holding a private key are never read. The store (~/.genter, or GENTER_HOME) is sealed with a secret made on the first run.

Better ranking: --semantic

Words find a question asked in the docs' words. --semantic also ranks by meaning, so other words and other languages find it too (DriftBench: Russian questions about English docs, 1 of 6 → 5 of 6). The passages go to the provider you pick:

| Provider | Set | | -- | -- | | OpenAI | OPENAI_API_KEY | | OpenRouter | OPENROUTER_API_KEY | | Vercel AI Gateway | AI_GATEWAY_API_KEY or AI_GATEWAY_TOKEN (free tier: GENTER_EMBED_MODEL=google/gemini-embedding-001) | | Ollama, on your computer (nothing leaves it) | nothing: ollama pull nomic-embed-text | | Any OpenAI-compatible endpoint | GENTER_EMBED_URL, GENTER_EMBED_KEY, GENTER_EMBED_MODEL |

The first key found is used; --provider openai|openrouter|vercel|ollama picks one.

Your apps: Genter Cloud

Your mail, calendar, GitHub, Slack, Notion and 500 more are not folders. Genter Cloud connects them and keeps their Anchors current by their own events. Make a token in Settings → API tokens, then:

genter login gnt_...
genter ask "what did Anna say about the contract?"   # your folders first, then your apps

genter mcp then finds in both too. --local skips the cloud.

| | genter-cli | Genter Cloud | | -- | -- | -- | | Sources | folders, files, websites, notes | + 500 apps | | Kept current | read again on every question | + every event in an app rechecks the Anchors it touches | | Ranking | words; meaning with your key | meaning, summaries and keywords written by a model, any language | | People | you | a team: roles, an MCP address per agent, a call log | | Price | free, Apache-2.0 | plans |

More

  • Your apps on your own Composio keys: the agent (run, find, write), the library, the models.
  • The specs Genter is built from.
  • Releases: raise version in package.json in a pull request; merging it into main publishes it to npm and makes the GitHub release.

License

Apache-2.0.