Inspiration
My inspiration for Crib Cub came from a place of pure, unadulterated freshman-year anxiety. Like every other incoming student, I was navigating the Lehigh housing portal, and I felt like I was gambling with the next year of my life. The website just gives you a name and a picture of a building. It tells you nothing about the culture. Is it the loud dorm? The social dorm? Is it clean?
Then came roommate selection. This felt even more like a lottery. You're trying to judge your compatibility with a total stranger based on a 50-word bio. My friends and I were swapping horror stories, and I just thought, "This is absurd." We have all this collective knowledge as students, but it's just scattered. I wanted a way to centralize that knowledge and help everyone make a more informed decision. That's where the idea for Crib Cub—a "Rate My Professors" but for dorms and roommates—was born.
What it does
Crib Cub is a secure, students-only review platform for Lehigh University. It allows students (verified by their @lehigh.edu email) to:
Read and write honest reviews for every dorm hall, covering categories like cleanliness, noise, and social life.
Review dorm-sponsored events, rating them on fun and community.
Search for and review potential roommates based on public-facing, structured feedback, helping students avoid bad living situations.
Earn badges for contributing to the community, encouraging participation.
To ensure a safe and constructive environment, every single review comment is moderated by the Google Gemini API to filter out hate speech and bullying before it gets posted.
How we built it
The entire project is built as a Single Page Application (SPA) using React.
Frontend & State: The app is built entirely in one file, using React's functional components and hooks. useState manages all the local component state (like what you've typed into a form). The most important hook is useContext, which creates a global "provider" that wraps the whole app. This provider holds the currentUser object, so any component can easily access user data without me having to pass it down through props.
Data Storage: I used a simple key-value storage system (mocked as window.storage). I designed a data structure to separate data logically. For example, all reviews for a specific dorm are stored at a key like dorm_reviews:Richards House. Roommate reviews were trickier: I store a private list for each user (e.g., roommate_reviews_by:my-email@lehigh.edu) so they can delete their own reviews, and a separate public list (e.g., roommate_reviews_about:their-email@lehigh.edu) that the search function uses.
AI Content Moderation: This is the feature I'm most proud of. Every time a user submits a review—for a dorm, event, or roommate—the text comment is first sent to the Google Gemini API (gemini-2.5-flash-preview-09-2025 model). I gave the model a simple system instruction: "You are a content moderator. Respond with only 'SAFE' or 'UNSAFE'." If the API returns 'UNSAFE', the app blocks the submission and shows the user an error message, all before the hateful content ever reaches the database.
Challenges we ran into
The Roommate Review Dilemma: The biggest challenge was ethical. How could I build the roommate review feature, which everyone wanted, without it instantly turning into a platform for bullying? This was a project-killer of a problem. The Gemini API was my solution. It wasn't just a cool feature; it was the only way the project could responsibly exist. Even with the API, I added a "Report" button on every review as a manual backup.
Data Syncing: Syncing the private and public roommate reviews was tough. When a user deletes their review, I had to make sure the code deleted it from their private list (roommate_reviews_by:...) AND from the public list (roommate_reviews_about:...). This meant writing careful async functions to fetch the old public list, filter it, and then save it back.
Preventing "Alert Hell": In my first drafts, I was using alert() and window.confirm() for everything. I quickly learned that these are disruptive and don't work in all environments. My challenge was to refactor all of those into a proper, component-based error-handling system, like the component that shows error messages directly on the page.
Accomplishments that we're proud of
I'm incredibly proud of successfully solving the ethical challenge of roommate reviews. Implementing the Gemini API for pre-submission moderation was a breakthrough. It allowed me to build the app's most-requested feature in a way that is responsible and prioritizes student safety.
I'm also proud of the data structure for roommate reviews—separating the private and public data—which works well to give users control over the reviews they've written while still making them searchable. Finally, getting the 60-day cooldown logic and the dorm-change cooldown to work correctly was a nice win for product-minded-design.
What we learned
Product Design is Hard: My biggest lesson was balancing features with fairness. It's easy to build a review app, but it's hard to build a responsible one. This forced me to think like a product manager, asking questions about spam prevention, anti-bullying measures, and user incentives.
The Power of a Good API: Before this, "API" was just an acronym. Now, I see it as a superpower. Integrating the Google Gemini API was a game-changer. It showed me how I could leverage massive, complex models to solve a core project challenge (moderation) with just a few lines of code.
Modern React is Awesome: On the technical side, I finally had a breakthrough with React. I learned how to properly manage a global user session with useContext, which makes passing data like currentUser so much cleaner. I also got a lot more comfortable with asynchronous JavaScript (async/await) for all the fetch calls to the API and the (mocked) database.
What's next for CribCub
CribCub is currently a proof-of-concept, and the next step is to make it production-ready.
Real Database: The first priority is to migrate from window.storage to a real-time, persistent database like Firebase Firestore. This would allow data to persist and be shared between all users.
Expand Review Categories: The review system is a great framework. The next logical step is to expand it to other parts of campus life, like Off-Campus Housing, Dining Halls, or even Professors.
Improved UI/UX: I would implement a custom modal component to replace the alert()s I'm still using (like for deleting a review) and to create a more professional-feeling "Are you sure?" confirmation.
Full User Management: I would build out a full authentication flow, including a "Forgot Password" feature.
Built With
- chatgpt
- claude
- figma
- gemini
- lovable
Log in or sign up for Devpost to join the conversation.