What I built
Stash.TF is two products in one codebase. The first is instant TF2 key trading: users sign in with Steam, buy or sell keys, pay or get paid in crypto, and the site drives trade offers through an automated bot account with status pushed back to the browser over websockets.
The second is a peer-to-peer marketplace. Sellers pick items from their Steam inventory, set a crypto price and wallet, and publish a listing or share a private invite link. Buyers pay on-chain; the flow coordinates trade offers, confirmations, and handoff so both sides know when items and money have lined up. Giveaways, support, and admin tooling for the team live in the same product.
I built the whole platform from scratch: the customer-facing site, payment handling, Steam inventory and trade flows, background processing, and the tooling to run it day to day. Nothing was a white-label marketplace; it grew piece by piece out of that first bot experiment.
Python
Custom Steam bot client
The website orchestrates the experience; a separate Python service handles Steam on the wire.
I started with off-the-shelf bot software, then replaced it with my own Python client when I needed more control over reliability, offer handling, and how the site and the bot stay in sync.
That service sends, confirms, accepts, and cancels trade offers on behalf of the site. It keeps Steam sessions stable across restarts, watches offer state in the background, and exposes a small HTTP API the web app calls so users see live progress without the UI talking to Steam directly.
Keeping bot logic out of the main app made both sides easier to change: trading rules and Steam edge cases in Python, accounts, payments, and product flows on the web stack. Earlier TF2 automation work (pricing checks, escrow awareness, catching bad offers) carried over into how strict the automated paths had to be.
Stack
How I built it
The web application is built on Laravel with interactive trading and listing screens, real-time status updates while a deal is in progress, and background workers for payments, notifications, and anything that should not block a click.
Several cryptocurrencies are supported with different confirmation rules and payout paths, but users still follow one familiar trade journey. Listings read live inventory from Steam, track which items are tied to an open deal, and record the path from payment through delivery.
Because real money and real items are involved, I put equal weight on operations: admin dashboards, alerts, scheduled maintenance tasks, and clear states when something needs a human. The goal is that traders know where they stand, and support has context when they do not.
Next project
VALIION v2
A full rewrite of VALIION: VALORANT stats, match replay, heatmaps, and a fast data layer after v1 hit the limits of an older stack.
Continue reading