Ben Collier, PhD Book a call →free, 15 minutes

Portfolio

Coding with AI

Working projects I built with AI coding tools, several of them for Effective Coding with AI, a Carnegie Mellon course, and smaller apps and visualizations I coded with an AI assistant from my own data. Each repo includes the prompts and build log, and I use them as examples in class.

The Faculty Twin sign-in screen: "Ask me about the course", a line saying it is an AI version of me that teaches from my own slides, and a box for the course passcode

Web app · October 2026

Faculty Twin

Python, FastAPI, Claude, Voyage AI embeddings, ElevenLabs, Supabase, Vercel, Claude Code

An AI version of me that teaches from my own slides. Students ask a course question and get my slides from this semester with a narrated walkthrough in an AI voice made from my recordings, and short clips of me explaining it in class. It is behind a passcode for my students. I built it for Effective Coding with AI (15-113), a Carnegie Mellon course, as Project 2 in Fall 2026.

  • Every answer comes from my own course material: a slide, its speaker notes, or what I said in class. If the material does not cover a question, the twin says so instead of guessing.
  • The voice is AI-generated from my recordings, and the page labels it that way. It only reads narration the backend wrote and signed, so nobody can make it say something else.
  • Students stay out of it. Class transcripts are scrubbed of names before anything is indexed, and no clip includes a student speaking.
A four-up grid from version 2 of the reels: four photos of me from the mid-2000s under neon stage lights and sparkles

Web app · October 2026

Reels: Me, Over the Years

Python, osxphotos, Apple Vision, OpenCLIP, NumPy, WebGL, Claude Code

172 photos of me from my own photo library, 2000 to 2026, cut two ways. Version 2 is a 3:41 music video drawn live in the browser with WebGL, cut to the beat of a CC0 track in the neon style of K-pop animation. Version 1 is a pair of slideshows: me at work, and me everywhere else. I built it for Effective Coding with AI, a Carnegie Mellon course, as Project 2.

  • A script on my Mac picks the photos: it reads Apple Photos read-only, finds my tagged face, drops screenshots, blurry shots and bursts, and sorts the rest with a local image model. No photo goes to any online service.
  • Nobody else appears. Apple Vision finds every other face and body, and each photo is cropped until mine is the only face, or it is left out. A second check runs on the final crop, because the first pass missed a toddler and a kiss.
  • Version 2 is directed by code: a script measures the track's kick drum (140 beats a minute), finds the drops, and lays 190 shots on that beat grid. The browser then draws every frame from the song time alone, so seeking is exact.
  • With reduced motion turned on, the same cut plays without flashes, glitch or shake.
Three iPhone screens from Ignatius at Home: the home page picking up day three of a guided series, the audio player reading that day's reflection with its progress through the session, and the series page with its days and a painting

Web app · September 2026

Ignatius at Home

Python, FastAPI, Claude Code, Claude, ElevenLabs, Supabase, Render

A meditation app that turns reading material, such as a handout, a few passages, or just an idea like "seven days on a theme", into a guided audio series listened to one day at a time. Each day pairs a reading with a slow, repeated listening, a short reflection, some background on the text, a stretch of quiet between two bells, and a painting to sit with. I built it for Effective Coding with AI, a Carnegie Mellon course, as the course's server-side project on Render.

  • The model plans each day and writes the guidance around the reading, but never rewrites the source text. Readings come from the person's own material or a public-domain source.
  • It is free for anyone: open models on an academic cloud, free Microsoft voices, and the free tiers of six search services, with Claude and ElevenLabs as the paid tier.
  • Notes a person writes about themselves stay private, even in the build logs of the shared examples.
Rink Rivals comparing Sidney Crosby and Alex Ovechkin: both player cards with draft position and trophies, the points-per-season chart aligned by career year, and the stat table with each category's leader highlighted

Web app · September 2026

Rink Rivals

Python, Flask, Claude Code, the NHL API, OpenAI

Type in two NHL players and see their careers side by side: every regular-season statistic with the leader highlighted, each player's draft position and trophies, and a season-by-season chart of their production. If you want it settled, a language model reads the whole comparison and picks a winner. It has to commit, explain the pick, and give the strongest argument against it. I built it for Effective Coding with AI, a Carnegie Mellon course, as a study in what a small app owes the person using it.

Most of the interesting work was deciding what the app should refuse to do. The NHL's search endpoint does not rank results by relevance. A search for "Marc-Andre Fleury" returns Marc-Andre Dorion first, so taking the top result quietly shows the wrong career without any error. A scoring function fixes that, and a regression test checks that the endpoint still behaves this way. Skaters and goalies share almost no statistics, so the app declines to compare them rather than print numbers that are accurate and meaningless. Shots against and games played measure workload, not quality, so they are shown but never scored, which keeps a long career from passing for a great one. The OpenAI key stays on the server. GitHub Pages has no server to hold a secret, and GitHub Secrets are build-time variables that would end up in the published JavaScript.

