What I've Built

Projects

Full-stack applications built with modern tooling, automated testing, and production-grade infrastructure, plus industry certifications in AWS and Java.

Personal & Team Projects

Projects

Personal Project

Radio Calico

April 2026 – Present

A production-ready, full-stack HLS radio player that streams a live lossless (16-bit / 44.1 kHz) audio broadcast with real-time now-playing metadata, animated album art, an elapsed-time visualizer, and a per-user like/dislike rating system persisted in PostgreSQL. Built with a multi-stage Docker setup, nginx reverse proxy, and a comprehensive security-focused CI/CD pipeline.

Node.js v22 Express 5 PostgreSQL HLS.js Vanilla JS nginx 1.29 Docker Docker Compose Jest GitHub Actions CI
✓ 99 tests (4 suites, ~0.6 s) ✓ 4-stage security scan on every push ✓ Multi-stage Docker build ✓ Sub-second initial page load

Key Features

  • Live HLS streaming: lossless 16-bit / 44.1 kHz audio via HLS.js, lazy-loaded on first interaction for near-instant initial page load.
  • Real-time metadata: track title, artist, album, year, and category tags update in sync with each track change from a CloudFront endpoint.
  • Like / dislike ratings: per-user votes persisted in PostgreSQL by IP address; toggle support with live count display.
  • Animated visualizer: CSS-driven audio visualizer and elapsed time display synchronized with playback state.
  • Multi-stage Docker build: separate deps-prod, deps-all, dev, prod, and nginx images; Express port internal-only in production.
  • Full Jest test suite: 99 tests across 4 files covering API routes (pg-mem in-memory Postgres), frontend DOM behavior (jsdom + fake timers), metadata fetching, and audio player events.
  • 4-stage security CI: npm audit + Trivy (Docker CVE scan) + Semgrep (SAST) + Gitleaks (secrets detection), all running in parallel with the Jest job on every push and PR.
  • Page-speed optimizations: self-hosted WOFF2 fonts, .webp image fallbacks, timestamp cache-busting on album art fetches.

Architecture

  • Traffic flow (prod): browser → nginx:80 → static files (public/) or /api/* proxied to Express on internal port 3000. Express is never exposed to the host in production.
  • Makefile workflow: make prod, make dev (nodemon + bind-mounts), make test, make scan; Docker Desktop starts automatically if not running.

University Team Project: 6 Developers

SmartSyllabus

University of Toronto Mississauga:January 2026 – Present

An all-in-one academic hub for Canadian and American university students. Students upload course syllabi, which are automatically parsed by Gemini 2.5 Flash AI to extract assessments, weights, deadlines, and lecture schedules:all stored in SQLite and reflected in an interactive calendar. Includes grade tracking, GPA calculation, a Pomodoro focus timer, and .ics calendar export.

React 18 Vite Flask SQLite Gemini 2.5 Flash JWT Auth FullCalendar Chart.js PyMuPDF React Router 7 CSS Variables
✓ 27 REST endpoints ✓ AI PDF parsing (2-pass extraction) ✓ RFC 5545 ICS export ✓ JWT access + refresh tokens

Key Features

  • AI syllabus parsing: upload a PDF; Gemini 2.5 Flash extracts assessments (name, weight, deadline) and lecture schedules in two structured JSON passes, auto-populating the calendar.
  • Grade tracking & GPA: enter scores per assessment; weighted averages and cumulative GPA are calculated automatically. Grade progression graph via Chart.js.
  • Interactive calendar: FullCalendar month view with assessment deadlines and lectures auto-populated. Manual event creation with color-coding per course.
  • ICS export: RFC 5545-compliant .ics file generated client-side via the Blob API; compatible with Google Calendar, Apple Calendar, and Outlook.
  • JWT authentication: access tokens (60-min) + refresh tokens (7-day). SHA-256 password hashing. SMTP-based password reset via time-limited email links.
  • Workload notifications: detects weeks with 7+ assessments due and surfaces alerts on the Home dashboard.
  • Pomodoro timer: fully client-side, customizable focus / break durations, pause/resume, session counter. State persisted in localStorage across page refreshes.
  • Design system: all colors, spacing, and typography defined as CSS custom properties in variables.css; no hardcoded values in component stylesheets.

Co-Developers

Also see

AWS & Oracle Java Certifications

Full details, badge images, and exam domain breakdowns on the Certifications page.

View Certifications →