MEMORY
Memory is a whimsical card-matching game that rewards memory, not luck. Players flip two cards per move and clear the board in as few moves as they can, while a scoring system tells avoidable "slips" apart from free exploration, so a perfect memory always earns a perfect score. Streak bonuses, star ratings, color-coded results, synthesized sound effects, and confetti cannons make every game feel playful. Built with Python, Flask, and vanilla JavaScript, deployed on Heroku, and designed privacy-first: no accounts, no tracking, and every score stays in the player's browser.
PYTHON FLASK JAVASCRIPT WEB AUDIO API HEROKU
Source Code
Play
Project Highlights
Memory, Not Luck
A simulation showed that even a perfect memory averages about 9 moves, so scoring by moves alone mostly measured the shuffle. I redesigned it around slips: a miss only costs points when the player had already seen the match, or flipped a card they knew wasn't one. Exploring new cards is always free, so a flawless memory scores 1350 on every board.
Project Highlights
Streaks That Sing
Each match is worth +100, plus +50 for every match in a row. Sticker-style toasts, sparkle bursts, and a chime that climbs in pitch with every streak step make a run feel like it's building. All sound is synthesized live with the Web Audio API, so there are no audio files and nothing loaded from anywhere else, plus a mute toggle that remembers your choice.
Project Highlights
A Flawless Finish
Winning fires confetti from two corner cannons, drawn on a canvas with time-based physics so it stays smooth on any screen. The results card shows stars, points, slips, a personal best, and session stats, plus a row of color squares that can be shared through the Web Share API or copied to the clipboard.
Project Highlights
Admire Your Board
Players can step out of the scorecard to see their finished board, with each pair glowing in its score color, and a floating chip brings the results back. Each game deals 6 pairs from a pool of more than 100 photos, optimized automatically by a git pre-commit hook. Non-square photos are shown whole over a feathered, blurred copy of themselves.