Hello World!

Scroll down...

Section I

About Me

Hi! My name is Ollie and I am a software engineer living in Austin, Texas. I specialize in web development and I am particularly interested in writing performant code and architecting efficient applications.

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.

If you wish to adjust the strength of the 3D scroll effect then you may do so here.

Section II

Flight Guesser

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

Exeter Cycling Club

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

Advent of Code

For the last few years I have attempted Eric Wastl's Advent of Code programming challenges, inevitably falling off once my festive responsibilities start consuming too much time!

In order to make this more visual and interactive, I have hacked together a web application to make it easier to run my solutions. My solutions have been compiled into WebAssembly and will run directly in the browser, which works on all platforms and provides near-native performance. 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 V

Portfolio

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 VI

Learn Common Words

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 VII

Elapsed Time

The aim of this project is to synchronize a timer between a server and all of its connected clients whilst using a minimal number of requests.

The implementation is driven by websockets which are automatically connected when a client is loaded. On connection, the websocket will push the current elapsed time to the client. The client will use its system clock to update the displayed value based on this offset.

Clicking the button will send a reset request to the server, which will trigger the server to push a zero offset value to all connected clients. Since the websockets will time-out and re-connect every five minutes, the displayed time should not drift significantly. Displayed times are generally within a tolerance of approximately one second, although this can be longer for slow connections.

This project was a proof of concept for using WebSockets with AWS Lambda functions through an API Gateway, which I later used in my Flight Guesser project.

Section VIII

Contact Me

Email address

Message

You can also find me on

LinkedIn:

Oliver Bilbie

Section IX

Attributions

Background image courtesy of NASA Hubble Space Telescope Gallery.