FootPal FC runs on a 27-model Postgres schema, 109 route handlers, and 175 tests.
It organizes recurring pickup soccer for 25+ players across three crews — RSVPs, team drafting, cost splitting, and player ratings.
- current release
- v2.43.0
- commits
- 457
- building since
- Jun 2026
I'm a full-stack developer and a Computer Engineering graduate from York University (2025), based in the GTA. I work in TypeScript, Next.js, React, PostgreSQL, and Python, and I've shipped two products to people who aren't me: FootPal FC, which I've been building since June 2026, and KonnectTaps, a digital business card platform I co-founded and built the frontend for. Most of what I care about as an engineer is in the decisions below — what I chose, and what it cost.
FootPal FC
footpalfc.amiribrahim3000.comOrganizes recurring pickup soccer — RSVPs, team drafting, cost splitting, and player ratings — across independent crews. In use by 25+ players in three crews, two of them outside my own friend circle (Montreal and Mississauga). Building since June 2026.
- Next.js 15
- TypeScript
- PostgreSQL (Neon)
- Prisma
- Web Push
- Sentry
- Vercel
- 27
- Postgres models
- 109
- HTTP handlers across 81 route files
- 175
- test blocks across 15 suites
- 457
- commits
- v2.43.0
- current release
Decisions
Crew-scoped isolation enforced in the application layer
Independent crews share one database. Access is gated by explicit guard functions — canAccessGame, canManageGame, getUserCrew — invoked per route.
Tradeoff — No Postgres RLS and no Prisma middleware. Isolation depends on each crew-scoped route calling a guard, and nothing underneath catches one that skips it.
Session auth written from scratch, no auth library
The cookie carries the plaintext token; the database stores only the SHA-256 hash. Sessions are per-device. A three-tier resolution path — Session row, then legacy hash column, then legacy plaintext — migrated existing accounts on read, without logging anyone out.
Tradeoff — Three lookup paths to maintain instead of one.
Man-of-the-match awards that fire exactly once
The award can be triggered by the final vote or by a fallback cron. Both paths run one conditional update guarded on a null timestamp, and the affected-row count decides which trigger won.
Tradeoff — The guarantee lives in one UPDATE's WHERE clause and its affected-row count, so it holds only as long as that stays a single statement.
Batched the game page's reads, cutting load from ~3.3s to ~1.1s
Collapsed 8 sequential Prisma reads into one parallel fetch and moved stats computation off first paint, then added three indexes after EXPLAIN showed sequential scans.
Tradeoff — Measured by hand on the heaviest crew game. There is no benchmark harness, so this is a point measurement, not continuous tracking.
Kickoff times resolved to UTC without a date library
Crew-local kickoff times resolve to UTC instants through Intl.DateTimeFormat.formatToParts, so daylight-saving shifts land on the right instant. package.json contains zero date libraries.
Tradeoff — The conversion logic is mine rather than a library's, including the DST transition days when a local time either does not exist or happens twice.
Hand-written service worker serving a branded offline page
The service worker is written by hand rather than generated. It serves a branded offline page in place of the browser's error screen. It does not cache pages, API responses, or app JS.
Tradeoff — Deliberate. Caching rosters and costs would show people stale information, so there is no cached app to fall back on — offline gets a clear page, not a working one.
Ratings and cost settlement as pure, unit-tested modules
The rating engine is crew-relative: each stat scales against that crew's best player and decays with absence. The settlement module nets per-game cost shares down to a single balance per player pair. Both are pure functions covered by the test suites.
Tradeoff — Crew-relative ratings do not compare across crews — the same number means different things in different crews.
Every Sentry event through one PII-scrubbing chokepoint
All error reporting routes through a single scrubbing function before anything leaves the app.
Tradeoff — Centralizing the scrubbing means one place to audit, and one place every error path has to keep routing through.
Counts verified by code audit, July 31, 2026.
KonnectTaps
Next.js / React / JavaScript
Digital business card platform I co-founded and built the frontend for, working with two other developers. Reached 100+ signups. Wound down in May 2026.
CSA Capstone — SOSO
System Design
Satellite telemetry visualization tool built for a Canadian Space Agency capstone project, turning operational scheduling constraints into readable technical workflows.
Co-Founder
Jan 2024 – May 2026
KonnectTaps — Remote
- Built the frontend for a digital business card platform in React and Next.js, from component work through to the shipped product.
- Worked alongside two other developers on scope and product direction.
- The platform reached 100+ signups. It wound down in May 2026.
Assistant Deli Manager
Jun 2025 – Present
Marché Adonis — Mississauga, ON
- Run daily operations and scheduling for a 13-person team, after a promotion from Clerk at the seven-year mark.
- Act as primary escalation contact through high-volume, time-sensitive shifts.
Clerk
Nov 2017 – Jun 2025
Marché Adonis — Mississauga, ON
- Ran inventory, customer service, and floor operations across seven years while completing a full-time engineering degree.
Education
B.Eng. Computer Engineering
Graduated Jun 2025
York University — Lassonde School of Engineering
Object-Oriented Programming (Java), Data Structures & Algorithms, Operating Systems, Communication Networks, Software Engineering Principles
Electromechanical Engineering Technician — Year 1
2022 – 2023
Humber College
Control Circuits, Robotics, Mechatronics, Industrial Pneumatics, Statics, Engineering Graphics, Engineering Materials
Languages
JavaScript (ES6+), TypeScript, Python, Java, SQL, Bash
Frontend
React, Next.js (App Router/RSC), Tailwind, PWA (Web Push, installable)
Backend
Node.js, FastAPI, PostgreSQL, Prisma, MySQL
Testing & observability
Vitest, Sentry
Infrastructure
Docker, GitHub Actions, Git/GitHub, Vercel, Linux/Ubuntu, Nginx
Currently learning: AWS, Kubernetes. Also familiar with Ladder Logic, IT/OT networking, and electromechanical systems from Computer and Electromechanical Engineering studies.
Open to full-stack and frontend roles.
- Roles
- Software Developer, Full-Stack Developer, Frontend Engineer
- Location
- Remote or hybrid — GTA, Ontario
- Availability
- Immediately