Building The World Now: six months of stack notes

About six months ago I started The World Now as a side project, an attempt to build a news site where the pipeline is mostly automated but the editorial judgment still feels like a human made the call.

No filler, no scraped soup, no “10 things you won’t believe.” Here’s where it’s at and what’s running under the hood.

## The stack

  • Next.js 15 on Vercel, App Router, RSC where it makes sense.
    Turbopack for dev, which is genuinely fast but eats HMR state maybe
    once a day and forces a restart.
  • MongoDB Atlas for articles, events, users, engagement. One DB
    doing most of the work.
  • AWS Lambda + Serverless Framework for the article generation
    pipeline. Cron-triggered, drafts with Grok-4, runs an editorial QA
    pass, publishes when it passes.
  • Resend for email — three audiences: free daily, free weekly,
    paid weekly deep-dive.
  • Stripe for the paid tier.
  • Mediavine for display ads on the free tier.

Nothing fancy. The interesting part isn’t any single piece, it’s the pipeline.

## The article pipeline

Every hour a Lambda wakes up, decides whether to publish, then:

  1. Pulls from ~20 sources (France24, Times of Israel, ReliefWeb, a
    few RSS endpoints I wrote custom parsers for).
  2. Dedups against the last 14 days of articles and against
    unique-image-across-all-articles.
  3. Drafts in one of two formats: BREAKING_NEWS (short, fast,
    ~1,100 words) or SITUATION_REPORT (long-form, context-heavy,
    ~1,500 words with secondary and tertiary images).
  4. Generates hero + secondary images, with placeholders while they
    render.
  5. Runs editorial QA — word-count checks, unique-image gate, citation
    format, no clickbait titles, no bare brackets, no word-count
    trailers leaking in.
  6. If QA fails: one retry. If it fails twice: drop the article
    entirely. I’d rather publish fewer good ones than patch bad ones.

Last 20 articles audited averaged 55 citations per BREAKING_NEWS and 70 per SITUATION_REPORT. That’s the part I’m proudest of — the thing is genuinely grounded, every claim traceable.

## What’s going wrong

Google doesn’t love me. Every page in my ranking-target set is
showing “Crawled, currently not indexed” in Search Console. I’ve been at this for weeks now, structured data tightened, internal linking cleaned up, manual URL inspections, sitemap pings. Nothing moves.

Google then sees the pages, reads them, and shrugs.

Bing, on the other hand, is crushing it. +37.6% impressions week over week, consistent top-10 positions on a handful of competitive
queries, and a traffic mix that’s well over 60% Bing at this point.
Which is a sentence I never expected to write.

So the plan is: double down on what’s working, and keep trying to get out of Google jail.

## What’s next

  • Per-location earthquake pages (/earthquakes-today/[location])
    with live USGS data — 15 country/state variants, each with its own
    fault systems, safety playbook, and official channels (JMA for Japan,
    ShakeAlert for California, ITSAK for Greece, and so on). Generic
    templates with a name swap won’t cut it; each one needs to actually
    be useful for that specific place.
  • A “listen on your commute” version of the weekly deep-dive using
    voice cloning. Evaluating VoxCPM2 vs Inworld TTS-1.5 vs ElevenLabs
    right now — cost vs quality is the current blocker.
  • Getting out of Google jail. Somehow.

## The link

If you want to poke around:
the-world-now.com

If you’ve been through the “crawled, currently not indexed” wall and something actually worked — drop it in the comments. I’ll owe you

Leave a Reply