What I used:
Rive CLI + GPU Canvas (both). The whole world is one WGSL shader, and the game logic, the hand animation, the ghosts and the boss are Luau scripts. Data binding runs the UI (scores, stars, portal locks), state machines handle the menus and hovers, and the sounds are all generated in code. Then I polished it by hand in the Rive Editor.