Inspiration

During my school days, my friend and I used to play a word game with a board drawn on paper. We would take turns forming words. It needed very little to get started, but there was always another word to spot or another move to think about.

I still remember my friend claiming CELLULOSE diagonally. It was the longest word we ever claimed in those games.

That memory became the starting point for Word Chess. I wanted to bring the game to a phone and build on it with online opponents, timed matches and ways to learn from each game.

What it does

Word Chess is played by two players on a shared board. On each turn, you place a letter and can swipe to claim a word that includes it. Words can run horizontally, vertically or diagonally, in either direction. Longer words earn more base points, and very hard words can earn an extra bonus.

The shared board is what makes the game interesting. A letter that helps you can also give your opponent an opportunity. You have to keep looking at the whole board and think about what your move leaves behind.

I wanted the game to give players a reason to practice vocabulary, recall words and notice patterns while competing with someone. The built-in dictionary lets them check an unfamiliar word without leaving the match.

I added guest mode so someone could try the game without signing up first. Players can find an online opponent or send a friend a personal invite.

Computer practice gives them a way to learn the rules or play when a friend is unavailable. The three difficulty levels use different strategies. Easy is more reactive, while the stronger levels look for scoring opportunities, block threats and set up future words.

The Bullet, Rapid and Classical time controls are inspired from chess. For rated matches between signed-in players, I use Glicko-2, a rating system also used in chess. Each time control has its own rating, and computer practice does not change it.

I also added match replay, reactions and shareable game recaps. Replay helps players look for opportunities they missed. Reactions bring some of the back-and-forth of playing with a friend into an online match. Four themes, each with light and dark versions, let players choose how their board looks.

How I built it

The interface uses React, Vite and TypeScript, with Capacitor for mobile packaging. The backend uses Node.js, Fastify and Socket.IO. PostgreSQL stores accounts and match history, while Redis supports matchmaking and leaderboard caching.

The server is responsible for accepting moves, calculating scores and keeping the match state consistent for both players.

ENABLE word list was chosen as the source for valid words, so both players follow the same rules. I also built a word-family index to group related forms and enforce family locks during a match.

Challenges I ran into

Keeping a live match fair

I had not worked with WebSockets before this project. Getting two players to see the same board, turns and remaining time became one of the hardest parts of the build.

At first, waiting for the server made letter placement feel slow. That led me to add immediate local feedback while keeping the server responsible for accepting moves.

The clocks needed more care. Network delays, a phone returning from the background, or a dropped connection could leave a player looking at an outdated turn or timer. I added clock synchronization, recovery after reconnecting, and checks to stop retried moves from being counted twice.

Understanding word families

Forms such as “play,” “played” and “playing” belong together, while similar-looking words can have different roots. This matters because claiming a word locks its family for the rest of the match.

English has enough exceptions and ambiguous cases that the word-family system still needs refinement.

Definitions presented another problem: a word can be valid for the game even when a definition provider has no entry for it. I kept validation separate from meanings, added cached dictionary lookups and included a labelled AI fallback for missing definitions.

Managing profiles as a solo developer

When I added profiles, custom profile pictures seemed like a natural feature. Then I realised that allowing uploads also meant taking responsibility for moderating those images.

As a solo developer, I needed a manageable approach. I disabled custom image uploads and replaced them with preset avatars. Players still get some personality, and the avatars fit the visual style of the game. They also fit the plan for optional cosmetic packs.

I added player reporting and blocking as well. Building a multiplayer game meant thinking about how people could behave toward each other, alongside the game rules.

Billing and store approval

My plan was to keep the actual gameplay free and offer optional paid extras. I built subscription support for premium themes, sticker packs, avatar packs and ad removal. Post-game analysis is a planned addition and is not available yet.

Then I ran into bank verification, or KYC, issues while setting up Google Play Billing. I had to disable subscriptions and paid purchase flows in the current release.

With subscriptions on hold, I integrated Google AdMob and RevenueCat ad reporting. The banner placement is on the completed-match results screen, keeping ads away from the live board and timed turns.

The integration forwards ad events and revenue data to RevenueCat. The aim is to support the free game while preserving the experience that makes people want another match.

The iOS release has also taken longer than expected. At the time of writing, it is still awaiting approval after around ten days of review and an appeal.

Accomplishments I'm proud of

Word Chess is now published on Google Play. I am proud of turning a game I played with a school friend into an app that people can install and play, while keeping the actual gameplay free.

I also tested matches with delayed messages, lost connections and incorrect device clocks. Getting the game to recover from those situations was an important part of making it ready for players beyond my own development setup.

What I learned

I initially thought publishing would be a straightforward final step once the game worked. It turned out to be a substantial part of the project.

I had to learn about store requirements, privacy disclosures, consent, account deletion and content moderation. These affected product decisions, including profile pictures and advertising.

On the technical side, I learned to think beyond a match played on a stable connection. A small delay or an unclear timer can affect how fair a game feels.

The biggest lesson has been that a working game is only part of a finished product. It also needs to be understandable, reliable and manageable by the person maintaining it.

What's next for Word Chess

My next priorities are to improve word-family handling, tune the computer opponents and refine the tutorial using player feedback. I also want to complete the iOS release and restore optional purchases once the billing issue is resolved. Post-game analysis remains a future feature. Once done, will include tournaments where a group of people can participate, such as in School / College competitions.

Built With

Share this project:

Updates

Submission history