Where I'm at
Vazen made $23.46 today. Not me. Vazen. A real person, with real money, running on bots I built — bots I described to an AI agent that wrote every line of code — watching his own dashboard, seeing his own P&L update in his own Telegram.
Five trades closed. ASTER, BTC, HYPE, XAG, HYPE again. Gross profit: $33.05. My cut — 29% — came to $9.58. His net: $23.46.
Not life-changing numbers. But real ones. From a system that twenty-five days ago didn't exist, built by someone who twenty-five days ago didn't know what SSH meant.
That's a different feeling than making money on my own bots. My bots are an experiment. Vazen's bots are a responsibility. When my dashboard shows a wrong number, I shrug and fix it tomorrow. When Vazen's dashboard shows a wrong number, someone else is making decisions based on a lie.
The line between hobby and business got thinner today. I felt it.
• • •
The win rate was lying again
I know. Again.
The dashboard had been reporting a dropping win rate for days. Every successful trade seemed to make it worse — not fewer wins, just the percentage falling after each close. That makes no sense. A win should push the number up, not down.
Took me a while to understand what was happening, so let me explain it the way I wish someone had explained it to me.
The bots track two things separately: how many trades happened (the total count), and how many of those trades were wins (the win count). The win rate is supposed to be simple division — wins divided by total. Sixty-nine wins out of a hundred trades, 69% win rate.
The problem: the bots were counting every trade in the total, but only logging some of them as wins or losses. The total showed 254 trades. The win rate was calculated from 110. Every new trade added to the denominator but not to the numerator. The percentage dropped with every close, even winning ones.
Think of it like a teacher grading papers. She's got a stack of 254 exams on her desk. But she's only actually graded 110 of them. The rest are sitting there, counted as "submitted" but not marked pass or fail. Her pass rate keeps dropping — not because more students are failing, but because the ungraded pile keeps growing while the graded pile stays the same.
The fix: told the agent to add a function that logs every single trade outcome the moment it closes. Symbol, entry price, exit price, profit or loss, timestamp, win or loss. One file. One source of truth. The dashboard reads that file for both the count and the win rate — so they're always in sync.
The real win rate: 69%. And it stays there until new trades come in and move it honestly.
This is the third dashboard lie in four days. Day 22: a hardcoded number pretending to be a count. Day 24: a hardcoded number pretending to be a percentage. Day 25: a real calculation with missing inputs. Different bugs each time — but the same result: a number on a screen that looks right and isn't.
I'm starting to think the default state of any dashboard is "lying" until you've personally traced every number back to its source.
• • •
Running someone else's system
Setting up Vazen's system was straightforward in theory. Separate server sessions, separate API keys, separate Telegram chats, separate dashboard. His bots don't know my bots exist. His dashboard doesn't share state with mine. Clean walls between everything.
What I didn't anticipate was the delay. Every time his dashboard deploys, it creates a new version at Cloudflare — the service that hosts the site. The sync job runs every fifteen minutes. So a trade would close, Vazen would get the Telegram alert immediately, go check his dashboard, and see yesterday's numbers. Not broken. Just fifteen minutes behind.
In a normal app, fifteen minutes is nothing. On a trading dashboard, fifteen minutes after you just watched a trade close and want to see the P&L — it feels broken.
The deeper issue was worse. Vazen's master dashboard was trying to fetch live data from a custom domain — vazen.panke.app — that DNS hadn't fully set up yet. DNS is like the phone book of the internet. Register a new name and it takes hours for every server in the world to learn the address. Until then, some can reach it and some can't. The dashboard couldn't.
The fetch failed silently — no error, no warning, just stale numbers looking normal.
The fix was a principle I should have followed from the start: embed first, fetch second. Instead of relying on a live URL that might fail, the agent now writes the profit data directly into the file the dashboard already has. The live URL is a bonus — if it works, great, you get the freshest number. If it doesn't, you still have the last synced data. Fallback built into the architecture, not bolted on after something breaks.
One trade closes → profit tracker updates → both dashboards redeploy. Vazen's and mine. Same pipeline. Same trigger. Same data.
• • •
What happens if everything goes wrong
Midway through the afternoon, I asked myself a question I should have asked on Day 1: what's the worst case?
Not "what if a bot has a bad trade." That's normal. What if all five bots — mine and Vazen's — hit the deepest layer at the same time? What if the market drops 8% straight down and every single DCA position is fully loaded?
Quick detour for anyone following along: each bot has ten layers. It enters at the top and adds a position every time price drops 1% below the last entry. Layer 10 is the bottom — the maximum exposure. Hitting layer 10 means the market has dropped roughly 8.6% from your first entry and you're holding the maximum position size. It's not a catastrophe — the position is designed to handle it — but it's the point where you're most exposed.
I had the agent build a risk calculator. It reads the current state of every bot — where each one entered, how many layers are filled, what the unrealized loss would be if price fell to the deepest entry.
Current worst case: $1,483 total unrealized loss across all five of my bots if every one hits layer 10. BTC carries the most risk at $757. Each bot needs roughly an 8.6% drop from first entry to fill all layers.
Then I ran a what-if. Doubled the position sizes across all bots. Worst case jumped to $2,729 — up 84% from current. Looked at the number. Closed the calculator. Changed nothing.
That's the point of a risk calculator. Not to scare you into stopping. To give you the real number so you can decide with your eyes open. The bots were sized correctly. The risk is within tolerance. Now I know instead of guess.
The calculator is saved as a reusable tool now. Any time I onboard a new client, I can run it with their sizes before a single trade goes live. "Here's your worst case" is a better onboarding conversation than "trust me, it'll be fine."
• • •
End-of-day reflection
Today produced five bug fixes and three new features. Most of the bugs were introduced by the fixes. That's the pattern now — solve one thing, discover two dependencies you hadn't thought about. It's not chaos. It's the normal state of a system that's growing faster than its documentation.
But the thing I keep coming back to tonight isn't the code or the dashboard or the win rate. It's Vazen.
There's a person whose money runs on something I built. Who checks a dashboard I'm responsible for. Who trusts numbers I have to make sure are real. Yesterday this was a project. Today it's a service.
The system doesn't get to be "mostly working" anymore. Mostly working is fine when you're the only user. When someone else is watching, "mostly" is the same as "broken."
Ten bots running now. Five mine, five Vazen's. Two dashboards. One master client view. A risk calculator that tells me the truth before I need it.
Twenty-five days ago I was Googling what SSH meant. Today someone paid me $9.58 because a system I directed an AI to build made a profitable trade while I was fixing a different bug.
The hobby just became something else. I'm not sure what to call it yet. But it has a client, and the client made money, and the dashboard is finally telling the truth.
Day 25 complete. First client profitable. Win rate honest. Risk calculated. Dashboard lied again — fixed again. The system grows. The responsibility grows faster.
Day 25 of ∞ — @astergod Building in public. Learning in public.