Skip to content
Daniel Murcia
All projects

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

    Home: overdue colonies and personal summary

  • Colony list with search and filters

    Colony list with search and filters

  • New visit form, one question per card

    New visit form, one question per card

  • Cat profile

    Cat profile

  • Cat history with AI summary

    Cat history with AI summary

  • Shelter cats

    Shelter cats

  • Discharging a cat

    Discharging a cat

  • Profile

    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.

Swagger documentation listing the API routes
Swagger documentation listing the API routes

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