Development covered 2 Aug 2026 to 4 Aug 2026 (commit dates).
This game has other people in it and almost never at the same moment. Sessions are short, they happen whenever, and two players being online together is a coincidence rather than a design assumption. Everything social therefore has to work from traces: what you did, left where somebody else will find it later.
This stretch went through that whole layer, and most of what I learned is about what asynchronous company is actually for.
What a ranking is for
The obvious answer is competition and that is mostly wrong here. Very few players are seriously racing anybody. What a board does in a game like this is give a number a context.
Ninety million qi means nothing on its own. Ninety million qi, when the people around you on the list are at seventy and a hundred and ten, means you are doing fine. That is the whole function, and it explains why a board should show your neighbours rather than only the top: the top is a different game and tells you nothing about yours.
Which makes the fault I found genuinely bad rather than cosmetic. One board ranked every player at the lowest possible value, because the figure it ranks on was never included in what the game sends up. It sorted correctly, it displayed correctly, it had been live for weeks, and every player looking at it learned something false about where they stood. A board that is wrong is worse than a board that is missing, because it is confidently answering the exact question the player brought to it.
A card that offers a fight it will not give you
The duel panel had a related problem in a different direction. It presented other cultivators as cards with a challenge button, and a note underneath explaining that challenges are not available.
Every part of that is honest and the combination is not. A player reads the button, not the note. This is the same family as an inert control, with an extra twist: the thing is not merely dead, it is actively advertising a feature the game has decided not to have yet. The right shape is to show the roster and no button at all.
There was a matching detail I liked less about my own work. The panel's only way out was labelled in a way that made it sound like a page refresh, so players avoided it and got stuck in a modal with no obvious exit. Exit affordances get the least attention of anything in an interface and they are the one control a confused person is looking for.
Seasons, and the word the player should never see
Seasons are the other lever for asynchronous company: a shared clock everybody is under, so a conversation about what happened this month has a boundary.
The banner announcing the current season was printing the season's internal name. Not a title, not a phrase, the identifier the system files it under. That is a small thing that does a lot of damage, because it tells the player they are looking at plumbing rather than at a world. The rule I keep restating on this project is that no internal name may ever reach a screen, and I keep restating it because it keeps happening in a new place.
The boss everybody can hit and nobody was paid for
The most enjoyable piece of asynchronous design here is the world boss: a very large creature that everybody chips at over days, from wherever they are, and which is a shared event without ever requiring two people to be present.
It also had the most complete failure of the stretch. Everyone chipped in, the creature fell, and nobody received anything, because the settlement that pays contributors was never reached. Weeks of a shared event with no payout at the end of it.
I do not have a clever lesson about that beyond the obvious. The completion path of a rare event is the least tested code in any game, because triggering it takes days by design. If a thing happens once a week, nothing about your normal testing will ever see its ending, and it needs to be exercised deliberately or it does not work.
The check that skipped itself
One last one, for the collection of tools that quietly stop working.
There is a check that refuses oversized files. Measuring the size of a directory produces an error rather than a number, the error left the size empty, and the empty value took the comparison down a branch that passed. So the guard let anything through as long as the path was a directory, which is to say exactly when it would have mattered.
The pattern is the same as an audit with an empty word list. When a check cannot compute its input, the safe answer is to stop, and the tempting one is to carry on with nothing.
Free to start, no install: Idle Cultivation Game.




Top comments (1)
the neighbours point is so true. a top 10 board tells almost everyone they lost, a board around your own spot tells you whether today actually mattered