A spec browser for large language models, built on the models.dev catalogue. Search 5,700+ model listings across 170+ providers by capability, context window and price, then copy any model's raw JSON.
Live at models.eloxt.com
- Instant search across model name, family, provider and identifier. Filter by reasoning, tool calling, structured output, input modality, open weights or free tier; sort by context size, price or release date.
- One row per model. Most models are resold by dozens of gateways. Duplicate listings collapse into a single row tagged
+13 more providers, turning 5,751 listings into ~2,500 distinct models. Toggle Every listing to see them all. - Full spec sheet per model: limits, pricing (including cache rates, 200K+ tiers and audio), modalities, reasoning controls, experimental modes, provider integration details, and the same model's price at every other provider.
- Copy JSON — one click puts the model's raw catalogue entry on the clipboard.
- Shareable URLs, keyboard
/to focus search, light and dark themes.
The search index. The full api.json is ~3MB, too much to ship to a browser. The server derives a compact index where each model is a fixed-position tuple — about 140KB gzipped for every model. The browser downloads it once, then every keystroke filters locally with no round trip.
Server render, client takeover. The route loader renders the first page of results on the server, so a shared URL like ?q=gemini+3 answers correctly and works without JavaScript. Once the index arrives the browser takes over. Both paths call the same searchModels function, so the list never shifts when the handoff happens.
Picking a model's representative listing. When duplicates collapse, which provider should the row show? Rather than maintaining a list of "real" providers, the answer comes from the data: resellers namespace their identifiers with the origin vendor (google/gemini-3.5-flash, anthropic/claude-opus-5). Taking the majority vote of those prefixes within a group identifies the lab's own listing. Two refinements matter — a provider shipping its own SDK package is a weak signal (some gateways do too), and the dot in gemini-3.1 is a version number, not a namespace.
Rendering. The result list is window-virtualized, so all 2,500+ rows scroll continuously without pagination while only the visible rows stay mounted. Rows self-measure because the layout reflows to a taller shape on narrow screens.
Caching. The parsed catalogue is held in module scope inside the Worker isolate for 30 minutes, and the upstream fetch sets Cloudflare edge cache headers so isolates share one copy. Edge caching only takes effect when the Worker runs on a zone, not on a workers.dev subdomain.
pnpm install
pnpm dev # http://localhost:3000| Script | Purpose |
|---|---|
pnpm dev |
Dev server on port 3000 |
pnpm build |
Production build |
pnpm preview |
Build, then serve locally |
pnpm deploy |
Build and deploy to Cloudflare Workers |
pnpm generate-routes |
Regenerate the TanStack Router route tree |
pnpm cf-typegen |
Regenerate Worker type definitions |
There is no test suite yet; pnpm test is wired to Vitest but no specs exist. Type checking runs via npx tsc --noEmit.
Built with TanStack Start, React 19, Tailwind CSS v4 and TanStack Virtual, on Node 22 and pnpm 11.
Deploys to Cloudflare Workers:
pnpm deploymodels.dev is itself hosted on Cloudflare. Without the global_fetch_strictly_public compatibility flag, the Worker's upstream fetch counts as a Worker-to-Worker call and the edge rejects it with error 1042. It fails only on cold isolates — warm ones serve from the module cache — so it surfaces as intermittent 404s that never reproduce locally. The flag is already set in wrangler.jsonc:
To deploy under your own hostname, change routes[0].pattern in wrangler.jsonc, or delete the routes block to publish on a workers.dev subdomain instead.
src/
lib/
models.ts Catalogue types and the compact index codec
search.ts Filtering, ranking, duplicate collapsing
format.ts Token, price and date formatting; the context ruler scale
use-model-index.ts Client-side index fetch, cached per session
server/
models-source.ts Upstream fetch, isolate cache, derived lookups
fns.ts Server functions for the search page and detail page
components/ Result row, copy button, header, footer
routes/
index.tsx Search page
m.$provider.$.tsx Model detail (splat route — identifiers contain slashes)
All specifications come from models.dev, an open catalogue of LLM providers and pricing. This project only reads and presents it; report data corrections upstream. Prices are USD per million tokens.

