What twelve months of shipping bought me
Powarz was a fan wiki and AI battle arena. It ran from August 2025 to July 2026. I wrote 76,060 lines of code, and on any given day about thirteen people used it. Here is the whole accounting, because the numbers turned out to be the only valuable thing it produced.
The numbers
| Metric | Lifetime |
|---|---|
| Accounts created (six of them mine) | 66 |
| People who ever did anything | 51 |
| Came back on a second day | 5 |
| Still active after 7 days | 1 |
| Still active after 30 days | 0 |
| Monthly actives, best month ever | 13 |
| Battles fought | 211 |
| … of those, fought by me | 116 |
| Comments posted, all time | 0 |
| Battles shared, all time | 0 |
| Paying subscribers | 0 |
| Revenue, all time | $0 |
| Lines of code | 76,060 |
| Lines of code per account | 1,150 |
Signups were flat at roughly fifteen a month for six straight months — one every other day, never accelerating, no matter what I shipped. Strip my own activity out and the entire history of Powarz is 95 battles fought by 41 people, and for nearly all of them the first and last thing they ever did happened on the same calendar day.
What actually happened
The expensive version of the loop was the one everybody quit
Powarz had two battle modes. The flagship made fourteen model calls and walked you through a move-selection state machine. The other streamed a fight in three calls and about twenty seconds.
| Mode | Started | Finished | Rate |
|---|---|---|---|
| Flagship (14 calls) | 202 | 76 | 38% |
| Streamed (3 calls) | 9 | 9 | 100% |
Sixty-two percent of my main feature was abandoned mid-flight. The version that always finished was reachable only through a page nothing linked to. I had built the good one, buried it, and defaulted everyone into the one they quit.
The two things that mattered commercially were never plugged in
Every battle had a share page, complete with generated preview images. Nothing in the codebase ever produced a link to it. Across 211 battles the share count was zero — not low, structurally zero.
The upgrade page had the same problem. Stripe was wired end to end. But no
navigation, no button, and no post-battle prompt ever pointed at it, so no
user could reach the paywall. I spent months believing I had a conversion
problem. I had an <a> tag problem.
It gets worse, and I only found this on the day I shut the site down: production was running on Stripe test keys the entire time. Even if someone had found the checkout page, no money could have moved. I had built a billing system, deployed it, and never once verified that the thing it existed to do was possible.
I was measuring nothing
Analytics were never switched on — not misconfigured, never provisioned. For the product's entire lifetime there is no pageview data, no traffic source, no bounce rate. Every number on this page was reconstructed from the database after the fact.
I did eventually ship funnel instrumentation: a table, a helper, and twenty named events. One of the twenty was ever wired up, and nothing in the codebase ever read the table back. It collected data for two and a half months that no one, including me, ever looked at.
I built a community feature set for a community that did not exist
Discussions, threads, voting, a moderation queue, a suggestion pipeline, a reporting system, notification preferences. Zero comments were ever posted. Nine of my thirty-eight database tables never received a single row.
Five things I'd tell myself in August 2025
-
Instrument before you build, not after
Had funnel events existed in month two, the 62% abandonment and the unreachable paywall would have been obvious in week one. Instead they surfaced in a post-mortem. Everything else in this list is downstream of this one.
-
Every step in a loop is a place to lose someone
Fourteen calls got 38% completion. Three calls got 100%. I did not have a content problem or a quality problem — I had a length problem, and the fix was subtraction.
-
Being your own biggest user hides the truth
I fought 55% of all battles on my own site. That was enough daily activity to make the thing feel alive to the one person whose opinion couldn't count. The dashboard looked fine because I was the dashboard.
-
Community features need a community first
Forums do not create conversation; they host it. I built the hosting for a conversation that had no reason to start, and got exactly the zero comments that predicts.
-
Shipping is not progress
202 tracked issues, all closed. Seventy-five pages, 127 endpoints, a second native client. Thirteen monthly actives. A closed ticket felt like a result, so I kept manufacturing them, and I never had to face the one number that wasn't moving.
The honest ending
The failure here isn't that Powarz was bad. Roughly fifty people tried it and the retention curve went to zero — not low, zero — and no amount of additional building was going to bend it. Twelve months of competent work went into answering a question I could have asked in six weeks for a fraction of the effort, if I had been willing to hear the answer.
The one instinct worth keeping: write down what would make you stop before you start. I did that for the projects that came after this one. I didn't do it for this one, and that cost about eight months.
Something else is coming to this domain.