Changelog

Site changes, audit fixes, and new features — dated

Human-maintained log so external readers can tell what was on the site at any given date. Newer entries on top. Source repo: ShadowOfTime1/monadpulse.

2026-04-30
Backlog burn-down — 8 fixes
  • Health score: active-set filter via on-chain get_execution_valset + silence->4h drop. The "30-50" bucket of 70 false-broken validators is gone; bottom of the table now starts at ~64 (real sub-optimal).
  • Map UX: Country and ISP columns; clickable top-6 country / top-5 ISP pills above the table for one-click filter.
  • About page: describes the new peers.toml+GeoIP pipeline and the mainnet observer node with its cgroup isolation from the testnet validator.
  • VDP signing-uptime on mainnet: API now points at our local mainnet observer (localhost:18080); 1h/8h/24h/7d windows resolve correctly via miner discovery on the live RPC.
  • SSH hardening: PermitRootLogin no, MaxAuthTries 3, AllowUsers shadowoftime, ClientAliveInterval 5min; cloud-init dangling sudoers removed; monad + monad-mainnet users → nologin shell.
  • Validators page: Location column with country code + ISP + datacenter dot, sourced from the same geo data as the map.
  • Governance ranks: migrated from execution_stake to consensus_stake (the value Monad actually uses for active-set selection). 5 testnet validators show a 22% exec/consensus gap during rotation in flight — these were ranked wrong before.
  • Stake history PK: migrated from (auth, epoch) to (val_id, epoch, network). Category Labs cluster (testnet val_ids 8/9/10/12 sharing one auth) now writes 4 rows/epoch instead of being collapsed — visible to the LLM impact analyser for the first time.
2026-04-30
Mainnet observer node + full mainnet map coverage
Stood up a mainnet full node ("observer", non-validating) on the same OVH server as the testnet validator, isolated via systemd cgroups (separate user monad-mainnet, dedicated NVMe drives nvme1n1+nvme3n1, CPU pinned to physical cores 12-15 + SMT siblings 28-31, MemoryMax caps at 12+16+6=34GB, IOWeight 50 vs testnet's 100). Same peers.toml-driven GeoIP pipeline now runs for both networks. Mainnet map: 16 → 201 validators (190 P2P-signed + 11 manual). Testnet adds the observer itself: 202 → 203. Snapshot restore took ~2 min; observer reached tip with lag=1 block within 5 min of launch. Testnet validator's block production was unaffected throughout. Mainnet ports: TCP 8002 + UDP 8002/8003 (p2p), TCP 18080 (RPC, localhost). Health monitor every 5 min (lag vs rpc.monad.xyz, peers.toml staleness, cgroup memory pressure) → Telegram.
2026-04-30
Map page — full validator coverage from peers.toml
Map now plots all 202 testnet validators (was 30, hand-curated) sourced from monad-bft peers.toml — the cryptographically-signed peer registry every node already gossips. Pipeline: a root cron job copies peers.toml from the validator's data dir every 30 min, build_validator_geo.py parses each (secp_pubkey, IP, name_record_sig) tuple, matches secp against validator-info to attach val_id/name, then batch-resolves IPs through ip-api.com for city / country / lat-lon / ASN / datacenter. A monadpulse-geo-rebuild.timer systemd unit refreshes the snapshot daily at 03:30 UTC. Popups now carry a source-tier icon: 🔒 P2P-signed + GeoIP (182), 👤 manually verified operator profile (20), — not yet in peer registry. Top-3 ISPs per cluster shown for each city. No mainnet equivalent yet — needs an observer node, deferred.
2026-04-28
Operator naming — upstream PR landed
shadowoftime (testnet val_id 267) is now in the upstream monad-developers/validator-info directory after the pending PR was merged. The local validator_directory_override_testnet.json kept the name visible on MonadPulse while the PR was in review; that override is now empty (no longer needed but kept as a hook for future pending-PR cases).
2026-04-26
Audit follow-up — terminology, changelog, clean URLs
  • Dashboard "Validators (this epoch)" → "Active validators · epoch N" with tooltip clarifying active vs registered.
  • This /changelog.html published; footer link added on every page.
  • Clean-URL routing: /blocks, /governance, etc. now load with full data (not the empty dashboard).
2026-04-26
Block Time tooltip + about.html dates corrected
Block Time tooltip now correctly notes that earlier mainnet blocks targeted 500ms and were later reduced to 400ms (previous wording said "earlier blocks were notably faster" — wrong direction). About page now distinguishes mainnet's first block (14 May 2025, ground-truth from eth_getBlockByNumber("0x1")) from public launch / TGE (24 November 2025).
2026-04-26
Audit fixes — 8 items
  • Governance: MIPs activated in MONAD_NINE (3, 4, 5, 6) now show Activated with cyan badge listing fork + activation date. Source: monad v0.13.0 release notes.
  • About page: mainnet launch date corrected; VDP attribution cleaned up.
  • Footer: "independent Monad validator" → "independent Monad testnet validator" on all 13 pages.
  • Alerts: HTML formatting (<blockquote>, <b>, <a>) now renders properly via a 6-tag whitelist sanitizer; previously displayed as escaped text.
  • Dashboard: "Block Time" → "Block Time (recent)" with tooltip distinguishing recent vs historical average.
  • Routing: nginx try_files updated to map /blocks → /blocks.html and similar (server-side fix; client-side dispatch follow-up below).
  • Governance reply counts: scraper switched from Discourse reply_count (top-level only) to posts_count - 1 to match what the forum's listing UI shows.
2026-04-25
Governance impact analyser switched to mainnet context
LLM-generated impact bullets for MIPs are now grounded against mainnet validator landscape (203 validators, 1.09B MON top stake, ~25M MON active-set threshold). Previously used testnet (197 validators, flat ~9-25M plateau). All 9 MIP analyses regenerated; validator-link URLs include &network=mainnet so clicks land on the right operator. Three-layer rank integrity: explicit rank-keyed context payload, hard prompt rule against rank manipulation, post-generation corrector that overwrites cited rank/stake from the live snapshot.
2026-04-25
Governance section v1 — full launch
New Governance page tracking all MIPs from forum.monad.xyz: per-proposal detail page (MIP-9 example) with plain-language summary, per-stakeholder impact analysis (validators / delegators / builders), unified timeline merging topic creation + replies + Discourse post revisions with real forum timestamps. Substantive vs cosmetic edits visually distinguished. Validator names in impact bullets are clickable links.
2026-04-23
VDP uptime metric on validator detail page
New "VDP Uptime" section on /validator.html?id=N with weekly target (≥98%) and 1h / 8h / 24h / 7d signing-uptime windows. Approximation noted explicitly: per-block leader election isn't exposed on-chain, so we use stake-weighted expectation as the assigned-blocks denominator.
2026-04-20
MonadPulse public launch
Initial release of monadpulse.xyz — independent analytics platform for Monad: dashboard, blocks, validators, map, stake, gas, alerts. Open-source MIT (repo). Built solo by shadowoftime on the same OVH server that runs the testnet validator (val_id 267).