Side project · Full stack · TF2 & crypto

Stash.TF

It started as a weekend experiment: could I get a Steam bot talking to TF2? That proof of concept turned into Stash.TF, a live trading site for Mann Co. keys and peer-to-peer item deals with crypto on both sides.

stash.tf
Stash.TF homepage

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

Laravel Livewire Redis RabbitMQ Reverb MySQL Python FastAPI Discord

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
Let's work together

Got a project in mind?

Whether it's a custom web app, backend work, or technical consulting — let's talk about what you're building.

Available for work
Laravel Backend Development Technical Consulting