Skip to main content
Glama
terra-pulse

terra-pulse

◉ TERRA PULSE

The planet has a pulse. Now you can hear it.

Live earthquakes (USGS) + wildfires, storms & volcanoes (NASA EONET) → one open Next.js dashboard with a WebGL planet, an explainable risk engine, a quantum-resilient audit seal, and an MCP server your coding agent can call.

Live Demo MIT Next.js MCP USGS NASA

Live App · Quakes API · MCP Endpoint · Risk API · Report an issue

Legend for every diagram below — 🩵 cyan = live data · 🟣 violet = AI/engine · 💚 emerald = agents/verified · 🟡 amber = external/caution · 🌹 rose = risk/alerts · ⬜ slate = infra.


Why this exists

2026 set records nobody wanted: 5,480+ earthquakes ≥ M4.5 and 7,700+ wildfires, floods, storms and volcanic events in a single year, with record heatwaves across Europe, Asia, Africa and North America. Meanwhile every AI agent suddenly speaks MCP — and every agent-to-tool hop is a new place for data to leak (the “harvest now, decrypt later” problem).

Terra Pulse sits exactly at that intersection:

Real world 🌍

What we built ⚡

Record quakes, fires, storms — people need one calm screen

Live USGS + NASA feeds, biggest-first, searchable, tsunami flags surfaced

AI agents need live tools, not screenshots

get_quakes · get_events · analyze_risk over MCP-style JSON-RPC — no key, no signup

Black-box “AI risk scores” nobody trusts

Deterministic engine: every point of the 0–100 score is itemized

“Harvest now, decrypt later” quantum anxiety

Every record sealed into a SHA-384 hash chain (tq384:), PQC swap-in marked in code

Related MCP server: earthquake-mcp-server

✨ Features

  • 🌐 WebGL planet — react-globe.gl (Three.js): night-earth texture, quake points sized/colored by magnitude, ripple rings on the strongest events, animated sequence arcs, auto-rotate, click-through to USGS

  • 📡 Live ticker + stats — strongest 24h, M4.5+ count, tsunami flags, open EONET events, auto-refresh every 2 min

  • 🔎 Quake explorer — magnitude slider, place search, per-event detail with USGS deep-link + one-click risk analysis

  • 🔥 NASA EONET board — wildfires / severe storms / volcanoes / floods with category filters

  • 🧠 Explainable risk engine (POST /api/analyze) — magnitude × depth × tsunami × exposure → score, level, felt radius, factors, actions, briefing, seal

  • 🤖 MCP server (/api/mcp) — initialize / tools/list / tools/call for Claude Code, Cursor, OpenCode

  • ⛓️ Seal chain — SHA-384(prevSeal ‖ canonicalJson), genesis TERRA-GENESIS, verifiable by replay

  • 🎨 Design system — dark-first aurora UI, glass panels, Geist + Mono, marquee, section-numbered narrative, mobile responsive, zero env vars

🏗️ System architecture

flowchart LR
    classDef live fill:#22d3ee,stroke:#0e7490,color:#04060c
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef agent fill:#34d399,stroke:#047857,color:#04060c
    classDef ext fill:#fbbf24,stroke:#b45309,color:#04060c
    classDef infra fill:#94a3b8,stroke:#475569,color:#04060c
    USGS([USGS feed]):::ext --> QAPI[/api/quakes<br/>120s cache + seal/]:::live
    EONET([NASA EONET]):::ext --> EAPI[/api/events<br/>300s cache + seal/]:::live
    QAPI --> UI{{Next.js dashboard<br/>planet + feed + ticker}}:::infra
    EAPI --> UI
    UI --> RISK[/api/analyze<br/>terra-risk-v1/]:::engine
    QAPI --> MCP[/api/mcp<br/>3 agent tools/]:::agent
    EAPI --> MCP
    RISK --> MCP
    MCP --> AGENT([Claude / Cursor / OpenCode]):::agent

🔄 Data-pipeline flow

