Projects

Linkudo

Sole freelance fullstack developer for the modern reimagining of this classic browserbased word association game. Built with Next.js, Node.js, Supabase, and Redis.

Screenshot of the Linkudo website; part of John Kavanagh's development portfolio.

In Brief

Originally launched as a Flash application nearly nineteen years ago, Linkudo ('Link you do') is a browserbased word association game which challenges players to connect two words through related, rhyming, and thematic links in the shortest number of steps. This modern reimagining (released in 2025) brings the game back to the web, introducing it to a whole new generation of players.

My Role

As the sole developer, I was responsible for architecting and building the new version of Linkudo, modernising its gameplay on a scalable, cloudbased infrastructure. Working from clientprovided designs, I developed the backend with Node.js, Supabase, and Redis while implementing the gameplay mechanics using Next.js, React, and TypeScript. This delivered a completely new experience whilst preserving the spirit of the original game.

linkudo.com
  1. Next.js & React
  2. TypeScript & SCSS
  3. Supabase & PostgreSQL
  4. Node.js & Python
  5. 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 browserbased 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 Pythonbased backend 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 frontend 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 graphbased search approach (BreadthFirst 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 frontend 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 edgeside 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 middletier 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 backend device recognition. These choices are also tracked to help analyse engagement trends and continuously optimise the experience.

A screenshot of the Linkudo game, displaying the default dark blue theme, and showing the first step in the game.A screenshot of the Linkudo game, displaying the optional light blue theme, and showing the second step in the game (having chosen 'Arranger' in the first step).A screenshot of the Linkudo game, displaying the optional pink theme, and showing the third step in the game (having chosen 'Arranger' in the first step, and 'Engineer' for the second step).A screenshot of the Linkudo game, displaying the optional green theme, and showing the fourth step in the game (having chosen 'Arranger' in the first step, 'Engineer' for the second step, and 'Agitator' for the third step).A screenshot of the Linkudo game, displaying the optional sage theme, and showing the fifth step in the game (having chosen 'Arranger' in the first step, 'Engineer' for the second step, 'Agitator' for the third step, and 'Campaign' for the fourth step).

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.

A grid of share images for Linkudo, showing all thirty different possible combinations of steps and themes for each individual game.

See what’s
possible.

This is just a snapshot of how I work: clean builds, precise code, and clear results. If you’d like the same to bring your project to life. Get in touch.

Get in touch