Roommate Expectations App - PRD
Executive Summary
A Progressive Web App (PWA) designed to transform written roommate expectations into a living, trackable system. Built for Gary Sheng and Dawson Carroll as they begin their new living arrangement at Hyde Park, Austin.
The core philosophy: Make expectations stupidly clear. No ambiguity. No "I thought you were going to do that." Just a shared source of truth that both roommates can reference and update in real-time.
Problem Statement
Roommate conflicts rarely stem from malice. They stem from:
- Unclear expectations - "I didn't know that bothered you"
- Memory gaps - "Whose turn was it to take out the trash?"
- Invisible labor - "I always buy the dish soap"
- Communication friction - Awkwardness around bringing up small issues before they become big ones
Traditional solutions (verbal agreements, posted lists on the fridge) fail because:
- They're not accessible when you're at the store wondering "did we need paper towels?"
- They don't track history
- They require manual mental tracking of rotating responsibilities
- They create friction around accountability
Solution Overview
A mobile-friendly web app that:
- Codifies expectations - Every rule is visible, agreed-upon, and referenceable
- Automates rotation tracking - The app knows whose turn it is
- Creates accountability without awkwardness - The system does the reminding, not your roommate
- Builds trust through transparency - Shared expense history, task completion logs
Target Users
Primary Users
- Gary Sheng - Moving into Dawson's apartment at Hyde Park, Austin
- Dawson Carroll - Current resident, podcast strategist, fellow Christian
User Context
- Both are busy professionals with unpredictable schedules
- Both value clear communication and have discussed expectations upfront
- Both are Christians who want to "push each other towards Christ"
- Both are technically literate and comfortable with apps
Core Features
1. Dashboard (Home Screen)
The first thing you see when opening the app. Shows at-a-glance status of everything that matters.
Components:
- Your Turn Alert - Prominent banner if any rotating task is on you
- Today's Cleaning Status - Quick view of daily checklist completion
- Balance Summary - "Dawson owes Gary $14.50" or "All square"
- Recent Activity Feed - Last 5 actions (tasks completed, expenses logged, guests announced)
- Faith Encouragement - Daily verse or encouragement widget (optional, can be hidden)
Design Notes:
- Should load in under 2 seconds
- Everything important visible without scrolling on mobile
- Dark mode default with light mode option
2. Rotating Tasks
Tracks "who did it last" for tasks that alternate between roommates.
Tasks to Track:
| Task | Frequency | Notes |
|---|---|---|
| Regular trash | As needed | When full or stinking |
| Friday trash day | Weekly | Put out bins for pickup |
| Shared supplies purchase | As needed | Dish soap, detergent, hand soap, counter cleaner |
| Vacuuming | Weekly minimum | Common areas |
For Each Task, Display:
- Task name and icon
- Who did it last
- When they did it (relative time: "3 days ago")
- Whose turn is next (prominently displayed)
- History log (expandable)
Interactions:
- One-tap "I did this" button
- Confirmation dialog to prevent accidental taps
- Optional: Add notes ("Bought the big bottle this time")
Logic:
- Simple alternation: Gary → Dawson → Gary → Dawson
- System automatically updates "next up" when task is marked complete
- If same person does it twice in a row, that's fine (sometimes you just do it) but the system notes it
3. Daily Cleaning Checklist
Personal accountability for daily cleaning habits. Not about tracking each other, but about personal commitment to shared standards.
Daily Tasks:
| Task | Rule |
|---|---|
| Dishes | Either drying on rack or in dishwasher by end of day |
| Dishwasher | Run it when full |
| Counters | Wipe after cooking |
| Cups | Don't leave empty cups lying around |
| Common area | Keep tidy by end of day |
| Leftovers check | Nothing older than 1 week in fridge |
Behavior:
- Resets at midnight each day
- Each roommate checks off their own items
- No nagging or notifications to the other person
- Weekly summary shows completion rates (for self-reflection, not judgment)
Design:
- Simple checkboxes
- Satisfying animation on completion
- Green checkmarks persist until midnight reset
4. Expense Tracker
Tracks shared expenses and calculates running balance.
Expense Categories:
-
Shared Supplies (rotating purchase responsibility)
- Dish soap
- Laundry detergent
- Hand soap
- Counter cleaner
- Paper towels
- Trash bags
- etc.
-
Utilities (split 50/50)
- Electric
- Internet
- Water (if applicable)
Expense Entry Fields:
- Item/description (required)
- Amount (required)
- Category: Shared Supplies / Utilities / Other
- Paid by: Gary / Dawson
- Date (defaults to today)
- Receipt photo (optional)
Balance Calculation:
- For Shared Supplies: Track who bought what, running total
- For Utilities: Enter total, auto-calculate 50% split
- Display: Net balance ("Dawson owes Gary $X" or "All square")
Settlement:
- "Settle Up" button to record when balance is paid
- Settlement history log
Monthly Summary:
- Total shared expenses
- Breakdown by category
- Who paid what
5. Guest Notifications
Simple visibility into when guests are expected. Not a permission system. Just a heads-up.
Fields:
- Who's posting (auto-filled)
- Brief message ("Friend coming over for dinner")
- Date/time (optional, defaults to "today")
Display:
- Reverse chronological feed
- Shows: Who posted, message, when
- Last 30 days visible, older archived
Rules Codified:
- "If someone needs to crash, just communicate"
- "Don't allow guests to use each other's things"
- These appear as reminder text in the guest section
6. Move-In Todos
Shared checklist for one-time setup tasks.
Initial Items:
- Move Gary in
- Get second key made
- Work out shared common space
- Figure out rent payment method
Features:
- Add new items
- Mark complete (shows who completed, when)
- Archive completed items
- Can be repurposed for future projects (apartment improvements, etc.)
7. Expectations Reference
A static page that displays the full roommate expectations document. Always accessible. The source of truth.
Sections:
- Core Values (Communicate well, Respect space, Push each other towards Christ)
- Cleaning Standards
- Expense Rules
- Space Rules
- Guest Etiquette
Design:
- Clean typography, easy to read
- Expandable sections
- Last updated timestamp
- Option to propose edits (creates a discussion item)
8. Faith Integration (Optional Feature)
Given the shared commitment to "push each other towards Christ," include optional faith elements.
Options:
- Daily verse on dashboard (from API or curated list)
- "Praying for you today" quick action
- Weekly reflection prompt ("How did we honor God in our home this week?")
- Can be fully hidden if preferred
Technical Architecture
Platform: Progressive Web App (PWA)
Why PWA over native:
- Works on any device (iOS, Android, desktop)
- No app store approval needed
- Can be installed to home screen
- Offline capable
- Faster to build and iterate
Tech Stack
| Component | Technology | Rationale |
|---|---|---|
| Framework | Next.js 14 (App Router) | Modern React, great PWA support, easy deployment |
| Styling | Tailwind CSS | Rapid UI development, consistent design |
| Database | Firebase Firestore | Real-time sync, generous free tier, easy auth if needed |
| Hosting | Vercel | Free tier, automatic deployments, great DX |
| PWA | next-pwa package | Simple service worker setup |
Data Model (Firestore)
/config
- roommates: ["gary", "dawson"]
- createdAt: timestamp
/rotatingTasks/{taskId}
- id: "trash"
- name: "Take out trash"
- icon: "🗑️"
- lastDoneBy: "gary" | "dawson" | null
- lastDoneAt: timestamp | null
- nextUp: "gary" | "dawson"
- history: [
{ by: "gary", at: timestamp, notes: "" },
{ by: "dawson", at: timestamp, notes: "" }
]
/cleaningLogs/{YYYY-MM-DD}
- date: "2026-01-02"
- gary: {
dishes: true,
counters: false,
cups: true,
commonArea: true,
completedAt: timestamp
}
- dawson: {
dishes: true,
counters: true,
cups: true,
commonArea: true,
completedAt: timestamp
}
/expenses/{expenseId}
- id: auto-generated
- item: "Dish soap"
- amount: 8.99
- category: "shared" | "utilities" | "other"
- paidBy: "gary" | "dawson"
- date: timestamp
- notes: ""
- receiptUrl: "" (optional)
- createdAt: timestamp
/settlements/{settlementId}
- amount: 50.00
- from: "dawson"
- to: "gary"
- date: timestamp
- notes: "Venmo'd"
/guests/{guestId}
- postedBy: "gary" | "dawson"
- message: "Friend coming over for dinner"
- expectedDate: timestamp
- createdAt: timestamp
/todos/{todoId}
- text: "Get second key made"
- completed: false
- completedBy: null | "gary" | "dawson"
- completedAt: null | timestamp
- createdAt: timestamp
- createdBy: "gary" | "dawson"
Security Model
Simple approach (no auth):
- App is accessible only via direct URL
- URL not indexed by search engines
- Firestore rules allow read/write from app domain only
- Acceptable for two trusted roommates
If auth desired later:
- Add Firebase Auth with email/password or Google
- Each user authenticates
- Firestore rules restrict to authenticated users
User Interface Design
Design Principles
- Mobile-first - Primary use case is checking/updating from phone
- One-tap actions - Common tasks require minimal interaction
- Glanceable - Key info visible without drilling down
- Dark mode default - Easier on eyes, modern aesthetic
- No clutter - Every element earns its place
Navigation
Bottom navigation bar with 5 items:
- Home (Dashboard)
- Tasks (Rotating tasks)
- Clean (Daily checklist)
- Money (Expenses)
- More (Guests, Todos, Expectations, Settings)
Color Palette
| Element | Color | Usage |
|---|---|---|
| Background | #0a0a0a | Dark base |
| Cards | #1a1a1a | Elevated surfaces |
| Primary | #22c55e | Actions, success states |
| Warning | #f59e0b | Attention needed |
| Danger | #ef4444 | Overdue items |
| Text | #fafafa | Primary text |
| Muted | #71717a | Secondary text |
Typography
- Headings: Inter or similar geometric sans-serif
- Body: System font stack for performance
- Monospace: For amounts and dates
Key Screens Wireframes
Dashboard:
┌─────────────────────────────┐
│ 🏠 Gary & Dawson │
├─────────────────────────────┤
│ ⚠️ YOUR TURN: Take out │
│ trash │
├─────────────────────────────┤
│ Today's Cleaning 3/5 ✓ │
│ [━━━━━━━━━━░░░] │
├─────────────────────────────┤
│ Balance All square │
├─────────────────────────────┤
│ Recent Activity │
│ • Gary: Bought dish soap │
│ • Dawson: Vacuumed │
│ • Guest: Friend tmrw │
├─────────────────────────────┤
│ 📖 "Iron sharpens iron..." │
└─────────────────────────────┘
│ 🏠 📋 🧹 💰 ⋯ │
└─────────────────────────────┘
Rotating Tasks:
┌─────────────────────────────┐
│ ← Rotating Tasks │
├─────────────────────────────┤
│ 🗑️ Regular Trash │
│ Last: Gary, 3 days ago │
│ Next up: DAWSON │
│ [I Did This] │
├─────────────────────────────┤
│ 📦 Friday Trash Day │
│ Last: Dawson, Jan 3 │
│ Next up: GARY │
│ [I Did This] │
├─────────────────────────────┤
│ 🧴 Shared Supplies │
│ Last: Gary (dish soap) │
│ Next up: DAWSON │
│ [I Bought...] │
├─────────────────────────────┤
│ 🧹 Vacuuming │
│ Last: Dawson, 5 days ago │
│ Next up: GARY ⚠️ │
│ [I Did This] │
└─────────────────────────────┘
Implementation Phases
Phase 1: Foundation (Day 1 Morning)
- Initialize Next.js project with TypeScript
- Configure Tailwind CSS with dark theme
- Set up Firebase project and Firestore
- Configure PWA manifest and service worker
- Create basic layout and navigation shell
- Deploy to Vercel
Phase 2: Core Features (Day 1 Afternoon)
- Build Dashboard with placeholder data
- Implement Rotating Tasks with full CRUD
- Implement Daily Cleaning Checklist
- Wire up Firebase real-time listeners
Phase 3: Expenses & More (Day 2 Morning)
- Build Expense Tracker with balance calculation
- Implement Guest Log
- Implement Move-In Todos
- Add Expectations reference page
Phase 4: Polish (Day 2 Afternoon)
- Add animations and micro-interactions
- Implement PWA install prompt
- Add offline support
- Test on multiple devices
- Seed initial data (your actual expectations)
- Final deploy
Success Metrics
Functional Success
- Both roommates can access the app from their phones
- Real-time sync works (one person's action appears for the other)
- PWA can be installed to home screen
- App works offline for viewing (syncs when back online)
Adoption Success (1 month check-in)
- App is used at least weekly by both roommates
- Rotating task disputes: zero
- "Whose turn was it?" questions: zero
- Both roommates report feeling clarity around expectations
Relationship Success (3 month check-in)
- No roommate conflicts related to tracked areas
- Both report the system as helpful, not annoying
- Optional: Positive impact on faith accountability
Future Enhancements (Not in V1)
- Push notifications - "Reminder: Trash day tomorrow"
- Recurring expense scheduling - Auto-log monthly utilities
- Photo evidence - Before/after cleaning photos
- Gamification - Streaks, achievements (maybe too much)
- Multi-roommate support - Scale to 3+ people
- Receipt OCR - Scan receipts to auto-fill expense
- Integration with Venmo/Splitwise - Direct settlement
- Calendar sync - Guest notifications to phone calendar
Risks and Mitigations
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| One person doesn't use it | Medium | High | Make it so simple there's no excuse. One-tap actions. |
| App feels like surveillance | Low | High | Focus on self-accountability, not tracking the other. No notifications about what the other person didn't do. |
| Over-engineering | Medium | Medium | Stick to the weekend timeline. Ship MVP first. |
| Firebase costs | Very Low | Low | Two users, minimal data. Free tier is more than enough. |
Appendix A: Full Expectations Document
For reference, the complete roommate expectations as agreed upon:
Core Values
- Communicate well and don't be afraid to.
- Respect each other's space and things.
- Push each other towards Christ!
Cleaning
- Dishes either drying on rack or in dishwasher by end of day.
- When dishwasher is full, run it.
- Wipe counters after cooking.
- Don't keep leftovers in fridge for longer than one week.
- Vacuum at least one time a week.
- Keep common area clean.
- Don't leave empty cups lying around, either put them in dishwasher or clean and dry them.
- When trash is stinking or full, take it out (rotating list).
- Trash day is Friday morning; put out bins for pickup (rotating list).
Expenses
- For shared use items, rotate buying (rotating list).
- Split utilities down the middle.
- Groceries are separate (ask before eating something the other bought).
Space
- Keep common area clean by end of day.
- Ask before using another's things unless specified.
- Don't allow guests to use each other's things.
Guests
- Text each other if someone will be coming over to give a heads up.
- If someone needs to crash, just communicate with each other.
Appendix B: Project Structure
roommate-app/
├── app/
│ ├── layout.tsx # Root layout with nav
│ ├── page.tsx # Dashboard
│ ├── tasks/
│ │ └── page.tsx # Rotating tasks
│ ├── cleaning/
│ │ └── page.tsx # Daily checklist
│ ├── expenses/
│ │ ├── page.tsx # Expense list & balance
│ │ └── add/page.tsx # Add expense form
│ ├── guests/
│ │ └── page.tsx # Guest log
│ ├── todos/
│ │ └── page.tsx # Move-in todos
│ └── expectations/
│ └── page.tsx # Full expectations doc
├── components/
│ ├── ui/
│ │ ├── Button.tsx
│ │ ├── Card.tsx
│ │ ├── Checkbox.tsx
│ │ └── ...
│ ├── Dashboard/
│ │ ├── YourTurnAlert.tsx
│ │ ├── CleaningStatus.tsx
│ │ ├── BalanceSummary.tsx
│ │ └── ActivityFeed.tsx
│ ├── Tasks/
│ │ └── TaskCard.tsx
│ ├── Expenses/
│ │ ├── ExpenseForm.tsx
│ │ └── ExpenseItem.tsx
│ └── Navigation.tsx
├── lib/
│ ├── firebase.ts # Firebase config & init
│ ├── db.ts # Firestore helpers
│ ├── hooks/
│ │ ├── useTasks.ts
│ │ ├── useExpenses.ts
│ │ ├── useCleaning.ts
│ │ └── ...
│ └── utils.ts # Date formatting, etc.
├── public/
│ ├── manifest.json # PWA manifest
│ ├── icons/
│ │ ├── icon-192.png
│ │ └── icon-512.png
│ └── sw.js # Service worker (generated)
├── styles/
│ └── globals.css # Tailwind imports
├── next.config.js # Next.js + PWA config
├── tailwind.config.js
├── tsconfig.json
├── package.json
└── README.md
Appendix C: Firebase Setup Checklist
- Create new Firebase project at console.firebase.google.com
- Enable Firestore Database (start in test mode, lock down later)
- Get web app config (apiKey, authDomain, projectId, etc.)
- Create
.env.localwith Firebase credentials - Initialize collections with seed data
Firestore Rules (initial permissive, tighten later):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
Document created: January 2, 2026 Authors: Gary Sheng, with AI assistance Status: Ready for implementation