AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Claude, ChatGPT, Gemini, Cursor, Codex 등 45개 AI 서비스 상태를 한눈에. 장애 발생 시 즉시 확인.
Translation pending
Developer toolsTypeScript · JavaScriptGitHub @bentleyparkOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Real-time monitoring dashboard for 45 AI services — uptime, latency, incidents, AIWatch Score reliability ranking.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Real-time monitoring dashboard for 45 AI services — track status, latency, uptime, and incidents across major AI providers. Visit ai-watch.dev — no signup required. Updated every 5 minutes via Cloudflare Workers. • Real-time status — Operational / Degraded / Down for 45 AI services • PWA support — Add to home screen, offline cache with Service Worker • Latency monitoring — Direct endpoint response time (RTT) for 33 probe-capable services, status page timing as fallback • 24h latency trend — Chart.j [README 설치·사용 부분 발췌] Getting StartedRead the full README ↗
English | 한국어
Real-time monitoring dashboard for 49 AI services — track status, latency, uptime, and incidents across major AI providers.
| Desktop | Mobile |
|---|---|
Visit ai-watch.dev — no signup required. Updated every 5 minutes via Cloudflare Workers.
/feed RSS app (zero-config) + RSS feeds#claude, #latency) for direct page accessGrouped by the dashboard's category taxonomy (49 total — sidebar filters / Overview sections mirror these).
| Service | Provider | Status Source |
|---|---|---|
| Claude API | Anthropic | Atlassian Statuspage |
| OpenAI API | OpenAI | incident.io (Atlassian compat) |
| Gemini API | Google Cloud incidents.json | |
| Mistral API | Mistral AI | Rootly (browser-rendered) |
| Cohere API | Cohere | incident.io (Atlassian compat) |
| GroqCloud | Groq | incident.io (Atlassian compat) |
| Together AI | Together | Better Stack RSS + uptime API |
| Fireworks AI | Fireworks | incident.io (Atlassian compat) |
| Cerebras Inference | Cerebras | Atlassian Statuspage |
| Perplexity | Perplexity AI | incident.io (Atlassian compat) |
| SpaceXSI API | SpaceXSI | RSS feed |
| DeepSeek API | DeepSeek | Flashduty (browser-rendered feed) |
| Kimi API | Moonshot AI | Atlassian Statuspage (Chinese titles → English) |
| OpenRouter | OpenRouter | Datadog Status Page (config.json) |
| Amazon Bedrock | AWS | AWS Health Dashboard |
| Azure OpenAI | Microsoft | Azure Status RSS |
| Service | Provider |
|---|---|
| Claude Code | Anthropic |
| Codex | OpenAI |
| Cursor | Anysphere |
| GitHub Copilot | GitHub |
| Windsurf (Devin Desktop) | Cognition |
| Junie | JetBrains |
| Service | Provider | Status Source |
|---|---|---|
| ElevenLabs | ElevenLabs | incident.io (Atlassian compat) |
| AssemblyAI | AssemblyAI | Atlassian Statuspage |
| Deepgram | Deepgram | Atlassian Statuspage |
| Fish Audio | Fish Audio | Better Stack RSS + uptime API |
| Service | Provider | Status Source |
|---|---|---|
| Hugging Face | HuggingFace | Better Stack RSS + uptime API |
| Replicate | Replicate | incident.io (Atlassian compat) |
| fal.ai | fal | Instatus (Next.js) |
| Pinecone | Pinecone | Atlassian Statuspage |
| turbopuffer | turbopuffer | incident.io (Atlassian compat) |
| Voyage AI | Voyage AI | Atlassian Statuspage |
| Jina AI | Jina AI | Atlassian Statuspage |
| Modal | Modal | Better Stack RSS + uptime API |
| Twelve Labs | Twelve Labs | Atlassian Statuspage |
| Service | Provider | Status Source |
|---|---|---|
| LangChain (LangSmith) | LangChain | incident.io (global page) |
| Helicone | Helicone | Better Stack RSS + uptime API |
| Langfuse | Langfuse | incident.io (Atlassian compat) |
| Service | Provider | Status Source |
|---|---|---|
| Runway | Runway | Atlassian Statuspage |
| Luma (Dream Machine) | Luma | Better Stack RSS + uptime API |
| Service | Provider | Status Source |
|---|---|---|
| Stability AI | Stability AI | incident.io (Atlassian compat) |
| Black Forest Labs (FLUX) | Black Forest Labs | Atlassian Statuspage |
| Service | Provider |
|---|---|
| claude.ai | Anthropic |
| ChatGPT | OpenAI |
| Character.AI | Character AI |
| DeepSeek App | DeepSeek |
| Grok | SpaceXSI |
| Kimi App | Moonshot AI |
| Grok Bot | SpaceXSI |
| Layer | Technology |
|---|---|
| Frontend | React 19, Vite 6, TailwindCSS v4, Chart.js |
| Backend | Cloudflare Workers (TypeScript) |
| Cache | Cloudflare KV (status cache, latency snapshots) |
| Hosting | Vercel |
| Alerts | Discord Webhook (Worker proxy) · Slack via native /feed RSS · RSS feeds |
| Analytics | Google Analytics 4 (Consent Mode v2) |
| Tests | Playwright (E2E), Vitest (unit) |
Browser (React SPA, 60s polling)
↓
Cloudflare Worker
├── GET /api/status → parallel fetch (49 services) → normalize
├── GET /api/uptime → daily uptime history
└── POST /api/alert → Discord webhook proxy (SSRF protected)
↓
Parsers (worker/src/parsers/)
├── impact-weights.ts → shared MAJOR_WEIGHT/MINOR_WEIGHT (Atlassian severity formula)
├── uptime-interval.ts → shared trailing-window downtime accumulator for the interval-based parsers (#1006)
├── statuspage.ts → Atlassian Statuspage API + uptimeData HTML (uptime computed per-day)
├── incident-io.ts → incident.io compat API + component_impacts intervals (uptime computed, same weighted formula)
├── gcloud.ts → Google Cloud incidents.json (Vertex Gemini)
├── aistudio.ts → Google AI Studio + direct Gemini API (secondary source, merged with gcloud — #310)
├── instatus.ts → Instatus Nuxt/Next.js SSR
├── betterstack.ts → Better Stack RSS + /index.json uptime API + dailyImpact (status_history)
├── datadog.ts → Datadog Status Page `config.json` (OpenRouter — #1403)
├── flashduty.ts → Flashduty feed (DeepSeek + DeepSeek App — browser-rendered via a scheduled Action, #618)
└── aws.ts → AWS Health events JSON API (Bedrock) + RSS (Azure OpenAI)
↓
Cloudflare KV
├── services:latest (status cache, TTL 5min)
├── daily:YYYY-MM-DD (uptime counters, TTL 2d)
├── history:YYYY-MM-DD (archived counters, TTL 90d)
├── probe:24h (health check probes, max 2016, TTL 7d, 36 probe targets)
├── ai:analysis:{svcId}:{incId} (AI per-incident analysis, TTL 1h, refreshed while active)
├── ai:reanalysis-skip:* (re-analysis failure cooldown, TTL scaled by failure type — #955)
├── ai:usage:{date} (daily AI usage counter, TTL 30d)
├── alerted:* (alert dedup keys, TTL 2h-7d)
├── detected:{svcId} (earliest detection timestamp, TTL 7d)
├── probe-degradation:daily:{svcId}:{date} (RTT degradation counter, TTL 48h, #464)
├── reddit:seen:{postId} (Reddit post dedup, TTL 24h)
└── vitals:{YYYY-MM-DD} (Web Vitals daily aggregation, TTL 3d)
.nvmrc)git clone https://github.com/bentleypark/aiwatch.git
cd aiwatch
npm install
npm run dev # localhost:5173
cd worker && npm install && cd ..
# Create .dev.vars for local dev:
echo "ALLOWED_ORIGIN=*" > worker/.dev.vars
# Run from the repo root — starts the worker on localhost:8788,
# which matches the dashboard's default / VITE_API_URL below.
npm run dev:worker # localhost:8788
Frontend (.env)
VITE_API_URL=http://localhost:8788/api/status
VITE_GA4_ID= # Optional: Google Analytics measurement ID
Worker (wrangler.toml + secrets)
ALLOWED_ORIGIN=https://your-domain.com
DISCORD_WEBHOOK_URL= # Worker Secret: Discord webhook for alerts
ANTHROPIC_API_KEY= # Worker Secret: Claude Sonnet API key (AI Analysis fallback)
# Frontend
npm run dev # Dev server (localhost:5173)
npm run dev:worker # Worker dev server (localhost:8788)
npm run dev:all # Both simultaneously
npm run build # Production build → dist/
npm run lint # ESLint
npm test # Playwright E2E tests
npm run test:src # Frontend unit tests (vitest — incl. CSP hash pin)
npm run test:worker # Worker unit tests (vitest)
# Worker deployment
npm run deploy:worker # Deploy to Cloudflare (use npm script only)
| Endpoint | Method | Description |
|---|---|---|
/api/status | GET | All service statuses + incidents + uptime + aiAnalysis |
/api/status/cached | GET | KV-only cached status (for Edge SSR, fast ~1.2s) |
/api/uptime?days=30 | GET | Daily uptime history (1-90 days) |
/api/report?month=YYYY-MM | GET | Monthly reliability archive (uptime, score, incidents, latency) |
/api/alert | POST | Discord webhook proxy (SSRF protected) |
/badge/:serviceId | GET | SVG status badge (shields.io style) |
/feed.xml | GET | Incident RSS 2.0 — all services (Slack /feed compatible) |
/feed/:slug | GET | Incident RSS 2.0 — single service (slug or service ID) |
/api/og | GET | Dynamic OG image PNG (1200×630, resvg-wasm) |
/api/v1/status | GET | Public API — all services (lightweight, CORS *) |
/api/v1/status/:id | GET | Public API — single service + top 5 incidents |
Open API for external developers. No authentication required. Rate limited to 60 req/min.
All services:
curl https://aiwatch-worker.p2c2kbf.workers.dev/api/v1/status
Single service:
curl https://aiwatch-worker.p2c2kbf.workers.dev/api/v1/status/claude
Response includes: id, name, provider, category, group (fine taxonomy — llm / voice / inference / …), status, latency (the service's latest direct-probe RTT in ms; null when it is not probed — never status-page timing, #1633), uptime30d, uptimeSource, lastChecked, and up to 5 recent incidents (single service only).
Embed real-time status badges in your README, docs, or blog.
[](https://ai-watch.dev/is-claude-down)
| Parameter | Description | Example |
|---|---|---|
uptime | Show uptime % | /badge/claude?uptime=true |
style | flat or flat-square | /badge/claude?style=flat-square |
label | Custom label | /badge/claude?label=My+API |
Every monitored service — the same ids /api/v1/status returns.
| ID | Service | ID | Service |
|---|---|---|---|
claude | Claude API | elevenlabs | ElevenLabs |
openai | OpenAI API | assemblyai | AssemblyAI |
gemini | Gemini API | deepgram | Deepgram |
bedrock | Amazon Bedrock | huggingface | Hugging Face |
azureopenai | Azure OpenAI | replicate | Replicate |
mistral | Mistral API | fal | fal.ai |
cohere | Cohere API | modal | Modal |
groq | GroqCloud | voyageai | Voyage AI |
together | Together AI | pinecone | Pinecone |
fireworks | Fireworks AI | turbopuffer | turbopuffer |
cerebras | Cerebras Inference | twelvelabs | Twelve Labs |
perplexity | Perplexity | langsmith | LangChain (LangSmith) |
xai | SpaceXSI API | helicone | Helicone |
deepseek | DeepSeek API | langfuse | Langfuse |
kimi | Kimi API | runway | Runway |
openrouter | OpenRouter | luma | Luma (Dream Machine) |
claudecode | Claude Code | stability | Stability AI |
Surface AI service outages — Claude API, OpenAI, Gemini, GitHub Copilot, and 45 more — directly in your Claude Code statusline. The recommended preset keeps an always-on, clickable AIWatch label (AIWatch 🟢 while all healthy, AIWatch 🔴 Claude API when something breaks — cmd/ctrl+click opens the dashboard). Prefer zero footprint when healthy? A minimalist preset that stays empty until something degrades is on the presets page.
Quickest install — add to ~/.claude/settings.json:
{
"statusLine": {
"type": "command",
"command": "( curl -sf --max-time 2 https://aiwatch-worker.p2c2kbf.workers.dev/api/statusline/branded ) 2>/dev/null || true"
}
}
Requires an OSC 8-compatible terminal (iTerm2, Warp, kitty, WezTerm, VS Code terminal, Terminal.app on macOS 12+) for the clickable label; others show it as plain text. Targets the Worker domain directly so per-prompt polls don't count as Vercel bandwidth.
Other presets — minimalist (empty when healthy), compact badge, full list, scoped to specific providers, and clickable per-service links: ai-watch.dev/#statusline
Properties: single GET per render, 5-min KV-cached on Cloudflare's edge, 2-second timeout, no jq dependency, no Anthropic API requests, no client identifier. On a network error the line stays empty; when AIWatch cannot read its own status snapshot it renders AIWatch ⚪ (unknown) rather than a green it cannot support. Compatible with any statusline tool that supports shell-command output (including ccstatusline's Custom Command widget).
Beyond the status bar, the AIWatch Claude Code plugin surfaces AI outages inside Claude Code with two pieces:
🔴 Claude API is down) or recovers (✅ Claude API has recovered), naming each service. Diffs each poll (default every 60s), so it only speaks up on a real transition — never spams./aiwatch command — briefs which AI services are degraded/down right now, each with its active incident (title + impact), an AI summary, and a fallback suggestion.Reads no code and collects no data — it only polls AIWatch's public status feed. Install it from AIWatch's own marketplace:
/plugin marketplace add bentleypark/aiwatch
/plugin install aiwatch@aiwatch-dev
Source + docs: plugin/aiwatch/. Full details: ai-watch.dev/plugin.
src/ # React 19 SPA (Vite, no router — hash routing in App.jsx)
components/ # Shared UI: StatusPill, SkeletonUI, EmptyState, Modal, Sidebar, Topbar, CookieBanner, AnalysisModal, …
pages/ # Overview, Latency, Incidents, Uptime, ServiceDetails, Settings, Ranking, Statusline
hooks/ # usePolling, useTheme, useLang, useSettings, useGitHubStars, useMonthlyArchives
utils/ # analytics, calendar, time, pageContext, constants, hashRoute, …
locales/ # ko.js, en.js (flat key→string maps)
api/ # Helpers live in `_`-prefixed dirs and handlers run on the edge runtime,
# so neither counts against the Hobby 12-Serverless-Function cap (#862/#867)
intro.ts # Landing page (/intro) _intro/ # its SSR template
is-down.ts # "Is X Down?" SSR pages (47 services) _is-down/ # slug-map, seo-content, template
methodology.ts # "How AIWatch Works" (/methodology) _methodology/
plugin.ts # Claude Code plugin landing _plugin/
badges.ts # Status-badge gallery (/badges) _badges/
reports.ts # /reports/* proxy → Jekyll site _shared/ # shared Edge helpers
confirm.ts csp-report.ts plugin-privacy.ts extension-privacy.ts
public/
manifest.json # PWA manifest (the Service Worker is built from src/sw/ → /sw.js)
icon-192.png # PWA icon 192x192
icon-512.png # PWA icon 512x512
scripts/ # Build/CI/ops scripts (OG generation, CI lint gates, verify-reminders, …)
worker/
src/
index.ts # Worker entry: CORS, routing, /api/*, /badge, /feed, cron scheduled handler
services.ts # Service configs + fetch orchestrator + status determination
types.ts utils.ts # Shared types + shared utilities
score.ts # AIWatch Score calculation
alerts.ts # Alert detection (incident + status-edge), holds, merges
ai-analysis.ts # Hybrid AI incident analysis (Gemma 4 primary + Sonnet fallback)
anthropic.ts # Anthropic Messages REST call (model id, retry, status classification)
probe.ts # Health check probing — direct RTT measurement (`PROBE_TARGETS`)
rss.ts badge.ts og.ts og-render.ts # Feeds, badges, OG images
daily-summary.ts weekly-briefing.ts monthly-archive.ts monthly-narrative.ts
security-monitor.ts # AI service security monitoring (HN Algolia, OSV.dev SDK vulnerabilities — 24 tracked packages)
changelog.ts reddit.ts platform-monitor.ts
suppression.ts overrides.ts withdrawn.ts upstream-link.ts # Operator + incident layers
parsers/ # Platform-specific parsers
statuspage.ts # Atlassian Statuspage
incident-io.ts # incident.io (Atlassian-compatible API)
gcloud.ts # Google Cloud Vertex (gemini primary source)
aistudio.ts # Google AI Studio + direct Gemini API (gemini secondary, #310)
instatus.ts # Instatus
betterstack.ts # Better Stack
datadog.ts # Datadog Status Page (OpenRouter)
flashduty.ts # Flashduty (DeepSeek + DeepSeek App)
aws.ts # AWS Health events JSON API — Bedrock (+ RSS parser reused for Azure OpenAI)
impact-weights.ts uptime-interval.ts # Shared uptime primitives (#1006)
__tests__/ parsers/__tests__/ # Vitest unit tests
This is a map, not an inventory —
worker/src/has ~50 modules. The per-module purpose and the issues that shaped each one live in docs/reference/directory-map.md.
See CONTRIBUTING.md for detailed guidelines.
All coding agents should start with AGENTS.md and the agent-neutral development workflow. Claude Code contributors should additionally read CLAUDE.md for Claude-specific automation rules.
git checkout -b feature/my-feature)npm run build && npm test && npm run test:src && npm run test:workernpm test + npm run test:src + npm run test:worker) — CI-gated, with E2E running on frontend changescloses #N in commit messagesFound a vulnerability? Please report it responsibly — see SECURITY.md for details.
AGPL-3.0 covers the code. The AIWatch name and logo are not licensed with it; see the Trademark Policy. The official site is ai-watch.dev.
/intro) with dashboard preview mock, KO/EN i18n, flow animation, optional ?banner= campaign slot, and GA4 tracking?src=ext-claude API only — reads no page content (zero data collection) — install from the Chrome Web Store or Firefox Add-ons/aiwatch command that briefs the current incident (title, impact, AI summary, fallback). Reads no code, collects no data. /plugin marketplace add bentleypark/aiwatch — detailscodex |
| Codex |
bfl |
| Black Forest Labs (FLUX) |
cursor | Cursor | claudeai | claude.ai |
copilot | GitHub Copilot | chatgpt | ChatGPT |
windsurf | Windsurf (Devin Desktop) | characterai | Character.AI |
junie | Junie | deepseekapp | DeepSeek App |
grok | Grok | fishaudio | Fish Audio |
jina | Jina AI | kimiapp | Kimi App |
grokbot | Grok Bot |