# Project export: indiwrap

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: CruzHacks 2025
- Tagline: Keep your house running smoothly — our app tracks chores, events, and keeps everyone on the same page! No more roommate drama.
- Devpost: https://devpost.com/software/slugville
- GitHub: https://github.com/yureinon/individually-wrapped
- Demo: https://individually-wrapped-frontend.onrender.com/
- Team: 4 GitHub contributor(s) — mizwan (34 commits), klam (27 commits), fionaleungg (16 commits), pineapplezsauce (13 commits)

## Devpost submission (written by the team)

### Inspiration

Our inspiration for this project was to make coordinating with roommates easier. We wanted an app that made communicating in shared living spaces simpler.

### What it does

Our project is a roommate coordination application with various features to make communicating with roommates and housemates much easier. Users are able to create an account and login. Once a user signs up and logs in, they are able to access the main app. The first page encourages them to either join a household or invite other users to a new one. There is also a status that can be set and seen by other users. The chores the user has for the week will display on the home page. There is another page that displays all the chores. Users will automatically be assigned new chores when the new week begins. Users also have the ability to create events which are displayed on a separate calendar page.

### How we built it

We used the MERN stack, composed of MongoDB, Express, React, and Node.js. To help work coordinate with other team members, we used a shared Github repository and worked in branches to help minimize merge conflicts. We first designed the application on Figma, then split our team, with two of us working on the backend and two of us on the front end. We made sure to write a document so our variable names were the same when fetching backend data from the frontend. Finally, to deploy our application, we used Render to deploy both the frontend and backend.

### Challenges we ran into

Some challenges we ran into were adapting to MongoDB. The primary weakness was the difficulty of writing more complex query statements. We were unfamiliar with MongoDB’s functionality and capabilities, leading to unoptimized code. Another challenge we encountered was connecting the backend to frontend, as there was a lack of communication involving the data being returned.

### Accomplishments we're proud of

Some accomplishments we’re proud of are designing and building a deployable full-stack application in a team. It was really rewarding to effectively work in Git branches and be able to see each part of the project be fleshed out.

### What we learned

The biggest thing we learned was working with MongoDB and working with others on Git branches concurrently. Some things that we worked on would be communication, keeping the shared documentation updated to date with any changes would be helpful for both sides.

### What's next

A lot of what’s next is polishing up the project and squashing bugs. There was still a lot more that we wanted to implement with a lot of our implementation missing the ability to be deleted. We had a whole laundry timer page concept that ended up being scrapped as it was lower on the hierarchy. We could also look into responsive web design for a desktop version of the application. There were also plans to be able to edit the color scheme and allow users to edit their profile, show shared items and groceries. To keep users up to date with the most recent changes to their house, we could also implement a notification inbox / push notification system.

## README (from the GitHub repository)

To run server use inside mern/server:

node --env-file=config.env server

To run frontend use inside mern/client:

npm run dev


## Detected evidence (automated analysis)

