
Linkudo
Sole freelance full‑stack developer for the modern reimagining of this classic browser‑based word association game. Built with Next.js, Node.js, Supabase, and Redis.

In Detail
Bringing Linkudo back to the web was much more than just a simple rewrite. The technology used in the original version (Flash) had long been obsolete, with the original codebase and gameplay mechanics lost to time and viability. The web and its users had moved on since too; using their phones to quickly solve Wordle puzzles on their commute rather than hunched over flickering CRT monitors with a keyboard and mouse.
This required a complete reimagining of the game's architecture to ensure it was performant, scalable, and engaging for a modern audience. Luckily, the client is also a talented designer, so at least the visual side of things was covered from the start. The challenge lay in redeveloping the game as a fully browser‑based experience, optimised for mobile phone use, whilst maintaining the simplicity and competitive nature that made the game so compelling in the first place.
This presented two distinct challenges:
Generating Daily Game Configurations
: a complex Python‑based back‑end system precomputes daily word association puzzles using a Breadth‑First Search (BFS) algorithm.Delivering the Game Experience
: a fast, responsive, and themable gameplay experience (React front‑end built on Next.js) that allows players to solve puzzles, track their performance, and share results.
Game Configuration Generation
Each day, the game presents its players with a new challenge. A Python process precomputes each day's challenges using a graph‑based search approach (Breadth‑First Search ‑ BFS) to identify valid word pairs and balanced solution paths.
Given the size of the dataset, this is a computationally expensive process. Configurations are precomputed and generated in batches, with each automatically assigned to a future date. These batches undergo editorial review before being imported into the game for instant future gameplay.
Built with Next.js, the game application includes several API endpoints developed in Node.js and TypeScript, enabling the front‑end to handle gameplay logic and user preferences. These handle every aspect of the gameplay logic, from fetching today's game configuration to keeping track of which theme the player has opted to use whilst playing the game.
The word data itself is a little over 13mb in size, so rather than relying on a combination of database storage and edge‑side caching, this is loaded into the server at start up and is held in hot cache, immediately available across Vercel's serverless architecture, and without any of the latency that might otherwise be introduced from an external database or caching endpoint. The other APIs essentially act as a middle‑tier between the player and data kept in a PostgreSQL database with Supabase for the rest of the game functionality. This is also aggressively cached via a Redis instance to keep responses as close to instantaneous as possible.
The final hurdle to overcome with these endpoints was security. To this end, the application handles CORS, method validation, and rate limits incoming requests, while also requiring a unique API key that is regenerated automatically every time the application is rebuilt.
The gameplay interface itself uses a combination of React and SCSS with a small component library to realise a player experience as close as possible to the client's vision. This is clean and crisp with fast and simple interactions to avoid distraction from the gameplay itself.
Customisable Player Preferences
Linkudo introduces personalised theming, allowing players to tweak their experience by selecting from five distinct themes, each with a unique look and feel. Their theme preferences persist across sessions via localStorage and back‑end device recognition. These choices are also tracked to help analyse engagement trends and continuously optimise the experience.





Automated Social Share Image Generation
When a player manages to complete the game, they are offered the opportunity to share their achievement on social media, including a unique image displaying that day's challenge, the number of steps the player took, and the theme they have selected. A standalone Node.js service generates customised Open Graph images from the game's daily configuration data.
Using Puppeteer, Express, and Vite, it renders a React component across all five themes, captures the output, and produces a branded share image showing the start and end words and the step count in the player's chosen theme. These images are then automatically uploaded into the game and used when a player decides to share their win.
