homeexperienceprojectsphotography

Projects

GooseDoor

ReactTypeScriptViteshadcn/uiTailwind CSSSupabasePostgreSQL
  • Built a full-stack platform using React, TypeScript, Vite, Tailwind, and shadcn/ui with modular components and responsive design; scaled to 8,000+ users and 110,000+ social impressions.
  • Expanded from Waterloo-only to 350+ supported colleges with automatic college detection and secure sign-up restricted to .edu, .uwaterloo.ca, and .ca domains; users from 30+ unique institutions.
  • Engineered Supabase backend (PostgreSQL + Edge Functions) with RLS policies, encrypted authentication, and anonymous offer submissions.
  • Designed normalized data models and API endpoints enabling fast filtering by company, role, college, and work term, while maintaining extensibility for future recruiter dashboards and offer comparison tools.
  • Implemented real-time analytics with aggregated queries and built verified job posting pages showing salary trends, company reviews, and college-specific participation.
GooseDoor screenshot

NetSpense

ReactTailwind CSSFastAPITesseract OCRFirebase
  • Created a personal finance web app that extracts and categorizes expenses from uploaded receipts using OCR (Tesseract) and NLP classification models.
  • Engineered a full-stack solution with React front-end and FastAPI backend, supporting user authentication, persistent storage, and data visualization dashboards.
  • Automated transaction categorization into spending buckets (food, transport, utilities, discretionary) with > 90% accuracy on test receipts.
  • Integrated interactive analytics (Recharts/Chart.js) for monthly summaries, trend lines, and budget tracking, improving user insight into spending habits.
NetSpense screenshot

Decay

ReactTypeScriptTailwind CSSChrome Extension API
  • Built Decay, a Chrome extension that tracks open tabs over time and visualizes inactivity using a heatmap-based UI to help users identify and close stale or forgotten tabs.
  • Implemented a coldness scoring algorithm (0–100) to rank stale tabs using a weighted decay model: Coldness Score = IdleScore + AgeScore + VisitScore, where IdleScore = min(100, (idleMinutes / 120) * 60) and additional components factor in how long the tab has existed and how frequently it has been revisited.
  • Implemented a feature set including soft-closing through a "Cold Tray," custom decay thresholds, protected domains/URLs, pinned tab immunity, and timeline-based tab aging insights, all configurable in a React + TypeScript settings dashboard with persistent local storage.
Decay screenshot 1
Decay screenshot 2
Decay screenshot 3
Steam
←CS Webring→
👈 this website is part of the uwaterloo CS webring!
© 2025 MIT Licensed