01
VernLLM — the LLM gateway as an npm package with zero dependencies, 605 commits and zero stars
The Show HN (4 points, one comment, the maker's own) says why it exists in the first sentence: "every LLM gateway I looked at meant adding a network hop just to get rate limiting, multi provider fallback, circuit breaking and other features," and "needing to take a whole separate service just to deploy, monitor and trust with my API keys is just annoying since my whole tech stack was just TypeScript and Node." vern-llm (MIT, Node 22.22+) wraps the SDK clients you already construct, fromOpenAI(new OpenAI(...)), fromAnthropic, Gemini, Bedrock, or fromFetch for anything over HTTP, in one VernLLM object that carries retries with backoff and jitter, an ordered fallback list with a circuit breaker per target, client-side rate limiting on requests per minute, tokens per minute and concurrency, a retry budget (retryRatio: 0.2 over a 60-second window in the README example), timeouts, Zod-validated structured output, provider-native JSON-schema mode, streaming, tool calling, cachedCall with a cache adapter you bring, and a middleware pipeline where transform runs per attempt and wrap runs once around the whole logical call regardless of retries. One onEvent stream reports retries, failovers, circuit transitions and rate-limit waits; onUsage and onUsageFailure report token spend on success and on failure, "so nothing goes unaccounted for when a call fails after the provider already responded." It has zero runtime dependencies: Zod and the provider SDKs are not required, because it "relies on compatible interfaces rather than specific implementations." The docs list forty-odd providers reachable through the OpenAI-compatible adapter, from Groq and Cerebras to Ollama, vLLM, LM Studio, Cloudflare Workers AI and Vercel's AI Gateway, which means it can sit in front of a gateway as easily as replace one. Version 2.7.0, published Saturday at 23:15 UTC, added dependency-aware middleware ordering and rate-limit state introspection.
The repository is the story. The first commit is July 19, titled "first commit"; there have been 605 since, 535 by the maker and the rest by GitHub Actions and Renovate, which is about twelve a day for fifty days. npm holds 36 versions from 0.1.0 on that same July 19 to 2.7.0 on Saturday, 8,284 downloads in the thirty days to Saturday, and the GitHub repository has zero stars and one fork. Around it is the process of a much larger project: eleven Actions workflows (build checks, lint, typecheck, unit, integration, CodeQL, docs build, changesets, versioning, publish), Codecov, Renovate, a CodeRabbit config, size-limit and publint in devDependencies, 68 source files against 108 test files, a 64-page Fumadocs site, and an OpenSSF Best Practices badge registered on August 22 at the "passing" tier (100% of passing, 22% of silver, 17% of gold, self-assessed as that badge is). The account behind it was created June 11, 2025, has zero followers, and a bio reading "LLM Application Infrastructure Engineer." The maker states the tradeoff in the OP better than a competitor would: "it has no centralized policy across multiple apps or languages so if you want that then its better to use a gateway instead." Eight thousand downloads against zero stars is either a quiet user base or the maker's own CI, and the repository does not say which. Machine-facing docs: none; the root README says of itself "This README is a quick reference, not the manual."
Reach for it when a Node service makes LLM calls and what you wanted from a gateway was fallback, rate limits and a circuit breaker rather than a shared key vault; it replaces the LiteLLM proxy container and the hop through it. Delete the gateway's API key from the deploy, since the keys stay in the process that already had them. Tradeoffs: TypeScript only, and per-process, so two services get two rate limiters and no shared view; a fifty-day-old API that moved from 2.6.0 to 2.7.0 in five days; one maintainer, one fork, zero stars; the badge is the self-certified tier; and the fallback tries targets "in order after the primary, with no scoring or health-checking," which is a feature until the primary is merely slow.