The Tech Stack I Used to Build 11 Kitties and My Thoughts on It
After 40 days of development, I launched 11 Kitties.

Let me go through the technologies I used to build this game about raising cute cats, one by one, along with the ones I tried to use but ended up dropping.
Technologies I Used
Development Environment
- Bun
- Why I chose it: it’s fast
- Thoughts
- Pros
- It’s really fast.
- Build speed is more than 3x faster than
node - The local server starts instantly
- Build speed is more than 3x faster than
- The documentation is pretty friendly
- It’s really fast.
- Cons
- There are few references for troubleshooting
- It has a lot of bugs.
- Using bun on its own is fine. But problems arise when you use it together with other tools.
- Example: with the default settings alone, I couldn’t do a
production build. There was a bug where bun’s environment variable settings conflicted withVite’s environment variable settings, so it always ended up doing only adevelopment build. To work around this, I had to add a script that copies the environment-specific.envfile to the project root directory every time I build.
- Lack of references for the test suite. As a result, I couldn’t use
github copilot’s automatic test code generation feature as-is; I had to tweak the generated test code a bit. But it works well. - To work with
pwa, you need the dependency overrides shown below - The fact that it includes a test suite is one of bun’s selling points. But
vitestis better. Node’s test feature is fast enough, and above all, AI doesn’t knowbun test’s code. - Can bun replace node?
"overrides": { "@rollup/plugin-node-resolve": "^15.2.3" }
- Pros
- biome
- Why I chose it
eslint/prettierdoesn’t work properly inwebstorm- I can’t stand the configuration conflicts between
eslintandprettier
- Thoughts
- It works well
- References are extremely scarce
- It integrates reasonably well with WebStorm (there are bugs, though)
- I’m worried that biome might not properly support react 18. There’s already a lot of chatter about this in the biome community too. That’s the downside of a small open-source project.
- Why I chose it
- Vite
- Why I chose it: it’s the de facto standard
- Thoughts: fast and easy to configure.
Libraries
- React 18
- Why I chose it
- Familiarity
- A rich ecosystem
- Power
- Career value
- Thoughts: satisfied
- Why I chose it
- Zustand
- Why I chose it
- It beat out the other stores and became the trend
- Convenient
localStoragesupport
- Thoughts
- More convenient syntax compared to
mobx, which I used before - It’s nice that you can choose the store scale appropriately
- The learning curve is gentle
- Kind of similar to
Vue pinia? - I used localStorage recklessly for the sake of optimization and got a bitter taste of premature optimization.
- More convenient syntax compared to
- Why I chose it
- xState
- Why I chose it
- During game development, I needed a finite state machine to handle sequential && multiple && conditional events depending on state branching. Without xstate, my react components would have fallen into conditional-statement hell.
- Others use it, so I figured I’d give it a try too…
- Thoughts
- Pros
- The functionality is good
- Thanks to clean declarative code, it’s flexible for feature changes and easy to maintain
- The above advantage is overwhelming, so I plan to keep using it despite the various drawbacks described below
- Cons
- The documentation is shoddy
- The types are shoddy too. With a well-made library, you can guess how to use it just by looking at the types, but xstate isn’t like that. It’s generic hell.
- There are few references for v5, the latest version and the one I used
- Debugging the functionality itself is hard
- The learning curve is steep
- Overkill compared to a finite state machine I’d implement myself
- To debug, you have to rely heavily on
actors.getSnapshot().value
- Pros
- Why I chose it
- React-query(v4)
- Why I chose it
- I needed query caching
- It’s familiar and useful
- I wanted to use v5, the latest version, but it doesn’t support ios12…
- Thoughts
- I’m always unhappy with the documentation
- Still, it’s better than V5, where references are scarce
- As for types, v4 is still generic hell
- Why I chose it
Technologies I Tried but Dropped
- Pwa = workbox + vitePWA
- Why I chose it: runtime caching of the large images the game needs
- Thoughts
- The configuration is incredibly convenient
- I was frustrated that
appledoesn’t supportpwa’scaches api - It was tricky to handle cases where the Response type was
opaque. I had a hard time because I didn’t know that if you don’t setAccess-control-allow-originto*, you also have to setaccess-control-allow-headerandaccess-control-allow-method - Since the large-image caching that was the reason for adopting it was no longer needed, I dropped it with tears in my eyes. I plan to use it in the next project if needed
- Cypress
- Why I chose it
- Beta support for
Safarihas started - The existence of
Cypress studio
- Beta support for
- Thoughts: too busy to really try it out
- Why I chose it
20240402
Leave a comment