√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
∞∞∞∞∞∞∞∞∞∞∞√√√∞∞∞∞∞∞∞√√∞∞∞∞∞√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
∞∞∞≈≈∞∞∞∞∞∞∞≈≠≠≠≠≠≈≈≈≈≈≈∞∞∞√∞∞∞∞∞∞∞∞∞∞∞∞∞√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
∞∞∞≈≈≈≈≠≠==≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≈≈≈≈≈≈∞∞∞∞≈∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞≈≈≈≈≈≈≈∞≈≈≈∞≈≈≈∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞√√√√√√√√√√√
÷÷÷÷÷÷÷==≠≈≈≈≈≈≈∞∞≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞√√∞∞∞∞∞∞∞∞∞∞∞∞∞∞≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈∞∞∞∞∞∞∞∞∞∞√∞∞√√√√√√√
≈≈≈≈∞≈≈≈∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞√√∞∞√√∞∞∞√√√√√√√√√√√√√√√√√√√√√∞∞∞∞∞∞∞∞∞∞∞√√√√√√√√√√√√√√√√√√√√√√√√√√
≈≈≈∞∞∞∞∞∞∞∞∞∞√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√∞×----≈√√√√√√√
√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√∞×----≈√√√√√√√
∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞≈∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞=∞∞∞∞∞√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√√∞×----≈√√√√√√√
∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞÷-×∞∞∞∞∞∞∞∞∞∞∞∞÷×--÷∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞≈××----÷∞∞∞∞∞∞∞
∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞≠---≠∞∞∞∞∞∞∞∞∞∞∞×----∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞=-------÷∞∞∞∞∞∞≈
∞≈∞∞∞∞∞∞∞∞∞∞∞∞∞∞≈==≠∞∞∞∞∞∞∞=-------÷≈≈∞∞∞∞∞×----≈≈∞∞∞∞∞∞∞∞∞∞∞≈----÷∞∞∞∞∞×-----≠≈∞∞∞∞÷-------÷∞∞∞∞∞∞∞
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈=----×≈≈≈≈≈≈=----------≠≈≈≈≈-----≠≈≈≈≈≠≠≠≠≠≠≠≈≈----÷∞∞≠≠≠-------÷∞∞∞∞×-------÷∞∞∞∞∞∞∞
≈≈≈≈×---≈≈≈≈≈≈≈÷-----≈≈≈≈≈≈=-------×--≠≈≈≈≈-----≠≈≈×---×=≈≈≈≈-----÷≈≈×---------÷≈≈≈≈×-------×≈≈≈≈≈≈≈
≈≈≈≈----≈≠=-≠≈≈×-----≈≈≈≈≈≈=----------≠≈≈≈÷-----=-÷-----÷≈≈≈≈------------------÷≈≈≈≈×-------×≈≈≈≈≈≈≈
≈≈≠≈----÷---×≈≈×-----≈≈≈≈≈≈÷-×--------≠≈≠××-----=-------÷≈≈≈≠------------------÷÷--≠×-------×≈≈-----
≠≠≠×----×---×≠≠×------≠××=≠÷----------=≠--------------÷×--×≈÷------------------×÷-----------×≈≠-----
≠÷×-----------×------------×------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
------------------------------------------------------×---------------------------------------------
------×---------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------×----×------
≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≠≈≈≈≈≈≈≈≈≈≈≠≠≠≠≈≈≈≈≈≈≈≈≈≈≈≈≠≠≠≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≠≠≠≠≠≠≠≠≠≈≈≈≈≈≈≈
≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≈≠≠≠≠≈≠≠≈≠≠≠≠≠≠≠≠≈≈≠≈≠≈≈≈≈≠≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≠≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≠≠≠≠≠≠≠≠≈≈≈≠≈≈
≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≈≠≠≠≈≠≠≠≠≠≠≠≠≠≠≠≠≠≈≈≈≈≠≠≠≠≈≈≈≠≠≈≈≠≈≈≠≠≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≠≠≠≠≠≠≠≈≈≈≈≈≈≈
≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠=≠≠=≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠≈≠≈≠≈≠≠≠≈≠≠≠≠≠≠≈≈≈≠≠≈≈≈≠≈≈≈≈≈≈≈≠≈≠≠≠≈≠≈≈≈≈≈≈≈≈
=======÷÷÷÷==÷=÷=====≠===≠≠≠========÷===========≠=≠==========≠===≠=≠≠==≠=≠≠=≠≠≠==≠≠≠≠=≠≠≠≠=≠≠≠≠≠≠≠≠≠
==========≠=======≠==÷≠≠≠≠=≠≠≠≠≠≠=≠≠≠≠≠≠≠≠≠≠≠≠≠=≠≠≠≠≠≠≠≈==≠≠≠≠≠==≠≠====≠≠≠≠≠=≠=≠≠=≠≈≈≠≠≠≠≠≠≠≠≠≈≈≈≠≠≠

