NikclasTech/nikclas

Compare the prices of different AI models before starting your larger project.

TypeScript

1

19 commits

updated Sep 23, 2026

See the code

See what people are saying

README

Nikclas

License: GPL v3 React Vite Tailwind CSS TypeScript Pricing: LiteLLM

Nikclas banner

Stop overpaying for tokens. Nikclas compares $/1M token prices across frontier AI models so you can ship the same quality for less.

Read this in: Espanol | Francais | Deutsch | 中文

Contents

1. Overview

Nikclas is a single-page React application that answers one question: which AI model does the same job for the least money?

It opens with a thesis hero (live price board sorted by input $/1M) and continues with a head-to-head comparator: pick a provider and a model on each side, see the price gap, and get a verdict with the exact saving per 1M input tokens.

All prices load live from the LiteLLM Model Catalog API.

2. Features

  • Live price board — the 4 highest-traffic flagships (gpt-4o-mini, gpt-4o, claude-sonnet-4-6, deepseek-chat), sorted by input $/1M with log-scale bars, BEST / AVOID tags and a live / syncing / cached status indicator.
  • Head-to-head comparator — provider and model selectors on both sides, swap button, per-model datasheets (input, output, context, speed), a central savings readout and a plain-language verdict.
  • Live pricing with honest fallback — prices are fetched from https://api.litellm.ai/model_catalog/{model_id}, cached in localStorage for 24h, and fall back to a bundled snapshot (verified 2026-09-22) while loading or offline. The UI always states which source is on screen.
  • Tech-styled identity — Chakra Petch display type, Inter body text, JetBrains Mono data type; deep-navy blueprint theme with signal-cyan (compute) and amber (savings) accents.
  • Accessible by default — semantic landmarks, labelled form controls, visible keyboard focus, live regions for price updates, and prefers-reduced-motion support.

3. Tech stack

LayerTechnology
UIReact 19 + TypeScript
BuildVite 8
StylingTailwind CSS 4
FontsChakra Petch, Inter, JetBrains Mono (Google Fonts)
DataLiteLLM Model Catalog API (api.litellm.ai)
LintESLint + typescript-eslint

No backend is required. The app is a static build that calls the public pricing API directly from the browser.

4. Project structure

.
├── components/
│   ├── hero/
│   │   ├── HeroSection.tsx    # Thesis, CTAs, stats + board layout
│   │   └── PriceBoard.tsx     # Live price-board console
│   └── compare/
│       ├── CompareSection.tsx # State, savings math, verdict
│       ├── CompareForm.tsx    # Provider + model selectors, swap
│       └── ModelCard.tsx      # Model datasheet card
├── src/
│   ├── lib/
│   │   ├── litellm.ts         # Catalog, API client, cache, hook
│   │   └── format.ts          # Formatting, vendor labels, bar scales
│   ├── App.tsx                # Composes HeroSection + CompareSection
│   ├── main.tsx               # React entry point
│   └── index.css              # Tailwind theme, fonts, animations
├── docs/
│   ├── README.es.md           # Spanish translation
│   ├── README.fr.md           # French translation
│   ├── README.de.md           # German translation
│   └── README.zh.md           # Chinese translation
├── public/                    # Static assets (banner, favicon, icons)
├── index.html                 # Fonts, meta, title
└── LICENSE                    # GNU General Public License v3.0

5. Getting started

Prerequisites

  • Node.js 20+ and npm.

Install

npm install

Run the dev server

npm run dev

Open http://localhost:5173/ in your browser.

Production build

npm run build
npm run preview

npm run build type-checks (tsc -b) and emits the static site to dist/, which can be served by any static host.

6. Pricing data

Source

GET https://api.litellm.ai/model_catalog/{model_id} returns per-token costs (input_cost_per_token, output_cost_per_token). The app multiplies them by 1,000,000 to display $/1M tokens, and reads max_input_tokens for the context window. Model metadata refreshes from LiteLLM's catalog on every load (deduplicated, then cached 24h).

The API free tier allows 100 requests/day per IP without a key; a fresh load of the full 15-model catalog uses 15 requests.

Known limitation: CORS

api.litellm.ai does not send an Access-Control-Allow-Origin header (verified with and without an Origin header; OPTIONS returns 405), so browsers may block the live response. In that case the app renders the bundled snapshot and labels it as cached. Serving the app behind your own backend or proxy that forwards to api.litellm.ai restores live data without changing any component.

Bundled snapshot (verified 2026-09-22, $/1M)

ModelProviderInputOutputContext
gpt-4o-miniOpenAI$0.15$0.60128k
deepseek-chatDeepSeek$0.28$0.42131k
deepseek-v4-flashDeepSeek$0.30$1.201M
deepinfra/nvidia/Llama-3.1-Nemotron-70B-InstructNVIDIA$0.60$0.60131k
gemini-2.5-flash-liteGoogle$0.10$0.401M
gpt-5.6-lunaOpenAI$0.20$1.20922k
zai/glm-5.3z.ai$1.40$4.401M
qwencloud/qwen-maxQwen$1.60$6.4031k
xai/grok-4.5xAI$2.00$6.00500k
gpt-4oOpenAI$2.50$10.00128k
claude-sonnet-4-6Anthropic$3.00$15.001M
moonshot/kimi-k3Kimi$3.00$15.001M
claude-fable-5-1Anthropic$10.00$50.001M
gpt-6-astraOpenAI$10.00$50.00922k
claude-opus-4-1Anthropic$15.00$75.00200k

