Bloom Sudoku was a project in the same Toss mini-app monorepo as Nyang Finder. (Toss is a popular Korean finance super-app that hosts small third-party "mini-apps.") This one had actually been committed, and right before I got to it, a feature had been added where "viewing a hint triggers a full-screen ad." At its core it's an ordinary 9×9 sudoku, but on top of that sits a raising game where you dress up a rabbit and tend a garden. Solve a puzzle and you get XP, and you spend XP on garden decorations or rabbit outfits. I wanted to ask why sudoku needs a rabbit, but having played it, it does give you a reason to solve one more puzzle.
The sudoku itself needed nothing
The puzzle generation and checking logic was hand-written code with no outside libraries. It builds a completed board with random backtracking, then digs out cells depending on difficulty. Easy removes 36 cells, Medium 46, Hard 54. When 54 of the 81 cells are empty, only 27 numbers are left. This part is pure computation that doesn't care whether it's in Toss or a browser, so I moved it over as is. When someone else's code has nothing to fix, there's nothing to say.
The screen went blank for the same reason as Nyang Finder
This app was also a completely blank screen as soon as it was deployed. Same cause, too. @toss/tds-mobile throws an error on its own the moment it loads outside the Apps-in-Toss environment, and this app was also only using the library as an empty wrapper, not for any actual screen components. Once I stripped out @toss/tds-mobile, @toss/tds-mobile-ait, @toss/tds-colors, and the @emotion/react that came along with them, it loaded. The library lets localhost through and blocks only real domains. So it never showed up once while I was testing on my own machine. I didn't fall into the same trap twice; I fixed both apps together. I'd like you to believe that.
There wasn't a single image file
Nyang Finder gave me one more round of trouble over the paths to its cat pictures, but Bloom Sudoku had no such problem. The rabbit, the garden decorations, and the wardrobe items are all drawn with emoji and CSS, so there are no image files at all. The wardrobe has 8 items, like a pink ribbon, a cherry blossom hairpin, a rattan hat, a mini crown, and round glasses, and the garden shop has 6 decorations, like a single tulip, a round flowerpot, a sunflower, and a cherry branch. Of the three apps, this was the simplest to move to a subpath.
You start with 86 XP
A brand-new user starts with 86 XP, not 0. That's the initial value hard-coded in the save code. Nowhere in the code does it explain why 86. A single tulip in the garden shop costs 20 XP, so before solving your first puzzle you can already buy up to four tulips. My guess is that it's there so a newcomer's garden doesn't look empty. To buy a fifth, you have to solve a puzzle. I usually treat unexplained numbers with suspicion, but I couldn't find a reason to change this one to 0, so I left it. Your puzzle in progress is saved too. If you close the window mid-puzzle, the cells you filled and your remaining hints stay in the browser, so you can pick up where you left off when you reopen it. It uses browser storage instead of Toss storage, so it doesn't carry over to other devices.
The ad attached to hints simply disappeared
The number of hints depends on difficulty: 3 on Easy, 2 on Medium, 1 on Hard. In the Toss app, using a hint shows a full-screen ad, but the ad code was written to check "is this a supported environment" first, so I didn't need to touch it. Outside Toss, the hint just appears with no ad. Web users get to use hints without watching ads.
How to use it
Press "Start today's sudoku" on the home screen and pick Easy, Medium, or Hard. Fill in cells with the number pad, and when you're stuck, use the hint button to reveal one correct cell. When you finish, you'll see your time and the XP you earned. In the "Garden" tab at the bottom, buy decorations with XP and place them in the garden; in the "Dress up" tab, put outfits and accessories on the rabbit.