~/francis-ohara_
all work

~/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.

PythonPythonFlaskFlaskPostgreSQLPostgreSQLPyTorchPyTorchSentenceTransformersSentenceTransformersAWS S3AWS S3DockerDocker

Role

Full-Stack Engineer

Timeline

Oct 2025 → Present

Semantic

vector search over every listing

N+1 → 0

query bottlenecks eliminated

S3

presigned-URL media uploads

mulemart.com

Mule Mart interface

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. 1

    authenticate

    Google OAuth verifies campus identity before anyone can list or buy.

  2. 2

    list

    Flask REST API persists listings to PostgreSQL via SQLAlchemy; images go straight to S3 through presigned URLs.

  3. 3

    embed

    Each listing description is encoded into a vector embedding with all-MiniLM-L6-v2 at write time.

  4. 4

    search

    Queries are embedded and ranked by cosine similarity, giving meaning-based discovery layered on top of the relational store.

  5. 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.
PythonFlaskPostgreSQLPyTorchSentenceTransformersAWS S3Docker