Uri Richardson

Portfolio

Hardware, games, machine learning and web apps, from a Code.org sketch to apps my robotics team uses every week.

Every project is labeled by how it was made.

Some of this work I wrote line by line. Some I designed and directed with AI coding tools doing part of the typing. Both are real, shipped work, so they are shown separately and marked clearly.

Built by hand

An assistive device, a classifier and games, made without AI assistance.

Reach

Hand-builtMotorized telescoping grabber for seniors, Project Invent 2025-2026

A grabber for seniors that extends on its own, so picking something up never means bending, stretching or squeezing. Our four-person team built it for Project Invent with Mozaic Senior Life, after hearing that residents were losing grip strength to arthritis.

I owned the mechanical design and fabrication: the CAD, the printing and the telescoping mechanism. Six months and three versions later, Reach won the Product Pivot award at Project Invent, and version 0.3 is being refined to go to residents.

  • Onshape CAD
  • 3D printing (PETG)
  • N20 gear motor
  • Joystick + motor controller
  • Lead-screw mechanism

How it works

  1. An N20 gear motor spins a lead screw. The connector riding on it can't rotate, so the thread drives it upward and the next stage climbs out of the one below
  2. Twin lead screws per connector stop it from spinning and leave a channel down the middle for wires
  3. 3 mm steel balls in a printed race let lead screw B spin freely without pulling out
  4. A four-bar linkage closes Fin Ray fingers in a straight line, run from a joystick through a motor controller on a 6 V LiPo battery
Feb 6, 2026
Proof of concept

A drill stands in for the motor. After tolerance tests set a 1.5 mm thread offset, the printed lead screws extend exactly as planned.

Worked
Version 0.0
Retired for safety

The connector's anti-rotation wings poked through the shell and made pinch points for fingers, so I scrapped it.

Retired
Version 0.2
Two screws, not one

Twin lead screws removed the wings, steel bearing balls fixed the friction, and the claw joined three stages in one model.

Product Pivot award

Handwritten Digit Classifier

Hand-builtk-nearest neighbors on MNIST, January 2026

A k-nearest-neighbors classifier for handwritten digits. It loads the 60,000 training and 10,000 test images of MNIST from JSON, flattens each 28 by 28 image into a 784-number vector and trains OpenCV's KNearest model on them.

To classify a digit it finds the k training images closest to it and takes a vote. The script then plots test digits with their true label and the model's prediction so you can see exactly where it gets fooled.

  • Python
  • OpenCV (cv2.ml)
  • NumPy
  • Matplotlib
  • scikit-learn
  • tqdm

Accuracy on all 10,000 test digits

k=196.91%
k=296.27%
k=397.05%
k=496.82%
k=596.88%
k=696.77%
k=796.94%
k=896.70%
k=996.59%
k=1096.65%

Measured by re-running this project’s code on its own data. Bars start at 95%. Best: k=3 at 97.05%.

Invasion

Hand-builtTurret defense game in Java (Greenfoot), June 2025

A top-down survival game written in Java with Greenfoot for my final project. Slimes crawl in from every edge of the map and chase you down. Every slime your defenses destroy earns $1, and you spend it on more defenses before the horde wears through your five hearts.

Building happens mid-fight on single keys: walls (C) start at $10 and cost $10 more with each one you place, turrets (X) cost $50 and land mines (Z) cost $10. The longer you survive the faster slimes spawn, and your score is how many seconds you lasted.

  • Java
  • Greenfoot
  • Object-oriented design

How it works

  1. Every frame rolls a random number to decide whether a slime spawns. The roll's range shrinks each second, so spawns go from occasional to constant
  2. Up to four turrets fire on their own timers at 1, 2 or 3 shots a second. Two lock onto the oldest slime on the map and two onto the newest, and the fourth fires explosive rounds
  3. Turrets turn toward their target with atan2 on a small Vector class I wrote, and bullets fly along that heading
  4. Walls soak up five slimes before crumbling, and mines blow up the moment a slime steps on one
The game's class tree in Greenfoot: 14 actor classes and 2 worlds
The game's class tree in Greenfoot: 14 actor classes and 2 worlds