Median speeds shown on the cards are indicative static values; prices and context windows are the live fields.

Automated updates

There is no database: data/pricing.json is the current dataset and git log -- data/pricing.json is the price history. Every 6 hours the pricing-update workflow runs the collector (npm run collect:pricing), validates the result and opens a pull request titled chore: update AI model pricing when prices moved — main is never written to directly. Jumps of 3x or more are kept in the PR but marked [possible-anomaly] for human review. Source links are re-checked weekly by the link-check workflow, which opens an issue if a source breaks.

7. Available scripts

CommandDescription
npm run devStart the Vite dev server
npm run buildType-check and build for production
npm run previewPreview the production build locally
npm run lintRun ESLint over the project
npm testRun unit tests (vitest)
npm run collect:pricingRefresh data/pricing.json from live sources
npm run validate:pricingValidate data/*.json
npm run check:linksCheck pricing source URLs

8. Automation

WorkflowTriggerWhat it does
ci.ymlPRs, pushes to mainInstall, lint, tests, build, data validation
pricing-update.ymlEvery 6h, manual dispatchCollector run, validation, pricing PR (never direct to main)
link-check.ymlWeekly, manual dispatchVerifies source URLs, opens an issue on breakage
security.ymlPRs, pushes to main, weeklyCodeQL analysis (JavaScript/TypeScript)

Dependabot updates npm and GitHub Actions dependencies weekly (.github/dependabot.yml, no auto-merge). No secrets are required: the pricing API needs no key and automation uses the built-in GITHUB_TOKEN with least-privilege permissions.

9. Contributing

See CONTRIBUTING.md, including how to add a new pricing provider (collector, parser, tests, official source, validation, pull request).

10. License

This project is licensed under the GNU General Public License v3.0 or later (GPLv3+). See LICENSE for the full text.

You are free to run, study, share and modify this software, provided that any distributed work remains under the same license and its source code stays available.

ai
ai-agents
react
typescript
web
webapp
web-development
website

Contributors

notcr12dev

15 commits

NikclasTech/nikclas

Compare the prices of different AI models before starting your larger project.

TypeScript

1

19 commits

updated Sep 23, 2026

See the code

See what people are saying

README

Nikclas

License: GPL v3 React Vite Tailwind CSS TypeScript Pricing: LiteLLM

Nikclas banner

Stop overpaying for tokens. Nikclas compares $/1M token prices across frontier AI models so you can ship the same quality for less.

Read this in: Espanol | Francais | Deutsch | 中文

Contents

1. Overview

Nikclas is a single-page React application that answers one question: which AI model does the same job for the least money?

It opens with a thesis hero (live price board sorted by input $/1M) and continues with a head-to-head comparator: pick a provider and a model on each side, see the price gap, and get a verdict with the exact saving per 1M input tokens.

All prices load live from the LiteLLM Model Catalog API.

2. Features

  • Live price board — the 4 highest-traffic flagships (gpt-4o-mini, gpt-4o, claude-sonnet-4-6, deepseek-chat), sorted by input $/1M with log-scale bars, BEST / AVOID tags and a live / syncing / cached status indicator.
  • Head-to-head comparator — provider and model selectors on both sides, swap button, per-model datasheets (input, output, context, speed), a central savings readout and a plain-language verdict.
  • Live pricing with honest fallback — prices are fetched from https://api.litellm.ai/model_catalog/{model_id}, cached in localStorage for 24h, and fall back to a bundled snapshot (verified 2026-09-22) while loading or offline. The UI always states which source is on screen.
  • Tech-styled identity — Chakra Petch display type, Inter body text, JetBrains Mono data type; deep-navy blueprint theme with signal-cyan (compute) and amber (savings) accents.
  • Accessible by default — semantic landmarks, labelled form controls, visible keyboard focus, live regions for price updates, and prefers-reduced-motion support.

3. Tech stack

LayerTechnology
UIReact 19 + TypeScript
BuildVite 8
StylingTailwind CSS 4
FontsChakra Petch, Inter, JetBrains Mono (Google Fonts)
DataLiteLLM Model Catalog API (api.litellm.ai)
LintESLint + typescript-eslint

No backend is required. The app is a static build that calls the public pricing API directly from the browser.

4. Project structure

.
├── components/
│   ├── hero/
│   │   ├── HeroSection.tsx    # Thesis, CTAs, stats + board layout
│   │   └── PriceBoard.tsx     # Live price-board console
│   └── compare/
│       ├── CompareSection.tsx # State, savings math, verdict
│       ├── CompareForm.tsx    # Provider + model selectors, swap
│       └── ModelCard.tsx      # Model datasheet card
├── src/
│   ├── lib/
│   │   ├── litellm.ts         # Catalog, API client, cache, hook
│   │   └── format.ts          # Formatting, vendor labels, bar scales
│   ├── App.tsx                # Composes HeroSection + CompareSection
│   ├── main.tsx               # React entry point
│   └── index.css              # Tailwind theme, fonts, animations
├── docs/
│   ├── README.es.md           # Spanish translation
│   ├── README.fr.md           # French translation
│   ├── README.de.md           # German translation
│   └── README.zh.md           # Chinese translation
├── public/                    # Static assets (banner, favicon, icons)
├── index.html                 # Fonts, meta, title
└── LICENSE                    # GNU General Public License v3.0

5. Getting started

Prerequisites

  • Node.js 20+ and npm.

Install

npm install

Run the dev server

npm run dev

Open http://localhost:5173/ in your browser.

Production build

npm run build
npm run preview

npm run build type-checks (tsc -b) and emits the static site to dist/, which can be served by any static host.

6. Pricing data

Source

GET https://api.litellm.ai/model_catalog/{model_id} returns per-token costs (input_cost_per_token, output_cost_per_token). The app multiplies them by 1,000,000 to display $/1M tokens, and reads max_input_tokens for the context window. Model metadata refreshes from LiteLLM's catalog on every load (deduplicated, then cached 24h).

The API free tier allows 100 requests/day per IP without a key; a fresh load of the full 15-model catalog uses 15 requests.

Known limitation: CORS

api.litellm.ai does not send an Access-Control-Allow-Origin header (verified with and without an Origin header; OPTIONS returns 405), so browsers may block the live response. In that case the app renders the bundled snapshot and labels it as cached. Serving the app behind your own backend or proxy that forwards to api.litellm.ai restores live data without changing any component.

Bundled snapshot (verified 2026-09-22, $/1M)

ModelProviderInputOutputContext
gpt-4o-miniOpenAI$0.15$0.60128k
deepseek-chatDeepSeek$0.28$0.42131k
deepseek-v4-flashDeepSeek$0.30$1.201M
deepinfra/nvidia/Llama-3.1-Nemotron-70B-InstructNVIDIA$0.60$0.60131k
gemini-2.5-flash-liteGoogle$0.10$0.401M
gpt-5.6-lunaOpenAI$0.20$1.20922k
zai/glm-5.3z.ai$1.40$4.401M
qwencloud/qwen-maxQwen$1.60$6.4031k
xai/grok-4.5xAI$2.00$6.00500k
gpt-4oOpenAI$2.50$10.00128k
claude-sonnet-4-6Anthropic$3.00$15.001M
moonshot/kimi-k3Kimi$3.00$15.001M
claude-fable-5-1Anthropic$10.00$50.001M
gpt-6-astraOpenAI$10.00$50.00922k
claude-opus-4-1Anthropic$15.00$75.00200k

Median speeds shown on the cards are indicative static values; prices and context windows are the live fields.

Automated updates

There is no database: data/pricing.json is the current dataset and git log -- data/pricing.json is the price history. Every 6 hours the pricing-update workflow runs the collector (npm run collect:pricing), validates the result and opens a pull request titled chore: update AI model pricing when prices moved — main is never written to directly. Jumps of 3x or more are kept in the PR but marked [possible-anomaly] for human review. Source links are re-checked weekly by the link-check workflow, which opens an issue if a source breaks.

7. Available scripts

CommandDescription
npm run devStart the Vite dev server
npm run buildType-check and build for production
npm run previewPreview the production build locally
npm run lintRun ESLint over the project
npm testRun unit tests (vitest)
npm run collect:pricingRefresh data/pricing.json from live sources
npm run validate:pricingValidate data/*.json
npm run check:linksCheck pricing source URLs

8. Automation

WorkflowTriggerWhat it does
ci.ymlPRs, pushes to mainInstall, lint, tests, build, data validation
pricing-update.ymlEvery 6h, manual dispatchCollector run, validation, pricing PR (never direct to main)
link-check.ymlWeekly, manual dispatchVerifies source URLs, opens an issue on breakage
security.ymlPRs, pushes to main, weeklyCodeQL analysis (JavaScript/TypeScript)

Dependabot updates npm and GitHub Actions dependencies weekly (.github/dependabot.yml, no auto-merge). No secrets are required: the pricing API needs no key and automation uses the built-in GITHUB_TOKEN with least-privilege permissions.

9. Contributing

See CONTRIBUTING.md, including how to add a new pricing provider (collector, parser, tests, official source, validation, pull request).

10. License

This project is licensed under the GNU General Public License v3.0 or later (GPLv3+). See LICENSE for the full text.

You are free to run, study, share and modify this software, provided that any distributed work remains under the same license and its source code stays available.

ai
ai-agents
react
typescript
web
webapp
web-development
website

Contributors

notcr12dev

15 commits

Languages

TypeScript

93.6%

CSS

4.2%

HTML

1.3%