Inspiration
What we call "the world's trends" is quietly biased. News apps show what editors chose to report. A single platform's trending tab mixes niche community chatter with genuinely global stories. And you only ever see your own country's trends — what people in the US, Germany, or France actually looked up today is invisible.
We wanted to answer one simple question that no product really answered: "What did people around the world actually pay attention to today?" Not what got reported — what people genuinely searched, read, watched, and talked about.
What it does
TrendCross collects four behavioral signals every day from four regions (🇺🇸 🇯🇵 🇩🇪 🇫🇷):
| Signal | Source | The human action |
|---|---|---|
| Searching | Google Trends | started looking something up |
| Reading | Wikipedia (per-language top articles) | tried to understand it |
| Watching | YouTube (popular charts) | watched it |
| Posting | Bluesky (trending topics) | talked about it |
AI then merges the same topic across languages, sources, and regions (e.g. the search term "earthquake Japan", the ja.wikipedia article「地震」, and a YouTube video become one topic) and computes a TrendCross score from how many sources × how many regions × what rank. The result is a daily world Top 20 + regional Top 10.
- Topics that appear across many signals and many regions = genuinely global stories
- Topics in only one source/region = community-specific
Crucially, the AI explains the "why," not a summary: why now (the trigger, fact-checked via web search), why here (the regional mix), and why in this signal (e.g. "spiking in search but not yet on social") — each with evidence and a confidence %. There's also an "AI Usage Trends" feature built on the Anthropic Economic Index: a fifth signal — "what the world is asking AI to do."
And there's AI's Picks, which flips the whole lens. Every day a separate AI pass independently picks "the most important events of the day" using web search — deliberately without seeing any of the behavioral data — and we place its picks next to what people actually did. The gap is the point: important-but-overlooked (a central-bank move, a conflict roadmap) versus attention-grabbing-but-not-pivotal (a TV appearance, a game update), shown without judging which is "right."
Free forever: the full world Top 20 ranking, viewable offline. TrendCross Plus (subscription) unlocks the AI "why" analysis, AI's Picks, per-region views, daily summaries, AI trends, and read tracking.
How we built it
- iOS: Swift / SwiftUI (MVVM), SwiftData for read state, async/await, offline file cache. Fully localized in Japanese / English / Spanish (UI and the ranking/analysis data). Built with XcodeGen.
- Subscriptions: RevenueCat SDK. A custom SwiftUI paywall (we isolated the SDK behind a
single
SubscriptionProvidingprotocol so the rest of the app only sees aPlusStatusenum). Entitlement-based gating, anonymous App User IDs (no account required), 30-day free trial + $2.99/month (¥300 in Japan). Available worldwide (except mainland China). - Backend: Serverless on AWS — CDK (Python), Lambda, Step Functions, EventBridge, API Gateway, S3, AppConfig, delivered via CloudFront + WAF. A two-phase daily pipeline (snapshot collection at a fixed UTC time, then normalize → analyze → publish).
- AI: Claude (Opus + Sonnet + Haiku, selected per-task via AppConfig profiles). Topic normalization is deliberately two-stage — Claude Haiku for entity-name canonicalization, then mechanical grouping (no AI) for the final merge — to structurally eliminate the ID-mixups we saw in early prototypes. Analysis runs through the Batch API (50% cost).
- AI's Picks (independence by construction): a separate Claude Opus pass does its own
web_searchto choose the day's most important events. It runs in an earlier pipeline phase, so it literally cannot read the behavioral data — independence is guaranteed by structure (and a regression test that the generator has no S3 read path), not by a prompt that says "don't look." The diff against the behavioral ranking is again computed mechanically (same normalization key), so no AI ever copies an ID. - Data: official APIs / feeds only — no scraping. Google Trends RSS, Wikimedia Pageviews API, YouTube Data API, Bluesky AT Protocol, and the Anthropic Economic Index (CC-BY).
Challenges we ran into
- Merging "the same topic" across languages and scripts without false joins. Our fix was to refuse to let any step copy an ID onto another item: Stage 1 only canonicalizes names, Stage 2 groups purely by a normalized key (NFKC + casefold + symbol strip) exact match.
- Degradation as the normal path. Any single source can fail on any day; the pipeline had to keep publishing from whatever's left, and the app had to treat missing fields as "hide," never "error" or blank screen.
- A subtle subscription bug: purchases succeeded but the paywall wouldn't unlock. The product was attached to the wrong RevenueCat entitlement identifier — a reminder that Offering attachment and Entitlement attachment are separate, and the entitlement ID must match the code byte-for-byte.
- Keeping the store submission clean: privacy manifest, generic wording for App Review, and
proving no debug/test code leaks into the Release binary (verified via
strings).
Accomplishments that we're proud of
- A cross-signal, cross-region ranking that genuinely surfaces "global vs. local" at a glance.
- AI that argues why — with evidence and confidence — instead of summarizing.
- AI's Picks: an AI "editorial control group" that, by construction, never sees the behavioral data — turning the importance-vs-attention gap into a first-class, honest feature.
- A clean subscription architecture: RevenueCat fully isolated behind one protocol, a free tier that's genuinely useful offline, and a paywall that's honest about what's free.
- Cost-disciplined AI (per-task model tiers + Batch API) running a real daily pipeline.
What we learned
- Behavioral data tells a different story than editorial data — and the gaps between signals ("searched but not watched") are often the most interesting insight.
- Importance and attention don't correlate. Building an AI "control group" that ignores behavior surfaced genuinely important events that no behavioral signal showed that day (a record equity move, a conflict roadmap), and conversely showed that much of the top behavioral data was TV appearances and game updates. The gap became a feature (AI's Picks), not a bug.
- For subscription apps, the store/dashboard configuration (entitlements, tax category, privacy declarations) is as much of the work as the code.
- Structurally preventing a class of AI error (ID mixups) beats trying to prompt your way out of it.
What's next for TrendCross
- Adopt the official Google Trends API to improve analysis quality (awaiting its general release / alpha-access approval).
- As revenue grows, upgrade to stronger AI models and widen web-search coverage for deeper analysis.
- Per-region Bluesky analysis (pending API support).
- Continuous improvement of prompts and sources.
- More regions (UK, Canada, Australia, and more).
- More analyses — monthly and yearly wrap-ups.
Built With
- amazon-cloudfront
- amazon-web-services
- anthropic-claude
- aws-appconfig
- aws-cdk
- aws-lambda
- aws-step-functions
- python
- revenuecat
- swift
- swiftdata
- swiftui
Log in or sign up for Devpost to join the conversation.