Sept 2025 – Present · Full-stack developer on a five-person team
The problem
Campus health check-ups ran on paper forms and email attachments. Students submitted documents that nurses had to read and re-key by hand, and nobody could tell at a glance who still had an outstanding requirement.
What I built
We built a role-aware platform for students, nurses, and administrators on Node.js, TypeScript, Express, and MongoDB. Access is protected by JWT sessions with multi-factor authentication over email and TOTP, and submitted PDFs and images are parsed by Google Gemini into structured records the staff can review instead of retype.
The outcome
Health records that used to be re-keyed by hand are now extracted, validated, and stored automatically, with role-based access separating what students, nurses, and administrators can see. Deployed on Vercel with MongoDB Atlas.
JWT authentication with multi-factor login over both email codes and TOTP authenticator apps
Role-based access control separating student, nurse, and administrator permissions
Gemini-powered extraction of structured data from uploaded PDFs and images
Automated check-up reminders so outstanding requirements surface before deadlines
2025 – Present · Sole developer — design, build, deployment, and operations
The problem
A list of links proves nothing. I wanted a portfolio that is itself the strongest piece of evidence in it — a real production application with authentication, user-generated content, moderation, and everything that goes wrong when strangers can post.
What I built
Next.js 14 App Router with server components, Supabase for authentication and PostgreSQL storage, and row-level security on every table. It runs in English, French, and Persian with full right-to-left support, and ships an admin panel for moderating comments, managing users, and queueing transactional email.
The outcome
A live application handling real authentication, rate-limited public writes, comment moderation, and abuse reporting — deployed on a custom domain with automated security headers, structured data, and a passing lint, typecheck, and test suite.
Supabase auth with OAuth providers, email confirmation, and TOTP-protected admin access
Trilingual interface (English, French, Persian) with right-to-left layout support
Moderated ideas board with threaded comments, likes, reporting, and rate limiting
Content Security Policy, CSRF protection, and row-level security across every table
Admin panel for users, comments, and a queued transactional email pipeline
2025 · Full-stack developer — Seneca WEB422 group project
The problem
A campus food bank has to serve students fairly with limited stock. Without enforced limits, a handful of early requests can empty the inventory before most students get anything.
What I built
A Next.js and Node.js application backed by MongoDB, with JWT-protected routes and role-based access. The cart and checkout flow enforces a monthly quota per student, and an admin dashboard tracks availability as stock moves.
The outcome
Quota enforcement moved from an honour system into the checkout logic itself, so limits hold without staff policing them, and administrators can see remaining availability in real time.
JWT-protected routes with registration and role-based access
Cart and checkout logic enforcing a monthly quota per student
MongoDB persistence with live availability tracking
Administrator dashboard for stock and request oversight
Winter 2025 · Group project of three — I built the terminal
The problem
A course project disappears when the term ends. The repository lives in the college's GitHub organization, so a recruiter cannot open it, and a Python pipeline is not something a link can show.
What I built
A terminal emulator built on xterm.js over a small in-memory file system holding the project's README, task brief, utility module, main script and requirements. `python project.py` replays the pipeline stage by stage — load, clean, organize, extract, save — and writes results.txt, cleaned_data.csv and insights.json into an output folder you can list, read and download. Tab completion and ↑/↓ history behave as they do in a real shell.
The outcome
The project can be explored from any browser tab, without Python, a clone or access to the course organization. Nothing runs on a server: the files are the project's own, and the run is a scripted replay of its stages rather than live execution.
xterm.js terminal with a virtual file system: ls, cat, cd, pwd, tab completion and command history
python project.py replays the pipeline and creates results.txt, cleaned_data.csv and insights.json
download <file> saves any file, including the generated output, through a Blob URL
Runs entirely client-side; clear removes the output and reset restores the original files
Small bookstore inventory is often tracked in a spreadsheet that only lives on one machine, so stock counts drift out of date the moment anyone is away from the desk.
What I built
A native Android app in Kotlin using Room with DAOs and a repository layer, structured with MVVM so the data layer stays testable independently of the UI.
The outcome
Inventory add, update, delete, and search run on-device against a local database, with unit tests covering the data layer rather than relying on manual clicking.
Room persistence with DAOs behind a repository abstraction
MVVM architecture separating view models from Android framework code
Full CRUD with search across the inventory
Unit tests covering repository and view model logic
Gross pay tells you very little. Working out what actually lands in your account means applying bracketed rates and deductions that differ by country and province or state.
What I built
A Kotlin Android app implementing bracketed tax logic for both Canadian and US payroll, recalculating on every input change so the effect of each variable is immediately visible.
The outcome
Take-home pay estimates update live as you adjust gross salary, jurisdiction, and pay period, making the marginal effect of each bracket visible instead of abstract.
Bracketed tax calculation covering both Canadian and US payroll rules