Campus
Connect_

The all-in-one campus app — market, rides, housing, community & more

As Product & UX Research Lead at Campus Connect, I identified key friction points through 100+ usability tests, built 15+ Figma prototypes, and scraped 5,800+ course records to accelerate early product validation — all while shaping the core product strategy from the ground up.

Role
Product & UX Research Lead
Company
Campus Connect
Location
Berkeley, CA
Timeline
Sep 2025 – Present
Type
Startup · 0→1
campus.
Product & UX Research · Berkeley, CA · 2025–Present
Home Market Community Rides Housing
01 — overview

What is Campus Connect?

Campus Connect is a startup building an all-in-one platform for college students — combining a peer marketplace, anonymous community forum, ride sharing, housing search, and a smart home dashboard into a single app tailored to campus life.

I joined as Product & UX Research Lead, responsible for owning the research pipeline, designing and testing UI concepts in Figma, and building early data infrastructure to validate the product before full development.

100+
Usability tests conducted to identify friction points
35%
Improvement in task completion clarity during moderated sessions
5,800+
Course records scraped with BeautifulSoup to build data prototype
Product Strategy UX Research Figma Usability Testing Python / BeautifulSoup Data Scraping Interaction Design 0→1 Product

02 — the product

Five features, one campus platform

Campus Connect spans five core features, each solving a distinct pain point for college students. The challenge was designing a cohesive experience that doesn't feel fragmented — while making each feature feel purpose-built for its context.

Home
Dashboard showing daily schedule, notifications, and recent activity at a glance
Market
Buy & sell with fellow students — textbooks, furniture, electronics
Community
Totally anonymous forum — life hacks, vents, campus tips, peer support
Rides
Split rides with classmates — peer-to-peer campus rideshare with real scheduling
Housing
Find subleases and rentals near campus, filtered by distance and availability
📷 Dark Mode UI
All 5 screens — dark mode overview
campus-darkmode.png  ·  your first screenshot
Campus Connect — dark mode: Home, Market, Community, Rides, Housing
📷 Light Mode UI
All 5 screens — light mode overview
campus-lightmode.png  ·  your second screenshot
Campus Connect — light mode variant

03 — research

Finding the friction — 100+ usability tests

I led the full research pipeline — designing test scenarios, running moderated usability sessions, and synthesizing findings into actionable friction points. With 100+ sessions across the product's core flows, I identified 3 key friction areas that were blocking user progress.

Friction Point 01
Scheduling — unclear task structure
Users struggled to understand their day at a glance. The home dashboard lacked visual hierarchy, making it hard to distinguish what was active, upcoming, or done.
Friction Point 02
Subleasing — trust & discovery gaps
Users were uncertain about listing legitimacy and had trouble filtering by their actual needs (distance, move-in date, price). The flow felt like a generic rental app, not a campus-specific one.
Friction Point 03
Marketplace — offer flow confusion
Users didn't understand what happened after tapping "Make Offer" — no confirmation, no status update. The gap between intent and feedback created drop-off at the most critical conversion point.
📷 Research Photo
Usability testing session or research artifacts
usability-testing.jpg
Moderated usability testing — 100+ sessions across all 5 features

04 — design

15+ Figma mockups to test & refine

I developed 15+ interactive UI mockups in Figma to test feature concepts and refine interaction logic before handing off to development. Each mockup was tied directly to a friction point or research hypothesis — not just visual exploration.

Goal: improve task completion clarity by 35% during moderated sessions — by making the right action obvious at every decision point, removing ambiguity, and surfacing status at a glance.

📷 Home
Home screen close-up
screen-home.png
Home dashboard
📷 Market
Campus Market close-up
screen-market.png
Campus Market
📷 Community
Community screen close-up
screen-community.png
Community forum
📷 Rides
Ride Share close-up
screen-rides.png
Ride Share
📷 Housing
Housing screen close-up
screen-housing.png
Housing search
📷 Design Process
Figma workspace — iterations, wireframes, or component library
figma-workspace.png
Figma — 15+ mockups built to test interaction logic before development

