Building interactive experiences at the crossroads of art, code & hardware.
CU Boulder class of 2026
About Me
I'm a creative technologist passionate about designing and building interactive
experiences that blend art, code, and hardware. I studied
Creative Technology and Design
at the University of Colorado at Boulder, where I developed skills including graphic
design, full-stack programming, electronic engineering, and much more. I graduated in 2026
and I'm looking for full-time creative technology roles now, open to relocating anywhere.
This portfolio is a curated showcase of my work over the years: a blend
of technical projects and creative experiments that represent my journey as a
technologist and designer.
Away from the desk, you'll find me mountain biking, bouldering, skiing, or partaking in similarily adrenaline-fueled activities.
Data Forest is an interactive installation that turns foot traffic
into a living digital forest, rendered in real time in Unity.
Four camera micro-zones around the building run YOLOv8 person detection on OpenCV video streams and report
per-zone crowd counts to a custom aggregation server. The vision and render workloads run on two separate
machines connected over direct Ethernet with static IPs.
In Unity, the aggregated crowd data drives where trees spawn and how fast they grow, with per-tree growth
animated through MaterialPropertyBlocks. Optical flow from the cameras streams over UDP to drive Unity's
WindZone, so the canopy sways harder as people move faster, and a browser-based pose-detection layer adds
an audio track that responds to visitors in front of the piece.
Behind the system is a specific feeling: standing in front of a scale model of the building
you are currently inside, except the model is alive and being redrawn by the people around you,
most of whom will never see it. Watching it makes you part of it. The full intent is explained
on the project's info page.
boulderalleycat.com is the digital home for
Boulder Alleycat, a racing event I co-organized with my roommate Doug in 2023 to revive the underground
racing culture in the city. To do so, I built a custom QR-based checkpoint tool
which enables real-time progress tracking and automatic timing and split data collection. The tool transformed the race format,
allowing races to be organized quicker and cheaper, without dedicated personnel, and with accurate live racer tracking.
The website's primary purpose is an archive of past
races. Users can browse through each of the 10 (so far)
races and look at the winners in both categories, their times, and what checkpoints the racers had to visit in order
to finish. The newest and most exciting feature is a 3D visualization
of the route taken by the fastest racer. A hallmark characteristic of Boulder Alleycat races is that checkpoints can be collected
in any order, encouraging creative pathfinding. As a result, the 3D visualizations bring the race data to life and offer fresh
perspectives on the routes taken by seasoned cyclists.
The same island, played rather than watched. Two to four seats, any of them a person and the
rest bots, on a board dealt fresh every time. The front page is a recorded game playing
itself on a slowly turning island, and two clicks from there deals you one of your own.
Catan shares its rules, geometry, look and
logic with its simulation and visualizer predecessor. What is
new is everything a played game needs: new panels and unique visual statistics, optimized and designed for gameplay instead of watching.
Up to four people can play it in four browsers with nothing in between. Every connection is peer to peer
and the host is the only machine that runs rules; a guest holds only what it is entitled to see,
works out its own options from that so the interface never waits on the wire, and sends what it
chose for the host to check. Nobody's hand crosses the connection, adding fun and realism.
A three-team website system for CU Boulder's ultimate frisbee program:
Mamabird (men's A-team),
CKFT (men's B-team), and
Quandary (women's A-team).
All three sites share one JavaScript core with team-specific data files and stylesheets for unique branding.
Key Features: Dynamic year-based roster browser with historical lineups dating back to 2013,
auto-filtering team leadership sections, descriptive tournament schedules, and video galleries
with YouTube integration. Player cards link to ulti-verse.com profiles for career stats. Each site features
clean animations and hash-based single-page navigation.
Built from scratch with vanilla JavaScript with zero dependencies beyond a library for 3D graphics.
The shared codebase architecture demonstrates efficient code reuse while maintaining distinct team identities
through modular data structures (ROSTER_DATA, TOURNAMENT_DATA, VIDEO_DATA). Sub-200KB payload, 60fps animations,
and responsive design prove vanilla JavaScript can power sophisticated multi-site systems without framework overhead.
Orbital Fence
is a single-page 3D console for tracking orbital debris, modelled on NAVSPASUR, the VHF space
surveillance fence that ran along the 33rd parallel until 2013. A hex-tiled globe turns on a marked
spin axis, carrying a sensor sheet that stands on a line of ground sites. Objects are invisible until
they trip that sheet, and a transit is what yields a catalogue number, an element set and a track.
The objects are real: 2,771 element sets from CelesTrak, propagated with SGP4 and joined against the
SATCAT so every contact carries its true name, NORAD number and radar cross-section. The master site
sits at Lake Kickapoo, Texas, and the planet's rotation comes from Greenwich Mean Sidereal Time, so
elevation, azimuth, range and range rate are measurements from a real place at a real time.
Nothing is drawn until the fence has seen it. The page opens on an empty sky and fills in live as the
sheet catches things, because watching the catalogue build is the piece. Zero dependencies, 118
headless unit tests.
For my Advanced Computational Fabrication class, I designed custom parametric trophies for the Boulder Alleycat race series using Grasshopper.
Each trophy is tailored to physically show the route taken by the racer by mapping race data onto a 3D topological model of campus.
The system extracts checkpoint coordinates from Google Maps and checkpoint order from my live tracking tool, then generates a personalized
3D model. The Grasshopper logic places markers at exact locations, aligns them with terrain height, and connects them with pipes that follow
the race route while maintaining prominence over the topographic base. Race metadata (racer number, race ID, and final time) is dynamically
positioned on the trophy.
The parametric system is designed to be reusable — I can generate a new custom trophy for any race simply by updating the coordinates and
checkpoint order. The final models were 3D printed on a Bambu Labs printer. Read more
here.
A fully automated growing system built within a standard filing cabinet by my group for our "Hacking the Apocalypse" course.
This project combines electrical engineering, Arduino programming, and mechanical design to create an
autonomous growing environment. The system monitors soil moisture, and uses a system of misters to water the soil when necessary.
A bank of fans is programmed to ventilate air after watering to mitigate mold and fungus growth. Grow lights allow the microgreens
to thrive even when the drawers are closed.
The system demonstrates practical engineering, proving that sustainable food
production can happen anywhere with smart automation.
SillBot is the final project I designed and constructed for the "Object" class at CU Boulder, focusing on physical manufacturing, electrical engineering, and Arduino integration.
Built from scratch, the machine detects ambient air temperature and uses a lead screw as a linear actuator to automatically open and close a sliding window. Left running during the hot Front Range summers, it uses fans to effectively regulate bedroom temperature through responsive automation.
Read more about the specifics, building process, and code here.
Four bots settle a freshly dealt island, forever, in 3D. One sprawls for the longest road, one builds upward
into cities and development cards, one lives off the harbours, and one spends its turns pointing the robber
at whoever is winning. When somebody reaches ten points a new island is dealt out tile by tile and they
start again.
Infinite Automatic Catan is a companion piece to Infinite Automatic
UNO, and the rules are the real ones — the two-tile distance rule, harbours at 2:1 and 3:1, a bank that can
actually run dry, and a longest road that breaks when a rival drops a settlement in the middle of it. The
pieces are scaled off the retail game and the harbours sit in the fixed notches of the sea frame rather than
wherever a shuffle puts them. Nothing on screen is a stand-in: the expected-yield panel weights every corner's
tiles by the true two-dice odds, so you can watch the worth of a claim change as the robber moves.
A simulated lava lamp. Wax takes heat by conduction from the bulb
in the base and loses it to the surrounding substrate, getting colder with height. Each glob rises, cools and falls
on its own.
Lava Lamp is drawn entirely in one WebGL fragment shader. The wax is
a metaball isosurface built on a compact support kernel, lit only by the bulb beneath it, so thin wax glows
and a glob's underside reads warmer than its shaded top. Seven bottle profiles and seven colors to choose from, and a flow speed
slider for adjustability. There's even a switch that cuts the light and leaves the wax to settle in the cold dark.
Four bots play UNO forever on a green felt table. Each player has a different strategy and personality; one
plays the odds, one goes after whoever is closest to winning, one hoards its wild cards, one trusts the
shuffle. A diverse collection of stats and graphs display every decision and it's effects.
Infinite Automatic UNO is the third version of a sketch I
first built as a fixed 16:9 wallpaper. Now, in it's final form, the sketch aesthetically demonstrates the
ups and downs of the beloved card game. Check it out!
Words are what give letters meaning. If the strict structure of written language is removed, do the remaining glyphs still carry meaning?
Glyphs & Gravity is an experimental typography tool
that lets users bring letters to life with dynamic physics and creative animations. From structured layouts to freeform gravity,
spinning, and bouncing effects, the tool combines playful interactions with typographic exploration.
Built from scratch in JavaScript (p5.js), it allows users to toggle features like gravity,
rotation, and even font, creating a unique playground for symbols and motion.
I've designed custom jerseys and apparel for two athletic teams, combining technical and design expertise to enhance team identity.
Co-Motion Sports 25th Anniversary Mountain Biking Jersey: I designed a limited-edition anniversary jersey
celebrating Co-Motion Sports' legacy in the mountain biking community. The design incorporates anniversary branding with
modern aesthetics.
CKFT (University of Colorado Club Ultimate B Team) Logo & Reversible Pinnie: I designed a custom logo for the team, to be used on
everything from merchandise to social media postings and beyond. Additionally, I designed and ordered a reversible pinnie with the logo and a few other
small details, to be used by the players at practices. The design was universally accepted and loved by the team members, and now stands as CKFT's
official logo.
These projects demonstrate my ability to translate team identity and community values into wearable design that athletes are proud to represent.