setHash agreement.setHash, stay within a few blocks of tip, and keep TLS valid (≥14 days). Use this board’s Spark gate / scorecard — not height alone.| Backend | Lag | Spark id | Anon-set | setHash | TLS | 24h | Status |
|---|---|---|---|---|---|---|---|
| Waiting for probes… | |||||||
/api/history. Strict green % — yellow/red samples count as down. Separate from the browser session charts below.| Backend | 24h | 7d | Samples (24h) |
|---|---|---|---|
| Waiting for history samples… | |||
| Backend | Tip | Spark | setHash | Anon | Uptime 24h | TLS | Reliable? |
|---|---|---|---|---|---|---|---|
| Waiting… | |||||||
Reliable uses Spark, setHash, fetch band, TLS, and 24h uptime when history exists. Details: About.
Tip can look fine while Spark sync still stalls on a slow or divergent set. Ranked fetch cards and bandwidth compare: Spark health.
Use the charts and scorecard above, then open Spark health or a backend for detail.
| Backend | Used by | Operator | Height?Chain tip height this backend reports, via blockchain.headers.subscribe. |
Lag?Blocks behind the fleet reference tip (highest height at least two backends agree on). 0 means fully synced. | Anon-set?Full Spark anonymity-set fetch time and size from the latest measurement (live on firostatus.com / always-on). | TLS?Days left on the peer TLS certificate. <14 days → yellow · expired → red. | setHash?Anon-set fingerprint match vs fleet consensus. | Uptime 24h?Strict green % from /api/history. Yellow/red samples count as down. |
Uptime 7d?Strict green % over 7 days from /api/history. |
Probe RTT?Round trip for the light probe (TLS + tip) from this monitor. Secondary to Spark setHash and lag. | Trend?This backend's probe RTT across polls this browser session. | Spark id?Active Spark coin-group id from spark.getsparklatestcoinid, cross-checked fleet-wide. ✗ = differs from consensus. |
Status?See legend. Yellow does not fail /api/ci spark_ok by itself. |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Probing live Firo servers… | |||||||||||||
setHash matches across the fleet. Serve times are measured from this monitor’s region.| # | Backend | Fetch | Size | Coins | setHash |
|---|---|---|---|---|---|
| Waiting… | |||||
spark.getsparkanonymityset): time, coins, MB, and setHash. This is the real mobile-sync bottleneck.setHash agreement and fetch cost, not height alone.M1 is live on this board. Prefer /api/ci spark_ok over green-count / early uptime %. Verifier curls: /docs/VERIFY.md.
firostatus.com)/api/ci)/api/status, /api/docs, /api/history, /api/health) + curl / CI examples/api/badge + CI curls (Developers tab)Public JSON for tip freshness, Spark coin-group agreement, setHash consistency, and anon-set fetch cost across the curated fleet. Same data as the dashboard.
setHash consistency —
so teams do not each re-download ~18–32 MB just to compare backends. Complement, not a replacement.
Not an in-wallet “pick a server” UI.
| Layer | Role | Typical use |
|---|---|---|
| Full node | Authoritative chain and Spark state | Required behind every Electrumx instance |
| Electrumx (Spark) | Indexed light wallet protocol for Firo Spark | What light and mobile wallets sync through in production |
| Wallet / SDK / app client | Talks to a chosen Electrum host | Real Spark sync, coin group fetch, user facing wallet logic |
| This monitor | Continuous probes across the curated public fleet | Alerts, CI, default list review, incident triage, status pages |
/api/ci gate…curl -sS 'ORIGIN/api/history?hours=24&limit=200' \
| jq '{storage, db, sample_count, recording_since, uptime_note,
uptime:.uptime.fleet_pct_24h,
fleet_n:(.fleet|length), events:(.events.sethash|length)}'
Verifier curls also live in /docs/VERIFY.md. Prefer /api/ci spark_ok over early uptime %.
status_reasons, summary, and a meta block.ok (Spark healthy and tip lag ≤2). Prefer spark_ok for Spark-only gates. When ok, notes may explain ops-yellow hosts.fleet series, events.sethash, 24h/7d uptime % (strict green; not a wallet SLA). Query ?hours=&id=&limit=./api/ci for CI gates.{host,port}. Private IPs rejected. No anon-set fetch. Rate limited./api/status| Field | Meaning for a developer |
|---|---|
| reference | Majority safe fleet tip. Highest height that at least two backends agree on, so one forked host cannot skew lag for everyone. |
| spark_consensus | Modal active Spark coin group id from spark.getsparklatestcoinid. |
| spark_sethash_consensus | Modal anon set setHash across measured backends. |
| endpoints[].lag | Blocks behind reference. Primary freshness signal. |
| endpoints[].spark_consistent | true when this host’s coin group matches fleet consensus. |
| endpoints[].anonset.ms | Wall time to fully download the active anon set from this monitor’s region. |
| endpoints[].anonset.mb / coins | Bytes on the wire and coin count for that full fetch. |
| endpoints[].anonset.setHash / consistent | Identity of the set and whether it matches fleet setHash consensus. |
| endpoints[].latency_ms | Light probe RTT from this monitor only. Secondary. Not user device latency and not a ranking score. |
| endpoints[].status | green / yellow / red — see About. Yellow is ops; spark_ok can still pass. |
| endpoints[].status_reasons | Human-readable why the host is yellow/red (e.g. tip lag, RTT outlier, setHash mismatch, TLS <14d). |
| stats.probe_rtt_yellow_threshold_ms | Current RTT yellow band: max(5000, 2.5× median probe RTT). |
| anonset_source | live on firostatus.com (continuous always-on sweeps). |
| tls_valid_to / tls_days_left | Peer TLS certificate expiry and whole days remaining (observed; CA trust not enforced). |
| anonset_checked_at | When the last completed full anon-set sweep finished. May lag checked_at during a long sweep. |
| meta | Purpose notes, probe methods, status rules, and height-only vs Spark field map. |
| What you look at | What you learn | What you miss |
|---|---|---|
| ok, height, lag | Host answers and is near tip | Slow or divergent Spark anon set (the usual mobile sync stall) |
| spark_latest_coin_id, spark_consistent | Coin group agreement across the fleet | Fetch cost and byte size of the set |
| anonset.ms, mb, setHash, consistent | Whether a wallet can finish a Spark sync on this host, and whether the set matches peers | Nothing height only tools already cover |
spark_consistent === false or anonset.consistent === false.anonset.mb and anonset.ms across operators before publishing recommended backends (same setHash can still mean different bytes on the wire)./api/badge or poll /api/ci from a status page.curl -sS ORIGIN/api/status \
| jq '[.endpoints[]
| select(.spark_consistent == false
or (.anonset != null and .anonset.consistent == false))
| {name, lag, spark_consistent, anonset}]'
# Prefer spark_ok for Spark path health (tip lag / ops-yellow alone should not fail Spark CI)
curl -sS ORIGIN/api/ci | jq -e '.spark_ok == true'
# Strict tip+Spark gate (HTTP 503 when ok=false); notes explain yellow when ok=true:
curl -sS -f ORIGIN/api/ci | jq '{ok, spark_ok, max_lag, yellow, notes, reasons}'
ok requires spark_ok and max_lag ≤ 2. Mild lag alone can yield spark_ok: true with ok: false. Ops-yellow (RTT outlier, TLS <14d) can leave ok: true with non-empty notes. Use spark_ok for Spark-only gates; use -f + ok when tip freshness is also required.
curl -sS ORIGIN/api/spark \
| jq '{checked_at, spark_consensus, spark_sethash_consensus, summary, inconsistent}'
# Consensus fingerprint
curl -sS ORIGIN/api/status | jq -r '.spark_sethash_consensus'
# Hosts that disagree
curl -sS ORIGIN/api/status | jq '[.endpoints[] | select(.anonset.consistent==false) | {id,name,setHash:.anonset.setHash}]'
# Divergence windows (always-on)
curl -sS 'ORIGIN/api/history?hours=168' | jq '.events.sethash[-5:]'
<!-- README / status page -->  <!-- Deep links (path routes) --> Overview: ORIGIN/overview Backends: ORIGIN/backends Spark health: ORIGIN/spark Backend detail: ORIGIN/backend/mathnodes Developers: ORIGIN/developers Health JSON: ORIGIN/api/health
Registry ids and deep links also ship in /api/docs (registry, deep_links). Production origin: https://firostatus.com. CORS is open. Probe methods: About.
| Electrum method | Monitor fields |
|---|---|
server.version | version, tls_valid_to, tls_days_left |
blockchain.headers.subscribe | height, lag |
spark.getsparklatestcoinid | spark_latest_coin_id, spark_consistent, spark_consensus |
spark.getsparkanonymityset | anonset.ms/mb/coins/setHash/consistent, spark_sethash_consensus |
Start here: /api/docs · /api/ci · /api/status · /docs/VERIFY.md · Operators · Alerts
Pick a listed backend to see tip, TLS, Spark agreement, and anon-set fetch cost against peers. Custom host runs a light live probe (no anon-set download).
Listed hosts show Spark fetch from this board. The live probe only checks version, headers, and Spark coin id — it does not add a server to the public list.
Live gates from this board. Telegram or a generic webhook can ping the maintainer. Wallet and CI teams should poll /api/ci.
Hosts that are broken on this poll — not only events since restart.
When an incident opens (red, Spark id / setHash mismatch, lag spike, TLS expired), this board can send a short text message to a chat the maintainer connected. Same payload as the log. The same host+type will not ping again until the cooldown (default 30 min). Visitors cannot subscribe from this page.
loading example…
The same moment, a JSON POST to a URL the maintainer set. Pipe that into ntfy, a chat incoming hook, or a small script. Body is {source, event} — no tokens, no wallet data. HTTP 2xx counts as delivered.
loading example…
Not Firo’s public Telegram. Wallet and CI teams should poll /api/ci.
FiroStatus (firostatus.com) is a community health board and JSON feed for the public Firo Electrum backends that light and mobile wallets depend on. Flagship focus: Spark sync health (anon-set fetch and setHash), plus tip lag and TLS. The dashboard and the API show the same probe data. See Developers for integration details.
/api/ci spark_ok (and ok) over green-count alone.server.version: reachability, TLS, software version, cert expiryblockchain.headers.subscribe: chain height and lag vs fleet reference tipspark.getsparklatestcoinid: active Spark coin group id, cross-checked across backendsspark.getsparkanonymityset: full anon-set fetch time, size, and setHash consistencyProbes are public Electrum methods only. No addresses, keys, transactions, wallet traffic, or personal data are collected. This is a public health board for the curated Electrum fleet — not a wallet and not a privacy guarantee for funds.
setHash mismatch, or TLS <14d — see status_reasons. Yellow is ops; spark_ok can still PASSMeasurements on firostatus.com run continuously: light probes, Spark anon-set fetches, and history (anonset_source: live).
Operators — pick a listed backend to see TLS, tip, Spark agreement, and anon-set fetch vs the fleet, or run a light live probe on a custom host.
Alerts — live open issues plus a transition log. The maintainer can get the same events on Telegram or a generic JSON webhook (see that tab for the message shape). Wallet and CI teams should poll /api/ci.
Reference tip = highest height ≥2 backends agree on. Uptime = strict green % (yellow/red count as down) — not a wallet-availability SLA; interpret with /api/ci. Anon-set ms/MB are from this monitor’s single region. Full write-up: /docs/METHODOLOGY.md · verifier curls: /docs/VERIFY.md.
Funded via FCS — budget and milestones on Roadmap.
Project contact: admin@firostatus.com · source: github.com/firostatus/Firostatus.
Public JSON: /api/status · /api/ci · /api/history · /api/health · /api/docs · badge: /api/badge