Case study · 2025
Cat Tracker Maine
Maine Humane's shared record of community cat colonies and Trap Neuter Return work, for shelters, volunteers, and animal control.
- Context
- Personal project
- Role
- Sole Developer
- Stack
- ReactTypeScriptViteTailwind CSSLeafletChart.jsNode.jsExpressPrismaPostgreSQL

What it does
Cat Tracker Maine is Maine Humane’s shared record of community cat colonies and Trap Neuter Return (TNR) work. It replaces scattered spreadsheets, email, and maps so shelters, volunteers, and animal control can see the same picture of where cats live and how TNR is going.
An administrator creates accounts. Volunteers and partners sign in, register a colony with a location and a rough cat count, then log each capture as TNR happens. The system tracks remaining cats against that estimate and marks a site complete when the work is done. Anyone can open Analytics for statewide totals. Signed in users see maps, county breakdowns, and activity. Administrators can add users, import older data, and export reports. Location detail stays behind the login, so colony addresses are not public.
Why it matters
Unmanaged colonies grow quickly. Coordinated TNR is a humane way to stabilize them, but only if people know where to focus. The tracker turns field work into evidence: which communities need help, how many cats have been through TNR, and where effort still remains. That helps target resources, show partners the impact, and keep care organized across Maine.
How I built it
The site is a web app with a map, charts, and a separate API. People register colonies and log captures there, and the totals on the analytics page come from those records. Colony addresses are only available after sign in.
TODO: anything you want to say about the decisions behind the build.
Technical detail
- Frontend: React 19, TypeScript, and Vite, with React Router. Tailwind CSS for layout. Leaflet for maps. Chart.js for charts. Axios for API calls.
- Backend: Node.js and Express 5. Prisma for the database. Sign in uses JWT, and passwords are stored with bcrypt. Email goes out through Nodemailer over SMTP.
- Data: the current local setup uses SQLite. The project README also describes PostgreSQL.
- Reports: CSV import and export.
- The frontend is built with Vite and talks to the Express API.