About MonadPulse
What this is, where the data comes from, and how it works
What is MonadPulse?
MonadPulse is an independent analytics platform for the Monad network. It shows what no standard block explorer does: validator performance patterns, health scores, block production anomalies, gas trends, and real-time alerts.
Built by shadowoftime, an independent Monad testnet validator based in Sydney, Australia. The platform runs on the same server as the validator node, pulling data directly from the local RPC with zero external dependencies.
How does Health Score work?
Each validator gets a score from 0 to 100 recalculated every hour. The score is a weighted composite of five factors:
validator_stake / total_stake × network_blocks) since per-block leader election isn't exposed on-chain — correct in long-window averages. Target ≥98% weekly. During Foundation stake rotation when the validator is out of consensus, blocks_assigned = 0 and the validator is excluded from this metric, not penalised.
Color coding: green (80+) = excellent, orange (50-80) = moderate, pink (<50) = needs attention.
A 🔄 badge next to a validator's name means they are currently in Monad Foundation's stake-rotation cycle. Until the active-set is expanded via MIP9, Foundation periodically pulls part of its VDP delegation from some validators and redistributes it to others — so every delegated validator gets time in the active-set. Validators flagged here are intentionally idle, not failing: uptime scoring skips the recency penalty for them, so their Health reflects pre-rotation performance, not the forced gap.
The 0–100 scale is the theoretical maximum. In practice no validator reaches 100: it would require perfect uptime (40pt) plus perfect block timing (20pt) plus latest client upgrade within hours (15pt) plus maximum delegation stake (15pt) plus 30+ days active (10pt). A validator in the upper-70s is at or near the top of the network. The same composite value appears in the API, on the Dashboard, on the Validators page and on each validator's detail page — no per-page re-scaling.
Where does the data come from?
get_delegators per validator — rebuilt weekly and on every epoch boundary.
peers.toml) from our own Monad nodes — every validator publishes a signed name record with their IP and ports, and our nodes accumulate these as they discover peers. (2) Manual override from each operator's public information (website, social profiles) for the small set of validators not yet seen via P2P. IPs are then resolved through ip-api.com for city, country, ASN, and datacenter classification. Refreshes daily at 03:30 UTC.
What are the Alerts?
MonadPulse monitors the network and generates alerts for notable events:
Slow blocks (>5 seconds) — something unusual happened with the proposer or network.
New epochs — boundary block reached, validator set may have changed.
TPS spikes — transaction volume >2x the 24h average.
New client releases — critical for VDP validators (48h update window).
All alerts are also sent to the public Telegram channel. Subscribe to get notified instantly.
Technical stack
Collector: Python asyncio service pulling blocks in real-time from local Monad RPC. Runs as systemd unit with rate limiting, graceful shutdown, and automatic backfill.
Database: PostgreSQL 16 with separate tables for blocks, epochs, health scores, gas stats, and alerts. All tables have a network column for testnet/mainnet separation.
API: FastAPI with async PostgreSQL queries. Rate-limited at nginx level (30 req/s).
Frontend: Vanilla HTML/JS with Chart.js. No framework, no build step. Dark theme with Monad brand colors.
Infra: OVH Advance-4, AMD EPYC 4585PX, 64GB RAM, 4x NVMe. Sydney, Australia.
Open source
MonadPulse is open source under the MIT license.
github.com/ShadowOfTime1/monadpulse