I've been coding for over a decade since I built my first PHP website for a gasoline delivery business. Since then,
I've expanded my knowledge to include, among other things, JavaScript / TypeScript, Ruby / Rails, React, and Python.
I delight in the puzzle of figuring out how to integrate a front and back end as smoothly as possible. I worked
on various personal projects and webapps over the years before turning to coding as a full time career in 2019.
After graduating from the super-competitive bootcamp App Academy, I worked for Amazon Web Services for three and a half years.
Recently I've been working on an app to time and manage sailboat races and a mobile
rhythm game, Beat Burner, that auto-generates tile-tapping levels from any music. I hope
you take a moment to look at some of my projects. It's been over a year since I left Amazon and, though I love the creative freedom
that comes with focusing on my own projects, I'm ready to join a team again.
Before becoming a full time software engineer, I was a mechanical engineer and a teacher.
I've taught middle and high-schoolers math, science, and philosophy and coached a fledgeling
robotics team as they went to their first state competition. On the engineering side I've worked
for New York State improving building energy efficiency
and designed custom tooling for the manufacture of large aircraft.
I thrive on tackling complex problems, especially in a cooperative environment. Effective technical
communication and problem solving is the common theme throughout my career of coding,
engineering, and teaching. If something seems
impossible at first or if others have tried and failed, I'm interested.
When I'm not coding I like to spend my time sailing, playing chess, and building boats.
Beat Burner
Beat Burner is a mobile & web tile-tapping style rhythm game that you can play with any music!
Rhythm games are tedious to create and sourcing music for the game is an inherent problem. Beat Burner tackles
both of these problems: You can use any music that you have access to, and levels are auto-generated.
In addition to 50 built-in songs, you can play Beat Burner with music from any of three other sources:
directly uploaded, live radio, or streaming through your computer. Effectively - if you can listen to it,
you can play it in the game.
Uploaded songs can be .m4a or .mp3 and the game will auto-generate levels in real-time as you play, so there's
no need to wait around while the algorithm does its magic. Beatburner taps into live radio using streaming links;
nearly every radio station has one. Currently there are several stations with different genres to choose from. The ability
to enter a custom streaming url is an upcoming feature.
An experimental feature of BeatBurner is the ability to bring music streamed from your computer directly to the game. This
works with a
utility for routing your computers sound to its microphone and then
listening to the microphone. The app forms a peer-to-peer connection with your computer through a Beat Burner webpage
and streams your computer audio to the game where it's analyzed in real time while you play.
Beat Burner is written in JavaScript and compiled into a mobile app using Capacitor. The small backend is written in PHP.
Regatta Master
Regatta Master is a web app for timing and managing sailboat races.
Running a sailboat race is a tedious task involving checking boats in, setting various classes and start
times, adjusting those start times, and siting the line for boats that are over early. Then at the finish, it's
necessary to site the line, identify the crossing boats, glance at a clock to note the time, and then
write down each boat's exact finish time. It's a stressful job and usually requires coordination of several team
members with clipboards all frantically trying to find or record information.
Regatta Master handles the stress for you so you can run a race without pressures like keeping track of which
boats have checked in or simultaneously siting the finish line while also looking at a clock. It's all organized
in the app. Different classes can be set to start at different times and it manages the different countdowns at
the same time. There's an easy feature for calling boats over early and then clearing them once they return to re-start.
Once boats are approaching the finishing line, simply select them from the list, stage them for finish, then
tap them as they cross - no need to look at a clock and manually record the time yourself.
You can pre-load all boat information by entering boats one at a time or by uploading spreadsheets that already
contain the information. You can even fetch the file directly from a server; no need to download then upload it
to the app. Once the race is complete, the app will generate a .csv file with the results.
The Regatta Master web app is written in TypeScript useing React. The upcoming mobile apps will be created from
slightly altered versions of the web app using Capacitor.
GRAFFITI
GRAFFITI is a Chrome extension that allows users to leave and view comments on any webpage.
Have you ever wanted to discuss a craigslist ad with your neighbors who are probably viewing the same ad? Ever
been frustrated that a youtube video has comments turned off? Ever been taken down a long signup process only
to discover that it's a scam, and then wished for a way to warn other users on the first page?
With GRAFFITI, you can interact with other users anywhere on the internet with a comment section that
will pop up when you click the extension button. Of course, it's entirely opt-in. Only people with the
extension can see or make comments so if you prefer browsing alone, just continue to do so.
The current version of GRAFFITI is for Chrome desktop, but a mobile version for Chromium based browsers,
such as
Kiwi, is currently
under development. Future work includes mobile versions for Firefox and Safari.
The extension is written with JavaScript. The backend is an API built with PHP and utilizing a SQL database.
SimpleChessMove
SimpleChessMove is a public-facing chess API that can suggest a move for a given game state
or evaulate if a move is legal.
In coding school in 2019, I built an extensive chess website based on Chess.com, but writing the chess logic was a
tedious task that seemed unnecessary. Why wasn't there an API that would do the majority of the heavy lifting
for me?
Now there is. Just send your game state to the SimpleChessMove API and it will suggest a move. You can select
from five different ai levels, which correspond directly to how many moves ahead the algorithm will look. It
can handle any move including castling, en passant, and pawn promotion.
You can also use the API to evaluate if a move is legal, allowing you to write your own chess frontend with minimal
need to write your own chess logic.
SimpleChessMove is built with PHP. The frontend demo is vanilla JavaScript and CSS.
CheckMatey
Who hasn't wished for a pirate-themed chess website?
Inspired by
chess.com, CheckMatey is a fully-functional online community
for chess players with multi-player functionality as well as
single-player games against the computer. There's also
a community forum where you can share your chess or pirate-related
thoughts with other players. You can even use the move-recording feature
to share that new opening you just invented.
If your
opponent's not online when you want to play, just use the "invite a friend"
feature to challenge your friend via email. If you're still
online when your friend clicks the link, you'll automatically
be put in a game together. Of course, if you prefer Tetris to chess,
we've also got you covered.
CheckMatey has a Ruby on Rails backend and a React & Redux frontend.
Wind & Waves
Wind & Waves is an interactive sailing simulator that allows you to
learn the basics of sailing a small boat while also investigating
the various forces that make sailing possible.
Under the hood, Wind & Waves features a physics model
that combines forces on the sail, hull, and centerboard to calculate
accurate, real-time boat motion. It even calculates rolling
motion, incorporating a sailor whose weight moves
automatically to balance the boat.
All the physics modeling is coded in pure javascript. The display
in HTML5 Canvas and components are rendered with React.
Don't Die Together!
Don't Die Together! is a top-down, multiplayer zombie survival game. You
You start off with a pistol and, with zombies closing in from all sides, you
must survive as long as possible. You can invite your friends to play in the
same game with you, but be careful: the more players there are, the more zombies
arrive!
Don't Die Together! uses MongoDB on the back end and React on the front end. Multiplayer
functionality is through Socket.IO. The game rendering uses HTML5 canvas.
Other collaborators on this poject are
Ryan Sabik,
Wesley Tam, and
Ryan Sullivan.