Data pipeline + small web app for AfriTechElles, an NGO based in Cameroon supporting women and girls in tech.
# AfriTechElles Data Pipeline
A small tool I built to help AfriTechElles (a Cameroon-based NGO supporting women
and girls in tech) make sense of their community sign-up data. Their member
information comes in through Google Forms and ends up as messy CSV exports,
inconsistent phone numbers, missing fields, no easy way to see who's actually
in the community at a glance. This project cleans that data, stores it, and
generates a report someone can actually read without a spreadsheet background.
## What it does
- Takes a CSV export of form responses (the real field names are in French
Nom complet, Numéro WhatsApp, Adresse email, etc.)
- Validates and cleans each row: normalizes phone numbers, fixes name casing,
parses inconsistent date formats, checks email format
- Anything that fails validation gets set aside (not silently dropped) with a
reason, so someone can go back and fix it manually
- Stores the clean data in a local SQLite database
- Generates a PDF summary report with a chart, plus lets you view the same
summary on a small dashboard page
- Has a basic form to add a member manually, in case someone signs up outside
the Google Form
- Has a simple password login for the upload/add pages, since they modify data
## Why I built it this way
I originally planned this as a script you'd run from the command line, but
switched to a small Flask app once I realized the actual users (Afritechelles'
team) aren't developers, they need something they can open in a browser, not
run `python main.py` in a terminal.
I went with a PDF for the report instead of an Excel file on purpose. My first
instinct was Excel since it's more "data-y," but the actual goal is for someone
without a data background to open it and understand the numbers in a few
seconds. A PDF is read-only, so there's nothing to accidentally break by
editing a cell, and it can lead with the important number instead of a wall of
rows.
The "rejected records" idea came from thinking about what happens to bad d …