Firo · Light-wallet infrastructure

Firo Spark Sync Monitor

Connecting…
Checking fleet…connecting to Firo backends
Public health signal for the Electrum backends Firo light wallets sync through — anon-set fetch cost, setHash agreement, tip lag, and TLS expiry. Built for wallet/SDK teams and operators. Privacy-safe probes only.
waiting for fleet…
What is Spark sync? · 30s
  1. Campfire / Stack light wallets pull the Spark anonymity set from ElectrumX — often tens of MB — not only chain headers.
  2. Height OK ≠ Spark OK. Watch fetch time, size, and setHash agreement across the fleet.
  3. Prefer backends that match fleet setHash, stay near tip lag, and keep TLS valid (≥14 days).
Limited preview mode. Tip / Spark id / TLS probes run live. Anon-set figures may be a baked snapshot (not a continuous sweep). Full durable charts, 24h/7d uptime, and live anon-set sweeps run on production: firostatus.com.
Live fleet · now
connecting…
Spark sync answer · now
Waiting for fleet probes…
Loading live data from the Firo Electrum backends… first probe can take up to ~20–30s.

Durable charts · tip lag, fleet mix, anon-set

SQLite · /api/history
No durable series in limited preview mode. Session charts at the bottom of Overview still update in-browser. Full tip-lag / fleet / anon-set history runs on firostatus.com.
Tip lag by backend (blocks)
Fleet health mix (stacked)
Anon-set fetch (s) · full Spark tab →

Fleet at a glance

Full backends table →
Backend Lag Spark id Anon-set setHash TLS 24h Status
Waiting for probes…

Server history · durable uptime?From SQLite on the always-on server (/api/history). Strict green % — yellow/red samples count as down. Separate from the browser session charts below. Always available on firostatus.com production.

24h / 7d · /api/history
24h / 7d uptime needs SQLite on the always-on host. In limited preview this panel stays empty — use the live status strip and scorecard, or open firostatus.com.
Fleet 24h
waiting for /api/history
Backend24h7dSamples (24h)
Durable history loads when the always-on server is recording…

Fleet scorecard

decision aid · monitor region
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.

One-click compare

pick 2–3 hosts
Waiting for backends…

TLS certificate countdown

sorted urgency · yellow <14d · red expired

Recent status changes

