The layer underneath.

Seven great builds with one missing foundation. What Mulago’s AI infrastructure should look like (once it exists).

Working draft · updated 18 August 2026 · Drawn from the 11 August team meeting, the 5 August principals conversation, and the 12 August system walkthroughs with Claire, Stephanie and Rahila

Where things stand today.

Seven builders, each solving the same four problems separately

Every build below is great. Each one also had to answer for themselves where its data comes from, how to get structure out of it, where the result lives, and whether it is safe to point at grantee data. The orange tags are the answers that repeat. Click any tag to see how many builders solved that same problem, and click a card to turn it over.

Avery
Funder engagement dashboard. Airtable backend, Cloudflare hosted.
  • own data source
  • own extraction
  • own hosting
  • heavy token burn
detail →
Type 1 · built with AI, runs without it
Runs onCloudflare, over an Airtable backend.
Gains from the layerInherits the hosting standard and identity at the edge, so there is no separate login to maintain.
← back
Rahila
Spotlight screening. ~1,300 candidates, with a config table and a full decision log.
  • own data source
  • own extraction
  • audit trail built
  • cost levers solved
detail →
Type 3 · AI inside the product
Runs onA fixed pipeline with one model call in the middle.
Gains from the layerThis is the pattern the shared pipelines copy. The config table and decision log are the parts worth stealing.
← back
Kenichi
Portfolio consistency dashboard. ~40 orgs, side by side.
  • own data source
  • own extraction
  • own hosting
  • static by choice
detail →
Type 1 · built with AI, runs without it
Runs onStatic, built by hand off Box PDFs.
Gains from the layerOrg-keyed Drive is what turns this from static into live. It is the build most blocked by the migration.
← back
Rohit
Automated numbers spreadsheet. Financials, flags, currency.
  • own data source
  • own extraction
  • own privacy call
  • stopped on privacy
detail →
Type 1 · built with AI, runs without it
Runs onLocal, and stopped on a privacy call.
Gains from the layerA written governance position on what may point at grantee data is what unblocks it.
← back
Sanat
Coaching prep. One Claude project per fellow.
  • own data source
  • own extraction
  • siloed per fellow
  • no cross-fellow view
detail →
Type 2 · AI in the workflow, person driving
Runs onOne Claude project per fellow.
Gains from the layerA shared knowledge base ends the per-fellow silo, so a new coach is not starting from nothing.
← back
Claire
Sourcing review interface. Reads and writes to Airtable, in daily use by five people this cycle.
  • own data source
  • own extraction
  • own hosting
  • writes back to a system of record
detail →
Type 1 · built with AI, runs without it
Runs onA hosted micro-site calling the Airtable API.
Gains from the layerToken behind a Worker and identity at the edge. The build itself does not change.
← back
Alex
AI comms coach for fellows. Prompt-chained, local folder.
  • own data source
  • own extraction
  • own hosting
  • fellows cannot reach it
detail →
Type 1 · built with AI, runs without it
Runs onPrompt-chained, out of a local folder.
Gains from the layerA tier 2 allowlist is the missing piece, because fellows are not on the Mulago domain.
← back

The layer, once it exists.

Five decisions, one folder structure, five pipelines, one hosting answer

Read bottom to top. Nothing here is a new system. It's the shape that already works at Mulago applied four more times: a declared source, a structured layer in between, and a surface people already visit.

Layer 1Source of truth

One answer per data domain. The value is not in the choice, it's that everyone builds against the same answer/data source of truth. This is drawn as one working data layer on Airtable, which is my rec: one org record from first referral to last grant, so a fellow becoming a portfolio org is no longer going through an export and re-creation on the other side, and the sourcing history stays accessible by all. Salesforce becomes the archive, kept accurate and read-only since it contains so much history (but debatable if it's heavy cost to retain). It also settles the write question, because Airtable is formally the write layer and there is nothing to reconcile back - but we all have to then get comfortable with using AI inside our source of truth home.

Two caveats belong next to that. This is my recommendation, but the choice is ours to make together: the three candid options and the cheap experiment that decides between them are laid out on where things live. And Rahila's Salesforce audit runs through end of September; her position, which I agree with, is that you should not restructure a foundation you have not checked, so nothing should progress until her audit's through.

  • AirtableOne org record: grants, disbursements, funder relationships, candidates
  • SalesforceArchive of the record to date, read-only
  • SurveyMonkeyFellow intake, piped not hand-copied
▲
Layer 2Document layer

Drive keyed by org rather than by year and grant cycle, so knowing an org’s name is enough to reach its memos, financials and milestone docs. Box becomes the archive it is already becoming. This is a folder-architecture decision made once, within a migration already in flight.

  • Google DriveOrg-keyed, reachable programmatically
  • BoxArchive only
▲
Layer 3Shared pipelines