From the source

Generator.javaThe difficulty ramp. te counts up once a second to 195, shrinking the roll from 100 to 2.5. Rolls of 0 to 3 spawn a slime off one of the four edges, so spawns go from 4 in 100 frames to every frame.
if (timeElapsed>1){
    int rngNum = ((int)(Math.random()*(100-(te*0.5))));
    spawnSlime(rngNum);
}
TurretSpawner.javaTarget selection. The later turrets aim at the newest slime, the first two at the oldest, so the defenses split their fire.
if((z.id==3)||(z.id==2)){
    int max = slimeList.size()-1;
    z.setTargetLocal(new Vector(slimeList.get(max).getX(),slimeList.get(max).getY()));
}else{
    z.setTargetLocal(new Vector(slimeList.get(0).getX(),slimeList.get(0).getY()));
}
Turret.java + Vector.javaAiming. Subtract the turret's position from the target's, turn the difference into an angle with atan2, and rotate the sprite to face it.
Vector temp = this.targetLocation;
temp.substract(this.position);
this.target = temp;
double angle = target.toDegrees();
setRotation(180-((int)(angle)));

// Vector.java
public double toDegrees(){
    return ((double)(Math.atan2(this.x,this.y)))*180/Math.PI;
}
The PyTag character sprite sheet: idle, run, roll and tag dash animations

PyTag Online

Hand-builtTwo-player online tag over Python sockets, 2025

A two-player online game of tag written in Python with pygame for Computer Science 1. Two players connect to a server, one is randomly made the tagger, and the runner has to survive 100 seconds in an arena full of obstacles.

There is no game engine or networking library underneath it: just raw TCP sockets, threads and the game's own player objects sent back and forth every frame.

  • Python
  • pygame
  • socket
  • threading
  • pickle

How it works

  1. A threaded TCP server accepts two clients and randomly picks which one is the tagger
  2. Every frame (25 fps) each client pickles its Player object, sends it to the server and gets the opponent's state back
  3. Pixel-mask collision decides a tag: the tagger has to be mid-dash when the sprites overlap
  4. The runner wins by surviving 100 seconds. Dash (J/Z) and roll (K/X) run on cooldowns
The PyTag character run cycle, animated

Controls: WASD or arrow keys to move, J or Z to dash, K or X to roll. Built for Computer Science 1, 2024-2025.

The Box

Hand-builtGame Lab arcade game in JavaScript (Code.org)

A ten-level puzzle platformer written in JavaScript in Code.org Game Lab. Every level traps a stick figure inside a walled box, and the whole game is finding the way out: a gap in a wall, a hidden opening, or a door that needs a key.

Gravity, jumping, collision and ledge climbing are all written by hand. Drop out of the bottom of the box and the next level loads. Spikes and acid rain send you back, and the credits count your time and deaths.

  • JavaScript
  • Code.org Game Lab
  • p5.play

Features

  • 10 levels built from reusable parts: walls, platforms, ladder, key, door, spikes and acid rain
  • Key-and-door puzzles: grab the key, then press E or Down at the door
  • Title screen, loading tips, level hints, music and end credits
  • A password-protected level skip I added for testing

Built with AI

Tools people actually use. I scoped them, designed them and shipped them, with AI coding assistants as part of the build.

Robotics Attendance

AI-assistedThree versions for FRC Team 6911 SO BOTZ, 2025-2026. Shown signed in, with teammates’ names blurred

My robotics team needed to know who showed up and for how long. I've rebuilt the answer three times, and each version replaced the last as the team grew.

The current app gives every member an account and a personal QR code. A barcode scanner at the door reads it, writes the scan to the database, and a nightly job at 11 PM turns each visit over 30 minutes into credited hours.

  • React 18
  • Vite
  • Firebase Auth
  • Cloud Firestore
  • Python
  • Firebase Admin SDK
  • Google Calendar API
  • Claude

What the team uses now

  • Member, Lead and Parent roles, with admin approval for new sign-ups
  • Hours leaderboard and a live “Here right now” list
  • Weekly scan log with CSV export, and hour corrections that land in an audit log
  • Public calendar that syncs to Google Calendar and iCal
  • Announcements, event RSVPs, café staffing sign-ups and email notifications
