Follow the Legend
Profiles of independent journalists, researchers, and citizens who hold power to account — often at significant personal cost. Australian and international.
What it shows
- A directory of Legends with bios, focus areas, social handles, and status (active / arrested / facing legal action / silenced).
- Per-profile Best Content (highest-view items across all connected platforms) and Recent Drops (newest ingested content).
- An Impact Score derived from aggregate engagement and recency — drives ordering on the list page.
- A timeline of Key Milestones (arrests, court cases, viral moments, campaign launches, legal wins).
How to read it
Ordering on the list page prioritises featured legends first, then highest impact score, then alphabetical. Impact score is a blunt proxy for reach, not importance — it reflects what the connected platforms publicly expose, which is uneven across services.
Inclusion is not endorsement. The goal is visibility for independent voices whose work has demonstrable public reach, regardless of political position.
Data sources
The build_legend_profile Celery pipeline pulls content from free, non-commercial-API sources:
- YouTube — public channel RSS feed (
feeds/videos.xml?channel_id=…). No key. Exposes only the most recent ~15 uploads and does not include view counts in the feed. - Odysee — public channel RSS feed (
odysee.com/$/rss/@handle:id). Stable where channels publish it; many don't. - X / Twitter — via nitter instances (
settings.NITTER_INSTANCES). Multi-instance fallback. Fragile — nitter instances break frequently; rotate the list when all fail. - Rumble — HTML scrape of the public channel page. Fragile — selectors drift; tasks log warnings and continue rather than failing the sweep.
- Facebook / Instagram / TikTok — no reliable free path. Items must be added manually via the Django admin.
The pipeline is idempotent: resources are keyed on (advocate, platform, external_id), so re-running the ingest updates existing rows rather than creating duplicates.
Operator guide
- Add or open a legend at
/admin/projects/advocate/. - Populate the platform fields you want ingested:
youtube_channel_id(theUC…identifier from the channel URL),rumble_url,odysee_url,twitter_handle. - Run the pipeline for that legend:
docker compose exec web python manage.py shell -c \ "from apps.projects.legend_ingest import build_legend_profile; \ build_legend_profile.delay(<id>)" - To run nightly for every featured legend, register
apps.projects.legend_ingest.sweep_all_legendsin django-celery-beat admin (the project uses the DatabaseScheduler).
Caveats
- Reliability. Nitter and Rumble break regularly. When X or Rumble sections look stale, check the worker logs — the tasks degrade gracefully rather than erroring.
- View counts. Only Rumble scraping and manual entry populate
view_countin v1; YouTube and Odysee RSS feeds don't include it. Impact scoring works with partial data. - No legal/dox info. Profile pages intentionally omit anything that could enable targeting or harassment.
- Manual entry. Use the admin for Facebook, Instagram, TikTok, court documents, podcast episodes, articles, and anything else the ingest pipeline doesn't cover.
Related pages
Last reviewed: 11 Apr 2026