projects
Things I've built recently, from personal projects to client work.
Port Observatory MTL
Real-time maritime data platform for the Port of MontrealBuilt a real-time vessel tracking platform that ingests live AIS data via WebSocket, runs DETR object detection and LLaVA vision-language inference on 480+ daily webcam snapshots, and correlates vessel schedules with truck activity.
- Sharded cron system on Cloudflare Workers to spread model inference across time windows
- 175K+ activity snapshots accumulated in D1 with R2 for image and video storage
- 5+ external data sources (AIS stream, port webcams, Quebec 511 traffic, terminal schedules, weather) in one dashboard
- Staleness tracking and graceful fallbacks when data sources go stale
Stack: TypeScript, Next.js, Python, Cloudflare Workers, D1, R2, Workers AI, MapLibre, WebSocket
Montreal Archives Search
Search engine for 14,822 historical photos from the Montreal city archivesStarted as an Instagram account sharing old Montreal photos from the city's Open Data portal. Grew to ~3k followers and evolved into a full search platform for ~15,000 historical images (1870s-1990s).
- Three search modes: keyword, semantic (BGE embeddings), visual (CLIP)
- 8-stage streaming ETL pipeline (Python + TypeScript) that cleans French-language archival metadata, generates VLM captions, runs OCR, and scores trust per field
- Production vector search on Cloudflare Vectorize (1024-dim BGE + 512-dim CLIP indices)
- Sub-50ms response times globally on Cloudflare's edge
Stack: TypeScript, Python, Cloudflare Workers, D1, Vectorize, R2, Workers AI, CLIP, Next.js
Diane Party Rentals
Custom ERP for event rental businessReplaced paper-based workflows with a custom ERP: automated quoting, real-time inventory locking (optimistic concurrency), and Stripe payment processing. Handles the full rental lifecycle from quote to return.
Cut quote turnaround from 24h to under 2h
Stack: Next.js, TypeScript, PostgreSQL, Stripe
visit siteBallerz Football Academy
Scheduling and payout platform for youth sportsAdmin and player portals for managing sessions, bookings, availability, and payments. Players check trainer availability and track progress. Staff handle scheduling and payouts.
Handling 100+ monthly sessions
Stack: Next.js, TypeScript, Tailwind CSS, Cal.com, Supabase
visit site