Project / 02
Tickermate - Discord market data bot
Serverless Discord bot for market and macro data. It uses Discord slash commands, AWS Lambda, DynamoDB caching, Massive, Binance, Marketaux, SEC RSS, and Federal Reserve feeds without running an always-on gateway process.
The problem
Most Discord bots are built like long-running apps: connect to the gateway, keep a process alive, and hope the host stays up. That is a poor fit for a slash-command finance bot where most interactions are short, bursty, and request-driven.
Tickermate takes the opposite path. It is a Lambda-first Discord application for stocks, indices, FX, crypto, market news, and Federal Reserve information. The bot is intentionally information-only: no trading recommendations, no AI commentary, and no strategy generation. Every response is shaped around source, freshness, and whether the data is delayed, end-of-day, historical, real-time, market, macro, or official.
My role
As a solo build, I focused the project around backend and platform engineering: Discord interaction handling, command routing, provider integrations, caching, response formatting, chart rendering, and AWS deployment structure.
The repo is organized around production boundaries instead of bot-framework convenience. Discord signature verification happens at the Lambda edge, fast commands return immediately, slow commands defer, and provider-specific code is separated from formatting and command execution.
System design
Tickermate uses Discord's webhook model, not a persistent gateway. Every interaction hits the Function URL signature gate, which forks: fast commands reply immediately, while slow commands defer and continue in worker Lambdas that post follow-ups and refresh the cache.
The production path is split across four Lambda handlers. interactions_handler receives Discord interactions through a Lambda Function URL, preserves the raw body for Ed25519 signature verification, handles Discord PING, and routes application commands. Fast routes reply directly. Deferred routes invoke command_worker, which posts follow-up responses through Discord's interaction webhook.
Charts are isolated in chart_worker, a container-image Lambda with Matplotlib dependencies kept out of the lightweight interaction package. Official news is handled separately by feed_refresh, which refreshes SEC, Federal Reserve, and curated issuer RSS feeds into DynamoDB.
Key technical decisions
- Function URL over gateway bot. A slash-command-only bot does not need a permanent Discord gateway connection. Lambda Function URLs keep the deployment cheap, request-driven, and easier to operate.
- Immediate versus deferred command routing. Quote and Fed commands can reply immediately. Charts, news aggregation, and corporate actions defer so Discord gets an acknowledgement inside the response window.
- Provider adapters and DTOs. Massive, Binance, Marketaux, Federal Reserve, and RSS providers normalize into typed records such as
QuoteSnapshot,BarSeries,NewsItem,MacroRate, andCalendarEvent. - Freshness as product behavior. Non-crypto market data is labeled
EOD,historical, ordelayed; Binance crypto data is labeledreal-time; Fed and RSS data is marked official where appropriate. - DynamoDB TTL cache. Stocks, indices, FX, Fed, and official feeds cache for 15 minutes; Binance crypto paths cache for 10 seconds; Marketaux news caches for 30 minutes to protect the free quota.
Results

Tickermate runs as Discord slash commands, with compact responses that show market data, source, and freshness metadata.
The repo implements 18 default slash-command routes across stock, index, fx, crypto, news, and fed, with four additional options/futures routes feature-gated off by default. It supports stock quotes, charts, corporate actions, stock news, index quote/chart, FX quote/chart/convert, crypto quote/chart/funding/open interest/news, general symbol news, Fed rate, next FOMC date, and FOMC calendar.
The deployment is described in AWS SAM: one public interaction Lambda Function URL, one async command worker, one scheduled feed refresh worker, one containerized chart worker, and one DynamoDB cache table with TTL. The repo also includes tests for Discord signature verification, route parsing, feature-gated command manifest generation, Fed rate parsing, and FOMC calendar parsing.
What I would do differently
I would add a small local integration harness for end-to-end command simulation. The unit tests cover important pieces, but a fake Discord interaction runner would make it easier to test fast replies, deferred replies, worker payloads, and webhook follow-ups together.
I would also add production failure handling around async paths. Direct Lambda invocation is simple for v1, but a queue or dead-letter path would make retries and failed chart/news jobs easier to inspect once the bot has real users.
Finally, I would expand provider fixtures. Market and macro APIs change shape over time, and snapshot tests around Massive, Binance, Marketaux, and Federal Reserve responses would make refactors safer without burning API quota.