Elie Habib 3e7bf49393 refactor(emails): refresh Pro welcome email — surface WM Analyst, Widgets, MCP (#3300)
* 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).
2026-04-22 23:18:32 +04:00

World Monitor

Real-time global intelligence dashboard — AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface.

GitHub stars GitHub forks Discord License: AGPL v3 TypeScript Last commit Latest release

Web App  Tech Variant  Finance Variant  Commodity Variant  Happy Variant

Download Windows  Download macOS ARM  Download macOS Intel  Download Linux

Documentation  ·  Releases  ·  Contributing

World Monitor Dashboard


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 HabibGitHub

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

Star History

Star History Chart
Description
Mirrored from GitHub
Readme AGPL-3.0 382 MiB
Languages
TypeScript 49.1%
JavaScript 47%
CSS 2.9%
HTML 0.4%
Rust 0.3%
Other 0.1%