The layer that replaces seven private builds. Each job runs the same way every time, with one step where the model is allowed to use judgment. Written once, pointed by four people at their own documents and their own field lists. This is Rahila’s Spotlight pattern turned into shared infrastructure. The reason it is drawn as one step rather than a whole pipeline of model calls is set out on the where things live page: almost everything the team has built used AI to get made and then runs without any AI inside it, and Spotlight is currently the only exception.

  • Extract fields from a memoKenichi, Rohit
  • Normalise financialsRohit, Claire
  • Research & score to a rubricRahila, Sanat, Alex
  • Structured brief from a templateSanat, Alex
  • File & chase grant submissionsClaire, Rahila
“I can promise you that the pipeline is going to run the same way every time. But I can’t promise you that the model searches the same way every time. Knowing which half is which is how you know where to put your safeguards.” Rahila, 11 August
Where these actually live
Three different things, three different homes. Most of the confusion about “where does it live” comes from expecting one answer.
The code
A private Mulago GitHub repo. Version history, reviewable changes, no silent conflicts.
The tunable parts
Prompts, criteria and field lists in an Airtable config table, so the owner can retune without touching code. Rahila already works this way.
The running
GitHub Actions on a schedule for the bulk jobs, Cloudflare for anything a person clicks. Both free at this size, nothing to administer.
The outputs
Airtable rows, which the dashboards read instead of being retyped.
The keys
GitHub or Worker secrets. Never in the repo, never in Drive.

Claude projects do not go away. They stay the place people think, and a job graduates into the repo once it has proved worth repeating. Explore in a project, run from the repo. Two tools, two jobs.

Worth confirming with Alex whether a Mulago GitHub organisation already exists. Whatever he uses for the website is probably the right home rather than something new.

▲
Layer 4Surfaces

One hosting answer instead of three. Avery’s Cloudflare setup is the most developed pattern already in use, so it becomes the standard: the build is a static page, and Cloudflare Access sits in front of it as an identity check at the edge. No login code lives inside the build, which is why someone who is not an engineer can stand one up. Leaking the URL stops leaking the data, access ends automatically when a Mulago account is switched off, and every visit is logged.

Tier 1 · Internal
Rule: the email ends in @mulagofoundation.org. Sign-in is the person’s existing Mulago account, so there is no separate user list to maintain.
  • Funder dashboardAvery
  • SpotlightRahila
  • Portfolio comparablesKenichi
  • Numbers & flagsRohit
  • Coaching briefsSanat
Tier 2 · Fellows
Rule: an allowlist of individual addresses. Fellows are not on the Mulago domain, so the domain rule cannot reach them. Same pattern, different rule, not a different system.
  • Comms coachAlex
Tier 3 · Public
Rule: open, no gate. Already live and already used by the team.
  • Mulago websiteAlex & Avery
The rule that makes the gate real. Gated access protects the front door, but the data behind it needs its own solution. If a page calls Airtable straight from the browser, the API token travels to the browser with it, sits in the page source, and can be lifted out and used from anywhere by anyone. Tokens like these usually carry read and write across the whole base, so at that point the "login" or password protection on the front of the page is purely decorative and the gate can just be walked around entirely. So: keys should always live in a Cloudflare Worker, the browser calls the Worker, and the Worker returns only the fields it should.

This is the first thing I would fix. At least one build already in daily use is hosted outside Mulago on Netlify (Claire's sourcing page) and reached with a single shared password. Two separate problems sit behind that. A password the page checks itself, rather than one the host checks before the page is ever sent, is likely readable by anyone who opens the source code for that page, so the link becomes the credential: if that web link leaks, we're risking a lot. And if the Airtable token is in that same page, the base is reachable from anywhere, by anyone. That includes people who leave Mulago.

This is not a criticism of how anything was built. It's just the default result of the quickest route to a working page which I am also guilty of, and it is precisely the problem this layer exists to solve. The fix is small: move the token behind a Worker so the browser never receives it, and let Cloudflare Access do the identity check at the edge instead of the page doing it.

Running across all four: one short governance position

What can point at grantee data (potential to create accessible and inaccessible to AI dBs in Airtable, similar to the plan for the Drive migration), which surfaces are sanctioned, and the expectation that anything making a judgment is measured against human agreement before it's trusted. Rules living in code makes them readable and checkable before a chron job runs. Every answer carrying a link back to its source makes a wrong one findable.

“A wrong answer that you can see is better than a right answer that you’re not able to audit.” Rahila, 11 August

What this is not

Not a data warehouse. Not a migration project. Not a platform that needs an owner. Mulago is fourteen people. The whole end state is five decisions, one folder structure, five pipelines and one hosting answer.

What it buys

  • The principals retool. Four responsibilities each only works if the systems are navigable by everyone. Today each has exactly one person who knows where the data lives.
  • Dashboards by year end. Building on structured data is easy. Building on forty PDFs in Box is why Kenichi’s is still static.