Project Examples

QA Automation

QA Flag
QA Flag 2022 -
QA Automation Framework, Round 2
Taking all that I learned from creating Flagpole, I have started a new project to do it better. QA Flag is still in early stage beta, but it takes on a syntax more similar to Angular and NestJS with class-based test suites and decorators.
#qa# automation# playwright# cheerio# typescript# open source# vercel
Flagpole 2018 - 2021
QA Automation Framework, Round 1
While at FloSports, I saw a need for a QA framework that was approachable, flexible, and powerful. It can test anything from full-browser UX testing, APIs, to video streams. FloSports still uses it and now use it at Echelon too. It's easy to learn and fast.
#qa# automation# puppeteer# cheerio# ffmpeg# typescript# node# open source


Minikin 2020 -
Small but mighty web server
Powerful but small web server and router built with TypeScript. It has a tiny footprint and zero dependencies.
#webserver# http# router# typescript
Scrape data from website to feed
Takes patterns to grab data from an HTML DOM and turn it into a news feed that could be used to generate RSS or injested into any system.
#scraper# http# data# rss# typescript

Video Streaming

HLS Proxy
HLS Proxy 2018-2020
Manipulate M3u8 Manifest on the fly
Load a master HLS playlist (m3u8) and dynamically filter or re-sort it, or load an HLS chunklist and dynamically prune the segments.
#hls# live streaming# m3u8# manifest# typescript
Trickplay 2018-2020
Generate iframes only renditions
Generate iframe only renditions from a master playlist, using ffmpeg to identify the byte range of the keyframes.
#hls# ffmpeg# ffprobe# trickplay# iframes# m3u8# manifest# typescript
Parse HLS
Parse HLS 2018-2020
Parse M3u8 files into JSON
Strongly-typed HLS manifest parser, written in TypeScript. Fast. Zero dependencies.
#hls# m3u8# manifest# typescript
Live Streaming
Live Streaming 2017-2021
Achitected FloSports Streaming Platform
We migrated our legacy streaming system to an entirely custom build. This included orchestration of starting and stopping EC2 instances running Wowza, a management and monitoring console for our NOC, Live to VOD automations for entire broadcasts and also realtime clipping based on sports meta data, piracy blocks, CloudFront CDN integration, and much more.
#wowza# hls# live streaming# vod# typescript# java# aws# cloudflare workers
FloFX 2017-2020
Realtime Sports Data
Architected and built initial MVPs for FloSports Sport Data system. This includes a webapp to manually collect data and integrations with various physical and cloud-based third party data systems to pull in stats. These stats power on-screen graphics on live streams, rendered as a webview on top of the stream in Wowza. This metadata also powers on-website and in-app stats views and trigglers automatic live-to-VOD clipping. The system also integrates with our home-built management system of our NOC and software run by production crews (either remotely or locally) to integrate with at-venue scoring systems and video production software like OBS or vMix.
#wowza# html# javascript# css# typescript# node# firebase# firestore# serverless

Machine Learning and OCR

FloCR 2018
Character recognition from camera input
Wrote a skunkworks project where the production team can point a camera at a scoreboard. Input can be adjusted for contrast and bounds to turn the realtime video input into data and glyphs to show scores, clock, and other sport data on the live stream.
#webapp# ocr# sports metadata# live streaming
FloCR for Streams
FloCR for Streams 2018
Character recognition from incoming stream
At FloSports we often simulcast received streams from other production companies. Consequently, we did not have the live score and other data from the game. As a Hackaton, wrote an application that grabbed frames every 500ms from Wowza stream and ran OCR on the graphics to extract the data in realtime, pushing it to Firebase.
#webapp# ocr# sports metadata# live streaming# wowza# firebase
ML to Auto-Trim VODs
ML to Auto-Trim VODs 2019
Used ML to trim pre-game slates
Before games started, there would often be several minutes of spinning slates or other graphics. This wasn't a good user experience. I trained an ML model to regonize slate graphics from real camera input to give the timecode of the first real frame, in order to trim the pre-game fluff off.
#machine learning# google automl# video streams
Customer Support ML
Customer Support ML 2020
Salesforce integration
Used dataset of tens of thousands of tagged CS tickets to train an ML model to recognize the problem from emails received from customers. Salesforce integration automatically fed incoming emails to this system to pre-tag them for the issue and, in some cases, immediately email them a solution with no CS interaction.
#machine learning# salesforce# cusomter support# efficiency# zapier# google automl
Spam or No Spam
Spam or No Spam 2019
ML Model to moderate forum
Took dataset of thousands of forum posts, labeled spam or not spam, created an ML model and API to properly identify the difference. Model was 99.9% accurate, despite the wide variety of content inputs.
#machine learning# google automl# moderation