How a tremor in Chile becomes a glowing dot on your screen in under two minutes:

flowchart TB
    classDef live fill:#22d3ee,stroke:#0e7490,color:#04060c
    classDef ext fill:#fbbf24,stroke:#b45309,color:#04060c
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef ok fill:#34d399,stroke:#047857,color:#04060c
    classDef infra fill:#94a3b8,stroke:#475569,color:#04060c
    A([USGS publishes GeoJSON]):::ext --> B{Fetch OK?}:::live
    B -- yes --> C[Normalize + sort biggest-first]:::live
    B -- no --> D[Sealed offline sample feed]:::engine
    C --> E[Chain tq384 audit seals]:::engine
    D --> E
    E --> F[Edge cache: 120s quakes / 300s EONET]:::infra
    F --> G[UI auto-refresh + globe layers]:::ok
    G --> H([You see it pulse]):::ok

🧠 Risk-engine flow

src/lib/risk.ts — one function serves the UI, the REST API, and the MCP tool:

flowchart LR
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef risk fill:#fb7185,stroke:#be123c,color:#04060c
    classDef ok fill:#34d399,stroke:#047857,color:#04060c
    classDef infra fill:#94a3b8,stroke:#475569,color:#04060c
    IN([magnitude · depth<br/>tsunami · place]):::infra --> M[Magnitude term<br/>M-3 x 18]:::engine
    IN --> DP[Depth term<br/>shallow +12 / deep -8]:::engine
    IN --> TS[Tsunami term<br/>+20 + coastal actions]:::risk
    IN --> EX[Exposure term<br/>offshore +6 / urban +8]:::engine
    M --> SUM((score 1-99)):::risk
    DP --> SUM
    TS --> SUM
    EX --> SUM
    SUM --> LVL{level?}:::risk
    LVL --> OUT([briefing + actions + seal]):::ok

Level bands: LOW <25 · GUARDED <45 · ELEVATED <65 · HIGH <85 · CRITICAL ≥85. Felt radius: min(1500, max(5, 10 × 2^(M−4))) km.

🤖 Agent (MCP) sequence

What happens when your coding agent asks about the planet:

sequenceDiagram
    participant A as Agent (Claude/Cursor)
    participant M as /api/mcp (JSON-RPC)
    participant Q as /api/quakes
    participant R as terra-risk-v1
    A->>M: tools/list
    M-->>A: get_quakes · get_events · analyze_risk
    A->>M: tools/call get_quakes {minMag: 4.5}
    M->>Q: sealed live feed
    Q-->>M: 80 quakes + tq384 seals
    M-->>A: top events
    A->>M: tools/call analyze_risk {M6.4…}
    M->>R: deterministic assessment
    R-->>M: CRITICAL 99 + factors + seal
    M-->>A: briefing with cited seals

⛓️ Seal-chain integrity

flowchart TB
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef risk fill:#fb7185,stroke:#be123c,color:#04060c
    classDef ok fill:#34d399,stroke:#047857,color:#04060c
    classDef infra fill:#94a3b8,stroke:#475569,color:#04060c
    G([GENESIS: TERRA-GENESIS]):::infra --> S1[seal 1 = SHA-384<br/>prev + canonical JSON]:::engine
    S1 --> S2[seal 2 commits to seal 1]:::engine
    S2 --> S3[seal 3 commits to seal 2]:::engine
    S3 --> V{Edit 1 byte<br/>in record 2?}:::risk
    V -- yes --> X([seals 2..n ALL break<br/>tampering is evident]):::risk
    V -- no --> Y([replay src/lib/seal.ts<br/>seals match = verified]):::ok

SHA-384 keeps a 192-bit margin under Grover-style quantum search; the ML-DSA (Dilithium) signature swap-in point is marked in code for the post-quantum upgrade.

🚀 Deployment pipeline

Push to main and Vercel ships it — the same gates run locally and in CI:

flowchart LR
    classDef infra fill:#94a3b8,stroke:#475569,color:#04060c
    classDef ok fill:#34d399,stroke:#047857,color:#04060c
    classDef risk fill:#fb7185,stroke:#be123c,color:#04060c
    classDef live fill:#22d3ee,stroke:#0e7490,color:#04060c
    P([git push main]):::infra --> L[npm run lint]:::infra
    L --> B[npm run build]:::infra
    B --> G[GitHub: CI green]:::ok
    G --> V[Vercel auto-deploy]:::live
    V --> C{HTTP verify?}:::live
    C -- 200s + counts --> D([LIVE]):::ok
    C -- fail --> F([fix + redeploy]):::risk

🧭 User-journey flow

flowchart TB
    classDef live fill:#22d3ee,stroke:#0e7490,color:#04060c
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef agent fill:#34d399,stroke:#047857,color:#04060c
    classDef risk fill:#fb7185,stroke:#be123c,color:#04060c
    L([Land on hero planet]):::live --> T[Read ticker + stats]:::live
    T --> F[Filter quakes / EONET]:::live
    F --> S{Found your event?}:::live
    S -- yes --> A[One-click risk analysis]:::engine
    S -- no --> F
    A --> R{Level HIGH+?}:::risk
    R -- yes --> W[Follow actions + verify with USGS]:::risk
    R -- no --> C[Stay informed]:::live
    W --> M[Or ask your agent via MCP]:::agent
    C --> M

🗺️ Roadmap

Phase 1 — Now: deepen the signal (in progress)

  • Polygon rendering for EONET fire/flood perimeters (currently points)

  • Per-region pages (/region/[id]) with shareable risk briefings

  • Playwright smoke tests: globe mounts, feed renders, MCP round-trip

flowchart LR
    classDef live fill:#22d3ee,stroke:#0e7490,color:#04060c
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef ok fill:#34d399,stroke:#047857,color:#04060c
    P1([Polygons]):::live --> R1([Richer map]):::live
    P2([Region pages]):::engine --> R2([Shareable briefs]):::engine
    P3([Smoke tests]):::ok --> R3([Fearless deploys]):::ok
    R1 --> WOW1([Wow: your fire, your street]):::ok

Phase 2 — Next: agent-native planet

  • MCP streamable-HTTP transport + tool schemas for more clients

  • Alert subscriptions: agent-notified when M6+ or tsunami flag appears in your watch zone

  • Coastal-distance estimator + aftershock-decay notes in the engine

flowchart LR
    classDef agent fill:#34d399,stroke:#047857,color:#04060c
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef risk fill:#fb7185,stroke:#be123c,color:#04060c
    A1([More transports]):::agent --> B1([Every agent connects]):::agent
    A2([Watch-zone alerts]):::risk --> B2([Pinged before the news]):::risk
    A3([Coastal + aftershock math]):::engine --> B3([Sharper briefings]):::engine
    B1 --> WOW2([Wow: ask anything, planet answers]):::agent

Phase 3 — Later: hardened + global

  • ML-DSA-65 signature envelope on the seal chain (swap-in marked in src/lib/seal.ts)

  • i18n safety actions (10 languages) + light mode + reduced-motion pass

  • GDACS/NOAA sources, OG image generator, PWA offline briefings

flowchart LR
    classDef engine fill:#a78bfa,stroke:#6d28d9,color:#04060c
    classDef live fill:#22d3ee,stroke:#0e7490,color:#04060c
    classDef ok fill:#34d399,stroke:#047857,color:#04060c
    C1([PQC signatures]):::engine --> D1([Quantum-proof log]):::ok
    C2([i18n + a11y]):::live --> D2([Everyone understands]):::live
    C3([More sources + PWA]):::live --> D3([Works anywhere]):::ok
    D1 --> WOW3([Wow: trust at planetary scale]):::ok

🚀 Quickstart (Next.js)

git clone https://github.com/aniruddhaadak80/terra-pulse.git
cd terra-pulse
npm install
npm run dev        # http://localhost:3000

