Enter two atproto handles. Each becomes an elemental spellcaster — Fire, Storm, Tide, or Stone, picked from their real public profile — with a signature spell and a real HP pool. Surge (how hard a spell hits) comes from tweet frequency, not raw post count — posts per day since the account was created. A real turn-based fight plays out, cast by cast, until someone's HP hits zero. Elements beat each other in a cycle, so type matchup can decide a close fight.
Each handle's public profile (app.bsky.actor.getProfile)
feeds four stats: Surge (attack power) from posts-per-day
since the account was created, Focus (crit chance and who
reacts first) from bio flair and profile polish, Reach (max
HP) from follower count, and Ward (damage reduction) from
the follower/follow ratio. Whichever stat is highest picks an
element — Surge leads to Fire, Focus to Storm, Reach to Tide, Ward
to Stone — and a signature spell is rolled from a seed on the
account's own DID, so a caster looks the same no matter who they
face. Elements beat each other in a fixed cycle (Fire > Storm
> Tide > Stone > Fire) for 1.35× damage, or resist for
0.7×. Whoever has higher Focus casts first each round, and the
fight runs turn by turn — real HP draining, not a fixed-length
log — until someone hits zero or ten rounds pass, in which case
whoever has more HP left wins. Each caster's rolls come from their
own seed, so swapping which handle goes in which box never changes
who wins.
type wheel: Fire ⟶ Storm ⟶ Tide ⟶ Stone ⟶ back to Fire