05 — data

5,800+ course records — building the data layer

To accelerate early product validation, I used Python + BeautifulSoup to scrape and structure 5,800+ course records, building a searchable "Rate My Professor" style data prototype for the platform.

This wasn't just a technical exercise — it was a product decision. Having real, structured course data meant we could prototype the scheduling and discovery features with actual Berkeley courses instead of dummy content, making usability tests far more realistic and our findings more reliable.

# ── Imports ────────────────────────────────────────────
import re
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup, Tag
import pandas as pd

BASE_URL = "https://classes.berkeley.edu"

# ── Fetch raw HTML with spoofed User-Agent ──────────────
def fetch_html(url: str) -> bytes:
    req = Request(url, headers={"User-Agent": "Mozilla/5.0"})
    with urlopen(req) as resp:
        return resp.read()

# ── Parse one course card → structured dict ─────────────
def parse_card(card: Tag) -> dict:
    course_name = card.select_one(".st--title h2")
    professor   = card.select_one(".st--instructors")
    days        = card.select_one(".st--meeting-days span:last-of-type")
    time_el     = card.select_one(".st--meeting-time span:last-of-type")

    start_time = end_time = None
    if time_el:
        parts = [p.strip() for p in time_el.get_text().split("–")]
        if len(parts) == 2:
            start_time, end_time = parts

    return {
        "Course Name" : course_name.get_text(strip=True) if course_name else None,
        "Professor"   : professor.get_text(strip=True)   if professor   else None,
        "Days"        : days.get_text(strip=True)        if days        else None,
        "Start Time"  : start_time,
        "End Time"    : end_time,
    }

# ── Paginate across 334 pages of Berkeley class listings ─
def crawl_with_pagination(url_template: str, max_pages: int = 334):
    all_rows = []
    for page in range(0, max_pages + 1):
        rows = parse_single_page(url_template.format(page=page))
        if not rows: break
        all_rows.extend(rows)
    return all_rows

# ── Run scraper → export 5,800+ rows to Excel ───────────
if __name__ == "__main__":
    URL = ("https://classes.berkeley.edu/search/class?"
           "f%5B0%5D=term%3A8576&page={page}")
    rows = crawl_with_pagination(URL)
    df   = pd.DataFrame(rows)
    df.to_excel("berkeley_schedule_all.xlsx", index=False)
    print(f"[DONE] {len(df)} rows saved")  # → 5,800+ records
View full repo on GitHub

06 — impact

What moved the needle

3
Key friction points identified across scheduling, subleasing, and marketplace
↑ 35%
Task completion clarity improvement in moderated usability sessions
15+
Interactive Figma mockups built to test and refine interaction logic
"The research directly shaped what we built first. Having 100+ sessions worth of data meant we weren't guessing — we knew exactly where users were dropping off and why."
— Product reflection

The combination of qualitative usability research, rapid Figma prototyping, and real data infrastructure gave the team a validated foundation to build from — compressing the typical research-to-build timeline significantly.


07 — reflection

What I learned leading 0→1 product research

Working on a startup from zero taught me that research at the 0→1 stage looks completely different from research at scale. There's no existing user base to survey, no historical data to reference, and no time for a 6-week discovery sprint. You have to move fast, make smart bets on what to test, and extract signal from every session.

The data scraping work also reinforced something important: the best prototypes use real data. Seeing "CS 3801 — Algorithms, 9:00 AM, Boyd Hall 201" in a usability test produces completely different (and more reliable) feedback than seeing "Course Name, Time, Location."

Key takeaway: In a startup, the PM and researcher roles blur constantly. The ability to move between strategy, research, design, and code in the same week — and know when to switch — is the actual skill.

Next project
Tinder × Gen Z →