* refactor(emails): refresh Pro welcome email — surface WM Analyst, Widgets, MCP
The Pro welcome email rendered a stale 4-card 2×2 grid (Near-Real-Time,
AI Analyst, Multi-Channel Alerts, "10 Dashboards") that missed three of
the release's signature differentiators and carried a wrong stat ("10
Dashboards" — the actual Pro surface is 50+ panels per the pricing
table). Net effect: paying users got a welcome email that undersold what
they bought and didn't point at the highest-retention action (the brief).
This commit rewrites the Pro path of userWelcomeHtml + featureCardsHtml
to the "signature-first" 2×3 grid designed via the playground at
docs/plans/pro-welcome-email-playground.html:
WM Analyst 🤖 Create Custom Widgets 🧩
MCP Integration 🔌 Daily AI Brief ☀️
Multi-Channel 50+ Pro Panels 📐
Delivery 📬
Other shifts on the Pro path:
- Headline: "Welcome to {planName}!" → "Welcome to {planName} — your
intel, delivered." — parameterized so pro_annual/pro_monthly both read
correctly.
- CTA: "Open Dashboard" (→ /) → "Open My Brief" (→ /brief). The brief
is the single highest-retention action for a new Pro.
- New "Invite your team" referral block above the CTA.
- New support contact line under the CTA, pointing at ADMIN_EMAIL so
replies route correctly.
API-plan path (api_starter/api_starter_annual/api_business/enterprise)
preserved byte-for-byte — same 4 cards, same "Welcome to {planName}!"
headline, same "Open Dashboard" CTA, no referral, no support line. A
follow-up will refresh that variant with its own MCP / Webhooks / API
lead after this ships.
Size: 6.4 KB rendered (was ~4 KB; Gmail clips at ~102 KB).
Playground (for future refreshes): docs/plans/pro-welcome-email-playground.html
* fix(emails): allowlist Pro plans + drop referral block pending Phase 9
Addresses two P1 review comments from @greptile-apps on #3300.
1. `isPro` was a deny-list (`!API_PLANS.has(planKey)`) — every plan key
outside API_PLANS fell into the Pro branch, including `free` (already
in PLAN_DISPLAY) and any future tier (e.g. `pro_team`) added to
PLAN_DISPLAY without a matching API_PLANS update. Switched to an
explicit allowlist: `PRO_PLANS = Set(['pro_monthly','pro_annual'])`.
Anything outside falls back to the neutral "Welcome to {planName}!"
shell + "Open Dashboard" CTA.
2. The "Invite your team — earn a month free" referral block linked to
`https://worldmonitor.app/referrals`, but that page isn't mounted and
`src/services/referral.ts` is still flagged "Phase 9 / Todo #223".
Shipping the block today would send paying users to a 404 and promise
a credit the backend can't grant. Removed the block entirely;
reinstate in a follow-up PR once the referral endpoint + credit logic
ship.
Playground (`docs/plans/pro-welcome-email-playground.html`) remains the
source of truth for future refreshes.
* fix(emails): align card gate with shell gate + wire reply_to for support line
Addresses two more review findings on #3300.
1. `featureCardsHtml()` still branched on `API_PLANS.has(planKey)`, so
every non-API plan (including `free` and any future tier added to
PLAN_DISPLAY without a matching PRO_PLANS update) got the 6-card Pro
marketing grid even though the shell gate (`userWelcomeHtml`) now
allowlists Pro correctly. Result: `free` or unknown-tier users saw
"Welcome to Free!" + "Open Dashboard" but still received "WM Analyst",
"Create Custom Widgets", "MCP Integration", etc. card content.
Fixed by parallel-allowlisting on `!PRO_PLANS.has(planKey)` — falls
through to the 4-card generic grid (same cards the API variant shows)
for anyone who isn't on pro_monthly / pro_annual. The generic grid is
safe for unknown tiers: no Pro-only claims, no specific promises.
2. The Pro support line reads "Questions? Reply to this email or ping
elie@worldmonitor.app" but FROM is `noreply@worldmonitor.app` and the
Resend payload omitted reply_to — replies would bounce.
Added an optional `replyTo` param to `sendEmail()` and thread
ADMIN_EMAIL through on the user welcome call. Gmail and every other
major client honour Reply-To over From when both are present.
The admin notification intentionally passes no replyTo to avoid
routing replies back to ADMIN_EMAIL (self-loop).
World Monitor
Real-time global intelligence dashboard — AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface.
Documentation · Releases · Contributing
What It Does
- 500+ curated news feeds across 15 categories, AI-synthesized into briefs
- Dual map engine — 3D globe (globe.gl) and WebGL flat map (deck.gl) with 45 data layers
- Cross-stream correlation — military, economic, disaster, and escalation signal convergence
- Country Intelligence Index — composite risk scoring across 12 signal categories
- Finance radar — 92 stock exchanges, commodities, crypto, and 7-signal market composite
- Local AI — run everything with Ollama, no API keys required
- 5 site variants from a single codebase (world, tech, finance, commodity, happy)
- Native desktop app (Tauri 2) for macOS, Windows, and Linux
- 21 languages with native-language feeds and RTL support
For the full feature list, architecture, data sources, and algorithms, see the documentation.
Quick Start
git clone https://github.com/koala73/worldmonitor.git
cd worldmonitor
npm install
npm run dev
Open localhost:5173. No environment variables required for basic operation.
For variant-specific development:
npm run dev:tech # tech.worldmonitor.app
npm run dev:finance # finance.worldmonitor.app
npm run dev:commodity # commodity.worldmonitor.app
npm run dev:happy # happy.worldmonitor.app
See the self-hosting guide for deployment options (Vercel, Docker, static).
Tech Stack
| Category | Technologies |
|---|---|
| Frontend | Vanilla TypeScript, Vite, globe.gl + Three.js, deck.gl + MapLibre GL |
| Desktop | Tauri 2 (Rust) with Node.js sidecar |
| AI/ML | Ollama / Groq / OpenRouter, Transformers.js (browser-side) |
| API Contracts | Protocol Buffers (92 protos, 22 services), sebuf HTTP annotations |
| Deployment | Vercel Edge Functions (60+), Railway relay, Tauri, PWA |
| Caching | Redis (Upstash), 3-tier cache, CDN, service worker |
Full stack details in the architecture docs.
Flight Data
Flight data provided gracefully by Wingbits, the most advanced ADS-B flight data solution.
Data Sources
WorldMonitor aggregates 65+ external data sources across geopolitics, finance, energy, climate, aviation, cyber, military, infrastructure, and news intelligence. See the full data sources catalog for providers, feed tiers, and collection methods.
Contributing
Contributions welcome! See CONTRIBUTING.md for guidelines.
npm run typecheck # Type checking
npm run build:full # Production build
License
AGPL-3.0 for non-commercial use. Commercial license required for any commercial use.
| Use Case | Allowed? |
|---|---|
| Personal / research / educational | Yes |
| Self-hosted (non-commercial) | Yes, with attribution |
| Fork and modify (non-commercial) | Yes, share source under AGPL-3.0 |
| Commercial use / SaaS / rebranding | Requires commercial license |
See LICENSE for full terms. For commercial licensing, contact the maintainer.
Copyright (C) 2024-2026 Elie Habib. All rights reserved.
Author
Elie Habib — GitHub
Contributors
Security Acknowledgments
We thank the following researchers for responsibly disclosing security issues:
- Cody Richard — Disclosed three security findings covering IPC command exposure, renderer-to-sidecar trust boundary analysis, and fetch patch credential injection architecture (2026)
See our Security Policy for responsible disclosure guidelines.
worldmonitor.app · docs.worldmonitor.app · finance.worldmonitor.app · commodity.worldmonitor.app
