v26.7.0 is the release where member cards stopped being a picture and started being a thing that moves. Two changes carried it: themes you roll for, and a rewrite of how the animation is drawn. Forty-nine commits, 73 files, about 9,400 lines added and 1,100 removed. Most of that is one directory.
The theme part is simple on purpose. There are 39 effects. You spend 1,000 XP, the bot rolls one, and it lands on your card. You do not get to pick. The roll happens on the bot side, not in the browser, because the XP is real and I did not want the spin to be something you could win by opening devtools. The web route only forwards the request and rate limits it to twenty spins a minute per IP. It is logged as a minigame, so it shows up in your history next to everything else you have gambled on.
A spin actually rolls two things. The effect, and a seed between 0 and 99,999. The bot announces the seed as your variant number, because that is what it is. The effect decides what kind of thing happens on your card; the seed decides what your particular one looks like. It sets the hue and the second hue it drifts toward, the saturation, which direction things move, the speed, the density, the drift and the tilt. It also seeds the structure inside the effect itself, so it picks where the trees stand, where the cracks start, which phase the moon is in.
That is 39 effects times 100,000 seeds. Two people with Sakura do not have the same Sakura, and there is no realistic chance anyone in any of these servers has the same card as anyone else. The seed is the reason the cards do not all look like the same sticker.
One thing worth being clear about, because it is not obvious: your accent colour does not tint a spun effect. Every one of the 39 has its own hardcoded palette pair, and the effect uses that. The accent is only the fallback for anything without one. Fire is orange because fire is orange, not because you picked orange.
The second change is the honest one. All of this used to be CSS animations, and CSS ran out. Thirty-nine effects of stacked gradients and keyframes meant the browser was compositing layers it should never have been asked to composite, and on iOS 18 some of them were outright invalid and silently did nothing. There is a commit in this release literally called "Fix IOS 18 invalid css animation". That was the point where I stopped patching it.
So the effects now render into a single canvas per card. There is a small engine behind it, about 3,200 lines across six files covering the frame loop, the sprites, the patterns, the structural pieces and the per-effect programs. One canvas, one loop, one place to fix things, and 39 programs sitting in one map. The card itself also reacts to the effect now instead of just sitting under it, and on phones the tilt uses the gyroscope with haptic feedback on the spin.
The rewrite left one piece of the old system alive. The CSS variant function is still there, because animated effect names in the panel still use it. Card effects do not touch it anymore. I left it rather than pretend the migration was cleaner than it was.
What I want to be straight about is how much of this release is cleanup. The commit list is not a highlight reel. Fixed a memory leak on the snow and fire effects. Fixed tornado debris escaping its bounds in the member list. Fixed the seed hue. Fixed 500s on save. Removed KOI entirely because I could not make it look right, and shipping a bad one is worse than shipping 39. Standardised where uploaded images live, which was overdue. The last commit before the tag is "Add more logs", which tells you roughly where my confidence was.
The release also adds issue and pull request templates, which is the least interesting thing here and probably the one that saves me the most time later.
If something on your card stutters or looks wrong, it is the new engine and I want to know. It is easier to fix now than it was a week ago, which was the whole reason to rewrite it.