03

Personal Projects

Outside of work, I run Ava — a Discord bot I built and maintain for a regional Pokémon and collectibles restock community spanning Virginia, Maryland, and DC. It tracks confirmed restocks, unverified "hope" tips, and line lengths in real time, then turns that history into statistical forecasts members actually use to plan store runs.

It's grown into a small platform: moderation tooling, a raffle system, a reputation leaderboard, onboarding automation, and a live public dashboard — all running on a Postgres backend I designed and operate myself.

StackPython · discord.py · PostgreSQL (asyncpg)
HostingRailway · CI/CD auto-deploy on push
Scope30 cogs · 25 interactive UI views
Coverage9 sub-regions across VA / MD / DC
SourceClosed — proprietary logic

A few pieces I'm most proud of — the rest is community infrastructure (moderation, raffles, reputation, onboarding, calendars) that keeps the server running smoothly.

AVA · CALLOUTS CORE FEATURE

Real-Time Callout & Tracking System

The heart of the server: four callout types — /restock (confirmed), /hope (unconfirmed tip), /remain (remaining stock check), and /empty — each one pings the right regional role and spins up a dedicated thread with a live, interactive status panel.

  • Crowd-sourced line tracking — members tap a line-length button (0/10/20/30/40/50+) in the thread; a rolling average of the last 10 reports drives a color-coded indicator (🟢/🟡/🔴) that updates live on both the thread panel and the original channel alert at once, with a 5-minute per-user cooldown against spam.
  • One-tap stock status — "Still in Stock" / "Cooked" buttons (with an optional note like "No Pokémon" or "Perfect Order only") rename the thread and update both embeds instantly, so status is visible without opening the thread.
  • Direct Google Maps links — every stored location carries its maps link, so every callout title is clickable straight to directions.
  • Guided location discovery — filing a callout walks region → store type → specific location, populated live from the database for that exact combination; a separate filterable browser lets mods search every stored location by store type and by region/state.
  • Duplicate & conflict protection — a 2-hour cooldown blocks re-reporting the same store/location, and an active unconfirmed hope alert blocks a duplicate restock report until it's confirmed instead.
Python PostgreSQL Real-Time Live Embeds
AVA · FORECASTING CORE FEATURE

Restock Forecasting Engine

Predicts which day of the week a store is most likely to restock, using up to 6 months of community-verified restock history. Four models run side by side:

  • Recency-weighted frequency — a 3-tier decay model (30/90/180-day windows) scores each day of the week independently, so a store restocking every Tuesday and every Sunday can show both near 100%.
  • Bayesian Beta-Binomial — wraps each day's estimate in a Beta posterior with a weak prior, pulling sparse data toward a sane baseline and reporting a 95% credible interval instead of a bare percentage.
  • Empirical Bayes regional pooling — estimates a region-wide base rate for a given day, then uses it as an informed prior so data-poor locations borrow strength from data-rich ones.
  • James–Stein shrinkage — blends each location's own rate with the regional average, weighted by how much history that location actually has.
Python scipy Bayesian Inference Empirical Bayes
AVA · VISION CORE FEATURE

AI Trading Card Identifier

Members drop a photo of a card into a channel; Claude Vision reads the game, name, number, set, language, and parallel/variant markings (holo patterns, serial numbers, SP/alt-art/treasure-rare stamps for TCGs; rookie/autograph/relic flags for sports cards) from a single structured-extraction prompt.

The result is cross-referenced against five different sources — pokemontcg.io, Scryfall, YGOProDeck, a One Piece card API, and eBay — to return live pricing, and a follow-up view lets the member log the card straight into their collection by condition.

Claude Vision Python Prompt Engineering Multi-API Fusion
AVA · ALERTS ACTIVE

Deal Watch Alert System

Listens to a channel fed by a third-party price-diff bot, parses product name and price straight out of its embeds (handling plain dollar amounts, USD-in-parens conversions, and bare "USD" suffixes), and matches against mod-configured watch rules — keyword, price ceiling, and optional location filter.

A match pings the right role in the right channel, with per-rule cooldown deduplication so a flaky source feed can't spam the same deal twice.

Python Regex Parsing Event-Driven
AVA · GRAPH MOD TOOL

Invite Network Visualizer

Generates a self-contained, interactive HTML graph of who invited whom across the server's history — node color and size scale with invite count, positions are pre-computed with a golden-angle phyllotaxis spiral so the graph renders instantly with physics off, and hover tooltips show join dates and invite counts.

Ships as a single downloadable file — no server, no dependencies, just open it in a browser.

Vis.js Python Graph Visualization
>
ENTER run  ·  ESC close  ·  home, projects, personal, resume, contact, download, terminal