Production:

npm run build && npm start

No environment variables required. Sealed offline samples keep the UI, build, and demo alive with no network. Why Next.js: App Router pages + API routes + edge caching + metadata/SEO live in one deployable unit — no separate backend, no CORS hacks, one vercel --prod ships everything.

🔌 Use it as an API

# Live quakes (biggest first, sealed)
curl https://terra-pulse-sooty.vercel.app/api/quakes | head -c 600

# Open NASA events
curl https://terra-pulse-sooty.vercel.app/api/events | head -c 600

# Risk briefing (GET or POST)
curl 'https://terra-pulse-sooty.vercel.app/api/analyze?magnitude=6.4&depthKm=18&tsunami=1&place=Offshore%20Maule,%20Chile'

🤖 Give your agent a live planet

Paste into mcp.json (Claude Code / Cursor / OpenCode):

{ "mcpServers": { "terra-pulse": { "url": "https://terra-pulse-sooty.vercel.app/api/mcp" } } }

Then ask: “What were the strongest earthquakes in the last 24h, and what's the risk briefing for the biggest one?” — the agent calls get_quakes → analyze_risk and cites the tq384: seals. Try it without any agent via the Live Agent Console on the site.

Raw JSON-RPC also works:

curl -X POST https://terra-pulse-sooty.vercel.app/api/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

📁 Project map

src/
  app/
    page.tsx                 # hero + WebGL planet + ticker + all sections
    layout.tsx               # metadata + fonts + theme
    api/quakes/route.ts      # USGS proxy (120s cache, sealed, offline fallback)
    api/events/route.ts      # EONET proxy (300s cache, sealed, offline fallback)
    api/analyze/route.ts     # risk engine (GET + POST)
    api/mcp/route.ts         # MCP-style JSON-RPC (initialize/list/call)
    api/health/route.ts      # health check
  components/
    PlanetGlobe.tsx          # react-globe.gl WebGL planet (points/rings/arcs) + error boundary
    GlobeCanvas.tsx          # lightweight canvas fallback if WebGL lib fails
    LiveDashboard.tsx        # quake explorer + EONET board
    Analyzer.tsx             # risk engine UI
    McpDocs.tsx              # agent setup + live console
    SealStrip.tsx            # audit-chain visualizer
    chrome.tsx               # navbar + ticker + stats + footer
  lib/
    risk.ts                  # deterministic risk engine
    seal.ts                  # tq384 hash chain
    types.ts                 # shared types
    fallback.ts              # offline sample feeds

🛡️ Disclaimers

Automated briefings are informational, not official warnings. Always verify with the USGS event page and your local disaster agency before acting.

🤝 Contributing

PRs welcome — see CONTRIBUTING.md. The roadmap above is the fastest way to find a high-impact first issue.

📜 License

MIT — see LICENSE. Data © USGS / NASA EONET (their terms apply to the feeds). Globe rendering via react-globe.gl (MIT) + night-earth texture from three-globe examples (CDN, falls back to a dark globe offline).

🙏 Acknowledgments


If the planet is talking, the code should be open. ⭐ Star it, fork it, stay safe.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides 25 geophysical intelligence tools for multi-hazard risk scoring, earthquake/volcano/tsunami/sinkhole prediction, weather intelligence, insurance underwriting, climate migration, and parametric triggers.
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables LLM agents to access live seismic data, calculate emergency vehicle routes, and dispatch first responders to incidents.
      MIT
    • F
      license
      B
      quality
      C
      maintenance
      Enables AI agents to query verifiable physical-world ground truth for any point on Earth — water availability, seismic and space-weather hazard, ground stability, and resource indications — with every answer backed by a Bitcoin-anchored provenance record that can be independently verified. It also lets agents check whether an Earth-science hypothesis has already been tested, list documented nulls and retractions, and run bounded controlled tests that return UNTESTABLE rather than fabricate a result.
      11
      -