Check it out: https://yhack2026-nu.vercel.app/
SuiteEase is a full-stack shared-living web app for roommates and suitemates. It combines chores, a shared bulletin board, expense tracking, settle-up flows, Google sign-in, and multi-suite membership in a single Next.js app backed by MongoDB.
This repository is the active app. It uses:
- Next.js App Router
- React + TypeScript
- Tailwind CSS
- MongoDB + Mongoose
- NextAuth
SuiteEase is designed as a one-suite-at-a-time experience, while still allowing a user to belong to multiple suites.
Core features:
- Google OAuth login
- Guest demo login
- Suite creation and invite-code joining
- Multi-suite membership with one active suite at a time
- Dashboard with a shared bulletin board and personal task summary
- Chores/tasks page with calendar + task board
- Shared expense tracking and settle-up flows
- Receipt scanning for expenses
- Suite assistant endpoint
SuiteEase distinguishes between:
- Membership: the suites a user is allowed to access
- Active suite: the one suite the user is currently viewing
The UI behaves as a single-suite app:
- all dashboard, tasks, finance, and bulletin data is scoped to the active suite
- switching suites changes the active suite only
- no view mixes data from multiple suites
Top-level app routes:
/login/onboarding//dashboard/tasks/finance/setup
SuiteEase currently supports:
- Google sign-in through NextAuth
- guest/demo sign-in through a credentials provider
Google sign-in is configured in:
Guest login:
- creates or reuses demo data through src/server/utils/guestSeed.ts
Post-auth behavior:
- new users without onboarding complete are routed through onboarding
- onboarded users go to the dashboard flow
Users create or join suites from:
Behavior:
Create Suitecreates a new suite and makes it active immediatelyJoin by Codeadds the suite to the user’s memberships and makes it active- users can belong to multiple suites
- the active suite is switchable from the app header
Suite APIs:
GET /api/suitesPOST /api/suitesPATCH /api/suitesfor active-suite switchingGET /api/suites/:idPOST /api/suites/join
Dashboard is powered by:
Current dashboard behavior:
- shared bulletin board for the active suite
My Taskscard scoped to the signed-in user- task summary includes:
- overdue tasks
- due today tasks
- upcoming tasks within the next 7 days
Dashboard API:
GET /api/dashboard/:suiteId
The bulletin board is a shared per-suite surface.
Key files:
Behavior:
- notes are stored in MongoDB
- notes are scoped to the active suite
- notes support color, inline edit, drag, delete, and persisted position
APIs:
GET /api/bulletin-notes?suiteId=...POST /api/bulletin-notesPATCH /api/bulletin-notes/:idDELETE /api/bulletin-notes/:id
Tasks are managed from:
Current capabilities:
- add a task
- assign to a suitemate
- due dates
- recurrence
- status updates
- Google Tasks sync for the assignee
- task board view
- calendar view
Important behavior:
- task board is active-suite scoped
- Google calendar tasks are filtered to tasks linked to the active suite, so tasks from other suites do not leak into the current calendar view
APIs:
GET /api/tasks?suiteId=...POST /api/tasksPATCH /api/tasks/:idPOST /api/tasks/:idfor Google Tasks syncGET /api/google-calendar?suiteId=...
Finance is managed from:
Current capabilities:
- add manual expenses
- add receipt-based expenses
- record payments
- edit expenses
- delete expenses
- delete settlements
- compute balances
- suggest settle-ups
Supporting services:
APIs:
GET /api/expenses?suiteId=...POST /api/expensesPATCH /api/expenses/:idDELETE /api/expenses/:idPOST /api/expenses/:id/payGET /api/expenses/balances/:suiteIdGET /api/settlements?suiteId=...POST /api/settlementsDELETE /api/settlements/:id
Receipt scanning is implemented server-side and used from the finance flow.
Endpoint:
POST /api/scan-receipt
Current implementation:
- accepts an uploaded image
- validates image type
- sends it to the configured AI receipt parser
- returns normalized receipt data for prefill
Current route:
Note:
- the current server route checks
LAVA_API_KEY - if receipt scanning is not configured, finance still works; only OCR-assisted prefill is unavailable
Guest mode is seeded through:
It creates:
- a demo suite
- demo roommates
- demo tasks
- demo expenses
- demo bulletin notes
Guest access is useful for:
- UI demos
- quick testing without Google OAuth
- local development when auth credentials are not set up yet
This repository’s current .env.example is minimal, but the app supports additional variables used by the active codebase.
Recommended local .env:
MONGODB_URI=mongodb://127.0.0.1:27017/suiteease
AUTH_SECRET=replace_with_a_long_random_string
AUTH_GOOGLE_ID=
AUTH_GOOGLE_SECRET=
NEXTAUTH_URL=http://localhost:3000
LAVA_API_KEY=
NEXT_PUBLIC_EXPERIMENTAL_BOARD=trueVariable notes:
MONGODB_URI: Mongo connection string, local or AtlasAUTH_SECRET: NextAuth secretAUTH_GOOGLE_ID: Google OAuth client idAUTH_GOOGLE_SECRET: Google OAuth client secretNEXTAUTH_URL: app base URL for NextAuthLAVA_API_KEY: required for receipt scanning and the suite assistantNEXT_PUBLIC_EXPERIMENTAL_BOARD: set tofalseto disable corkboard mode toggle
You can use either:
- local MongoDB
- MongoDB Atlas
If you use Homebrew on macOS:
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-communityTest the connection:
mongosh "mongodb://127.0.0.1:27017/suiteease"If mongosh connects, MongoDB is ready.
- Create a MongoDB Atlas cluster
- Create a database user
- Add your IP to Network Access
- Copy your connection string
- Set:
MONGODB_URI=mongodb+srv://<user>:<password>@<cluster-url>/suiteeaseTo use Google login locally:
- Create a Google Cloud project
- Enable the Google OAuth API flow
- Add an OAuth client
- Set authorized redirect URIs, including:
http://localhost:3000/api/auth/callback/google
- Put the credentials into
.env:
AUTH_GOOGLE_ID=...
AUTH_GOOGLE_SECRET=...
AUTH_SECRET=...
NEXTAUTH_URL=http://localhost:3000Without Google OAuth configured, you can still use the guest/demo login path.
Install dependencies:
npm installStart the app:
npm run devOpen:
http://localhost:3000
Production build:
npm run build
npm run startChoose one:
- Continue with Google
- Try as Guest
Go to:
/setup
Use:
Create Suiteto make a brand-new suiteJoin by Codeto join an existing suite
Use the suite switcher in the header. This updates the active suite for the current user.
Go to:
/tasks
You can:
- create tasks
- assign tasks
- update statuses
- sync eligible tasks to Google Tasks
Go to:
/finance
You can:
- record expenses
- upload receipts
- record payments
- view balances and settle-up recommendations
Use the dashboard board to:
- create notes
- edit notes
- drag notes
- share reminders with everyone in the active suite
Health endpoint:
GET /api/health
Useful when checking if the app is booting correctly.
Available npm scripts:
npm run dev
npm run build
npm run startThe shortest path to run locally:
cp .env.example .env
npm install
npm run devThen update .env with at least:
MONGODB_URIAUTH_SECRET
If you want Google login:
AUTH_GOOGLE_IDAUTH_GOOGLE_SECRETNEXTAUTH_URL
If you want receipt scanning / AI features:
LAVA_API_KEY