This is the small, public version. I have also built a much larger hockey platform that is now being demonstrated to NCAA Division I programs for their coaches, managers, scouts, and players. Its code and login are private, so they are not linked here. It runs several coordinating agents and a data-analysis agent over a hockey database of more than 6 GB. I am happy to demo it in person for anyone interested in hockey data work at that scale.

Charlie the cocker spaniel, in a sweater, hopping across a voxel road in Charlie Road

Browser game · September 2026

Charlie Road

Kiro, Claude Code, three.js

A browser version of Crossy Road starring Charlie, our nine-year-old cocker spaniel, in place of the chicken. It keeps what makes the original work: the voxel look, one hop per input, endless roads, rivers, and railways, and a camera that punishes dawdling. Then it adds what matters to Charlie: tennis balls instead of coins, a bark that stops traffic, squirrels to chase, his real outfits as unlocks, a giant caterpillar toy worth five balls, and a flying saucer piloted by a squirrel where the eagle used to be.

The first version came from thirty minutes in class with Kiro. It went through five iterations, from colored rectangles to a fake-isometric board that never quite worked. I rebuilt it in an evening at home with Claude Code. I measured the camera angle from real gameplay screenshots and wrote a spec with acceptance criteria a machine could check, plus fairness rules for the world generator. Then I let an autonomous run build it one block at a time, checking each block by stepping the simulation through a debug harness instead of trusting a screenshot. After I played it, a second round added the bark, the saucer, combos, a daily challenge, and a shareable trading card. Every prompt, decision, and build step is in the repo.

A 3x3 Raven's Progressive Matrices puzzle with the last cell missing and six answer options

Experiment · September 2026

Can a computer pass an IQ test?

Python, Claude Code, 16 language models

  • 13random guessing
  • 34a student's 2017 program
  • 59expert system, no language model
  • 93current language model

Three programs, one from 2017 and two from this year, take the same 96 Raven's Progressive Matrices, the wordless reasoning test from 1936 that still shows up in hiring. A current language model, given the puzzle sheet and every cell as images, nearly aces it.

Sixteen language models from nine companies ran the same puzzles with the same prompt, so the write-up compares accuracy, cost, and speed directly. Four models tied at 92 while their prices differed by almost five to one. Five scored below the program with no AI in it. One release changed how the model works at answer time, and that moved its score more than two years of scaling did on either side. A neural network trained on thousands of invented puzzles scored 10, worse than guessing, and the explanation is the most useful lesson in the repo. A script generates every number from the raw results, and the prompt history quotes every instruction that produced them.

The game mid-puzzle: QUARTER-MUNCHING ARCADE ICONS solved in yellow above twelve words such as PIEROGI, CATAN and KAYAK, two of them selected

Browser game · September 2025

Connections About You

JavaScript, Node.js, Express, OpenAI GPT-5 with web search, gpt-oss-120b, Playwright, Claude Code

A word game in the style of the NYT's Connections. An AI writes puzzles about a person: type a name and a town, and GPT-5 searches the web and builds four groups of four from that person's work, their city, and some guesses about their tastes. When the game ends, it explains each group and links to what it read. Next to five puzzles it wrote about me, I added three packs I wrote by hand, for Star Wars, The Lord of the Rings and Carnegie Mellon, each in its own animated theme.

  • A few rules keep it a game and not a resume: at least two groups are about fun things, at most one is about work, and at most one is about the place. Real Connections groups in the prompt show the format and the difficulty ladder, from yellow up to purple.
  • Every answer is checked before anyone plays it: a schema, sixteen different words across the four groups, and up to two retries. The last twenty puzzles go back into the prompt so it stops reaching for the same themes.
  • The demo has no live generation. A static page cannot keep an OpenAI key secret, so it plays five puzzles GPT-5 wrote about me, saved from the server's history. Run the server and it makes one about you.
  • Writing nine puzzles by hand showed me what the AI misses: a good puzzle lives in its red herring, a word that fits two groups when only one grouping works. The model rarely builds one on purpose.

AI-engineered

Apps and visualizations coded with an AI assistant

Small apps and data visualizations I engineered with an AI coding assistant, from my own data: my photo library, my teaching evaluations, and my StrengthsFinder results, plus a word game. Each page links its prompt log.

Reels →172 photos of me, 2000 to 2026, picked and cropped with Apple's Vision API from Python and cut into a WebGL music video. Travel map →27 countries and 55 US cities, mapped from my own photo library with Apple's Vision API from Python. Strengths →What two StrengthsFinder results, five years apart, say about how I work. Teaching evaluations →Two interactive analyses of my de-identified course evaluations, compared side by side. Connections →A word game: puzzles an AI wrote about me, and ones I wrote for Star Wars, The Lord of the Rings and Carnegie Mellon, each in its own animated theme.