Turn house chores into a democratic voting system with photo proof.
Accused of neglecting the house? Post proof. Let your housemates vote. Keep score. Stay accountable.
You've got 5 housemates. Someone's always complaining the house is a mess. But who's responsible? The old tally system was:
- ❌ Messy (scribbled on a whiteboard)
- ❌ Inaccurate (people disagreed on what counted)
- ❌ Subjective (no proof, just arguments)
- ❌ No accountability
Spring Cleaning is a real-world accountability app built to solve this problem. Here's how it works:
Anyone can call out a dirty area by posting a photo. No more "I didn't see it!"
The other 4 housemates vote on whether the accusation is valid (need 3/4 majority to pass).
Guilty verdicts = 1 point. Accumulate 3 points = punishment decided by the house.
Accused? Submit a defense before the vote happens. Let your housemates reconsider.
Everyone sees votes, points, and leaderboards instantly. No excuses.
- Photo proof required — Post a picture of the problem area
- Describe the issue — What specifically is wrong?
- Auto-timestamp — Every accusation is timestamped (UTC)
- User attribution — Know who posted it
- Fair democracy — Majority wins (3 out of 4 votes)
- Anon voting (optional) — Hide your vote if you want to avoid drama
- Real-time results — Watch votes come in live
- Clear verdict — Guilty or Not Guilty with vote breakdown
- Appeal system — Accused can defend before voting closes
- Points tracker — See who has the most violations
- Appeal history — Which appeals succeeded?
- Violation timeline — Browse past accusations + outcomes
- Profile pages — Your housemate's track record
- Streaks — Track who's been clean (no new points for X days)
- Achievements — Badges for milestones (e.g., "Mr. Clean" for 30+ days)
- Weekly reset option — Start fresh every Monday if the house votes for it
- Firebase Auth — Each housemate has their own secure login
- Role-based rules — Accused housemates can't vote on their own case
- Vote audit trail — See who voted for what (transparency)
- Photo storage — Securely stored in Firebase (100% private)
| Technology | Purpose |
|---|---|
| React 18 | UI framework |
| Firebase Auth | User authentication |
| Firestore | Real-time vote tracking & results |
| Firebase Storage | Photo uploads |
| Vite | Fast dev server & build |
| Tailwind CSS | Responsive styling |
| React Router | Navigation |
| GitHub Pages | Free hosting + PWA deployment |
Visit kevinb2212.github.io/spring-cleaning on any device.
Test account:
- Email:
test@example.com - Password:
Test123!
# Clone the repo
git clone https://github.com/KevinB2212/spring-cleaning.git
cd spring-cleaning
# Install dependencies
npm install
# Start the dev server
npm run dev
# Open http://localhost:5173# Build for production
npm run build
# Deploy to GitHub Pages
npm run deploy- Go to Firebase Console
- Click "Add project"
- Create a new project (e.g., "house-voting")
In the Firebase Console, enable:
- ✅ Authentication (Email/Password)
- ✅ Firestore Database (Start in production mode)
- ✅ Firebase Storage (For photo uploads)
Copy your Firebase config and add it to src/firebase.js:
const firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "your-project.firebaseapp.com",
projectId: "your-project-id",
storageBucket: "your-project.appspot.com",
messagingSenderId: "YOUR_SENDER_ID",
appId: "YOUR_APP_ID"
};In Firebase Auth > Users, create accounts for each housemate:
- Email: kevin@gmail.com, password: Kevin123!
- Email: shane@gmail.com, password: Shane123!
- etc.
Then create matching docs in Firestore under the users collection:
{
"uid": "auth_uid_here",
"name": "Kevin",
"email": "kevin@gmail.com",
"totalPoints": 0,
"avatar": "https://api.dicebear.com/7.x/avataaars/svg?seed=kevin",
"cleanStreak": 0,
"joinedAt": "2026-03-25"
}Deploy the security rules so only authenticated users can access:
firebase deploy --only firestore:rulesPush to main and GitHub Actions will auto-deploy, or:
npm run deploy- Someone posts a photo with an accusation (e.g., "Kitchen floor is disgusting")
- Accused housemate gets 24 hours to appeal with a written defense
- Other 4 housemates vote (Guilty or Not Guilty)
- Majority wins (3+ votes = guilty, adds 1 point)
- Results posted with vote breakdown (e.g., "3 Guilty, 1 Not Guilty")
- Leaderboard updates in real-time
- 1 point = One violation
- 3 points = House chooses punishment (usually chores, buying snacks, etc.)
- Points reset at end of month (or on schedule you set)
src/
├── components/
│ ├── Accusation.jsx # Post a new accusation
│ ├── Vote.jsx # Vote on an accusation
│ ├── Leaderboard.jsx # Points & stats
│ ├── Appeal.jsx # Submit a defense
│ └── Profile.jsx # Individual housemate page
├── pages/
│ ├── Home.jsx # Main dashboard
│ ├── Login.jsx # Auth
│ └── Details.jsx # Accusation detail view
├── firebase.js # Firebase config
├── App.jsx # Router setup
└── index.css # Global styles
Shows all active accusations waiting for votes, leaderboard, and your streak.
Photo, accusation text, appeals from accused, live vote counter, results.
Your housemate's history, points, appeals, clean streak.
Simple interface: vote Guilty or Not Guilty, see results live.
- Be fair — Only post if it's actually messy
- No revenge votes — Don't vote guilty to settle a grudge
- Respect appeals — Read the defense before voting
- Use photos — "The bathroom smells bad" doesn't count without proof
- 3-point rule — At 3 points, the accused chooses their punishment
- Anonymous voting mode (hide voter identity)
- Weekly challenges ("Keep kitchen clean all week" = -1 point)
- Photo evidence gallery (browse all accusations)
- Notification alerts (push notif when you're accused or it's your turn to vote)
- Export reports (CSV of all votes, points, dates)
- Custom point system (house votes to change 3-point threshold)
- Punishment tracker (what punishments were assigned/completed)
Used by Kevin & 4 housemates since March 2026. Results:
- ✅ 100% daily active usage
- ✅ House is cleaner (proof-based accountability works)
- ✅ No more arguments (voting is objective)
- ✅ Fair system everyone respects
MIT © Kevin Biju
"A tidy house is a tidy mind. Democracy keeps it that way."