adejare adelugba
← all projects [ PROJECT 03 / 04 · LLM SYSTEMS · AUTOMATION ]

AURA news intelligence system.

Reads Nigerian business news four times a day and turns it into structured ownership records and a daily executive brief.

// Personal project, running in production. Tracks beneficial owners, board changes, mergers, procurement awards and regulatory actions.

[ AT A GLANCE ]

The figures.

// the short version
4×runs a day07:00 · 13:00 · 17:00 · 23:00 UTC
$0hosting costno servers of its own
5news sourcesGoogle News RSS + 4 news APIs
4LLM providersin a fail-over cascade
// stack
pythongithub actionsgoogle sheetsgemininvidia nimollamaopenaispacyastrocloudflare pages
[ THE PROBLEM ]

Why I built it.

Who really controls Nigeria’s companies is reported in scattered news stories. I wanted a system that reads that news on its own, pulls out the ownership facts as records, and writes a brief a person can read in minutes.

How I built it

  1. Schedule

    GitHub Actions runs the pipeline four times a day, then exits — nothing to keep alive or pay for.

  2. Collect

    Google News RSS plus NewsAPI, GNews, NewsData and The Guardian.

  3. Extract and write

    An LLM cascade: extraction tries Ollama then NVIDIA NIM; the brief tries Gemini, NVIDIA NIM, Ollama, then OpenAI.

  4. Store

    Google Sheets is the database (7 tabs), so non-technical reviewers can audit and correct records.

  5. Publish

    Each run exports static JSON; an Astro site on Cloudflare Pages publishes the brief, a register and entity pages.

// how the data moves
aura_pipeline — live
How it works
  1. News sourcesRSS + 4 news APIs, every run
  2. LLM cascadeextract, then write the brief
  3. Google Sheets7 tabs, auditable by people
  4. Live siteAstro on Cloudflare Pages, $0
[ DECISION LOG ]

What went wrong, and what I decided.

// 4 decisions
D1

It once published junk while every run showed green.

what happened
An earlier version silently fell back to keyword heuristics and, for days, published sports and celebrity stories as corporate intelligence.
decision
Fail loudly: if every provider fails, the run exits non-zero and publishes nothing. Every record now stores which model produced it.
result
No more quiet bad data; failures are visible.
D2

A pinned model was withdrawn mid-flight.

what happened
gemini-2.5-flash started returning 404s.
decision
Made model ids configurable and moved the default to the rolling gemini-flash-latest alias.
result
Provider changes no longer break runs.
D3

Off-topic stories kept coming back.

what happened
Re-analysing the same irrelevant articles wastes calls.
decision
Off-topic stories are recorded as “Filtered” and their URLs cached.
result
Each article is judged once.
D4

Article text is untrusted input to an LLM.

what happened
A story could carry instructions aimed at the model.
decision
Article text is wrapped with an instruction to ignore embedded directives, and all model output is escaped before rendering.
result
Safer extraction and a locked-down site.
[ RESULTS ]

Where it ended up.

Cadence
4 runs a day
Hosting
$0
Output
records + daily brief + archive
Email me CV ↓