Music. Coding. Gaming. Life.


Programming has been a hobby of mine since I was a child. I am entirely self-taught, and have managed to carve out a career in the field that spans over fifteen years.

Initially, I worked with BASIC on the TI 99/4A, Atari 130XE, and the Commodore 64 and 128. This transitioned easily to Mac OS 7's QBasic. Then I learned Microsoft Visual Basic 4 through 6 and starting making small programs and games. My first two programming jobs involved me learning Microsoft Access, with all kinds of back-end VBScript.

In 1998, I got heavily interested in web technology, and took a dive into HTML and JavaScript. Soon, I'd pick up Visual Basic.NET, C#, and ASP.NET. I was then able to transition my HTML knowledge to the modern HTML5 browser. My JavaScript experience also readied me for learning Node.js. Along the way I've picked up a bunch of PHP and C/C++ as well somehow.

In many ways, I consider the core concept of coding to come quite naturally to me. You simply break a task down into smaller and smaller tasks. What really fascinates me about coding, however, is how you can put all these simple tasks together to do something phenomenal.

I am involved in many projects outside of my professional career that involve programming in some way. This page is dedicated to showcasing those projects.

Current Projects

Commits and Releases

Better concurrency and error handling.

Fixes #2.
Additional information for exceptions.
Ensure Discord is started up before the web application.

Fixes #72.
I guess technically these are 405s, not 404s.
Removed superflous mode data tag logging
(9 total commits)
Fix prefer-named-capture-group ESLint errors.
Fix bugs with record types in standings.

Fixes #71.
Write VoD to VoD channel.

Fixes #70.
Add VoD to match and matches pages.
Thank caster for casting, and reminder to post VoD.
Don't listen to guild member events on servers other than OTL.
Add the !vod command for casters.
Redis caching of common web calls.

Fixes #69.
Setup cache invalidations.
Addition of caching framework, plus notes for implementation.
Fix bug with unvoiding a match with no match time set.
Probably a better way to do scheduling.
Schedule notifications instead of checking once per minute.

Fixes #68.
Upgrade express.js.

Fixes #2.
Add streamers and casters to the match page.

Fixes #67.
Link matches on the matches page to their own match page.

Fixes #66.
Fix JavaScript bug causing dates to not display.

Also a documentation fix on the home view.
Send a 404 instead of a 500 on a request with an unsupported method.
Fix Discord.js error handling of ECONNRESET.

Fixes #64.
Fix bug with trying to notify matches where the channel doesn't exist.

Fixes #63.
Setup pings to indicate a server is online and offline.

Offline ping only occurs if "signOff" is true in the appsettings.json.
(14 total commits)
Shorten database timeout errors.
Fix jip lobby join
(24 total commits)
Fix example tracker url
(4 total commits)
Version 0.4.
Various bug fixes.
Fix bugs, update packages.
Actually use https module.
Fix name normalization on new match page.

Also, really version 1.1.
Update URL to https.
Setup pings to indicate a server is online and offline.

Offline ping only occurs if "signOff" is true in the appsettings.json.
(10 total commits)
Disable unused field for now
(5 total commits)
Fix bug with closing a game too fast after voiding it.
Fix display name when player leaves the server before a match is closed.
Limit KDA to 3 decimals in `!addstat`.
Admin can force match time to 180 days out.
Fix bug with index.d.ts.
Match page.

Fixes #58.
Link team roster to players page.

Fixes #61.
Add `!next time` command to show times instead of countdowns.

Fixes #60.
Fix bug with `!creatematch` not always swapping team colors.

Fixes #59.
Add images for Junebug, Mesa, and Turnstile.
Fix some warnings.
Add custom 404 view, fix router.

Fixes #57.
500 error handling, plus some other fixes.

Part of #57.
Move all views into their own class, making them available to the client

Also fixed a ton of bugs.
No longer maintaining repository here.
Move cast view to its own class, fix database issues.
Refactor controllers to call models instead of directly accessing DB.
Refactor the Otl class into other classes.
Refactor file structure and notifications.
Refactor for team database calls.
Refactor general database calls into Map, Event, & Team database calls.
Turnstile - Update - 4/21/2019
Refactor for player database calls.
Refactor notifications database calls into challenge database calls.
Refactor for new team database calls.
Refactor for match database calls.
KrossFire - CM, MP - Krusty - 4/13/2019
(3 total commits)
Begin database refactor, breaking out challenges into its own class.
Add favicon support.

Fixes #56.
`!addmap` and `!removemap` admin commands.

Fixes #55
`!lockteam` and `!unlockteam` admin commands.

Fixes #54.
Minor refactor to support dynamic loading of matches.

Fixes #53.
Make events scheduleable, and wait until an hour prior to allow joins.

Fixes #10 and #11.
Changes in preparation of Season 15.
(2 total commits)
Fix bugs with missing players.
Update to HTTPS where necessary.

Fixes #51.
Show KDA for `!addstat`.

Fixes #52.
Add links page, fix a variety of bugs.

Fixes #50.
Add images for Burning Indika, Keg Party, and Sub Rosa.
OuterKrust - CM, MP - Krusty - 4/12/2019
Tryhard - CM, MP, SP - Yinut - 4/9/2019
KubeRun - CM, MP - Krusty - 4/7/2019
Undertow - Update, adds MP - 4/6/2019
Add link to Challonge tournaments.
Show full error message for long errors.
Implement displaying of overtime games on the website.

Fixes #48.
Implement recording of overtime on the bot.

Fixes #47.
Fix bug with team size records not showing correctly on the website.

Fixes #46.
Scrub information in parenthesis after name on website.

Fixes #45.
Implement morgan for web logging.

Fixes #44.
Enforce a minimum of one stock map per team.

Fixes #43.
Burning Indika - Update - 4/3/2019 Media Player