Indexed codebase: 60 recognized source files, 95 KB.
- CSS (language) — detected in the code
- Express (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- MongoDB (technology) — detected in the code
- React (technology) — detected in the code
- Node.js (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (67 of 67)

```
.DS_Store
.gitignore
mern/.DS_Store
mern/client/.gitignore
mern/client/eslint.config.js
mern/client/index.html
mern/client/package.json
mern/client/README.md
mern/client/src/add-members/added.jsx
mern/client/src/add-members/page.jsx
mern/client/src/App.jsx
mern/client/src/AuthenticatedRoute.jsx
mern/client/src/chores-list/Chore.jsx
mern/client/src/chores-list/ChoresList.jsx
mern/client/src/chores-list/EventContext.jsx
mern/client/src/chores-list/RotateChores.jsx
mern/client/src/home/Chore.jsx
mern/client/src/home/Home.jsx
mern/client/src/home/Roommate.jsx
mern/client/src/home/StatusContext.jsx
mern/client/src/home/StatusPopup.jsx
mern/client/src/house-selection/button.jsx
mern/client/src/house-selection/page.jsx
mern/client/src/HouseContext.jsx
mern/client/src/index.css
mern/client/src/invitations-create/CreateHouse.jsx
mern/client/src/invitations-create/Invitations.jsx
mern/client/src/invitations-create/InvitationsCreate.jsx
mern/client/src/main.jsx
mern/client/src/NotFound.jsx
mern/client/src/schedule/createevent.jsx
mern/client/src/schedule/dates.jsx
mern/client/src/schedule/event.jsx
mern/client/src/schedule/EventContext.jsx
mern/client/src/schedule/page.jsx
mern/client/src/signup-login/Landing.jsx
mern/client/src/signup-login/Login.jsx
mern/client/src/signup-login/Signup.jsx
mern/client/src/styles/add-member.css
mern/client/src/styles/App.css
mern/client/src/styles/ChoresList.css
mern/client/src/styles/Home.css
mern/client/src/styles/house-selection.css
mern/client/src/styles/InvitationsCreate.css
mern/client/src/styles/Landing.css
mern/client/src/styles/Login.css
mern/client/src/styles/schedule.css
mern/client/src/styles/Signup.css
mern/client/src/UserContext.jsx
mern/client/vite.config.js
mern/server/config.env
mern/server/controllers/authController.js
mern/server/controllers/choreController.js
mern/server/controllers/eventController.js
mern/server/controllers/houseController.js
mern/server/controllers/inviteController.js
mern/server/controllers/userController.js
mern/server/db/connection.js
mern/server/package.json
mern/server/routes/auth.js
mern/server/routes/chore.js
mern/server/routes/event.js
mern/server/routes/house.js
mern/server/routes/invite.js
mern/server/routes/user.js
mern/server/server.js
README.md
```

### Dependencies

- mern/client/package.json: @eslint/js@^9.21.0, @types/react@^19.0.10, @types/react-dom@^19.0.4, @vitejs/plugin-react@^4.3.4, autoprefixer@^10.4.21, eslint@^9.21.0, eslint-plugin-react-hooks@^5.1.0, eslint-plugin-react-refresh@^0.4.19, globals@^15.15.0, postcss@^8.5.3, react@^19.0.0, react-dom@^19.0.0, react-router-dom@^7.5.0, vite@^6.2.0
- mern/server/package.json: bcrypt@^5.1.1, cors@^2.8.5, dotenv@^16.5.0, express@^5.1.0, jsonwebtoken@^9.0.2, mongodb@^6.15.0, swagger-jsdoc@^6.2.8, swagger-ui-express@^5.0.1

### Recent commits (newest first)

- Update .gitignore
- Update .gitignore
- manually replaced every fetch link
- upper case
- changed landing to landing.jsx
- update gitignore to deploy
- 1 line
- Merge pull request #12 from yureinon/morehome-frontend-backend
- kinda working
- bruhbruh
- bbruh
- chore list
- get chore fixed
- Msdferge branch 'morehome-frontend-backend' of https://github.com/yureinon/individually-wrapped into morehome-frontend-backend
- a
- Merge pull request #11 from yureinon/backend
- add chores
- status
- invite and roommate list
- Merge branch 'chores' of https://github.com/yureinon/individually-wrapped into backend

## Key source files (fetched from GitHub, selected and truncated for size)

### mern/server/package.json

```
{
  "name": "server",
  "version": "1.0.0",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "bcrypt": "^5.1.1",
    "cors": "^2.8.5",
    "dotenv": "^16.5.0",
    "express": "^5.1.0",
    "jsonwebtoken": "^9.0.2",
    "mongodb": "^6.15.0",
    "swagger-jsdoc": "^6.2.8",
    "swagger-ui-express": "^5.0.1"
  }
}

```

### mern/client/package.json

```
{
  "name": "client",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "@eslint/js": "^9.21.0",
    "@types/react": "^19.0.10",
    "@types/react-dom": "^19.0.4",
    "@vitejs/plugin-react": "^4.3.4",
    "autoprefixer": "^10.4.21",
    "eslint": "^9.21.0",
    "eslint-plugin-react-hooks": "^5.1.0",
    "eslint-plugin-react-refresh": "^0.4.19",
    "globals": "^15.15.0",
    "postcss": "^8.5.3",
    "react-router-dom": "^7.5.0",
    "vite": "^6.2.0"
  }
}

```

### mern/server/server.js

```javascript
import express from 'express';
import cors from 'cors';
import swaggerUi from 'swagger-ui-express';
import swaggerJSDoc from 'swagger-jsdoc';
import auth from './routes/auth.js';
import user from './routes/user.js';
import house from './routes/house.js';
import invite from "./routes/invite.js";
import event from './routes/event.js';
import chore from "./routes/chore.js";

const PORT = process.env.PORT || 5050;
const app = express();

// swagger setup
const swaggerOptions = {
  definition: {
    openapi: '3.0.1',
    info: {
      title: 'MERN API Docs',
      version: '1.0.0',
    },
    components: {
      securitySchemes: {
        bearerAuth: {
          type: 'http',
          scheme: 'bearer',
          bearerFormat: 'JWT',
        },
      },
    },
  },
  apis: ['./routes/*.js'], // Path to route files with Swagger comments
};

const swaggerSpec = swaggerJSDoc(swaggerOptions);
app.use('/api/v0/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));

app.use(cors());
app.use(express.json());
app.use('/api/v0/login', auth);
app.use('/api/v0/user', user);
app.use('/api/v0/house', house)
app.use("/api/v0/invite", invite);
app.use('/api/v0/event', event)
app.use("/api/v0/chore", chore);

// start the Express server
app.listen(PORT, () => {
  console.log(
    `Server listening on port ${PORT}\nLink: http://localhost:5050/api/v0/docs`
  );
});