Echelon API
Echelon API 2021-2022
Based on NestJS
The team and I launched a new API shortly after I joined Echelon. The goal was to modernize and unify the a host of disparate APIs, so that our clients had a highly standardized RESTful API to use. This allowed faster development and fewer bugs.
#typescript# node# nestjs# rest api# docker
StatX 2020
Firebase Functions
Architected and built original MVP for FloSport's API that handled sport data in an abstracted way so that it could serve dozens of different sports with unique data schemas.
#typescript# node# firestore# firebase# rest api# nosql
Serverless API
Serverless API 2017-2020
We migrated FloSports' live streaming API off of a legacy PHP-based system into a strongly-typed API built on the Serverless framework and running on Lambdas. This worked well for a while, but we ran into issues with the scalability of Lambads, and we ported it over to NestJS to run in Kubernetes on Google Cloud.
#typescript# serverless# aws lambda# api gateway# kubernetes# gks


Echelon UX Library
Echelon UX Library 2022-
Angular Compnents
We built a UX component library that is reused for all new front end portals that we create. This allows us to independently create and test the functionality and design of UX components, outside of the scope of a particular app. Those components can be leveraged in each frontend for fast interation, consistent design, and predictable UI.
#angular# typescript# ux# components
Echelon API SDK
Echelon API SDK 2022-
Angular Components
We created automation around our API, so that each time there is a change to the API it verifies that it is compatible, consistent, and complete. Then it builds a few version of the SDK. Our front end applications use that SDK to make calls to the API, giving them fast and easy development, strong typing (input and output), and always being up-to-date with any changes.
#angular# typescript# automation# github actions# lambda# cdk
Echelon Content Management System
Echelon Content Management System 2022-
We replaced our legacy content management system with a new one. Through jobs, we keep our legacy CMS in sync for backward compatibility. We utilize AWS Aurora as the source of truth, but push also to OpenSearch for fast, rich searching, filtering, and faceting of our content. This has given us consistent metadata and an event-driven architecture to hook into a recommendation engines, push notifications, etc.
#angular# typescript# opensearch# mysql# lambda# aws# cdk# sqs
Fediroll 2022
Mastodon Client in SvelteKit
As a fun side project, I built a full web client for Mastodon/Fediverse. It displays feeds with added support for Markdown posts, has multiple customizable tabs, allows you to post and image attachments, etc. It was a vehicle for me to learn about the Fediverse, Mastodon APIs, and SvelteKit 1.0.
#svelte# sveltekit# typescript# mastodon# fediverse# masto.js# cloudflare 2022-2023
Personal Homepage, built with Svelte
Heard all of the hype about Svelte. I decided to learn it and built this personal homepage less than 24 hours after writing my first line of Svelte code. Later migrated to SvelteKit 1.0.
#svelte# sveltekit# javascript# html# css# vercel# cloudflare
RaceTab 2007-2015
Track & Field Meet Manager
Created a full-fledge timing and race management program called RaceTab, which received wide market praised and marketshare. Despite not being supported for years, continues to have a loyal user base. Integrates with various video and chip timing systems, registration services, and imports and exports various formats. Still the most flexible software on the market.
#windows# application# winforms
Gravity 2004-2008
Professional Service Industry Suite
Created internal software at Florida Industrial Scale that the owner and I spun off as a separate company. We sold licenses to scale service industry companies for $10-30K per install. The software ran the entire business: sales, service, rentals, inventory, accounting, collections, customers, leads, customer support, sales tax, purhcase orders, quotes, integrated with third party software like QuickBooks, and had a separate tablet-based app for our service techs where the service orders two-way synced over-the-air with customers signing acceptance on the screen. Keep in mind this was before smart phones were invented. This software is still being used by many of these companies.
#windows# application# winforms# crm
MileSplit Live
MileSplit Live 2007-2015
Track & Field Live Results Platform
System multiple components: Windows-based app (Electron) that runs on timing company's machine, an API powered by Firebase Functions (database is Firestore), and a frontend built with Angular (hosted on Firebase Hosting). I managed the outsourced team in Mexico that built the Electron application, while myself and my team built the web-based components. It syncs with various timing systems and pushes results to the web in real-time. It integrates with the MileSplit database to add metadata like team logos, badges for personal bests, and ranked performances. It also gives timers custom landing pages, domains, and branding.
#angular# typescript# firebase functions# firestore# pubsub# firebase hosting# outsource# electron