← Powarz

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

MetricLifetime
Accounts created (six of them mine)66
People who ever did anything51
Came back on a second day5
Still active after 7 days1
Still active after 30 days0
Monthly actives, best month ever13
Battles fought211
… of those, fought by me116
Comments posted, all time0
Battles shared, all time0
Paying subscribers0
Revenue, all time$0
Lines of code76,060
Lines of code per account1,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.

ModeStartedFinishedRate
Flagship (14 calls)2027638%
Streamed (3 calls)99100%

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.