Tip can look fine while Spark sync still stalls on a slow or divergent set. Ranked fetch cards and bandwidth compare: Spark health.
| Backend | Lag | Spark id | Anon-set | setHash | Status |
|---|---|---|---|---|---|
| Waiting for probes… | |||||
| Backend | 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 (snapshot on this preview). | 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 · yellow = lag / slow / missing Spark id / coin-id or setHash mismatch (setHash ✗ alone is enough) · red = unreachable or far behind. |
|---|---|---|---|---|---|---|---|---|
| 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. Funded always on hosting keeps anon set sweeps continuous (see Roadmap).
The Vercel preview already proves the Spark signal. What’s left is always-on community infrastructure (continuous anon-set sweeps, durable history, own domain), then tools so wallet teams and operators can decide, not only watch a status wall.
/api/status, /api/docs, /api/history) + concrete curl / CI examples/api/badge (and docs embeds)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…meta block describing purpose.ok (Spark healthy and tip lag ≤2). Mild lag alone can yield spark_ok: true with HTTP 503 — use spark_ok for Spark-only gates./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, or red from lag, Spark consistency, and probe RTT rules (see meta.status_rules). |
| anonset_source | snapshot on this Vercel preview (bundled last sweep). live on the always on host once funded. |
| anonset_checked_at | When the last full anon set sweep finished. May be older than checked_at on the preview. |
| meta | Purpose notes, probe methods, status rules, and height only vs Spark field map. Safe to ignore if you only need metrics. |
| 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 https://firo-spark-sync-monitor.vercel.app/api/status \
| jq '[.endpoints[]
| select(.spark_consistent == false
or (.anonset != null and .anonset.consistent == false))
| {name, lag, spark_consistent, anonset}]'
/api/ci# Exit non zero when tip+Spark gate fails (HTTP 503)
curl -sS -f https://firo-spark-sync-monitor.vercel.app/api/ci \
| jq '{ok, spark_ok, max_lag, reasons, green, yellow, red}'
ok requires spark_ok and max_lag ≤ 2. Mild lag alone can yield spark_ok: true with ok: false — see reasons. -f fails curl on HTTP 503. For Spark-only CI, assert spark_ok.
curl -sS https://firo-spark-sync-monitor.vercel.app/api/spark \
| jq '{checked_at, spark_consensus, spark_sethash_consensus, summary, inconsistent}'
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/status · /api/ci
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. The dashboard and the API show the same data. See Developers for integration details.
spark_ok vs strict tip band (ok / max lag ≤2).server.version: reachability, TLS, software versionblockchain.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 consensus is the modal value across the fleet.
setHash mismatch — tip can be 0 blk with Spark id matching and still yellow on setHash ✗This preview already probes the live fleet and ships a Developers JSON guide. Funding moves it to always-on hosting with continuous anon-set sweeps, durable multi-day history, alerting, operator tooling, wallet scorecard / compare views, Spark incident log, deeper ElectrumX method docs, and a proper community domain. Details on the Roadmap.
Public JSON API: /api/status · field docs: /api/docs · badge: /api/badge