
A fast, single-page dashboard for monitoring AI service credits, cloud billing, and account balances across OpenRouter, OpenAI, Anthropic, xAI, Mistral, Groq, Manus, Plaud, CivitAI, Railway, Neon, RunPod, mem0, AWS, GCP, Vercel, and more.
Live Demo · Quick Start · Providers · Add Your Own
- Single dashboard — all your AI and cloud provider balances at a glance
- Auto-refresh — balances update every 60 seconds in the browser, with background polling every 5–30 minutes
- Live refresh — force an immediate refresh of any provider or all at once
- In-app settings — configure credentials directly from the dashboard UI
- Password auth — optional single-user password gate to protect settings and/or the full dashboard
- Railway-ready — two-service deploy (frontend + backend) with
uvand Railpack - Docker support — multi-stage Dockerfile included
| Provider | Category | Auth Required | What It Shows |
|---|---|---|---|
| OpenRouter | AI | API Key | Prepaid credit balance |
| OpenAI | AI | API Key + Admin Key (optional) | Key validity; 30-day spend with Admin key |
| Anthropic | AI | Session Cookie + Org ID | Prepaid credit balance |
| xAI (Grok) | AI | Management Key + Team ID | Prepaid credit balance |
| Mistral AI | AI | Session Cookie | Best-effort balance |
| Groq | AI | Session Cookie | Best-effort balance |
| Manus | AI | JWT Bearer Token | Monthly credits, daily refresh, add-on balance |
| Gemini | AI | API Key | Key validity only (no balance endpoint) |
| Plaud | AI/Tools | JWT Bearer Token | |
| CivitAI | AI | Session Cookie | |
| Railway | Cloud | Account API Token | Credit balance + current billing period spend |
| Vercel | Cloud | Personal Access Token | Account details |
| Neon DB | Cloud | API Key | Monthly compute consumption |
| RunPod | Cloud | API Key | Credit balance |
| Firecrawl | Cloud | API Key | |
| mem0 | Tools | API Key | |
| AWS | Cloud | IAM Key + Secret | Month-to-date spend via Cost Explorer |
| GCP | Cloud | Service Account JSON | Month-to-date billing spend |
Prerequisites: Python 3.11+, Node.js 22+, pnpm, uv
# Clone the repo
git clone https://github.com/CaptainASIC/reckoner
cd reckoner
# Backendcd backend
uv sync
cp ../.env.example ../.env
# Edit .env with your credentials
uv run uvicorn main:app --reload --port 8000
# Frontend (separate terminal)cd frontend
pnpm install
VITE_API_URL=http://localhost:8000 pnpm devOpen http://localhost:5173 for the dashboard.
- Fork or push this repo to GitHub
- Create a new Railway project → Deploy from GitHub repo
- Add two services, both pointing to the same repo:
- Backend — root directory:
/backend - Frontend — root directory:
/frontend
- Backend — root directory:
- Add environment variables in each service's Variables tab (see
.env.example) - Set
VITE_API_URLin the frontend service to the backend's public URL - Done — Railway provides public URLs for both services
docker build -t reckoner .
docker run -p 8000:8000 --env-file .env reckonerCopy .env.example to .env and fill in your credentials. All variables are optional — only configure the services you use.
Reckoner supports optional single-user password authentication to prevent unauthorized access:
| Variable | Default | Description |
|---|---|---|
RECKONER_PASSWORD | (empty — auth disabled) | Set a password to enable auth. All settings endpoints require login. |
RECKONER_PROTECT_DASHBOARD | true | When true, viewing balances also requires login. Set to false to keep the dashboard public while still protecting settings. |
When RECKONER_PASSWORD is not set, auth is completely disabled and the dashboard behaves as before.
Tokens are issued as JWTs with a 30-day expiry and are invalidated on backend redeploy.
Click the ⚙️ icon on any provider card to configure credentials directly in the dashboard. Settings are persisted in the local SQLite database.
- Go to openrouter.ai/settings/keys
- Create an API key
- Set
OPENROUTER_API_KEY
- Go to platform.openai.com/api-keys for a standard key
- Optionally, go to platform.openai.com/settings/organization/admin-keys for an Admin key
- Set
OPENAI_API_KEYand optionallyOPENAI_ADMIN_KEY
- Log in to platform.claude.com
- Open DevTools (F12) → Network tab
- Find a request to
/api/organizations/<org-id>/prepaid/credits - Copy the
org_idfrom the URL and thesessionKeyfrom the Cookie header - Set
ANTHROPIC_ORG_IDandANTHROPIC_SESSION_COOKIE
- Log in to console.x.ai
- Go to Settings → Management Keys → Create a key
- Find your Team ID in the console URL or account settings
- Set
XAI_MANAGEMENT_KEYandXAI_TEAM_ID
- Log in to manus.im
- Open DevTools (F12) → Network tab → filter by
api.manus.im - Click any request → Headers → copy the value after
Bearerin the Authorization header - Set
MANUS_API_KEY— token is valid for ~90 days
- Log in to web.plaud.ai
- Open DevTools (F12) → Network tab → filter by
api.plaud.ai - Click any request → Headers → copy the value after
Bearerin the Authorization header - Set
PLAUD_API_KEY— token is valid for ~5 months
- Log in to civitai.com
- Open DevTools (F12) → Application → Cookies
- Copy the full Cookie header string (at minimum the
__Secure-civitai-tokencookie) - Set
CIVITAI_SESSION_COOKIE
- Go to [railway.app/account/tokens]
- Create a new token — select "No workspace" to create an Account token
- Set
RAILWAY_CREDIT_TOKEN(notRAILWAY_API_KEY— Railway injects that automatically)
- Go to console.neon.tech/app/settings/api-keys
- Create an API key
- Set
NEON_API_KEY
Note: Consumption API requires Launch plan or above.
- Go to runpod.io/console/user/settings → API Keys
- Create an API key
- Set
RUNPOD_API_KEY
- Go to firecrawl.dev/app/api-keys
- Create an API key
- Set
FIRECRAWL_API_KEY
- Go to app.mem0.ai/dashboard/api-keys
- Create an API key (
m0-...) - Set
MEM0_API_KEY
- Create an IAM user with
ce:GetCostAndUsagepermission - Generate access keys
- Set
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY, andAWS_DEFAULT_REGION
- Create a service account with
roles/billing.viewer - Download the JSON key file
- Set
GCP_SERVICE_ACCOUNT_JSON(full JSON contents) andGCP_BILLING_ACCOUNT_ID
reckoner/
├── backend/ # FastAPI application
│ ├── main.py # App entry point
│ ├── auth.py # Password auth + JWT tokens
│ ├── scheduler.py # Background balance refresh
│ ├── config_manager.py # Settings persistence
│ ├── models/
│ │ ├── database.py # SQLite schema + connection
│ │ └── schemas.py # Pydantic v2 models
│ ├── routers/
│ │ ├── auth.py # Login + auth status endpoints
│ │ ├── credits.py # Dashboard + refresh endpoints
│ │ ├── health.py # Health check
│ │ └── settings.py # Provider credential management
│ └── providers/ # One file per service
│ ├── base.py # Abstract base class
│ ├── openrouter.py
│ ├── openai.py
│ ├── anthropic.py
│ ├── xai.py
│ ├── mistral.py
│ ├── groq.py
│ ├── manus.py
│ ├── plaud.py
│ ├── gemini.py
│ ├── civitai.py
│ ├── railway.py
│ ├── vercel.py
│ ├── neon.py
│ ├── runpod.py
│ ├── firecrawl.py
│ ├── mem0.py
│ ├── aws.py
│ └── gcp.py
├── frontend/ # React + TypeScript + Tailwind
│ └── src/
│ ├── App.tsx
│ ├── components/
│ │ ├── ProviderCard.tsx
│ │ ├── SettingsModal.tsx
│ │ └── SummaryBar.tsx
│ ├── hooks/
│ │ ├── useAuth.ts
│ │ ├── useDashboard.ts
│ │ └── useSettings.ts
│ ├── pages/
│ │ ├── LoginPage.tsx
│ │ └── SettingsPage.tsx
│ ├── types/index.ts
│ └── utils/
│ ├── api.ts
│ └── format.ts
├── .env.example # Environment variable template
└── README.md
| Endpoint | Method | Description | Auth |
||----------|--------|-------------|------|
| GET /api/health | GET | Health check | Public |
| GET /api/auth/status | GET | Auth status (enabled, dashboard protected, authenticated) | Public |
| POST /api/auth/login | POST | Login with password, returns JWT | Public |
| GET /api/credits/ | GET | Full dashboard (cached) | Protected* |
| POST /api/credits/refresh | POST | Refresh all providers | Protected* |
| POST /api/credits/refresh/{id} | POST | Refresh single provider | Protected* |
| GET /api/credits/providers | GET | List providers with metadata | Protected* |
| GET /api/settings/providers | GET | Get settings (masked) | Auth required |
| PUT /api/settings/providers/{id} | PUT | Update provider credentials | Auth required |
* Protected when RECKONER_PROTECT_DASHBOARD=true (default). Public when set to false.
Interactive docs available at /docs (FastAPI Swagger UI).
- Create
backend/providers/yourprovider.pyextendingBaseProvider - Implement
fetch_balance()andis_configured() - Register in
backend/providers/__init__.py - That's it — the dashboard picks it up automatically
This project is licensed under the GNU General Public License v3.0.
