Inspiration
Reptiles are quiet pets. A lizard can't tell you its enclosure is too cold, that it's about to shed, or that it has stopped moving around the way it normally does. Keepers usually find out by happening to look at the right moment. We wanted one screen that watches every enclosure for you and tells you when something needs attention.
What it does
Reptiles are quiet pets. A lizard can't tell you its enclosure is too cold, that it's about to shed, or that it has stopped moving around the way it normally does. Keepers usually find out by happening to look at the right moment. We wanted one screen that watches every enclosure for you and tells you when something needs attention. RepTracker is a dashboard that runs as a local website on your own computer. For each lizard it shows:
- Camera view of the enclosure (top or side)
- Sensor graphs for temperature and humidity on the hot and cold sides
- Movement graph of where the lizard is in the enclosure over time, in cm from the left wall
- Status and alerts at the top of the page: activity (basking, exploring, hiding), weight, shedding, food, and hazards like temperature or humidity out of range
- Ask a question about a lizard, answered from its data
Adding a lizard is one form: name, species, enclosure width, camera, and sensors. A compact view fits four enclosures on one screen.
How we built it
- Backend: Python and Flask. Each lizard is a JSON config; there is no database.
- Frontend: one HTML/CSS/JavaScript page, with the charts drawn as inline SVG, no chart library.
- Simulated hardware: we had no cameras or sensors on hand, so a "camera" is a video file and a "sensor" is a JSON time series. The app reads them by time index, so the dashboard behaves as if it were live.
- AI pipeline: for a time range, RepTracker pulls one frame per minute with ffmpeg, packs up to 60 frames into a PDF with timestamps (Pillow), and adds a context chunk with the lizard's config, a sensor summary, and species notes. The model must answer in a strict JSON Schema: a finite set of statuses plus a position for every image. That one response drives the alerts, the stats, and the movement graph.
- Dev mode: a controllable clock (speed up, pause, jump to a time), file uploads, and a prompt inspector that shows every prompt before it is sent.
Challenges we ran into
- Making recorded files feel live. Mapping a finite video and finite sensor series onto a running clock, including looping and ranges shorter than an hour.
- Keeping the AI cost down. We wanted one API call per check, not one per frame, which led to the frames-in-a-PDF design.
- Getting usable output from a model. Free text can't drive alerts, so we constrained the answer to a schema with fixed status values.
- Tracking a lizard that hides. The animal is often out of frame, and repeated video frames break simple frame-to-frame motion detection.
Accomplishments that we're proud of
- The whole loop works end to end: add a lizard, watch its camera and sensors, generate prompts, get a structured report, and see alerts and the movement graph update.
- Every prompt is a plain file you can read and edit by hand.
- We wrote the design down as we went: decisions, open questions, and sources are all in the repo.
What we learned
- Simulating hardware with files let us build and test the full product in 24 hours without waiting on parts.
- Deciding the output schema first made the UI, the alerts, and the prompts much easier to build.
- Time is the hard part of a "live" dashboard, not the charts.
What's next for RepTracker
- Connect a real vision model. The pipeline and schema are ready; the current build runs on an offline mock provider that stands in for the model.
- Dedicated motion tracking (frame differencing with a Kalman filter) for finer position data than one sample per minute.
- Automatic species research to fill in ideal conditions for each species.
- Real cameras and sensors in place of recorded files.