Karibu Give; USSD Micro-Philanthropy for the Next Billion Givers
This is a submission for Weekend Challenge: Generosity Edition What I Built Karibu Give (Swahili for Welcome, Give ) is a USSD micro-donation platform that works on a kabambe phone(feature phone) with no data, no app, no account , just a phone number and a mobile-money PIN. Built for the International Day of Charity. Two things stop generosity from scaling in Kenya and across Africa: You need a smartphone to give. Most donation platforms are web-forms that assume Chrome, data bundles, and card rails. 40% of Kenyan adults still use feature phones. You need trust to give again. Donations disappear into a black box. Donors never see where 50 KES actually went. Karibu Give attacks both: Dial *384*6120# → 1. Donate → Pick a cause → Enter 50 → Confirm → M-Pesa STK prompt in 2 seconds. No internet, no app store, no signup. Session state is managed server-side via sessionId (Africa's Talking USSD callback at POST /ussd ). Real M-Pesa money movement — STK Push is triggered via my dedicated M-Pesa Service https://mpesa-service-3s2d.onrender.com/stkpush , which wraps Daraja API ( POST {phone:"2547...", amount} → CheckoutRequestID:"ws_CO_..." ). SQLite = source of truth, Snowflake = audit trail — every pending → completed/failed transition via POST /payment-callback ( Body.stkCallback.CheckoutRequestID Daraja shape + AT shape) is synced to DONATIONS_ANALYTICS in Snowflake with phone_hash = SHA256(phone).slice(0,16) , never raw PII. POST /admin/sync-snowflake batch-retries unsynced rows. Only 3 causes can be active at a time — admin ( /admin behind ADMIN_USER/PASSWORD Basic Auth) creates charities ( name, emoji, target_amount, description ), toggles active, edits, deletes (blocked if donations exist). USSD and landing page render only active causes , so the choice stays focused. The limit is enforced in SQLite ( countActive()<3 ) and in the UI ( Activate disables at 3/3). Two separate AI cards — not one bolted-on feature: ✨ Google AI Impact Summary (Gemini 1.5 Flash via @google/