Project Story
Inspiration
Charitable giving often asks donors to trust a black box. People may know which organization they supported, but not what their contribution purchased, who benefited, or whether the money was spent as intended. At the same time, children’s homes can struggle to communicate specific, urgent needs such as food, rent, school fees, medical care, and utilities.
We created Pamoja, meaning “together” in Swahili, to make giving more concrete, transparent, and human. Instead of donating to a general fund, donors can support a specific expense and understand the direct impact of their contribution.
Our goal was simple: replace “Your donation helps” with clear outcomes such as “Your $20 feeds one child for two months,” and back that claim with visible funding progress and receipts.
What it does
Pamoja is an iOS platform that connects donors with verified children’s homes, beginning with communities in Kenya.
Children’s homes publish itemized monthly needs, including food, education, medical care, rent, and utilities. Donors can:
- Discover verified children’s homes
- Review their current needs and monthly funding progress
- Contribute toward a specific expense
- See the tangible impact of a donation before completing it
- Track their personal giving and supported homes
- View receipts showing how donated funds were spent
Each expense displays the amount raised, its monthly target, and the percentage of donations supported by receipts. Homes can upload receipt images, and Gemini analyzes them to extract information such as the vendor, total, purchase date, and whether the purchase matches the intended expense category.
Pamoja also includes a home-management experience for creating expenses and submitting receipts, along with an administrative approval flow that prevents unverified homes from appearing to donors.
How we built it
We built the donor and children’s-home experiences as a native SwiftUI iOS application. The app uses asynchronous networking with URLSession and connects to a REST API built with Python and FastAPI.
Our backend runs on DigitalOcean App Platform and serves as the secure layer between the iOS app and our database. It handles donations, home registration, expense creation, receipt uploads, administrative approval, impact calculations, and dashboard analytics.
We used Tiger Data with PostgreSQL and TimescaleDB to model donations as timestamped events. The donations table is a TimescaleDB hypertable, allowing us to efficiently organize and query contributions over time. A continuous aggregate groups donations into monthly funding totals for each expense.
This structure means our monthly progress bars do not require a scheduled reset. We calculate current-month funding using time-based queries, while previous months remain available for historical dashboards.
We integrated Gemini’s vision capabilities to inspect uploaded receipts. Gemini extracts structured details from the image and evaluates whether the purchase appears consistent with the selected expense category. If the AI service is temporarily unavailable, Pamoja still accepts the receipt and clearly degrades to a non-blocking fallback.
Payments are currently simulated so that we could focus on validating the complete itemized-giving and proof-of-spending experience. The system is designed to support services such as Stripe for donor payments and M-Pesa for payouts in a future production release.
Challenges we ran into
One of our biggest challenges was connecting several moving parts within a hackathon timeline: a native iOS application, a public API, a managed time-series database, image storage, and AI-powered receipt analysis.
We also encountered several technical issues during deployment and integration:
- The API response evolved as we added descriptions, expense categories, receipt metadata, and AI results. We made the Swift models backward-compatible so the app could safely handle both older and newer response shapes.
- Our seed script truncates and rebuilds the demo database. Running AI analysis during that process made reseeding slow and risky, so we separated AI backfilling into a resumable process that cannot leave the core demo data partially populated.
- Gemini occasionally returned capacity or quota errors. We designed receipt submission to succeed even when AI analysis is unavailable, ensuring that an external AI service never prevents a home from documenting its spending.
- Designing an interface that communicated transparency without overwhelming donors was another challenge. We kept the main donation flow simple while placing receipts, accountability details, and AI checks inside expandable views.
Accomplishments that we're proud of
We are proud that Pamoja works as a complete, connected experience rather than a collection of isolated screens.
A donor can discover a verified home, select a real expense, preview the impact of a contribution, complete the simulated donation, and immediately see the funding bar update. That same donor can later view receipts and track their cumulative impact.
We are especially proud of:
- Turning donations into understandable, human-centered impact statements
- Building an itemized funding model instead of a generic donation pool
- Creating receipt-backed accountability for every expense
- Using Gemini to analyze real receipt images without making AI a point of failure
- Implementing real-time monthly analytics with Tiger Data and TimescaleDB
- Deploying a live FastAPI backend on DigitalOcean
- Supporting both donor and children’s-home workflows in one native iOS app
- Including verification and safeguarding principles from the beginning
What we learned
We learned that transparency is not a single feature: it must shape the entire product. Showing a receipt is useful, but it becomes much more meaningful when it is connected to a specific need, funding target, donation history, and measurable outcome.
We also learned the value of designing graceful fallbacks. AI services, hosting platforms, and external APIs can fail, especially during a live demonstration. The core giving and receipt workflows should remain functional even when an optional service is unavailable.
From a technical perspective, we gained experience with SwiftUI, FastAPI, container deployment, asynchronous database access, TimescaleDB hypertables, continuous aggregates, multipart image uploads, and structured vision-model responses.
Most importantly, we learned that presenting impact clearly can be just as important as collecting the donation itself. Donors should not have to guess what their support accomplished.
What's next for Pamoja: Transparent Giving, Tangible Impact
Our next step is to move from simulated transactions to real payment infrastructure. We plan to integrate Stripe for donor payments and M-Pesa for secure payouts to participating homes.
We would also like to:
- Partner with trusted local organizations to strengthen home verification
- Add reporting and fraud-detection tools
- Notify donors when an expense they supported receives a new receipt
- Support recurring contributions and emergency funding campaigns
- Expand historical impact dashboards for donors and homes
- Improve currency conversion using live exchange rates
- Add multilingual and accessibility support
- Explore a public, privacy-conscious audit ledger
- Expand carefully into additional communities and countries
Our long-term vision is for Pamoja to become more than a donation platform. We want it to be a trusted bridge between donors and communities: one where every contribution has a clear purpose, a measurable impact, and visible proof.
Built With
- asyncpg
- computer-vision
- digitalocean
- docker
- fastapi
- gemini
- git
- github
- google-gemini-api
- ios
- postgresql
- pydantic
- python
- rest-api
- swift
- swiftui
- tiger-data
- timescaledb
- uvicorn
- xcode
Log in or sign up for Devpost to join the conversation.