Hey, I’m Dawson.
I’m studying computer science at the University of Waterloo and previously worked full-time at General Learning (YC F24).
I specialize in backend systems and UI/UX for web and mobile apps. Now, I my free time goes to machine learning, mostly inference and reinforcement learning.
If I’m not at the keyboard, you might find me at the gym or the poker table.
Built 1500 Blueprint’s study planner, practice tools, and account management, and bolstered the platform’s security.
Helped grow RevisionDojo from 250K to 750K+ users. Shipped the mobile app (20k+ downloads, 4.8 stars) and high-retention learning features.
Led the migration from WordPress to Next.js. Built a custom CMS for blogs and an encrypted payments system.
Reviewed coding problems for LLM training data and helped tighten evaluation quality.
Turns the phones in a crowded room into a camera network to find a missing person.
Swift 6, ARKit, SwiftUI, Expo, Python, FastAPI, WebSockets, YOLOE, OSNet, Baseten, OpenAI, Cloudflare Tunnel
A little more
- Phones scan a QR code, calibrate on printed markers, and stream frames plus ARKit pose to a FastAPI hub.
- A YOLOE and OSNet re-ID service on a Baseten GPU matches each frame to the reference photos in about 127 ms.
- The console maps every phone and a likelihood heatmap, then cues searchers with arrows, flashes and haptics.
- I built the iOS client (413 tests, ARKit confined to one file) and most of the console.
A Chrome extension that replaces the new tab with a high-signal developer news feed. Think daily.dev but much cleaner.
Next.js, React, TypeScript, Prisma, Supabase Postgres, Upstash Redis, WXT, Chrome Manifest V3, Tailwind, Vercel
A little more
- A daily cron pulls about 40 RSS feeds and clusters duplicate coverage by title similarity in a 48-hour window.
- The feed API ranks stories by recency, tag match and source authority. Titles are never rewritten.
- Tags, votes and the reading list live in chrome.storage.
My portfolio, set over an interactive pool. Drop in floaties and they drift, bob and bump into each other.
Next.js 16, React 19, TypeScript, WebGL2, Tailwind v4, shadcn/ui, Base UI, Vercel
A little more
- A WebGL2 fragment shader draws the water, caustics and floor shadows, and scales its buffer to hold the frame rate.
- A small custom solver steps the floaties at 1/120 s with damped bounces and steers them around the content.
- The misc tab pulls my Monkeytype personal bests from its public API, cached for an hour.
MonkeyType straight in the terminal, with blazing fast performance. Built using Go.
Go, Bubble Tea v2, Lip Gloss, Cobra
A little more
- One Bubble Tea model drives the test, results and stats screens at 120 FPS.
- Every run is appended to a JSONL log that feeds the per-second chart and the trend sparklines.
- A keystroke through update and render takes about 4 µs, 2,000× inside the frame budget.
Use Kanye's Stem Player right in the browser. Splits any song into its stems.
React Router 7, Cloudflare Workers, R2, Workers KV, Modal, Demucs, Three.js, React Three Fiber, Web Audio, Zustand
A little more
- Uploads go straight to Cloudflare R2; a Modal GPU runs Demucs and posts four stems back through a webhook.
- A Web Audio graph plays the stems in sync; dragging the LED grooves on the model sets each level.
- Echo and gate effects, a mix recorder, keyboard shortcuts and three colourways.
A performance-first Rust macOS app with 22 file tools, from video compression and Whisper transcription to PDF splitting.
Rust, Tauri 2, Tokio, React, TypeScript, Vite, Zustand, Tailwind, FFmpeg, whisper.cpp, Hugging Face
A little more
- React builds a typed job and checks which engines are installed over Tauri IPC before anything runs.
- Rust hands each job to FFmpeg, ImageMagick, Pandoc or whisper.cpp and streams progress back as events.
- Container-only conversions skip re-encoding: ffprobe checks the codecs, then the file is remuxed instantly.
- 29 input formats, 202 valid conversions, about 470 tests.
An npm package that renders LaTeX in React Native as native SVG, with no WebView.
TypeScript, React Native, MathJax, react-native-svg
A little more
- MathView converts LaTeX to SVG paths with MathJax and draws them with react-native-svg, offline and instantly.
- Inline and display math mix with plain text in one string; the KaTeX WebView mode stays as an option.
- A fork of iAmAdheil’s renderer, extended with the native SVG mode.
A daily mood tracker where friends who share their history show up as extra lines on your chart.
Next.js, React, TypeScript, Prisma Postgres, Auth.js, Google OAuth, Recharts, Tailwind, shadcn/ui, Vercel
A little more
- Log a mood from 0 to 10 with tags and a note; sharing is one-directional and per person.
- Google sign-in through Auth.js with database sessions in Prisma.
- A token-authenticated endpoint lets an iOS Shortcut log a mood without opening the app.
Finds the right people to contact at a company for sponsorship.
Python, Selenium, Flask, React, Vite, Tailwind
A little more
- Type a company and a role; a Flask endpoint drives headless Chrome through a LinkedIn people search.
- Hits are filtered by role and company and returned as JSON to a React front end of profile cards.
- I wrote the scraper and API; my teammates built the front end.
Turns a photo of a handwritten or printed equation into LaTeX.
Python, PyTorch, OpenCV, Flask, Next.js, Tailwind
A little more
- OpenCV cleans the image, finds each symbol’s contour and re-merges split glyphs like = and i.
- Each crop is normalised to 64×64 and classified by a PyTorch CNN, then assembled into LaTeX left to right.
- Five model versions trained on 49k+ symbol images: 24k generated across 25 fonts, 25k handwritten from CROHME.
Monkeytype
- 15 seconds
- 166
- Top 2.76%
- 30 seconds
- 152
- 60 seconds
- 141
- Top 2.32%
Currently bumping
9 Months & 50 HoursFred again.. & Latin Mafia
BlondeFrank Ocean
Nothing Was the SameDrake
Favourite poker hand
