A blue-and-black static dashboard that tracks:
- Cardano blockchain epochs — live epoch number, countdown to the next epoch, epoch start/end, slot position and progress bar (computed on-device from mainnet genesis, works fully offline).
- Cardano staking rewards in ADA — per-epoch ADA (₳) rewards for your stake pool (the main staking reward), with USD estimates from the live ADA price, plus any other assets paid in the same epoch.
- Staking Rewards & Other Assets cards — an ADA card auto-aggregated from the payout table (cumulative rewards, average per epoch, annualized estimate at 73 epochs/year, sparkline), plus a card for each other asset your pool earns (e.g. RealFi (REALFI)).
- Network snapshot — best-effort live ADA price (Blockchair, CoinGecko fallback) and block/supply stats (Blockchair). Degrades gracefully to offline mode when APIs are unreachable.
- Donations — your Cardano wallet address with copy button, QR code, and explorer links.
- X profile — linked throughout: https://x.com/kshot9000
No build step, no backend — it's one index.html file, which makes it perfect for GitHub Pages.
- Open
index.htmlin any browser. That's it. - Or serve it:
npx serve .(or Python:python -m http.server 8000) and visithttp://localhost:8000.
- Create a new GitHub repository (e.g.
cardano-spo-tracker). - Push this folder to it:
cd cardano-spo-tracker git init git add . git commit -m "Cardano SPO Tracker" git branch -M main git remote add origin https://github.com/<YOUR-USERNAME>/cardano-spo-tracker.git git push -u origin main
- In the repo, go to Settings → Pages → Build and deployment → Source: Deploy from a branch → Branch:
main, folder:/ (root)→ Save. - After ~1 minute your site is live at:
https://<YOUR-USERNAME>.github.io/cardano-spo-tracker/- …or
https://<YOUR-USERNAME>.github.io/if you name the repo<YOUR-USERNAME>.github.io.
Tip: because everything is one file, you can also just upload
index.html(plus this README) via the GitHub website's upload button.
Open index.html and scroll to the CONFIG block near the bottom (clearly marked ████ CONFIG — EDIT YOUR DATA HERE ████). Everything you care about is there:
| What | Where |
|---|---|
| Donation address | DONATION_ADDRESS (currently your addr1… address) |
| X profile | X_PROFILE / X_HANDLE |
| Your stake pools | POOLS array — add { name, ticker } entries |
| Per-epoch ADA staking rewards | EPOCH_PAYOUTS array — one object per epoch, newest first (the ADA card aggregates these automatically) |
| Other assets (RealFi, etc.) | ASSET_TRACK array — add { id, name, ticker, color, blurb, usdPrice, payouts: [...] } |
Rules of thumb:
- Add one
EPOCH_PAYOUTSrow per epoch with the epoch number, settlement date, pool ticker, ADA amount, and anyotherassets paid that epoch. - Set
sample: falseon each row once the numbers are real (removes the "sample" flag). - In
ASSET_TRACK, setusdPriceto a number (e.g.0.05) if you want a USD value on the card — leavenullto hide it. - Payout lists are sorted newest-first; the sparkline shows the last 8 payouts.
No JS logic needs to change — the page renders whatever is in the config.
| Data | Source | Needs key? |
|---|---|---|
| Epoch number, countdown, slots, progress | Computed on-device from Cardano mainnet genesis (2017-09-23 21:44:51 UTC, 5-day / 432,000-slot epochs at 1-second slots) | No — works offline |
| API epoch cross-check | Blockchair best_block_epoch (some explorers count one epoch ahead — the on-device clock is the primary value) |
No |
| ADA price (USD) + 24h change | Blockchair market_price_usd, with CoinGecko as fallback |
No |
| Total blocks / supply / transactions / best block time | Blockchair public API | No |
| Your payouts & asset payouts | The CONFIG block in index.html (you edit) |
No |
If the network is unavailable or an API rate-limits you, the site drops to OFFLINE MODE (amber pill): the epoch clock keeps ticking and all your payout data stays visible.
node --test tests/smoke.test.mjsThe smoke suite extracts the page's epoch engine and checks it against Koios ground truth (epoch 659 start/slot anchors), verifies the donation address is the site owner's checksum-valid bech32 address, and guards the explorer-link and 404/og hygiene.
- The QR code loads from the cdnjs
qrcodejsCDN; if a visitor is fully offline it falls back to a copy-the-address prompt. - This is an independent tracker — not affiliated with the Cardano Foundation or Input Output Global.