Section I
Hi! My name is Ollie and I am a software engineer living in Austin, Texas. I am experienced in systems programming as well as web development, and enjoy exploring the limits of what computers can do.
This page is a showcase of some of the projects I have worked on for fun over the past few years. All of the source code for these applications is available on my GitHub along with some other bits and pieces, including the source code for this page.
Due to technical limitations, some features of this website are unavailable on Firefox. Please use a Chromium-based browser for the best experience.
If you wish to adjust the strength of the 3D scroll effect then you may do so here.
Section II
Flight Guesser is a game designed to be played when the player spots an aircraft in the real world, where the objective is to guess where the aircraft has come from and/or where it is heading. Points are awarded based on proximity to the correct locations, based on data sourced from Flight Radar. The game has multiplayer functionality where players can create a multiplayer lobby and share a code for others to join. While in a multiplayer lobby, a real-time leaderboard will be available.
The interface for this project is a single-page application written in React and hosted from an AWS S3 bucket. I decided to try out Zustand to manage the application state in this project, which I found to be a more ergonomic approach in this situation.
To keep server costs minimal, the APIs use AWS Lambda to execute code. The APIs are written in Python and are exposed through an API Gateway. The multiplayer API makes use of WebSocket connections to allow for real-time scoreboard updates to be pushed from the server to the client.
Section III
This project is a prototype website for my previous local road cycling club which is not currently in use. As well as providing access to general information about the club, the application allows administrators to select a route for the week which will be displayed on the website and sent via email to the mailing list.
Authentication is handled via Strava's OAuth2 implementation, where only administrators' Strava accounts have permission to set and update the route. Once authenticated, additional menus become available which will display all of the user's Strava routes and allow them to select one. A corresponding title and message can be provided, which are displayed on both the website and the email notifications. Club members can indicate whether they will be attending the ride using buttons in the email.
Since search-engine-optimization is important for this particular project, the user interface is server-side-rendered. I decided to try out Yew for this project which is similar to React but for Rust, where the code is compiled to WebAssembly. By wrapping the server-side rendering logic in an Axum HTTP server, I was able to get it to run inside of an AWS Lambda function. This architecture allows for reasonably fast page load times while keeping server costs minimal.
The APIs for the application are written in Rust and executed using AWS Lambda. The mailing list is stored in DynamoDB, which is a decision made primarily to minimize server costs. Other data items such as the currently selected route are stored as SSM parameters so that they may be updated without needing to rebuild the back-end.
Section IV
This project was inspired by Starlink. I built it as a way to explore lower-level networking with UDP and to simulate what reliable communication might look like in a real satellite constellation.
The setup consists of two programs: one representing satellites and one representing a ground station. Satellites periodically broadcast their position (a randomly generated low-Earth orbit updated with Runge-Kutta integration). These packets pass through a “Space” layer that randomly drops or delays them to mimic real-world conditions.
The ground station listens for incoming packets, reorders them correctly, and prints them in sequence. When it detects missing packets, it sends NACKs back to the satellite, which then retransmits the requested packet. Of course, those NACKs can also get lost or delayed — just to keep things interesting.
To keep everything responsive, the system uses multiple long-running threads (satellites broadcasting, ground station listening, background retry logic, etc.). I encapsulated the threads using RAII objects with proper cleanup, and used mutexes + condition variables to safely coordinate between them without race conditions.
The demo video shows a ground station (left) receiving data from three satellites (right).
Section V
I have learned a lot about programming thanks to Eric Wastl's Advent of Code programming challenges, which are annual collections of increasingly difficult puzzles that test knowledge of algorithms as well as mathematics.
In order to make my solutions more visual and interactive, I have hacked together a web application to make it easier to run my them. The solutions written in Rust have been compiled into WebAssembly and will run directly in the browser, which works on all platforms and provides near-native performance. Similarly, solutions written in Go are compiled to WASM using a lightweight Go runtime called TinyGo, and Python solutions are interpreted in the browser using a WASM-based interpreter called Pyodide. The application uses a web worker pattern to allow programs to be safely terminated early, as well as to not block the main thread while they are running.
The front-end of this project is hosted from an S3 bucket behind a CloudFront distribution. All logic is handled in the client so there is no need for any back-end services.
Section VI
This portfolio page was written in plain JavaScript, making use of a 3D scrolling effect and twinkling stars to achieve a science-fiction look. The page also features a custom lazy-loading mechanism for iframes which only loads the embedded content when it is in view.
The page also includes a contact form to avoid exposing my email address to scrapers. This is handled by an AWS Lambda function exposed via an API Gateway which uses SES to send emails.
Browser-imposed recursion limits have been circumvented by passing an incrementing depth parameter to the embedded portfolio pages. Firefox does not handle this very well, so I recommend using a Chromium-based browser if you want to play around with recursion.
Section VII
This project is a simple tool for learning foreign languages. Each round the player is presented with a word in the source language, and three words in the target language. The player must correctly identify the corresponding word in the target language to score a point. As the player progresses, more words are introduced until all of the 1000 most common words are included.
This project was a first attempt to familiarize myself with Yew before taking on something bigger. The front-end of this project is hosted from an S3 bucket behind a CloudFront distribution. All logic is handled in the client so there is no need for any back-end services.
Section VIII
Email address
Message
Section IX
Background image courtesy of NASA Hubble Space Telescope Gallery.