All Projects

2025 · 8 weeks — CodePath Web 102 · 1-person team

Bizboard

A marketplace built for builders.

GitHub →

Overview

Bizboard is a service marketplace for entrepreneurs and freelancers. Users can list services, browse offerings by category, leave comments, upvote listings they find valuable, and track activity through a personal dashboard. Built with React and Supabase, it demonstrates real-time CRUD, row-level security, and full responsive design.

Thought Process

For the CodePath final project I wanted to build something I'd actually use, not a todo app. Service marketplaces have real complexity: auth, ownership, real-time interactions, filtering, and activity tracking. That made it a good forcing function for everything the course covered.

Supabase was the right call for a solo project. PostgreSQL under the hood meant proper relational modeling — listings, users, comments, and upvotes as linked tables, not a flat NoSQL blob. Row-level security (RLS) meant I could write security policies declaratively in SQL rather than scattering auth checks through my React components.

The dashboard was the hardest piece. Aggregating upvotes, comment counts, and view activity per listing in real time required careful query design. I ended up using Supabase's real-time subscriptions for live comment feeds and polling for dashboard metrics — a deliberate tradeoff between freshness and complexity.

System Architecture

A React single-page application communicating directly with Supabase. Row-level security policies in PostgreSQL enforce data ownership. Real-time subscriptions power the comment feed.

React SPA

Component-based UI covering listing creation, browsing, search, filtering, comments, and the personal activity dashboard.

Supabase Auth

Email/password authentication with session management. User identity flows through to RLS policies so every DB query is automatically scoped to the right owner.

PostgreSQL (via Supabase)

Relational schema: users → listings → comments + upvotes. Foreign key constraints and join queries power the activity dashboard.

Row-Level Security (RLS)

Declarative SQL policies that ensure users can only modify their own listings and comments — no auth logic in React components.

Supabase Realtime

WebSocket-based subscriptions on the comments table. New comments appear instantly for all viewers of a listing without polling.

Key Learnings

  1. 01

    Supabase RLS is genuinely powerful but the mental model takes time — you're writing security as database policy, not application logic. Once it clicks, it's elegant.

  2. 02

    Good filter UX is harder than it looks. Combining search text, category, price range, and sort order in a way that feels instant required debouncing inputs and pre-computing filter combinations.

  3. 03

    Designing for real-time from the start is easier than retrofitting it. I added real-time comments late and had to refactor my state management significantly.

  4. 04

    Solo full-stack projects clarify how much product surface area a single person can realistically own. Scope decisions become very concrete when you're the designer, developer, and tester.