Skip to content

Senior full-stack developer · Ontario, Canada · Remote

I design, build and run products end to end.

Nine years shipping web and mobile products in React Native, TypeScript, Node and Postgres. Good Fights is a Mobile and Web app I built and operate from the database up: apps on both stores, a Next.js site, the API behind them, and the scrapers and LLM enrichment that keep it current — 3,415 users, 76,516 ratings, all on infrastructure I operate myself.

  • TypeScript
  • React
  • React Native · Expo
  • Next.js
  • Node
  • PostgreSQL · Prisma
  • WordPress · PHP
  • Docker
  • LLM features
Michael Primak, smiling
Live from productionGood Fights API
15,348
fights live in the app
1,573
events tracked

Real numbers from an app I built and run. Updated hourly.

01Selected work

Things I've shipped.

Real products, live today. Each one has a short write-up of what was built, what was hard, and what happened after launch.

Good Fights app icon

Good Fights

A fight-rating app for combat-sports fans — live on the App Store and Google Play, with a fight catalogue going back to 1993 that daily scrapers keep current.

  • React Native · Expo
  • TypeScript
  • Node
  • PostgreSQL · Prisma
  • Next.js
  • LLM enrichment
  • Docker
  • GitHub Actions
  • iOS + Android
Read the case study
Good Fights home screen: events for Saturday September 12th, each card carrying its poster, start time and broadcaster, with the UFC Fight Night card expanded to show four hype-rated fights scored 7.5 to 9.2.An event page: the UFC Fight Night Silva vs Delgado poster, a written preview, an add-to-calendar action, Canadian broadcast listings for Sportsnet+ and Paramount+, and the main card with a hype score beside every fight.The rating sheet: How hyped are you for Silva vs Miguel Delgado, scored 8 out of 10 on a colour-graded flame scale, with a box for why and a link to the comments.

LGBT Voice Tanzania

Website for an LGBT+ advocacy organization, built on WordPress so the team can publish and manage it themselves.

WordPress · Non-profitCase study

avoidjawsurgery.com

A WordPress site rebuilt as fast, dependency-free static HTML — every page migrated word-for-word, redesigned, and ready to host anywhere.

Static rebuild · AI-assistedCase study

Meaford Osteopathy

Business website for a local health clinic, with an integrated booking system — the kind of site most small businesses actually need.

Business site · BookingCase study
02How I build

AI in production, not just in my editor.

Everyone says they use AI now. Here is what that actually looks like when it has to survive contact with real users.

  1. LLM features with guardrails

    Good Fights enriches its catalogue with Claude and gates every result on a confidence score, so nothing the model is unsure about reaches a user. There are unit tests that check the model's output — including one that verifies quoted material is real. I use Claude Code daily too, but the part that counts is the model running in production.

  2. Tested, and shipped by a pipeline

    Jest on the API — including tests that check what the model produced — type-checking and linting on every package, and more than 30 scheduled jobs, built as GitHub Actions workflows and now run from VPS cron, covering the scrapers, enrichment, database backups and content checks. Over-the-air updates push a fix to users without waiting on app-store review.

  3. I run the infrastructure

    A Docker-built API on Render, a Linux VPS where systemd and cron run the scrapers, the live trackers and the jobs that have to happen at 4am, Postgres with Prisma migrations, Cloudflare R2 for images, PostHog for what people actually do. No platform team behind me — when production breaks at 11pm, it's me.

This site is a working example.

Designed and coded with Claude Code, with me reviewing every decision — statically generated, accessible, fast, and dark-mode aware. If you want to know how something here was built, ask me.

03Experience

Coder and manager, at small and mid-sized organizations.

I've written the code, sat with the customer, and run the team — which is why I'm comfortable being handed any of the three.

  1. Sept 2025 – nowGood FightsFounder and sole developer. React Native apps on the App Store and Google Play, a Node/TypeScript API on Postgres, a Next.js site, daily scrapers and Claude-based enrichment — successor to Fighting Tomatoes.Developer
  2. 2024 – nowLGBT Voice TanzaniaWeb developer. Redesigned, built, deployed and maintain the site for an LGBT rights advocacy group.Developer
  3. Apr 2024 – Nov 2024Zerion SoftwareImplementation Engineer. Adapted a mobile data-collection platform to individual client use cases — talking to customers about what they were capturing, working out how the product should best receive and process it, then making the GUI and JavaScript changes to fit.Developer
  4. 2018 – 2020WellnessLiving Systems Inc.White Label App Dept. Coordinator. Ran a team of developers, designers and support staff delivering white-label mobile apps to B2B clients.Manager
  5. 2016 – 2025Fighting TomatoesWeb developer. Built and ran the interactive web app Good Fights grew out of — JavaScript, PHP, MySQL and Python, with accounts, ratings, comments and search.Developer
Education
  • Big Data Analytics, Georgian College
  • Master of Osteopathic Sciences, Canadian Academy of Osteopathy
  • BA Human Kinetics, Laurentian University
RésuméDownload PDF
04Contact

Get in touch.

Hiring? Tell me about the role and the team. I reply within one business day.

Open to senior full-stack, front-end and React Native roles — remote, Canada. Résumé is above, or ask and I'll send it.