A joint project with a peer for RPI's Interactive Data Visualization course (COMM 4880). The goal was
to build visualizations that make it easy to compare many video streaming services — by cost,
genre distribution, content overlap, and features. My contribution includes the two visualizations
below and the general site design. Note the displayed data is randomly generated, and the site isn't
optimized for mobile.
A homework assignment for RPI's Principles of Software course (CSCI 2600). Using a previously
implemented Graph ADT to store building locations on the RPI campus, the program computes the shortest
path between any two buildings with Dijkstra's algorithm. It accepts building names or ID numbers and
supports commands: "b" lists all buildings, "r" finds a path between two buildings, and "q" quits. I
built it against the Model-View-Controller pattern — modular design, code reuse, and design patterns
were the focus — and wrote unit tests for each function with JUnit 4.
RPI Campus Map (cropped)
List Buildings & IDs
Pathfinding Example
Pathfinding Example
I enjoyed this one because it produced a genuinely useful tool for RPI students, and it was great
practice writing correct code that's logically organized, readable, and modular.
A homework assignment for RPI's Operating Systems course (CSCI 4210): a multi-process solution to a
variation of the N-Queens problem. Given an m × n board, the program reports the number of solutions
using brute force with backtracking — fork() spawns a new process for every potential queen placement.
Read more about the N-Queens problem here. It also compiles with two precompiler flags:
"QUIET" trims output to the first two and final lines in the top-level parent, and "NO_PARALLEL" uses a
waitpid() call to prevent child processes from running in parallel.
Algorithm Diagram
Terminal Output
Terminal Output
A valuable assignment — it taught me how to use a waitpid() call effectively to control child
processes.
A personal project to learn the Spotify API and build a customizable alternative to Spotify's
auto-generated playlists. Given a list of genres and artists, the program populates a playlist from
Spotify's recommendation system, adding a song only if (1) its album cover is grayscale and (2) it has
an appropriate "energy" level for the time of day — lower energy in the morning, higher at
night. If three iterations pass without a match, it picks different artists/genres and raises the
energy cutoffs. Built with the Spotipy library.
Terminal Output
Spotify Playlist
I used the Pillow library to detect whether an album cover is grayscale. After a cover is downloaded
and downscaled, the detect_color_image function below analyzes its color bands to classify it as B&W,
grayscale, or color. Some of this analysis is adapted from Stack Exchange (see the source for
acknowledgements).
detect_color_image()
The vibe_check function below determines each track's "energy" using the Spotify API's audio-features
endpoint.
A homework assignment for RPI's Operating Systems course (CSCI 4210): a single-process,
multi-threaded TCP server for the Wordle word game (never played? try it
here).
A client connects via a port number and gets 6 tries to guess a hidden word; on each guess the server
returns an eight-byte packet indicating a correct, incorrect, or invalid word. Because it uses POSIX
threads, it handles multiple clients and games in parallel, tracking total valid guesses, wins, and
losses in global variables guarded by mutex locks for thread synchronization. Beyond socket(), bind(),
and listen() for network setup, I wrote my own Wordle comparison algorithm using hashtables.
Client Output
Server Output
My first time working with low-level network functions — I really liked the concept of
multi-threaded computing and the obvious benefits it brought to this project.
willbordman.com is the first website I've built from scratch. It's been fun making these pages and
aggregating the work I've done over the past few years. Please don't hesitate to contact me if you
find any issues — this site is still a work in progress!
All projects are non-commercial unless labeled otherwise. Some project code has been omitted per my
institution's
policy on sharing code.
Selected renders from my work in Blender & Houdini.
Nothing here yet.
Selected project details.
2024 GLDC ExpoTriumph renders on display at the expo.
Air PurifierProduct model for interior renders.
Coffee MakerProduct model for interior renders.
Power GeneratorProduct render for Triumph Modular.
Trailer TopdownTop-down render of a mobile trailer.
Trailer ExteriorExterior render of a mobile trailer.
Trailer InteriorInterior render of a mobile trailer.
Final AnimationBuilt around Blender's FLIP fluid simulator.
Still RenderOrthographic camera through a glass material.
Still RenderHDRI-lit product shot.
Blender WorkspaceFluid sim and scene setup.
Final RenderThe finished, photoreal scene.
Second AngleA different view of the same room.
Clay RenderUntextured pass showing the modeling.
Composition StudyI learned to frame the scene before modeling a ton of detail — the final
composition actually doesn't show half the objects I originally made.
Another VersionA later reworking of the same scene.
Final AnimationAn architectural walkthrough of the house.
Project PresentationA walkthrough of the process and challenges.
All projects are non-commercial unless labeled otherwise/watermarked. All projects were completed
exclusively in
Blender unless otherwise specified.