Year 1
NFC cards and a spreadsheet

A Python script read physical cards through an NFC reader over a serial port. Each tap toggled check-in or check-out and was logged to a Google Sheet.

No AI
Year 2
Base44 web app

Moved to a hosted web app. Members typed their names to check in, with no individual accounts.

Limited AI
Year 3
The SO BOTZ app

Personal accounts and QR codes, a door scanner station, Firebase, and a whole team hub around it.

Built with Claude

EPOCh

AI-assistedAP U.S. and AP World History study site, 2026

A study site for AP U.S. History and AP World History. One toggle switches every page between the two courses, each covering all nine AP periods with a written narrative, key themes, key people and term lists.

Every highlighted term opens a hover card with its definition, date, period and the terms it connects to, so reading the overview doubles as building a concept map.

  • React 18
  • Vite
  • Tailwind CSS
  • anime.js
  • Firebase Auth
  • Cloud Firestore
  • OpenAI API
  • Web Speech API

What's inside

  • Ten study modes, including flashcards, Timeline Sort, document sourcing (HAPP), Degrees of Separation and the Feynman technique
  • An “Ask anything” tutor with a course-specific prompt and streamed answers
  • Written answers graded by AI, with keyword grading as a fallback
  • Live multiplayer rooms (MCQ Blitz, Define the Term) with real-time leaderboards
  • A community board where students post and upvote feature ideas

PRIORITY V

AI-assistedWork in progressAuto-scheduling day planner, started April 2026

Still in development. PRIORITY V works today, but it isn't finished: features are still being built and may change.

A planner that builds the day for you. Enter tasks with a total time, a priority from I to V and a due date, plus fixed blocks like school, practice and dinner. The scheduler places work sessions between them.

It orders work by priority and deadline, adds breaks after long stretches, protects a daily free-time target and puts deep-focus tasks in your peak hours. It also looks ahead and warns when a deadline is at risk.

  • JavaScript (no framework)
  • SVG
  • Firebase Auth
  • Cloud Firestore
  • Web Speech API
  • Service Worker

Features

  • Day, week and month views. The day timeline zooms and pans, and goes vertical on phones
  • Free-time target with a Spread toggle: scattered through the day or kept as one block
  • Hold-to-speak voice commands to add tasks and blockers
  • Repeating blockers and .ics calendar import
  • Cloud sync with Google or username and PIN sign-in, plus reminder notifications
Weekly grid with live totals, PDF export, archive and backup (shown empty)

LHRIC Intern Time Card

AI-assistedBuilt for interns at Southern Westchester BOCES, 2026

Interns at the Lower Hudson Regional Information Center log hours on an official paper timecard. This app replaces the paperwork: sign in with Google, fill in each day's time in, lunch and time out, and the totals calculate as you type.

Export stamps every entry, the weekly total and an optional drawn signature onto a copy of the official LHRIC timecard PDF and downloads it, ready to hand in.

  • JavaScript
  • Firebase Auth
  • Cloud Firestore
  • pdf-lib
  • Canvas

How it works

  1. Each intern's week lives in their own Firestore document, cached offline so it syncs across devices
  2. A stopwatch button stamps the current time. Entering one date fills in the rest of the week
  3. pdf-lib writes every field onto the real form at calibrated coordinates
  4. Past weeks are archived and can be re-exported. JSON backup and restore is built in

Ask Me Anything

AI-assistedEmail-to-AI bridge for use during school

I connected the ChatGPT API to Google Cloud so that from any computer I could email a specific account with a specific subject line. The program picks the message up, runs it through ChatGPT and replies with the answer within about 30 seconds.

It let me use AI during school hours from any computer with email, for learning only and never for plagiarism.

  • Google Cloud
  • Gmail
  • ChatGPT API

How it works

  1. Send an email to the dedicated inbox with the trigger subject
  2. A program on Google Cloud checks for new messages that match
  3. The message body is sent to the ChatGPT API
  4. The answer is emailed back to the sender

Want the full picture?

My resume covers experience, robotics leadership, certifications and awards.

Email copied to clipboard