SPB Git

perf: boost no longer bumps the config version (probes re-downloaded 22k targets every cycle), cached /config payload, direct JSON responses for heavy endpoints

Simon-Pierre Boucher committed (Sep 13, 2026) parent 8162818 Browse files

8 changed files +5,720 −32

modified apps/api/src/internetpressure/api/admin.py +6 −3
@@ -109,11 +109,14 @@ class TargetIn(BaseModel):
109 enabled: bool = True 109 enabled: bool = True
110 110
111 111
112−@router.get("/targets") 112+@router.get("/targets", response_model=None)
113−async def admin_targets(_: str = Depends(require_admin)) -> dict[str, Any]: 113+async def admin_targets(_: str = Depends(require_admin)): # type: ignore[no-untyped-def]
114+ from fastapi.responses import Response
115+
114 from ..registry import list_targets 116 from ..registry import list_targets
117+ from ..util import dumps
115 118
116− return {"targets": await list_targets()} 119+ return Response(dumps({"targets": await list_targets()}), media_type="application/json")
117 120
118 121
119 @router.post("/targets", status_code=201) 122 @router.post("/targets", status_code=201)
modified apps/api/src/internetpressure/api/public.py +10 −5
@@ -320,8 +320,8 @@ async def _observed(target_ids: list[str], hours: int) -> dict[str, Any]:
320 return r or {} 320 return r or {}
321 321
322 322
323−@router.get("/services") 323+@router.get("/services", response_model=None)
324−async def services() -> dict[str, Any]: 324+async def services() -> Response:
325 live = await _live("services") or [] 325 live = await _live("services") or []
326 targets = await list_targets(enabled_only=True) 326 targets = await list_targets(enabled_only=True)
327 out = [] 327 out = []
@@ -331,7 +331,9 @@ async def services() -> dict[str, Any]:
331 out.append({**{k: s.get(k) for k in ("slug", "name", "category", "pressure", "level", "level_label", "targets", "affected_regions", "importance")}, 331 out.append({**{k: s.get(k) for k in ("slug", "name", "category", "pressure", "level", "level_label", "targets", "affected_regions", "importance")},
332 "observed_availability_24h": r3(obs.get("availability")) if obs.get("n") else None, 332 "observed_availability_24h": r3(obs.get("availability")) if obs.get("n") else None,
333 "vendor_status": s.get("vendor_status")}) 333 "vendor_status": s.get("vendor_status")})
334− return {"ts": iso(utcnow()), "services": out} 334+ from ..util import dumps
335+
336+ return Response(dumps({"ts": iso(utcnow()), "services": out}), media_type="application/json")
335 337
336 338
337 @router.get("/service/{slug}") 339 @router.get("/service/{slug}")
@@ -430,7 +432,7 @@ async def _targets_summary(targets: list[dict[str, Any]]) -> list[dict[str, Any]
430 return out 432 return out
431 433
432 434
433−@router.get("/targets") 435+@router.get("/targets", response_model=None)
434 async def targets(category: str | None = None, q: str | None = None, country: str | None = None, tier: int | None = None, 436 async def targets(category: str | None = None, q: str | None = None, country: str | None = None, tier: int | None = None,
435 limit: int = Query(300, ge=1, le=3000), offset: int = Query(0, ge=0)) -> dict[str, Any]: 437 limit: int = Query(300, ge=1, le=3000), offset: int = Query(0, ge=0)) -> dict[str, Any]:
436 ts = await list_targets(enabled_only=True) 438 ts = await list_targets(enabled_only=True)
@@ -446,7 +448,10 @@ async def targets(category: str | None = None, q: str | None = None, country: st
446 total = len(ts) 448 total = len(ts)
447 cats = sorted({t["category"] for t in await list_targets(enabled_only=True)}) 449 cats = sorted({t["category"] for t in await list_targets(enabled_only=True)})
448 page = ts[offset: offset + limit] 450 page = ts[offset: offset + limit]
449− return {"total": total, "limit": limit, "offset": offset, "categories": cats, "targets": await _targets_summary(page)} 451+ from ..util import dumps
452+
453+ return Response(dumps({"total": total, "limit": limit, "offset": offset, "categories": cats, "targets": await _targets_summary(page)}),
454+ media_type="application/json")
450 455
451 456
452 @router.get("/target/{target_id}") 457 @router.get("/target/{target_id}")
modified apps/api/src/internetpressure/engine/loop.py +13 −13
@@ -301,27 +301,27 @@ class Engine:
301 return 0 301 return 0
302 302
303 async def _boost(self, ctx: Ctx, sigs) -> None: # type: ignore[no-untyped-def] 303 async def _boost(self, ctx: Ctx, sigs) -> None: # type: ignore[no-untyped-def]
304+ """Sampling boost for stressed targets (≥ 2 probes at stress ≥ 0.5). Sticky for `boost_seconds`, recomputed at
305+ most once a minute, delivered to probes inside every batch response — never through a config-version bump."""
306+ if time.time() - getattr(self, "_boost_at", 0.0) < 60:
307+ return
308+ self._boost_at = time.time()
304 sch = ctx.cfg.scheduler 309 sch = ctx.cfg.scheduler
305 stressed: dict[str, set[str]] = {} 310 stressed: dict[str, set[str]] = {}
306 for s in sigs: 311 for s in sigs:
307 if s.pair.stress >= 0.5 and s.tags.probe_id != "*": 312 if s.pair.stress >= 0.5 and s.tags.probe_id != "*":
308 stressed.setdefault(s.tags.target_id, set()).add(s.tags.probe_id) 313 stressed.setdefault(s.tags.target_id, set()).add(s.tags.probe_id)
309− boosted = sorted(t for t, ps in stressed.items() if len(ps) >= 2)[:40] 314+ new_ids = {t for t, ps in stressed.items() if len(ps) >= 2}
310 cur = await rds.get_json("ip:boost") or {} 315 cur = await rds.get_json("ip:boost") or {}
316+ until_cur = parse_ts(cur.get("until")) if cur else None
317+ keep = set(cur.get("targets") or []) if (until_cur and until_cur > utcnow()) else set()
318+ boosted = sorted(keep | new_ids)[:60]
311 if boosted: 319 if boosted:
312 until = utcnow() + __import__("datetime").timedelta(seconds=int(sch.get("boost_seconds", 900))) 320 until = utcnow() + __import__("datetime").timedelta(seconds=int(sch.get("boost_seconds", 900)))
313− new = {"targets": boosted, "factor": float(sch.get("boost_factor", 0.5)), "until": iso(until)} 321+ await rds.set_json("ip:boost", {"targets": boosted, "factor": float(sch.get("boost_factor", 0.5)), "until": iso(until)},
314− if set(cur.get("targets") or []) != set(boosted): 322+ ex=int(sch.get("boost_seconds", 900)) + 60)
315− await rds.set_json("ip:boost", new, ex=int(sch.get("boost_seconds", 900)) + 60) 323+ elif cur and until_cur and until_cur < utcnow():
316− await bump_config_version() 324+ await rds.r().delete("ip:boost")
317− else:
318− await rds.set_json("ip:boost", new, ex=int(sch.get("boost_seconds", 900)) + 60)
319− elif cur:
320− # let it expire naturally, but drop the list if it was set by us and nothing is stressed anymore
321− until = parse_ts(cur.get("until"))
322− if until and until < utcnow():
323− await rds.r().delete("ip:boost")
324− await bump_config_version()
325 325
326 async def _publish(self, now, health, gp, regions_out, countries_out, services_out, asns_out, fronts, incidents, 326 async def _publish(self, now, health, gp, regions_out, countries_out, services_out, asns_out, fronts, incidents,
327 routing: RoutingResult, g: ScopeScore, scopes, sigs, published_events, corr_active, allowed) -> None: # type: ignore[no-untyped-def] 327 routing: RoutingResult, g: ScopeScore, scopes, sigs, published_events, corr_active, allowed) -> None: # type: ignore[no-untyped-def]
modified apps/api/src/internetpressure/ingest/router.py +21 −7
@@ -101,11 +101,16 @@ async def _schedule() -> dict[str, Any]:
101 } 101 }
102 102
103 103
104−@router.get("/config") 104+_targets_cache: tuple[str, list[dict[str, Any]]] | None = None # (config_version, payload)
105−async def probe_config(request: Request) -> dict[str, Any]: 105+
106− p = await _authenticate(request, b"") 106+
107+async def _targets_payload(version: str) -> list[dict[str, Any]]:
108+ """The target list is identical for every probe and only changes with the config version: build it once."""
109+ global _targets_cache
110+ if _targets_cache and _targets_cache[0] == version:
111+ return _targets_cache[1]
107 targets = await list_targets(enabled_only=True) 112 targets = await list_targets(enabled_only=True)
108− out_targets = [ 113+ out = [
109 { 114 {
110 "target_id": t["target_id"], "name": t["name"], "hostname": t["hostname"], "url": t["url"], "ip": t["ip"], 115 "target_id": t["target_id"], "name": t["name"], "hostname": t["hostname"], "url": t["url"], "ip": t["ip"],
111 "port": t["port"], "category": t["category"], "provider": t["provider"], "service_id": t["service_id"], 116 "port": t["port"], "category": t["category"], "provider": t["provider"], "service_id": t["service_id"],
@@ -114,14 +119,23 @@ async def probe_config(request: Request) -> dict[str, Any]:
114 } 119 }
115 for t in targets 120 for t in targets
116 ] 121 ]
117− return { 122+ _targets_cache = (version, out)
123+ return out
124+
125+
126+@router.get("/config", response_model=None)
127+async def probe_config(request: Request) -> Response:
128+ p = await _authenticate(request, b"")
129+ version = await config_version()
130+ body = {
118 "server_time": iso(utcnow()), 131 "server_time": iso(utcnow()),
119− "config_version": await config_version(), 132+ "config_version": version,
120 "probe": {k: p[k] for k in ("probe_id", "name", "region", "country", "city", "provider", "asn", "lat", "lon", "enabled")}, 133 "probe": {k: p[k] for k in ("probe_id", "name", "region", "country", "city", "provider", "asn", "lat", "lon", "enabled")},
121 "schedule": await _schedule(), 134 "schedule": await _schedule(),
122 "resolvers": RESOLVERS, 135 "resolvers": RESOLVERS,
123− "targets": out_targets, 136+ "targets": await _targets_payload(version),
124 } 137 }
138+ return Response(dumps(body), media_type="application/json")
125 139
126 140
127 def _m_row(probe_id: str, m: Any) -> dict[str, Any] | None: 141 def _m_row(probe_id: str, m: Any) -> dict[str, Any] | None:
modified apps/api/src/internetpressure/registry.py +3 −4
@@ -201,11 +201,10 @@ async def save_config_override(value: dict[str, Any], actor: str = "admin") -> P
201 201
202 async def compute_config_version() -> str: 202 async def compute_config_version() -> str:
203 row = await pg.fetchrow("SELECT count(*) AS n, max(updated_at) AS m FROM targets") 203 row = await pg.fetchrow("SELECT count(*) AS n, max(updated_at) AS m FROM targets")
204− boost = await rds.get_json("ip:boost") or {}
205 cfgrow = await pg.fetchrow("SELECT updated_at FROM config WHERE key='pressure'") 204 cfgrow = await pg.fetchrow("SELECT updated_at FROM config WHERE key='pressure'")
206− h = hashlib.sha1( 205+ # NB: the sampling boost is deliberately NOT part of the version — probes receive it in every batch response,
207− f"{row['n']}|{row['m']}|{dumps_str(boost)}|{cfgrow['updated_at'] if cfgrow else ''}".encode() 206+ # a version bump would make all of them re-download the whole target list.
208− ).hexdigest()[:8] 207+ h = hashlib.sha1(f"{row['n']}|{row['m']}|{cfgrow['updated_at'] if cfgrow else ''}".encode()).hexdigest()[:8]
209 return f"{utcnow().strftime('%Y%m%dT%H%M%SZ')}-{h}" 208 return f"{utcnow().strftime('%Y%m%dT%H%M%SZ')}-{h}"
210 209
211 210
added data/seed/services-fragments/developer.yaml +333 −0
@@ -0,0 +1,333 @@
1+# Services fragment — developer platforms, SaaS, AI and security providers with a machine-readable public status page.
2+# Every connector verified 2026-09-13 with curl (Statuspage `/api/v2/summary.json` → page + status.indicator; status.io `/1.0/status/<id>`
3+# → result.status_overall). Providers on custom / Instatus / incident.io / Hund pages (PagerDuty, Notion, JetBrains, DocuSign, DeepSeek,
4+# OpenRouter, Auth0, Algolia, Adobe, Cisco, CrowdStrike, Bitwarden, Mailchimp, Intercom, Zendesk, Zoho, Calendly, Modal, Cursor, …) are omitted.
5+services:
6+ # ───────── ai (49)
7+ - { slug: wandb, name: "Weights & Biases", category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.wandb.com/api/v2/summary.json" } }
8+ - { slug: comet, name: Comet ML, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.comet.com/api/v2/summary.json" } }
9+ - { slug: pinecone, name: Pinecone, category: ai, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.pinecone.io/api/v2/summary.json" } }
10+ - { slug: zilliz, name: Zilliz, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.zilliz.com/api/v2/summary.json" } }
11+ - { slug: turbopuffer, name: turbopuffer, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.turbopuffer.com/api/v2/summary.json" } }
12+ - { slug: tavily, name: Tavily, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.tavily.com/api/v2/summary.json" } }
13+ - { slug: moonshot, name: Moonshot AI, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.moonshot.cn/api/v2/summary.json" } }
14+ - { slug: perplexity, name: Perplexity, category: ai, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.perplexity.com/api/v2/summary.json" } }
15+ - { slug: stability, name: Stability AI, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.stability.ai/api/v2/summary.json" } }
16+ - { slug: runway, name: Runway, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.runwayml.com/api/v2/summary.json" } }
17+ - { slug: heygen, name: HeyGen, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.heygen.com/api/v2/summary.json" } }
18+ - { slug: synthesia, name: Synthesia, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.synthesia.io/api/v2/summary.json" } }
19+ - { slug: d-id, name: D-ID, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.d-id.com/api/v2/summary.json" } }
20+ - { slug: descript, name: Descript, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.descript.com/api/v2/summary.json" } }
21+ - { slug: cartesia, name: Cartesia, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.cartesia.ai/api/v2/summary.json" } }
22+ - { slug: deepgram, name: Deepgram, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.deepgram.com/api/v2/summary.json" } }
23+ - { slug: assemblyai, name: AssemblyAI, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.assemblyai.com/api/v2/summary.json" } }
24+ - { slug: speechmatics, name: Speechmatics, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.speechmatics.com/api/v2/summary.json" } }
25+ - { slug: retell, name: Retell AI, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.retellai.com/api/v2/summary.json" } }
26+ - { slug: bland, name: Bland AI, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.bland.ai/api/v2/summary.json" } }
27+ - { slug: hume, name: Hume AI, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.hume.ai/api/v2/summary.json" } }
28+ - { slug: poe, name: Poe, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.poe.com/api/v2/summary.json" } }
29+ - { slug: groq, name: Groq, category: ai, asns: [], importance: 3, status: { kind: statuspage, url: "https://groqstatus.com/api/v2/summary.json" } }
30+ - { slug: cerebras, name: Cerebras, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.cerebras.ai/api/v2/summary.json" } }
31+ - { slug: sambanova, name: SambaNova, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.sambanova.ai/api/v2/summary.json" } }
32+ - { slug: fireworks, name: Fireworks AI, category: ai, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.fireworks.ai/api/v2/summary.json" } }
33+ - { slug: baseten, name: Baseten, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.baseten.co/api/v2/summary.json" } }
34+ - { slug: lambda-labs, name: Lambda, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lambdalabs.com/api/v2/summary.json" } }
35+ - { slug: coreweave, name: CoreWeave, category: ai, asns: [], importance: 3, status: { kind: statusio, url: "https://status.coreweave.com/1.0/status/5e126e998f2f032e1f8f0f4b" } }
36+ - { slug: paperspace, name: Paperspace, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.paperspace.com/api/v2/summary.json" } }
37+ - { slug: nebius, name: Nebius, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.nebius.com/api/v2/summary.json" } }
38+ - { slug: crusoe, name: Crusoe, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.crusoecloud.com/api/v2/summary.json" } }
39+ - { slug: braintrust, name: Braintrust, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.braintrust.dev/api/v2/summary.json" } }
40+ - { slug: langfuse, name: Langfuse, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.langfuse.com/api/v2/summary.json" } }
41+ - { slug: crewai, name: CrewAI, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.crewai.com/api/v2/summary.json" } }
42+ - { slug: botpress, name: Botpress, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.botpress.com/api/v2/summary.json" } }
43+ - { slug: voiceflow, name: Voiceflow, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.voiceflow.com/api/v2/summary.json" } }
44+ - { slug: cursor, name: Cursor, category: ai, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.cursor.com/api/v2/summary.json" } }
45+ - { slug: windsurf, name: Windsurf, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.windsurf.com/api/v2/summary.json" } }
46+ - { slug: tabnine, name: Tabnine, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.tabnine.com/api/v2/summary.json" } }
47+ - { slug: ampcode, name: Amp, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.ampcode.com/api/v2/summary.json" } }
48+ - { slug: lovable, name: Lovable, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lovable.dev/api/v2/summary.json" } }
49+ - { slug: bolt, name: Bolt.new, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bolt.new/api/v2/summary.json" } }
50+ - { slug: devin, name: "Devin (Cognition)", category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.devin.ai/api/v2/summary.json" } }
51+ - { slug: manus, name: Manus, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.manus.im/api/v2/summary.json" } }
52+ - { slug: augment, name: Augment Code, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.augmentcode.com/api/v2/summary.json" } }
53+ - { slug: qodo, name: Qodo, category: ai, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.qodo.ai/api/v2/summary.json" } }
54+ - { slug: otter, name: Otter.ai, category: ai, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.otter.ai/api/v2/summary.json" } }
55+ - { slug: nvidia-ngc, name: NVIDIA NGC, category: ai, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.ngc.nvidia.com/api/v2/summary.json" } }
56+ # ───────── cloud (13)
57+ - { slug: storj, name: Storj, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.storj.io/api/v2/summary.json" } }
58+ - { slug: tigris, name: Tigris, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.tigrisdata.com/api/v2/summary.json" } }
59+ - { slug: latitude, name: Latitude.sh, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.latitude.sh/api/v2/summary.json" } }
60+ - { slug: outscale, name: Outscale, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.outscale.com/api/v2/summary.json" } }
61+ - { slug: sync, name: Sync.com, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.sync.com/api/v2/summary.json" } }
62+ - { slug: egnyte, name: Egnyte, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.egnyte.com/api/v2/summary.json" } }
63+ - { slug: sharefile, name: ShareFile, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.sharefile.com/api/v2/summary.json" } }
64+ - { slug: jottacloud, name: Jottacloud, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.jottacloud.com/api/v2/summary.json" } }
65+ - { slug: tresorit, name: Tresorit, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.tresorit.com/api/v2/summary.json" } }
66+ - { slug: carbonite, name: Carbonite, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.carbonite.com/api/v2/summary.json" } }
67+ - { slug: crashplan, name: CrashPlan, category: cloud, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.crashplan.com/api/v2/summary.json" } }
68+ - { slug: rubrik, name: Rubrik, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.rubrik.com/api/v2/summary.json" } }
69+ - { slug: cohesity, name: Cohesity, category: cloud, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.cohesity.com/api/v2/summary.json" } }
70+ # ───────── commerce (9)
71+ - { slug: chargebee, name: Chargebee, category: commerce, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.chargebee.com/api/v2/summary.json" } }
72+ - { slug: recurly, name: Recurly, category: commerce, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.recurly.com/api/v2/summary.json" } }
73+ - { slug: zuora, name: Zuora, category: commerce, asns: [], importance: 2, status: { kind: statuspage, url: "https://trust.zuora.com/api/v2/summary.json" } }
74+ - { slug: fastspring, name: FastSpring, category: commerce, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.fastspring.com/api/v2/summary.json" } }
75+ - { slug: commercetools, name: commercetools, category: commerce, asns: [], importance: 2, status: { kind: statusio, url: "https://status.commercetools.com/1.0/status/56e4295370fe4ece420002bb" } }
76+ - { slug: recharge, name: Recharge, category: commerce, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.rechargepayments.com/api/v2/summary.json" } }
77+ - { slug: yotpo, name: Yotpo, category: commerce, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.yotpo.com/api/v2/summary.json" } }
78+ - { slug: shipbob, name: ShipBob, category: commerce, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.shipbob.com/api/v2/summary.json" } }
79+ - { slug: taxjar, name: TaxJar, category: commerce, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.taxjar.com/api/v2/summary.json" } }
80+ # ───────── developer (185)
81+ - { slug: travis-ci, name: Travis CI, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://www.traviscistatus.com/api/v2/summary.json" } }
82+ - { slug: buildkite, name: Buildkite, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://www.buildkitestatus.com/api/v2/summary.json" } }
83+ - { slug: bitrise, name: Bitrise, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bitrise.io/api/v2/summary.json" } }
84+ - { slug: semaphoreci, name: Semaphore CI, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.semaphoreci.com/api/v2/summary.json" } }
85+ - { slug: harness, name: Harness, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.harness.io/api/v2/summary.json" } }
86+ - { slug: octopus, name: Octopus Deploy, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.octopus.com/api/v2/summary.json" } }
87+ - { slug: codefresh, name: Codefresh, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.codefresh.io/api/v2/summary.json" } }
88+ - { slug: codecov, name: Codecov, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.codecov.com/api/v2/summary.json" } }
89+ - { slug: coveralls, name: Coveralls, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.coveralls.io/api/v2/summary.json" } }
90+ - { slug: codeclimate, name: Code Climate, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.codeclimate.com/api/v2/summary.json" } }
91+ - { slug: snyk, name: Snyk, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.snyk.io/api/v2/summary.json" } }
92+ - { slug: mend, name: Mend.io, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.mend.io/api/v2/summary.json" } }
93+ - { slug: gitguardian, name: GitGuardian, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.gitguardian.com/api/v2/summary.json" } }
94+ - { slug: semgrep, name: Semgrep, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.semgrep.dev/api/v2/summary.json" } }
95+ - { slug: pulumi, name: Pulumi, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.pulumi.com/api/v2/summary.json" } }
96+ - { slug: expo, name: Expo, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.expo.dev/api/v2/summary.json" } }
97+ - { slug: browserstack, name: BrowserStack, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.browserstack.com/api/v2/summary.json" } }
98+ - { slug: saucelabs, name: Sauce Labs, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.saucelabs.com/api/v2/summary.json" } }
99+ - { slug: applitools, name: Applitools, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.applitools.com/api/v2/summary.json" } }
100+ - { slug: percy, name: Percy, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.percy.io/api/v2/summary.json" } }
101+ - { slug: stoplight, name: Stoplight, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.stoplight.io/api/v2/summary.json" } }
102+ - { slug: readme, name: ReadMe, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://www.readmestatus.com/api/v2/summary.json" } }
103+ - { slug: gitbook, name: GitBook, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://www.gitbookstatus.com/api/v2/summary.json" } }
104+ - { slug: mintlify, name: Mintlify, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.mintlify.com/api/v2/summary.json" } }
105+ - { slug: depot, name: Depot, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.depot.dev/api/v2/summary.json" } }
106+ - { slug: kong, name: Kong, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.konghq.com/api/v2/summary.json" } }
107+ - { slug: mergify, name: Mergify, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.mergify.com/api/v2/summary.json" } }
108+ - { slug: sourcegraph, name: Sourcegraph, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://sourcegraphstatus.com/api/v2/summary.json" } }
109+ - { slug: gitpod, name: Gitpod, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://www.gitpodstatus.com/api/v2/summary.json" } }
110+ - { slug: datacamp, name: DataCamp, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.datacamp.com/api/v2/summary.json" } }
111+ - { slug: gemfury, name: Gemfury, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.gemfury.com/api/v2/summary.json" } }
112+ - { slug: rollbar, name: Rollbar, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.rollbar.com/api/v2/summary.json" } }
113+ - { slug: bugsnag, name: Bugsnag, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bugsnag.com/api/v2/summary.json" } }
114+ - { slug: honeybadger, name: Honeybadger, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.honeybadger.io/api/v2/summary.json" } }
115+ - { slug: airbrake, name: Airbrake, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.airbrake.io/api/v2/summary.json" } }
116+ - { slug: scoutapm, name: Scout APM, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.scoutapm.com/api/v2/summary.json" } }
117+ - { slug: dynatrace, name: Dynatrace, category: developer, asns: [], importance: 3, status: { kind: statusio, url: "https://api.status.io/1.0/status/546d8cb6af8407b6730000cb" } }
118+ - { slug: lightstep, name: Lightstep, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.lightstep.com/api/v2/summary.json" } }
119+ - { slug: loggly, name: Loggly, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.loggly.com/api/v2/summary.json" } }
120+ - { slug: sumologic, name: Sumo Logic, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.sumologic.com/api/v2/summary.json" } }
121+ - { slug: axiom, name: Axiom, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.axiom.co/api/v2/summary.json" } }
122+ - { slug: cribl, name: Cribl, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.cribl.cloud/api/v2/summary.json" } }
123+ - { slug: logzio, name: Logz.io, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.logz.io/api/v2/summary.json" } }
124+ - { slug: coralogix, name: Coralogix, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.coralogix.com/api/v2/summary.json" } }
125+ - { slug: mezmo, name: Mezmo, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.mezmo.com/api/v2/summary.json" } }
126+ - { slug: logrocket, name: LogRocket, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.logrocket.com/api/v2/summary.json" } }
127+ - { slug: opsgenie, name: Opsgenie, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://opsgenie.status.atlassian.com/api/v2/summary.json" } }
128+ - { slug: xmatters, name: xMatters, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.xmatters.com/api/v2/summary.json" } }
129+ - { slug: lumigo, name: Lumigo, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.lumigo.io/api/v2/summary.json" } }
130+ - { slug: observeinc, name: Observe, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.observeinc.com/api/v2/summary.json" } }
131+ - { slug: netdata, name: Netdata, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.netdata.cloud/api/v2/summary.json" } }
132+ - { slug: auvik, name: Auvik, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.auvik.com/api/v2/summary.json" } }
133+ - { slug: logicmonitor, name: LogicMonitor, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.logicmonitor.com/api/v2/summary.json" } }
134+ - { slug: ninjaone, name: NinjaOne, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.ninjaone.com/api/v2/summary.json" } }
135+ - { slug: connectwise, name: ConnectWise, category: developer, asns: [], importance: 2, status: { kind: statusio, url: "https://status.connectwise.com/1.0/status/619cf82551fec9053d612f09" } }
136+ - { slug: atera, name: Atera, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.atera.com/api/v2/summary.json" } }
137+ - { slug: bigpanda, name: BigPanda, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.bigpanda.io/api/v2/summary.json" } }
138+ - { slug: deadmanssnitch, name: "Dead Man's Snitch", category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.deadmanssnitch.com/api/v2/summary.json" } }
139+ - { slug: hetrixtools, name: HetrixTools, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.hetrixtools.com/api/v2/summary.json" } }
140+ - { slug: planetscale, name: PlanetScale, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://www.planetscalestatus.com/api/v2/summary.json" } }
141+ - { slug: cockroach, name: CockroachDB, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.cockroachlabs.cloud/api/v2/summary.json" } }
142+ - { slug: prisma, name: Prisma, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://www.prisma-status.com/api/v2/summary.json" } }
143+ - { slug: convex, name: Convex, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.convex.dev/api/v2/summary.json" } }
144+ - { slug: directus, name: Directus, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.directus.cloud/api/v2/summary.json" } }
145+ - { slug: hygraph, name: Hygraph, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.hygraph.com/api/v2/summary.json" } }
146+ - { slug: prismic, name: Prismic, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.prismic.io/api/v2/summary.json" } }
147+ - { slug: bubble, name: Bubble, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bubble.io/api/v2/summary.json" } }
148+ - { slug: retool, name: Retool, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.retool.com/api/v2/summary.json" } }
149+ - { slug: coda, name: Coda, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.coda.io/api/v2/summary.json" } }
150+ - { slug: make, name: Make, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.make.com/api/v2/summary.json" } }
151+ - { slug: pipedream, name: Pipedream, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.pipedream.com/api/v2/summary.json" } }
152+ - { slug: workato, name: Workato, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.workato.com/api/v2/summary.json" } }
153+ - { slug: tray, name: Tray.ai, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.tray.io/api/v2/summary.json" } }
154+ - { slug: celigo, name: Celigo, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.celigo.com/api/v2/summary.json" } }
155+ - { slug: boomi, name: Boomi, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.boomi.com/api/v2/summary.json" } }
156+ - { slug: temporal, name: Temporal, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.temporal.io/api/v2/summary.json" } }
157+ - { slug: inngest, name: Inngest, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.inngest.com/api/v2/summary.json" } }
158+ - { slug: sevalla, name: Sevalla, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.sevalla.com/api/v2/summary.json" } }
159+ - { slug: aiven, name: Aiven, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.aiven.io/api/v2/summary.json" } }
160+ - { slug: clickhouse, name: ClickHouse, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.clickhouse.com/api/v2/summary.json" } }
161+ - { slug: singlestore, name: SingleStore, category: developer, asns: [], importance: 2, status: { kind: statusio, url: "https://status.singlestore.com/1.0/status/5f75344c593ae004ba02aaa6" } }
162+ - { slug: tinybird, name: Tinybird, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.tinybird.co/api/v2/summary.json" } }
163+ - { slug: materialize, name: Materialize, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.materialize.com/api/v2/summary.json" } }
164+ - { slug: firebolt, name: Firebolt, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.firebolt.io/api/v2/summary.json" } }
165+ - { slug: influxdata, name: InfluxData, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.influxdata.com/api/v2/summary.json" } }
166+ - { slug: couchbase, name: Couchbase, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.couchbase.com/api/v2/summary.json" } }
167+ - { slug: neo4j, name: Neo4j, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.neo4j.io/api/v2/summary.json" } }
168+ - { slug: bloomreach, name: Bloomreach, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.bloomreach.com/api/v2/summary.json" } }
169+ - { slug: redpanda, name: Redpanda, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.redpanda.com/api/v2/summary.json" } }
170+ - { slug: cloudamqp, name: CloudAMQP, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.cloudamqp.com/api/v2/summary.json" } }
171+ - { slug: dbt, name: dbt Labs, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.getdbt.com/api/v2/summary.json" } }
172+ - { slug: census, name: Census, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.getcensus.com/api/v2/summary.json" } }
173+ - { slug: rudderstack, name: RudderStack, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.rudderstack.com/api/v2/summary.json" } }
174+ - { slug: tealium, name: Tealium, category: developer, asns: [], importance: 2, status: { kind: statusio, url: "https://status.tealium.com/1.0/status/56216ec56de34e1e5900016f" } }
175+ - { slug: stitch, name: Stitch, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.stitchdata.com/api/v2/summary.json" } }
176+ - { slug: matillion, name: Matillion, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.matillion.com/api/v2/summary.json" } }
177+ - { slug: metabase, name: Metabase, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.metabase.com/api/v2/summary.json" } }
178+ - { slug: mode, name: Mode Analytics, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.modeanalytics.com/api/v2/summary.json" } }
179+ - { slug: hex, name: Hex, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.hex.tech/api/v2/summary.json" } }
180+ - { slug: sigma, name: Sigma Computing, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.sigmacomputing.com/api/v2/summary.json" } }
181+ - { slug: preset, name: Preset, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.preset.io/api/v2/summary.json" } }
182+ - { slug: astronomer, name: Astronomer, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.astronomer.io/api/v2/summary.json" } }
183+ - { slug: prefect, name: Prefect, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.prefect.io/api/v2/summary.json" } }
184+ - { slug: umbraco, name: Umbraco, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.umbraco.io/api/v2/summary.json" } }
185+ - { slug: contentstack, name: Contentstack, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.contentstack.com/api/v2/summary.json" } }
186+ - { slug: kontent, name: Kontent.ai, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.kontent.ai/api/v2/summary.json" } }
187+ - { slug: buttercms, name: ButterCMS, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.buttercms.com/api/v2/summary.json" } }
188+ - { slug: builderio, name: Builder.io, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.builder.io/api/v2/summary.json" } }
189+ - { slug: duda, name: Duda, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.duda.co/api/v2/summary.json" } }
190+ - { slug: uploadcare, name: Uploadcare, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.uploadcare.com/api/v2/summary.json" } }
191+ - { slug: filestack, name: Filestack, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.filestack.com/api/v2/summary.json" } }
192+ - { slug: clerk, name: Clerk, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.clerk.com/api/v2/summary.json" } }
193+ - { slug: fusionauth, name: FusionAuth, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.fusionauth.io/api/v2/summary.json" } }
194+ - { slug: zitadel, name: Zitadel, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.zitadel.com/api/v2/summary.json" } }
195+ - { slug: workos, name: WorkOS, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.workos.com/api/v2/summary.json" } }
196+ - { slug: frontegg, name: Frontegg, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.frontegg.com/api/v2/summary.json" } }
197+ - { slug: yubico, name: Yubico, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.yubico.com/api/v2/summary.json" } }
198+ - { slug: dashlane, name: Dashlane, category: developer, asns: [], importance: 2, status: { kind: statusio, url: "https://status.dashlane.com/1.0/status/5aabcb89fccc4b04d3774443" } }
199+ - { slug: keeper, name: Keeper Security, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://statuspage.keeper.io/api/v2/summary.json" } }
200+ - { slug: veracode, name: Veracode, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.veracode.com/api/v2/summary.json" } }
201+ - { slug: contrast, name: Contrast Security, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.contrastsecurity.com/api/v2/summary.json" } }
202+ - { slug: censys, name: Censys, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.censys.io/api/v2/summary.json" } }
203+ - { slug: greynoise, name: GreyNoise, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.greynoise.io/api/v2/summary.json" } }
204+ - { slug: cesium, name: Cesium, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.cesium.com/api/v2/summary.json" } }
205+ - { slug: radar, name: Radar, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.radar.com/api/v2/summary.json" } }
206+ - { slug: smarty, name: Smarty, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.smarty.com/api/v2/summary.json" } }
207+ - { slug: cos, name: "Center for Open Science (OSF)", category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.cos.io/api/v2/summary.json" } }
208+ - { slug: apify, name: Apify, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.apify.com/api/v2/summary.json" } }
209+ - { slug: browserbase, name: Browserbase, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.browserbase.com/api/v2/summary.json" } }
210+ - { slug: serpapi, name: SerpApi, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.serpapi.com/api/v2/summary.json" } }
211+ - { slug: warp, name: Warp, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.warp.dev/api/v2/summary.json" } }
212+ - { slug: semanticscholar, name: Semantic Scholar, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.semanticscholar.org/api/v2/summary.json" } }
213+ - { slug: grammarly, name: Grammarly, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.grammarly.com/api/v2/summary.json" } }
214+ - { slug: linear, name: Linear, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://linearstatus.com/api/v2/summary.json" } }
215+ - { slug: smartsheet, name: Smartsheet, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.smartsheet.com/api/v2/summary.json" } }
216+ - { slug: lucid, name: Lucid Software, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.lucid.co/api/v2/summary.json" } }
217+ - { slug: autodesk, name: Autodesk, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://health.autodesk.com/api/v2/summary.json" } }
218+ - { slug: frameio, name: Frame.io, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.frame.io/api/v2/summary.json" } }
219+ - { slug: bentley, name: Bentley Systems, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.bentley.com/api/v2/summary.json" } }
220+ - { slug: onshape, name: Onshape, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.onshape.com/api/v2/summary.json" } }
221+ - { slug: ptc, name: PTC, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.ptc.com/api/v2/summary.json" } }
222+ - { slug: mendix, name: Mendix, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.mendix.com/api/v2/summary.json" } }
223+ - { slug: altium, name: Altium, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.altium.com/api/v2/summary.json" } }
224+ - { slug: blackduck, name: Black Duck, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.blackduck.com/api/v2/summary.json" } }
225+ - { slug: pandadoc, name: PandaDoc, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.pandadoc.com/api/v2/summary.json" } }
226+ - { slug: hellosign, name: Dropbox Sign, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.hellosign.com/api/v2/summary.json" } }
227+ - { slug: signnow, name: signNow, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.signnow.com/api/v2/summary.json" } }
228+ - { slug: airslate, name: airSlate, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.airslate.com/api/v2/summary.json" } }
229+ - { slug: pdffiller, name: pdfFiller, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.pdffiller.com/api/v2/summary.json" } }
230+ - { slug: signeasy, name: Signeasy, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.signeasy.com/api/v2/summary.json" } }
231+ - { slug: signable, name: Signable, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.signable.co.uk/api/v2/summary.json" } }
232+ - { slug: nitro, name: Nitro, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.gonitro.com/api/v2/summary.json" } }
233+ - { slug: clearbit, name: Clearbit, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.clearbit.com/api/v2/summary.json" } }
234+ - { slug: quip, name: Quip, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.quip.com/api/v2/summary.json" } }
235+ - { slug: helpscout, name: Help Scout, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.helpscout.com/api/v2/summary.json" } }
236+ - { slug: gorgias, name: Gorgias, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.gorgias.com/api/v2/summary.json" } }
237+ - { slug: kustomer, name: Kustomer, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.kustomer.com/api/v2/summary.json" } }
238+ - { slug: heap, name: Heap, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.heap.io/api/v2/summary.json" } }
239+ - { slug: hotjar, name: Hotjar, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.hotjar.com/api/v2/summary.json" } }
240+ - { slug: fullstory, name: FullStory, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.fullstory.com/api/v2/summary.json" } }
241+ - { slug: pendo, name: Pendo, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.pendo.io/api/v2/summary.json" } }
242+ - { slug: appcues, name: Appcues, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.appcues.com/api/v2/summary.json" } }
243+ - { slug: walkme, name: WalkMe, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.walkme.com/api/v2/summary.json" } }
244+ - { slug: optimizely, name: Optimizely, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.optimizely.com/api/v2/summary.json" } }
245+ - { slug: statsig, name: Statsig, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.statsig.com/api/v2/summary.json" } }
246+ - { slug: flagsmith, name: Flagsmith, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.flagsmith.com/api/v2/summary.json" } }
247+ - { slug: devcycle, name: DevCycle, category: developer, asns: [], importance: 1, status: { kind: statusio, url: "https://api.status.io/1.0/status/6a28108059348e05f706f393" } }
248+ - { slug: typeform, name: Typeform, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.typeform.com/api/v2/summary.json" } }
249+ - { slug: surveymonkey, name: SurveyMonkey, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.surveymonkey.com/api/v2/summary.json" } }
250+ - { slug: qualtrics, name: Qualtrics, category: developer, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.qualtrics.com/api/v2/summary.json" } }
251+ - { slug: jotform, name: Jotform, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.jotform.com/api/v2/summary.json" } }
252+ - { slug: bamboohr, name: BambooHR, category: developer, asns: [], importance: 2, status: { kind: statusio, url: "https://status.bamboohr.com/1.0/status/54f0de009d6f51e7140002b7" } }
253+ - { slug: greenhouse, name: Greenhouse, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.greenhouse.io/api/v2/summary.json" } }
254+ - { slug: lever, name: Lever, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.lever.co/api/v2/summary.json" } }
255+ - { slug: ashby, name: Ashby, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.ashbyhq.com/api/v2/summary.json" } }
256+ - { slug: personio, name: Personio, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.personio.de/api/v2/summary.json" } }
257+ - { slug: lattice, name: Lattice, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.lattice.com/api/v2/summary.json" } }
258+ - { slug: blackboard, name: Blackboard, category: developer, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.blackboard.com/api/v2/summary.json" } }
259+ - { slug: codility, name: Codility, category: developer, asns: [], importance: 1, status: { kind: statusio, url: "https://status.codility.com/1.0/status/602b8b3348af2205ab890df0" } }
260+ - { slug: codesignal, name: CodeSignal, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.codesignal.com/api/v2/summary.json" } }
261+ - { slug: maze, name: Maze, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.maze.co/api/v2/summary.json" } }
262+ - { slug: usertesting, name: UserTesting, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.usertesting.com/api/v2/summary.json" } }
263+ - { slug: productboard, name: Productboard, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.productboard.com/api/v2/summary.json" } }
264+ - { slug: aha, name: "Aha!", category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.aha.io/api/v2/summary.json" } }
265+ - { slug: shortcut, name: Shortcut, category: developer, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.shortcut.com/api/v2/summary.json" } }
266+ # ───────── finance (2)
267+ - { slug: navan, name: Navan, category: finance, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.navan.com/api/v2/summary.json" } }
268+ - { slug: carta, name: Carta, category: finance, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.carta.com/api/v2/summary.json" } }
269+ # ───────── infrastructure (25)
270+ - { slug: sentinelone, name: SentinelOne, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.sentinelone.com/api/v2/summary.json" } }
271+ - { slug: eset, name: ESET, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.eset.com/api/v2/summary.json" } }
272+ - { slug: umbrella, name: Cisco Umbrella, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.umbrella.com/api/v2/summary.json" } }
273+ - { slug: jamf, name: Jamf, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.jamf.com/api/v2/summary.json" } }
274+ - { slug: kandji, name: Kandji, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.kandji.io/api/v2/summary.json" } }
275+ - { slug: addigy, name: Addigy, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.addigy.com/api/v2/summary.json" } }
276+ - { slug: omnissa, name: Omnissa Workspace ONE, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.workspaceone.com/api/v2/summary.json" } }
277+ - { slug: tenable, name: Tenable, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.tenable.com/api/v2/summary.json" } }
278+ - { slug: qualys, name: Qualys, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.qualys.com/api/v2/summary.json" } }
279+ - { slug: wiz, name: Wiz, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.wiz.io/api/v2/summary.json" } }
280+ - { slug: aquasec, name: Aqua Security, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.aquasec.com/api/v2/summary.json" } }
281+ - { slug: upwind, name: Upwind, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.upwind.io/api/v2/summary.json" } }
282+ - { slug: traceable, name: Traceable, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.traceable.ai/api/v2/summary.json" } }
283+ - { slug: wallarm, name: Wallarm, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.wallarm.com/api/v2/summary.json" } }
284+ - { slug: path, name: Path Network, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.path.net/api/v2/summary.json" } }
285+ - { slug: recordedfuture, name: Recorded Future, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.recordedfuture.com/api/v2/summary.json" } }
286+ - { slug: zerofox, name: ZeroFox, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.zerofox.com/api/v2/summary.json" } }
287+ - { slug: anomali, name: Anomali, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.anomali.com/api/v2/summary.json" } }
288+ - { slug: valimail, name: Valimail, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.valimail.com/api/v2/summary.json" } }
289+ - { slug: abnormal, name: Abnormal Security, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.abnormalsecurity.com/api/v2/summary.json" } }
290+ - { slug: webroot, name: Webroot, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.webroot.com/api/v2/summary.json" } }
291+ - { slug: f-secure, name: F-Secure, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.f-secure.com/api/v2/summary.json" } }
292+ - { slug: withsecure, name: WithSecure, category: infrastructure, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.withsecure.com/api/v2/summary.json" } }
293+ - { slug: spycloud, name: SpyCloud, category: infrastructure, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.spycloud.com/api/v2/summary.json" } }
294+ - { slug: openvpn, name: OpenVPN, category: infrastructure, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.openvpn.com/api/v2/summary.json" } }
295+ # ───────── messaging (33)
296+ - { slug: resend, name: Resend, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://resend-status.com/api/v2/summary.json" } }
297+ - { slug: sparkpost, name: SparkPost, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.sparkpost.com/api/v2/summary.json" } }
298+ - { slug: bird, name: Bird, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.bird.com/api/v2/summary.json" } }
299+ - { slug: mailjet, name: Mailjet, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.mailjet.com/api/v2/summary.json" } }
300+ - { slug: plivo, name: Plivo, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.plivo.com/api/v2/summary.json" } }
301+ - { slug: infobip, name: Infobip, category: messaging, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.infobip.com/api/v2/summary.json" } }
302+ - { slug: onesignal, name: OneSignal, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.onesignal.com/api/v2/summary.json" } }
303+ - { slug: courier, name: Courier, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.courier.com/api/v2/summary.json" } }
304+ - { slug: knock, name: Knock, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.knock.app/api/v2/summary.json" } }
305+ - { slug: getstream, name: Stream, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.getstream.io/api/v2/summary.json" } }
306+ - { slug: daily, name: Daily, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.daily.co/api/v2/summary.json" } }
307+ - { slug: 100ms, name: 100ms, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.100ms.live/api/v2/summary.json" } }
308+ - { slug: livekit, name: LiveKit, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.livekit.io/api/v2/summary.json" } }
309+ - { slug: apivideo, name: api.video, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.api.video/api/v2/summary.json" } }
310+ - { slug: startmail, name: StartMail, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.startmail.com/api/v2/summary.json" } }
311+ - { slug: aircall, name: Aircall, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.aircall.io/api/v2/summary.json" } }
312+ - { slug: dialpad, name: Dialpad, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.dialpad.com/api/v2/summary.json" } }
313+ - { slug: talkdesk, name: Talkdesk, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.talkdesk.com/api/v2/summary.json" } }
314+ - { slug: genesys, name: Genesys Cloud, category: messaging, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.mypurecloud.com/api/v2/summary.json" } }
315+ - { slug: constantcontact, name: Constant Contact, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.constantcontact.com/api/v2/summary.json" } }
316+ - { slug: klaviyo, name: Klaviyo, category: messaging, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.klaviyo.com/api/v2/summary.json" } }
317+ - { slug: braze, name: Braze, category: messaging, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.braze.com/api/v2/summary.json" } }
318+ - { slug: iterable, name: Iterable, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.iterable.com/api/v2/summary.json" } }
319+ - { slug: attentive, name: Attentive, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.attentivemobile.com/api/v2/summary.json" } }
320+ - { slug: postscript, name: Postscript, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.postscript.io/api/v2/summary.json" } }
321+ - { slug: activecampaign, name: ActiveCampaign, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.activecampaign.com/api/v2/summary.json" } }
322+ - { slug: mailerlite, name: MailerLite, category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.mailerlite.com/api/v2/summary.json" } }
323+ - { slug: getresponse, name: GetResponse, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.getresponse.com/api/v2/summary.json" } }
324+ - { slug: aweber, name: AWeber, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.aweber.com/api/v2/summary.json" } }
325+ - { slug: drip, name: Drip, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.drip.com/api/v2/summary.json" } }
326+ - { slug: omnisend, name: Omnisend, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.omnisend.com/api/v2/summary.json" } }
327+ - { slug: kit, name: "Kit (ConvertKit)", category: messaging, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.kit.com/api/v2/summary.json" } }
328+ - { slug: superhuman, name: Superhuman, category: messaging, asns: [], importance: 1, status: { kind: statuspage, url: "https://status.superhuman.com/api/v2/summary.json" } }
329+ # ───────── social (1)
330+ - { slug: substack, name: Substack, category: social, asns: [], importance: 3, status: { kind: statuspage, url: "https://substack.statuspage.io/api/v2/summary.json" } }
331+ # ───────── streaming (2)
332+ - { slug: vimeo, name: Vimeo, category: streaming, asns: [], importance: 3, status: { kind: statuspage, url: "https://status.vimeo.com/api/v2/summary.json" } }
333+ - { slug: jwplayer, name: JW Player, category: streaming, asns: [], importance: 2, status: { kind: statuspage, url: "https://status.jwplayer.com/api/v2/summary.json" } }
added data/targets/fragments/developer.yaml +5333 −0
Large diff (5,333 lines) is not loaded by default to keep the page fast.Load diff
modified infra/compose.yml +1 −0
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme