Skip to content
Michael Grier

Things I've built.

I love building things that help support the communities, pursuits, and people that matter to me. Here's some of the projects that I have been working on recently.

Fuckers Skateboards

Storefront for a local, independent skateboard brand. Next.js, Postgres, Stripe.

github.com/michael-grier/fuckers-hq
Fuckers Skateboards homepage with a skate video hero and links to the shop and videos.
Slide 1 of 7

01Context

An e-commerce site for a small local skateboard brand with nobody on staff to manage it full-time. Correctness and reliability have to be built into the design rather than ensured by human oversight.

02Checkout

Guest checkout runs through Stripe, but prices and stock are re-read from Postgres and reserved under row locks before a payment session exists, so the store can never oversell. Every checkout carries an idempotency key, so a retried request converges on the same reservation, and a cron worker recovers reservations whose Stripe session creation failed mid-flight.

03Orders and admin

Orders exist only once Stripe's webhook confirms payment. Webhook events are stored exactly once and refund and dispute state is derived from them, so late or out-of-order events converge on the right answer. Confirmation emails go through a retrying outbox. An admin surface for products, orders, local delivery, and shipping rates keeps day-to-day running to a few screens.

04Verified

Tested with over 400 cases, including concurrency suites that run against a real Postgres instance and Playwright flows against test-mode Stripe and Clerk. CI runs audit, lint, typecheck, tests, and a full build on every PR, and production deploys only after migrations succeed against a verified database.

05Stack

Next.js, Neon Postgres, Drizzle, Stripe Checkout and Tax, Clerk, Cloudflare R2, Resend, Sentry

YYC Skate Spots

Street spot book for Calgary. iOS app (coming soon to Android).

github.com/michael-grier/yyc-skate-spots
Calgary skate spot map with location pins, search, filters, and a selected spot preview.Chinatown 12 Stair details with a spot photo, skating features, sharing, and directions.Map filters for distance, spot type, and bust factor, showing 14 matching spots.
Slide 1 of 3

01Context

A mobile app designed to help the Calgary skateboarding community find and share street spots.

02Moderation

New and edited spots wait for review before they appear publicly. Review state lives apart from the spot itself so a contributor's edit can't overwrite a moderator's decision, removals accumulate strikes, and repeat problems lead to a contribution ban that keeps sign-in intact. Every moderation action is authorized server-side against a role claim, never trusted from the client.

03Photos and sharing

Photos are downscaled on-device before an authenticated upload records who owns them. Share links open the app when it's installed and fall back to a static web page when it isn't. Distance filtering is a client-side haversine over one reactive query, which is all a one-city dataset needs.

04Shipped

Shipped to the App Store with a hand-authored privacy manifest, Sign in with Apple, and retry-safe account deletion. CI typechecks, lints, runs 177 backend and component tests, and verifies the iOS release configuration before every export.

05Stack

Expo, React Native, Expo Router, Convex, Clerk, Google Maps, EAS, Cloudflare Pages

Code Trainer

Interview prep for full-stack TypeScript developers, in the browser.

github.com/michael-grier/code-trainer
Dashboard with the next lesson queued, the curriculum listed by track, and progress synced to a GitHub account.
Slide 1 of 6

01Context

60 lessons and over 240 problems across algorithms, runtime behaviour, the type system, React, backend TypeScript, and testing and production readiness.

02Runtime and grading

Code runs in a sandboxed iframe with no same-origin access, one Web Worker per run, and hard timeouts, so a runaway loop dies with its worker instead of hanging the page. Grading is deterministic where that is honest, including running the real TypeScript compiler in a worker for type problems and driving React components through scripted interactions, and structured self-review where it is not.

03Progress and verification

Progress is kept in localStorage for guests and merged per-field into Convex once you sign in, so the backend stays limited to auth and progress and the learning runtime stays client-side. Every lesson ships with a test that runs its reference solution against its own cases, so the curriculum can't drift from the grader. Nearly 400 tests in total, with Playwright covering the sandbox across three browsers.

04Stack

React, Vite, TypeScript, Tailwind, Monaco, Convex, Better Auth