Projects
Preparing the portfolio shell before the interactive work loads.
Preparing the portfolio shell before the interactive work loads.
Interactive project
A 3D browser darts game with regulation-style scoring, three match formats, and throws controlled by mouse, touch, or keyboard. Play solo, face the CPU, or share the board with a friend.

Learning through feedback
I created Dart Room as a playable companion to The Blind Dart Thrower, a neural-network lesson plan. The lesson uses dart throwing to make learning from error concrete: start with a set of conditions, make an attempt, observe the result, then adjust.
Dart Room grounds that loop in an actual game. Each throw has a target, a trajectory, an impact, and a consequence for the next decision. You can ignore the lesson and just play, but the feedback loop is always there.
How to play
A visit is three darts. Turns advance automatically after the third dart or after a bust.
Select Count Up, 301, or Cricket. Play solo, against the CPU, or with a second player on the same device. Add player names, choose Rookie, Pub regular, or The House for CPU matches, and decide whether 301 requires a double out.
Drag or swipe upward across the board and release over your target. The release point sets the aim, while the distance, pace, and straightness of the gesture affect the spread. The scorecard updates after every impact.
Play eight rounds and add every dart to your total. The highest score wins. A tied high score ends as a draw. Your best Count Up result is saved on this device.
Each player begins at 301 and subtracts every hit. Reach exactly zero to win. If a visit takes the score below zero, it busts and the score returns to where that visit began. With Double out enabled, the finishing dart must land in a double ring or the bull, and leaving one also busts the visit.
Close 15 through 20 and the bull by marking each target three times. Singles add one mark, doubles add two, and triples add three. Once you close a target, extra marks score points while an opponent still has it open. Win by closing every target and finishing with at least as many points as your opponent.
Dragging is not required. Use Keyboard aim to choose Triple 20, Triple 19, Double 20, Double 16, or Bullseye, then activate Throw. Controls are keyboard reachable, focus remains visible, score and turn changes are announced to assistive technology, the result dialog contains focus, and reduced-motion preferences are respected.
Build and adapt it
Dart Room is built with Next.js, TypeScript, Three.js, and WebGL. It runs in the browser without an account or server-side game state. The only persistent game data is your Count Up personal best, stored locally on the device.
The source is available under the MIT License. Read the scoring rules, inspect the 3D scene, run the game locally, or adapt it for another project.