blackcj-web · SkylineOS 9.0 · Hyprland · tty1

press any key to skip

~/projects
--:--:--
~/projectsprojects

casey@blackcj-webls -la ~/projects

Side projects and hobby builds — things I made for fun, to scratch my own itch, or just to learn something new. For my professional work, see experience.

Twitch Apex Stats

active

Apex Legends stat overlays & chat commands for Twitch streamers.

A suite of tools — stream overlays and chat commands — that let Twitch streamers show off and track their Apex Legends stats live, right from their broadcast and chat.

LaravelNext.jsReactTypeScriptMariaDB (Galera)KubernetesTwitch APIStripePatreon
↗ live 29,000+ channels

ModTrack

active

Time-tracking & invoicing for contracted ALGS broadcast moderators.

An internal tool built for a client: contracted Twitch & YouTube moderators on the official Apex Legends ALGS broadcasts log their moderating hours and generate invoices. An admin panel handles job creation, extra job benefits, and invoice review/processing, with a Wise integration that collects each moderator's payment details for payout.

Next.jsTypeScriptMariaDBKubernetesWise
private · client tool

glsms

active

Send & receive SMS through GL.iNet cellular routers — Go library, REST server & CLI.

A Go library, REST server, and interactive terminal UI (built with Bubble Tea) for reading and sending SMS through GL.iNet cellular routers on firmware 4.x. The SMS JSON-RPC protocol was reverse-engineered by probing a live GL-X3000 / Spitz AX, and it ships as a single CLI with prebuilt binaries for Linux, macOS, and Windows.

GoBubble TeaJSON-RPCREST APIGoReleaser

Patreon Local Library

active

Self-hosted archiver that pulls creator videos into Plex with AI captions.

A personal, self-hosted tool that routinely checks the creators I support on Patreon (but site support expanded to YouTube, Nebula, and Floatplane), downloading new videos along with their thumbnails and metadata into a SQLite database. Each video runs through a local instance of OpenAI's Whisper to generate closed captions, and a Next.js control UI doubles as a Plex metadata-agent source so everything lands in Plex with proper details. The download and captioning workers are horizontally-scalable, multi-instance Node processes. This all results into captioned video libraries with great app support across web, mobile, and TV from a single source.

Next.jsTypeScriptNode.jsSQLiteOpenAI WhisperPlex
personal · self-hosted

Apex Legends Comp Review

archived

ALGS pro player & team stats, analytics, and stream-performance tracking.

A now-discontinued analytics site that collected Apex Legends pro esports stats from ALGS tournament matches. Player and team profiles surfaced match history and performance analytics alongside live Twitch/YouTube stream status, plus stream and video performance tracking. Python workers pulled data from the Twitch and YouTube APIs, behind a Laravel backend on a MariaDB Galera cluster.

Next.jsTypeScriptLaravelMariaDB (Galera)KubernetesPythonTwitch APIYouTube API
casey@blackcj-web: ~/projects — sky-shzsh

sky-sh — interactive shell. Migration theme loaded.

type help for commands, or neofetch to start.

casey@blackcj-web ~/projects