Projects/Live·2026

Shared-house chores · Cleaning rota with photo check-off

A chores tool for shared houses: automatic rotating rota, on-the-spot photo check-off, anti-cheating duplicate detection and optional AI grading. Tenants just tap a WeChat link; the landlord runs everything from one admin page

Visit ↗GitHub ↗

Overview

In a shared house, keeping the common areas clean on goodwill and group-chat reminders almost always fails: nobody is sure whose turn it is, whether it got done, or whether it was done properly. This system hands all three to software — the rota rotates automatically, completion needs photos taken on the spot, and the photos are checked by the system. The landlord only handles the few cases that need a human.

The whole system is one Python file plus one web page, running on my own server. Tenants tap their personal link in WeChat — no sign-up, no app.

Core features

  • Automatic rota: 4 areas (living room / kitchen / bathroom / laundry) × 5 people, rotating weekly with 1 person off each week; a 5-week cycle so everyone gets every area
  • On-the-spot photos: the page opens the phone camera directly; at least 2 photos from different angles per area, and opening the camera issues a one-time code valid for 15 minutes
  • Anti-cheating
    • Every photo's perceptual hash is compared against all past photos; old photos or someone else's photos are rejected
    • Photos in one batch can't be the same angle; too dark, too blurry or a blank wall gets rejected outright
    • The server watermarks each photo: area | tenant | time | LIVE / UPLOAD
    • Gallery upload is only allowed when the camera can't be opened, and always goes to the landlord for manual review
    • All tenants can see each other's photos — transparency keeps everyone honest
  • AI check (optional): with an Anthropic API key, Claude Haiku judges "is this the right area, is it a photo of a screen, is it clean" and scores it; ≥70 passes automatically, dirty areas are sent back to redo, suspicious ones go to the landlord
  • Swap requests: a busy tenant can ask a housemate to cover; it only takes effect once the other person taps "accept" on their own link, after which they submit the photos and any overdue mark goes to them
  • Landlord admin: view photos, approve / reject / undo in one tap, 12-week stats (passed, rejected, overdue, covered for others, covered by others), copy this week's or next week's rota message for the WeChat group
  • Tenant management: rename, copy link, issue a new link (the old one stops working immediately), deactivate people who move out, add new tenants; changes affect the rota from next week, while this week and history stay as they were

How it's built

  • Backend: a single FastAPI file + SQLite; photos on local disk, originals deleted after 90 days but hashes kept for duplicate checks
  • Frontend: one plain HTML/JS page that works in WeChat's in-app browser, no build step
  • Image processing: Pillow for brightness / sharpness checks and watermarks, imagehash for duplicate detection
  • AI: Anthropic Messages API — the photos plus the acceptance criteria go to Claude Haiku, which returns structured JSON; everything still works without a key
  • Deployment: Caddy or Nginx for HTTPS (a mobile web page needs HTTPS to use the camera) + systemd; about 10 minutes to set up, and AI costs a few cents a month

Live demo

Click "Visit" above for the demo. It looks exactly like the real system:

  • Switch roles at the top: the landlord admin or any tenant
  • As a tenant you can see this week's duty, take a photo (or pick one from the gallery) to submit, and send or accept swap requests
  • As the landlord you can review photos, reject and undo, manage tenants, copy the rota message and see 12-week stats
  • It comes with 12 weeks of sample data; everything runs in your browser, photos are never uploaded anywhere, and refreshing resets it
  • The demo has no AI; live photos that pass the basic checks are approved directly

Source code and deployment notes are on GitHub.

Related build log