ColonyCare
A mobile app and API for the volunteers of an animal protection association that looks after feral cat colonies.
- Year
- 2026
- Status
- Live, private
- My role
- Solo project: product, design, mobile app, API, infrastructure and CI/CD.
- Availability
- In daily use by the association’s volunteers, but not on the App Store or Google Play. I fund the project myself, so to keep costs down it's shared privately: an Android APK, plus Expo with over-the-air updates. That's why there's no public download link.
8 screens

Home: overdue colonies and personal summary

Colony list with search and filters

New visit form, one question per card

Cat profile

Cat history with AI summary

Shelter cats

Discharging a cat

Profile
Volunteers log every colony visit, keep a profile and history for each cat, manage the shelter, and see at a glance which colonies need a visit today. An AI summary condenses each cat's history in a few lines.
Built for every age
Large type, wide buttons, one question per card in every form, and errors shown right next to the field that failed.
Over 200 API tests
A test walks every route and checks it rejects missing or forged tokens, so an unprotected endpoint can't ship by accident.
Privacy-aware AI
Only the cat's profile and notes go to Gemini, never volunteer names, emails or phones. A test enforces it.
Push to deploy
GitHub Actions runs lint, migrations and tests on Postgres, ships the image to ECR and deploys to EC2 through SSM. The app updates over the air with EAS.
The goal
The association’s volunteers feed and look after several cat colonies, plus the cats kept at the shelter. They needed one place to see which colonies are due a visit, how each cat is doing, and what happened to cats that were moved, adopted or went missing, and it had to be easy for volunteers of every age.
What the app does
The home screen splits colonies into overdue (two days or more without a visit) and due today, with the same green, amber and red code used across the app.
A visit records cats seen, dry food, cans, notes and up to two photos. Each cat has a profile with up to three photos, health status, and an age that moves forward by itself: the API stores the age given and when, and returns today's.
Every change to a cat is logged automatically with its author: new profile, edits with old and new values, deleted photos, moves to the shelter and discharges (adopted, deceased or missing). Volunteers can ask for an AI summary of that history, cached until the data changes.
How it's built
The API is a FastAPI service on PostgreSQL. Each domain module (users, colonies, visits, cats, admin) follows the same models, schemas, crud and router layout, and every response shares one { success, message, data } envelope.
Accounts start pending until an admin activates them. Sign-in works with email or Google through the browser, so it also runs inside Expo Go. The JWT carries a fingerprint of the password, so changing it signs out every other device.
In production the configuration lives in AWS Secrets Manager and the EC2 role reads it, so there are no .env files on the server. Caddy handles HTTPS, compression and request size limits, and RDS keeps automatic backups.

Stack
- Mobile app
- Expo SDK 57, React Native 0.86, React 19, TypeScript, NativeWind, React Navigation 7, Formik + Yup, EAS Update
- API
- FastAPI, SQLAlchemy 2, Alembic, Pydantic 2, fastapi-users (JWT), slowapi, pytest
- Cloud
- AWS EC2, RDS PostgreSQL, S3, SES, Secrets Manager, ECR, SSM, Caddy
- AI
- Google Gemini with fallback model, Cached summaries