```

### mern/client/src/main.jsx

```javascript
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <App />
  </StrictMode>,
)

```

### mern/client/src/App.jsx

```javascript
import {BrowserRouter, Routes, Route} from 'react-router-dom';
// import AuthenticatedRoute from './AuthenticatedRoute';
import NotFound from './NotFound';
import './styles/App.css'
import './styles/Landing.css'
import Landing from './signup-login/Landing'
import Login from './signup-login/Login'
import Signup from './signup-login/Signup'
import Home from './home/Home'
import HouseSelection from './house-selection/page'
import InvitePage from './add-members/page'
import InvitationsCreate from './invitations-create/InvitationsCreate'
import SchedulePage from './schedule/page'
import UserContext from './UserContext';
import HouseContext from './HouseContext';
import ChoresList from './chores-list/ChoresList'
import React from 'react';
import Chore from './home/Chore';

function App() {
  const [currentUserEmail, setUserEmail] = React.useState('');
  const [currentUserName, setUserName] = React.useState('');
  const [houseName, setHouseName] = React.useState('');
  const [houseType, setHouseType] = React.useState('');
  // const [selectedWorkspace, setSelectedWorkspace] = React.useState('');
  // const [selectedChannel, setChannel] = React.useState('');

  return (
    //   selectedWorkspace, setSelectedWorkspace, selectedChannel, setChannel}}>
    <UserContext.Provider value={{currentUserEmail, setUserEmail, currentUserName, setUserName}}>
      <HouseContext.Provider value={{houseName, setHouseName, houseType, setHouseType}}>
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<Landing />} />
          <Route path="/login" element={
            // <AuthenticatedRoute>
              <Login />
            // </AuthenticatedRoute>
          } />
          <Route path="/signup" element={
            // <AuthenticatedRoute>
              <Signup />
            // </AuthenticatedRoute>
          } />
          <Route path="/home" element={
            // <AuthenticatedRoute>
              <Home />
            // </AuthenticatedRoute>
          } />
          <Route path="/schedule" element={
            // <AuthenticatedRoute>
              <SchedulePage />
            // </AuthenticatedRoute>
          } />
          <Route path="/invitationscreate" element={
            // <AuthenticatedRoute>
              <InvitationsCreate />
            // </AuthenticatedRoute>
          } />
          <Route path="/houseselection" element={
            // <AuthenticatedRoute>
              <HouseSelection />
            // </AuthenticatedRoute>
          } />
          <Route path="/invites" element={
            // <AuthenticatedRoute>
              <InvitePage />
            // </AuthenticatedRoute>
          } />
          <Route path="/choreslist" element={
            // <AuthenticatedRoute>
              <ChoresList />
            // </AuthenticatedRoute>
          } />
          <Route path="*"
            element={
              // <AuthenticatedRoute >
                <NotFound />
              // </AuthenticatedRoute>
            }
          />
        </Routes>
      </BrowserRouter>
      </HouseContext.Provider>
    </UserContext.Provider>
  );
}

export default App;

```

### mern/client/vite.config.js

```javascript
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vite.dev/config/
export default defineConfig({
  plugins: [react()],
})

```

### mern/client/eslint.config.js

```javascript
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'

export default [
  { ignores: ['dist'] },
  {
    files: ['**/*.{js,jsx}'],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
      parserOptions: {
        ecmaVersion: 'latest',
        ecmaFeatures: { jsx: true },
        sourceType: 'module',
      },
    },
    plugins: {
      'react-hooks': reactHooks,
      'react-refresh': reactRefresh,
    },
    rules: {
      ...js.configs.recommended.rules,
      ...reactHooks.configs.recommended.rules,
      'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
      'react-refresh/only-export-components': [
        'warn',
        { allowConstantExport: true },
      ],
    },
  },
]

```

### mern/client/index.html

```html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800&display=swap" rel="stylesheet">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"/>
    <title>indiwrap</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

```

### mern/client/src/UserContext.jsx

```javascript
import React from 'react';

const UserContext = React.createContext();
export default UserContext;
```

### mern/client/src/HouseContext.jsx

```javascript
import React from 'react';

const HouseContext = React.createContext();
export default HouseContext;
```

[50 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]