watching…

    Spark sync signal?Flagship metrics height-only tools miss: full anonymity-set fetch cost and setHash agreement. Production (firostatus.com) measures live continuously.

    flagship · anon set + setHash

    Tip can look fine while Spark sync still stalls on a slow or divergent set. Ranked fetch cards and bandwidth compare: Spark health.

    setHash incidents

    from /api/history
    Divergence windows are recorded on the always-on server. Live setHash ✓/✗ still shows in the glance table and Backends columns on this preview.
    Why this board exists
    Can wallets complete a Spark sync on these backends?

    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.

    This browser session · charts & probe RTT

    secondary · not durable history
    Fleet health over session ·
    green yellow red
    Avg probe RTT · median ·
    Measuring probe RTT…

    Live backend status

    synced & consistent lag / RTT outlier / Spark mismatch / TLS<14d unreachable / far behind / TLS expired
    Sorted critical → healthy
    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…
    Anonymity-set fetch health
    The Spark signal height only tools miss
    Each public backend’s active Spark anonymity set is fully downloaded so the community can see fetch time, size, and whether setHash matches across the fleet. Serve times are measured from this monitor’s region.

    Anon-set fetch time over history

    seconds · dashed = fleet slow band
    Time-series history needs always-on SQLite. Ranking cards below still use the latest snapshot / live merge on this preview.

    Anon-set growth · coins & MB

    fleet median over history
    Growth charts need multi-day samples from the always-on history on firostatus.com.

    setHash divergence windows

    from durable history
    Incident windows are always-on only. Per-backend setHash ✓/✗ is still live in the ranking table.

    Fetch ranking (fastest → slowest)

    #BackendFetchSizeCoinssetHash
    Waiting…

    Per-backend anon-set fetch?Full download of each backend's Spark anonymity set for the active coin group (spark.getsparkanonymityset): time, coins, MB, and setHash. This is the real mobile-sync bottleneck.

    Same set, different bandwidth?Backends can serve the same setHash at different byte sizes. Useful when comparing operator efficiency for mobile sync.

    bytes per full fetch · identical setHash
    collecting…
    Why this matters: height-only trackers miss the Spark path. The active coin group is often tens of thousands of coins / tens of MB and can take 15 to 40 s+ to serve. A backend can be green on tip and still stall mobile Spark sync. Fleet-wide 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).
    Delivery plan · FCS funded
    Ship always-on production, then ops tools
    Firo Crowdfunding System: $2,000 (in FIRO), 50/50 across two milestones — paid after verification, not upfront. Proposal is funded and WIP. Live now: firostatus.com HTTPS always-on board + JSON API + SQLite history. Still finishing M1 public gates: project MIT GitHub URL + forum launch write-up (link them here when posted). Then M2 ops (alerting, operator self-check, upstream, handover).
    Funded
    Proposal accepted · WIP
    Product
    Always-on probes + API + history
    Domain
    firostatus.com · HTTPS
    Next
    MIT repo + forum · then M2
    $2,000
    Total (in FIRO)
    50 / 50 · verify then pay
    ~3 wks
    Work duration
    within 1 month of funding
    MIT
    License
    repo URL pending

    Where delivery stands

    Live probes, Spark setHash health, durable history, and the public JSON API run on firostatus.com (always-on Node). Domain + HTTPS is live. Public MIT GitHub and the forum launch write-up stay pending until their URLs are posted (honesty for CFC). Scorecard / compare / diagnose already ship as early decision surfaces.

    M1 acceptance checklist · live

    CFC verifies product signals here plus the public gates. Prefer /api/ci spark_ok over green-count / early uptime %.

    • anonset_source = live
      Continuous always-on sweeps
    • Anon-set fields populated
      ms / MB / setHash on endpoints
    • /api/history recording
      sample_count + uptime %
    • ok
      Own domain + HTTPS
      firostatus.com · always-on
    • pend
      Public MIT GitHub
      README · methodology · CONTRIBUTING
    • pend
      Forum launch write-up
      point at live URL + API curls
    # 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}'
    Milestone 1 · Always-on production · Week 1 · $200 hosting line · paid after verify
    $1,000
    • Public MIT GitHub repo with README, methodology, and contribution guide
    • Own domain + HTTPS always-on hosting (firostatus.com)
    • Production dashboard: reachability, height, tip lag, probe RTT, version, TLS
    • Spark coin group consistency cross-checked across the public fleet
    • Live anon-set fetch health: time, size/coins, setHash consistency
    • Durable history (SQLite) with 24h / 7d uptime % (strict green; interpret with /api/ci)
    • Public JSON API (/api/status, /api/docs, /api/history, /api/health) + curl / CI examples
    • Firo forum launch write-up for the community
    Acceptance: live public URL on own domain; repo public under MIT; API returning real fleet data; anon-set fetch-health populated; continuous history recording.
    Milestone 2 · Ops, decision tools & upstream · Weeks 2–3 · on delivery
    $1,000
    • Per backend detail pages with durable history charts (24h / 7d; 30d when history accumulates)
    • Anon set growth tracker (coins, MB, fetch time over time)
    • Opt in alerting (Telegram / Discord / webhook) for red status, Spark / setHash mismatch, or lag spikes
    • Operator self service: add or verify your server + privacy-safe self check page
    • Embed kits / README + status-page snippets for live /api/badge + CI curls (Developers tab)
    • Wallet scorecard: ranked Reliable? table (Spark · setHash · fleet slow band · tip · uptime · TLS)
    • One-click compare: side-by-side Spark id, setHash, fetch MB/ms, lag, TLS across 2–3 backends
    • Public Spark incident / transparency log (setHash divergence windows)
    • Developers docs: ElectrumX→field map, spark_ok-first CI, deep links, setHash pin curls
    • At least one upstream contribution to Firo wallet or docs (e.g. Spark health check)
    • Handover runbook and 6 to 12 month uptime commitment
    Acceptance: remaining M2 = alerting + operator self-check + upstream PR + handover; decision surfaces (detail / scorecard / compare / incidents / docs) already ship on the always-on build.

    Budget · $2,000

    paid in FIRO after milestone verification
    M1 · production engineering + deploy$800
    M1 · domain + VPS hosting (12 months)$200
    M2 · ops, decision tools, alerting, upstream$1,000
    Total$2,000
    For Firo developers
    Machine readable Spark Electrum fleet health

    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.

    Who this is for

    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.

    vs a wallet Electrum SDK: an SDK (or app) talks to one host and does real Spark sync for the user. This monitor watches the curated public fleet — tip lag, coin-group agreement, full anon-set fetch ms/MB, and 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.

    Where this sits in the Firo stack

    LayerRoleTypical 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
    Electrum clients query one host. This API watches the fleet. Use it when the community needs a shared answer: which public backends agree on Spark state, and how costly a full anon set fetch is right now.
    Open /api/docs
    Loading live /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 %.

    Public JSON routes

    GET /api/status
    Full fleet snapshot: lag, Spark consistency, anon set health, status_reasons, summary, and a meta block.
    GET /api/spark
    Compact Spark consensus for docs and light polling. Includes inconsistent endpoint ids without ranking hosts.
    GET /api/ci
    Pass/fail JSON. HTTP 200 when ok (Spark healthy and tip lag ≤2). Prefer spark_ok for Spark-only gates. When ok, notes may explain ops-yellow hosts.
    GET /api/docs
    Machine readable field glossary, probe list, deep links, and example uses.
    GET /api/badge
    SVG badge for READMEs. Prefers spark ok over green-count (yellow ops hosts do not imply Spark failure).
    GET /api/history
    Durable SQLite: points, fleet series, events.sethash, 24h/7d uptime % (strict green; not a wallet SLA). Query ?hours=&id=&limit=.
    GET /api/health
    Liveness: Node uptime, last snapshot summary, sqlite sample_count. No filesystem paths.

    Fields that matter in /api/status

    FieldMeaning for a developer
    referenceMajority safe fleet tip. Highest height that at least two backends agree on, so one forked host cannot skew lag for everyone.
    spark_consensusModal active Spark coin group id from spark.getsparklatestcoinid.
    spark_sethash_consensusModal anon set setHash across measured backends.
    endpoints[].lagBlocks behind reference. Primary freshness signal.
    endpoints[].spark_consistenttrue when this host’s coin group matches fleet consensus.
    endpoints[].anonset.msWall time to fully download the active anon set from this monitor’s region.
    endpoints[].anonset.mb / coinsBytes on the wire and coin count for that full fetch.
    endpoints[].anonset.setHash / consistentIdentity of the set and whether it matches fleet setHash consensus.
    endpoints[].latency_msLight probe RTT from this monitor only. Secondary. Not user device latency and not a ranking score.
    endpoints[].statusgreen / yellow / red from tip lag, Spark/setHash consistency, TLS, and fleet-relative probe RTT (outlier vs median — not a fixed 3s wall).
    endpoints[].status_reasonsHuman-readable why the host is yellow/red (e.g. tip lag, RTT outlier, setHash mismatch, TLS <14d).
    stats.probe_rtt_yellow_threshold_msCurrent RTT yellow band: max(5000, 2.5× median probe RTT).
    anonset_sourcelive on firostatus.com (continuous always-on sweeps).
    tls_valid_to / tls_days_leftPeer TLS certificate expiry and whole days remaining (observed; CA trust not enforced).
    anonset_checked_atWhen the last completed full anon-set sweep finished. May lag checked_at during a long sweep.
    metaPurpose notes, probe methods, status rules, and height-only vs Spark field map.

    Height only checks vs Spark path

    What you look atWhat you learnWhat you miss
    ok, height, lagHost 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

    Concrete jobs this API supports

    1. CI or ops alert. Fail a job or page someone when any default host has spark_consistent === false or anonset.consistent === false.
    2. Incident triage. Separate an app bug from an Electrum host that is serving a slow or divergent Spark set.
    3. Default list review. Compare anonset.mb and anonset.ms across operators before publishing recommended backends (same setHash can still mean different bytes on the wire).
    4. Docs transparency. Embed /api/badge or poll /api/ci from a status page.

    Example: list Spark inconsistent hosts

    curl -sS ORIGIN/api/status \
      | jq '[.endpoints[]
          | select(.spark_consistent == false
              or (.anonset != null and .anonset.consistent == false))
          | {name, lag, spark_consistent, anonset}]'

    Example: spark_ok-first CI (recommended for Spark sync)

    # 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.

    Example: compact consensus poll

    curl -sS ORIGIN/api/spark \
      | jq '{checked_at, spark_consensus, spark_sethash_consensus, summary, inconsistent}'

    Pin / audit fleet setHash

    # 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:]'

    Embed kit

    <!-- README / status page -->
    ![Spark fleet](ORIGIN/api/badge)
    
    <!-- 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.

    ElectrumX method → JSON field

    Electrum methodMonitor fields
    server.versionversion, tls_valid_to, tls_days_left
    blockchain.headers.subscribeheight, lag
    spark.getsparklatestcoinidspark_latest_coin_id, spark_consistent, spark_consensus
    spark.getsparkanonymitysetanonset.ms/mb/coins/setHash/consistent, spark_sethash_consensus

    Privacy and probe surface

    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.

    Not for

    • In-wallet server picker / user-device RTT ranking
    • Authoritative chain state (full nodes remain authoritative)
    • Replacing Campfire / Stack / Electrum-Firo Spark sync itself

    Start here: /api/docs · /api/ci · /api/status · /docs/VERIFY.md

    What this is

    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.

    How to read the Overview in 30 seconds

    1. Spark / tip gates — prefer /api/ci spark_ok (and ok) over green-count alone.
    2. Durable charts + fleet at a glance — lag, fleet mix, anon-set cost, who agrees on setHash.
    3. Scorecard / compare / diagnose — decision aids; early history can keep “Reliable?” false even when Spark PASSes.

    What it checks (privacy safe)

    • server.version: reachability, TLS, software version, cert expiry
    • blockchain.headers.subscribe: chain height and lag vs fleet reference tip
    • spark.getsparklatestcoinid: active Spark coin group id, cross-checked across backends
    • spark.getsparkanonymityset: full anon-set fetch time, size, and setHash consistency

    No 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.

    Status model

    • green: reachable, ≤2 blocks behind, Spark id + setHash match fleet, TLS ≥14 days, probe RTT not a fleet outlier (band = max(5s, 2.5× median RTT))
    • yellow: tip lag >2, RTT outlier, missing Spark id, coin id / setHash mismatch, or TLS <14d — see status_reasons. Yellow is ops; spark_ok can still PASS
    • red: unreachable, more than 100 blocks behind, or TLS certificate expired

    Production vs preview

    SurfaceProduction · firostatus.comLimited preview
    Light tip probesLiveLive
    Anon-set sweepsanonset_source: liveOften baked snapshot
    /api/history + uptime %Yes (SQLite)No / incomplete
    M1 public gatesDomain live · MIT repo + forum write-up pending URLsNot CFC evidence alone

    Privacy statement

    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.

    Scoring (short)

    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.

    Funding

    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 firo spark fleet health badge