"Wait... which account did I use yesterday? Was it Gmail 2 or Gmail 3? And is Claude already exhausted?"
Sound familiar? If you're juggling multiple AI tools across multiple accounts, be it Claude, Gemini, GPT, etc., you already know the pain.
You open your browser, try a prompt, get a quota error. Switch accounts. Try again. Another error. You have no idea which account is fresh, which one is burned out, or when anything resets.
QuotaWatch fixes that.
It's a dead-simple, self-hosted dashboard that visualizes all your AI quotas across every tool and every account, all in one place, backed by a Google Sheet you already own. No subscriptions. No third-party services. Just clarity.
- 🟢 Shows every model on every account as Available or Exhausted
- ⏱️ Counts down exactly how long until each quota resets
- ⭐ Automatically highlights the best account to use for each platform
- 📊 Uses Google Sheets as the database — no server, no SQL, just a spreadsheet
- 🐳 Runs in a single Docker container — self-hosted, private, yours
- Docker installed on your machine
- A Google account
You need three things from Google Cloud Console:
| Credential | How to get it |
|---|---|
| API Key | APIs & Services → Credentials → Create API Key |
| OAuth Client ID | APIs & Services → Credentials → Create OAuth Client → Web App |
| Sheet ID | Create a Google Sheet; copy the ID from the URL: spreadsheets/d/SHEET_ID/edit |
⚠️ Addhttp://localhost(or your domain) to Authorized JavaScript origins in your OAuth Client settings.
cp .env.example .envEdit .env with your credentials:
SHEET_ID=your_google_sheet_id
OAUTH_CLIENT_ID=your_oauth_client_id.apps.googleusercontent.com
API_KEY=your_google_api_keyCopy the example compose file:
cp docker-compose.example.yml docker-compose.ymlOr create a docker-compose.yml manually:
services:
quota-tracker:
image: avianage/quotawatch:latest # or :v1.0, :v1.1, etc.
container_name: quota-tracker
restart: unless-stopped
environment:
- SHEET_ID=your_google_sheet_id
- OAUTH_CLIENT_ID=your_oauth_client_id.apps.googleusercontent.com
- API_KEY=your_google_api_key
ports:
- "8080:80" # Change 8080 to any port you preferThen start the container:
docker-compose up -dOpen http://localhost:8080 in your browser and click Connect Google.
No compose file? No problem:
docker run -d \
--name quota-tracker \
--restart unless-stopped \
-p 8080:80 \
-e SHEET_ID=your_sheet_id \
-e OAUTH_CLIENT_ID=your_client_id \
-e API_KEY=your_api_key \
avianage/quotawatch:latest| Tag | Description |
|---|---|
latest |
Most recent stable build |
v1.0 |
Initial release |
Your credentials are never baked into the image. They are injected at container startup via environment variables. The image you pull from Docker Hub contains no API keys — every user runs it with their own credentials.
QuotaWatch/
├── html/
│ ├── index.html # The dashboard app
│ ├── config.js # Auto-generated at runtime (do NOT commit)
│ └── config.example.js # Template for local development
├── Dockerfile # Container definition
├── entrypoint.sh # Injects env vars into config.js on startup
├── docker-compose.example.yml # Ready-to-use compose template
├── .env.example # Credential template
└── .gitignore / .dockerignore
See DOCKER.md for instructions on rebuilding and pushing updates to your registry.
Licensed under the MIT License