~/work/mule-mart
Mule Mart
AI-powered campus marketplace
A full-stack e-commerce marketplace for the Colby College community where verified students buy, sell, and donate items, with AI-powered semantic search and real-time messaging.
Semantic
vector search over every listing
N+1 → 0
query bottlenecks eliminated
S3
presigned-URL media uploads
mulemart.com

01 · the problem
Campus buy/sell happens in chaotic group chats and bulletin boards: no trust, no search, no structure. Mule Mart gives the Colby community a verified marketplace where keyword search isn't the ceiling. Searching “warm jacket for Maine winter” should find a parka, even if no listing uses those words.
02 · what I built
- Designed a scalable REST API backend with Flask and PostgreSQL, with Google OAuth restricting access to verified community members.
- Implemented AI-powered semantic search with SentenceTransformers (all-MiniLM-L6-v2) and PyTorch: listings are embedded as vectors and ranked by cosine similarity instead of keyword overlap.
- Integrated AWS S3 presigned URLs so product images upload directly to object storage without passing through the app server.
- Built an in-app real-time messaging system for buyer-seller communication, with notification triggers for unread messages.
- Optimized SQLAlchemy queries to eliminate N+1 bottlenecks and improve response times, and containerized the app with Docker.
03 · the pipeline
- 1
authenticate
Google OAuth verifies campus identity before anyone can list or buy.
- 2
list
Flask REST API persists listings to PostgreSQL via SQLAlchemy; images go straight to S3 through presigned URLs.
- 3
embed
Each listing description is encoded into a vector embedding with all-MiniLM-L6-v2 at write time.
- 4
search
Queries are embedded and ranked by cosine similarity, giving meaning-based discovery layered on top of the relational store.
- 5
connect
Real-time in-app messaging links buyers and sellers, with unread-message notifications.
04 · key decisions
Hybrid relational + vector architecture
Rather than reaching for a dedicated vector database, I layered semantic search over PostgreSQL, keeping transactional integrity for orders and auth while still ranking results by meaning. Right-sized for a campus-scale platform.
Presigned URLs for media
Routing image uploads directly to S3 keeps large payloads off the API server entirely: cheaper, faster, and the backend stays focused on business logic.
Kill the N+1s before they kill you
Profiling listing pages exposed N+1 query patterns in SQLAlchemy relationships. Fixing eager-loading strategies measurably improved response times.
05 · where it stands
- ✓Live at mulemart.com for the Colby College community.
- ✓Meaning-based product discovery that keyword search can't match.
- ✓Open source on GitHub.