voidly
Atlas · 7-day per-platform forecast

Will Twitter be blocked in Iran next week?

One XGBoost model per platform, scoring the 7-day shutdown probability for each (country, platform) pair. Built for journalists who need a per-target prediction rather than a single country-wide risk score.

Trained 2026-05-21 · 9 platforms · model info

Median LOCO AUC
1.000
leave-one-country-out across top-8 per platform
Best platform
twitter
AUC 1.000
Worst platform
twitter
AUC 1.000
Promote floor
0.65
passed

7-day shutdown probability grid

Each cell is the probability that the given platform sees at least one critical-level block in the given country in the next 7 days. Click a cell for per-call SHAP-style attribution.

Legend:<10%10-25%25-45%45-65%65-85%≥85%no data

Per-platform model details

PlatformStatusLOCO AUCTemporal AUCTrain rowsPositivesTop feature
Discordskipped00insufficient data
Facebooklive1.0000.97018041444crit_rate_7d
Instagramlive1.0000.98219551501crit_rate_7d
LinkedInskipped00insufficient data
Redditlive1.0000.99213751195crit_rate_7d
Signallive1.0000.99019691490crit_rate_7d
Telegramlive1.0000.99119521436crit_rate_7d
TikToklive1.0000.98317411567block_rate_7d
Twitter/Xlive1.0000.99032921688crit_rate_7d
WhatsApplive1.0000.98517351330crit_rate_7d
Wikipediaskipped00insufficient data
YouTubelive1.0000.98618101338crit_rate_7d

Honest caveats

  • Per-platform models trained only on countries that ever observed a platform-specific block. Countries with zero history score the base rate.
  • LOCO CV uses the top 8 countries per platform by positive count; thin-data platforms have wider AUC variance.
  • Targets are derived from elevated/critical/warning signal_levels on platform-matching domains, not from direct block confirmations.
  • Per-platform forecasts inherit strong autocorrelation: once a country actively blocks a platform, the next-week probability stays high. The model is essentially predicting 'will the current block state persist?', which it does ~85% of the time on active pairs.
  • Countries with zero historical evidence on a platform score the feature-vector floor (≈base rate); treat these as low-information.

Methodology

We define 12 platforms by their canonical domains: Twitter/X (twitter.com, x.com), WhatsApp (whatsapp.com, web.whatsapp.com), Telegram (telegram.org, t.me), YouTube, Signal, Facebook, Instagram, TikTok, Reddit, Discord, Wikipedia, LinkedIn. For each platform we filter the evidence table to rows whose domain column matches one of those host patterns.

Features (17 per row) are computed at the (country, platform, date) level: trailing 7/14/30-day anomaly rate, trailing 7/14/30-day critical rate, observation count, country-wide trailing anomaly rate, plus country geography (continent, risk tier) and calendar features (day-of-week, weekend).

The target is binary: did this (country, platform) experience at least one signal_level='critical' observation in the next 7 days? We restrict scoring to country-platform pairs with at least 5 observations in the trailing 30 days to avoid trivially predicting zero for never-observed pairs.

Each platform gets its own XGBoost classifier (200 trees, max_depth 4, learning_rate 0.05). Evaluation is LOCO across the top-8 countries by positive count, plus a temporal holdout of the last 21 days. Three platforms (Discord, Wikipedia, LinkedIn) have zero critical-block observations in the current evidence window and are skipped with trained=false.

Why the high AUC is honest but not surprising. Per-platform censorship is strongly persistent: when a country has a critical block on Twitter today, it almost certainly has one next week. The model exploits this persistence aggressively, which is why LOCO and temporal AUC sit near 0.99 even though the prediction is genuinely useful (it correctly separates persistently-blocked from never-blocked).

API

# Single (platform, country) score
GET https://api.voidly.ai/v1/forecast/platform/twitter/IR
# All countries for one platform
GET https://api.voidly.ai/v1/forecast/platform/signal
# Full grid (heatmap source)
GET https://api.voidly.ai/v1/forecast/platform/grid
# Model info + honest caveats
GET https://api.voidly.ai/v1/forecast/platform/info

See also