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. Always available on firostatus.com production.| Backend | 24h | 7d | Samples (24h) |
|---|---|---|---|
| Durable history loads when the always-on server is recording… | |||
| Backend | Tip | Spark | setHash | Anon | Uptime 24h | TLS | Reliable? |
|---|---|---|---|---|---|---|---|
| Waiting… | |||||||
Reliable = green status · Spark+setHash agree · anon-set not slower than the fleet band (1.75× median, floor 20s) · TLS ≥14d · (24h uptime ≥95% when history exists). Early history + ops-yellow samples can keep Reliable=no even when /api/ci spark_ok PASSes — prefer the Spark gate for sync health. Single probe region · modal consensus.
Tip can look fine while Spark sync still stalls on a slow or divergent set. Ranked fetch cards and bandwidth compare: Spark health.
Height-only checks miss the Spark path. Use the charts and scorecard above for tip lag, anon-set cost, and setHash agreement — 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 durable SQLite history (/api/history) on the always-on server. |
Uptime 7d?Strict green % over 7 days from SQLite 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?green = tip fresh, Spark id + setHash match, TLS OK, probe RTT not a fleet outlier · yellow = tip lag / RTT outlier vs fleet / Spark mismatch / TLS <14d · red = unreachable, far behind, or TLS expired. 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 checks also catch
a host serving a different or stale set. On always-on hosts, anon-set sweeps run continuously. Live board: firostatus.com (see Roadmap for remaining M1 public gates).
Live probes, Spark setHash health, durable history, and the public JSON API run on firostatus.com (always-on Node). Domain + HTTPS and the forum launch write-up are done. Public MIT GitHub remains the open M1 gate until the project URL is posted. Milestone 2 deliverables stay unchecked until after M1 verification / first installment.
CFC verifies product signals here plus the public gates. Prefer /api/ci spark_ok over green-count / early uptime %.
# Verifier cheatsheet (pass when live)
curl -sS ORIGIN/api/status | jq '{anonset_source, spark_ok:(.endpoints|map(select(.spark_consistent==false or (.anonset.consistent==false)))|length==0), sample_hint:(.endpoints|map(.anonset.ms)|map(select(.!=null))|length)}'
curl -sS ORIGIN/api/history?hours=24 | jq '{sample_count, fleet_pct_24h:.uptime.fleet_pct_24h, fleet_n:(.fleet|length)}'
curl -sS -f ORIGIN/api/ci | jq '{ok,spark_ok,max_lag,reasons}'
firostatus.com)/api/ci)/api/status, /api/docs, /api/history, /api/health) + curl / CI examples/api/badge + CI curls (Developers tab)Firo light wallets sync Spark through public Electrumx backends. A host can look fine on height and still serve a slow or inconsistent anonymity set. This page documents the public JSON feed that reports tip freshness, Spark coin group agreement, setHash consistency, and anon set fetch cost across the curated fleet.
Primary: wallet / SDK / mobile teams reviewing default Electrum hosts, and Electrumx operators watching Spark serve cost. Secondary: public transparency when Spark sync stalls. The dashboard and the JSON feed show the same probe data.
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=.sample_count. No filesystem paths./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 from tip lag, Spark/setHash consistency, TLS, and fleet-relative probe RTT (outlier vs median — not a fixed 3s wall). |
| 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.
| 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 |
Probes are public Electrum methods only: server.version, blockchain.headers.subscribe, spark.getsparklatestcoinid, and spark.getsparkanonymityset. No addresses, keys, transactions, or wallet traffic are sent or stored. CORS is open (*) so browser tools and dashboards can read the feed.
Start here: /api/docs · /api/ci · /api/status · /docs/VERIFY.md
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 consistencyNo addresses, keys, transactions, or wallet data are sent or stored. The reference tip is the highest height at least two backends agree on. Spark / setHash consensus is the modal value across the fleet.
setHash mismatch, or TLS <14d — see status_reasons. Yellow is ops; spark_ok can still PASS| Surface | Production · firostatus.com | Limited preview |
|---|---|---|
| Light tip probes | Live | Live |
| Anon-set sweeps | anonset_source: live | Often baked snapshot |
/api/history + uptime % | Yes (SQLite) | No / incomplete |
| M1 public gates | Domain + forum live · MIT repo URL pending | Not CFC evidence alone |
Probes are public Electrum methods only. No addresses, keys, transactions, wallet traffic, or personal data are collected. This board is ops health for the curated fleet — not a wallet and not a privacy guarantee for funds.
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.
FCS proposal by panagot — ~$2,000 (in FIRO), paid after verification. Funding page · Forum thread · Roadmap.
Public JSON: /api/status · /api/ci · /api/history · /api/health · /api/docs · badge: /api/badge