Linkudo
Sole freelance full‑stack developer for Linkudo, rebuilding a classic Flash word association game as a modern mobile‑first product with Next.js, Node.js, Supabase, Redis, and Python.

In Detail
Bringing Linkudo back to the web required more than a straightforward rewrite. The original Flash version was no longer viable, and the original codebase and gameplay mechanics had effectively been lost. The rebuild needed to preserve the simplicity and competitive feel of the original game whilst making it work for modern web and mobile users.
That meant rethinking both the game‑generation system and the player experience. The client provided the visual design direction, whilst my work covered the full technical build: puzzle generation, APIs, data storage, caching, gameplay logic, theming, share‑card generation, and deployment.
This created two distinct technical challenges:
Generating Daily Game Configurations:
a complex Python‑based back‑end process precomputes daily word‑association puzzles using a graph‑based Breadth‑First Search algorithm.Delivering the Game Experience:
a fast, responsive, themable Next.js and React front end lets players solve puzzles, track performance, persist preferences, and share results.
Game Configuration Generation
Each day, Linkudo presents players with a new challenge. A Python process precomputes daily puzzles using a graph‑based Breadth‑First Search algorithm to identify valid word pairs and balanced solution paths.
Because of the size of the word dataset, generation is computationally expensive. Configurations are created in batches, automatically assigned to future dates, reviewed editorially, and then imported into the game for instant daily play.
The Next.js application includes Node.js and TypeScript API endpoints for gameplay logic, user preferences, daily configuration retrieval, and theme handling.
The word dataset is a little over 13MB, so it is loaded into the server at startup and held in hot cache rather than repeatedly fetched from a database or external cache. Other API routes act as a middle tier between the player and data stored in Supabase/PostgreSQL, with Redis used aggressively to keep responses close to instantaneous.
The API layer also handles CORS, method validation, request rate limiting, and a unique API key regenerated automatically on every application rebuild.
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 supports five selectable themes, allowing players to personalise the game without changing the underlying mechanics. Preferences persist across sessions through localStorage and back‑end device recognition, whilst theme choices are tracked to help understand engagement patterns.





Automated Social Share Image Generation
When a player completes a puzzle, Linkudo can generate a unique social share image showing that day's challenge, the player's step count, and their selected theme. A standalone Node.js service generates these Open Graph images from the daily game configuration data.
Using Puppeteer, Express, and Vite, the service renders a React component across all five themes, captures the output, and produces branded share images for each valid result state. Those images are uploaded into the game and used when a player shares a completed puzzle.

- "
It's been a pleasure to work with John Kavanagh in the web team at Nando’s. He's a top professional who has prided himself in bringing my designs to life with a high standard since day one. He has a great eye for detail with a clear understanding of user‑centric thinking and is always willing to give great suggestions from a technical standpoint.
I have also really appreciated his positive energy which gives a great lift to the team at every stand up. Any team would be lucky to work with him, as I have experienced myself!"
- "
John Kavanagh is one of the most professional developers I have worked with. Add to this a synergy between some of the values which Underwired holds in high regard (perfectionism, creativity in all skillets and future facing) and you have someone I wouldn't hesitate to recommend for front‑end development work."
- "
John Kavanagh is a highly intelligent and truly senior front‑end web developer, who's surprisingly well versed in the arcana of CSS. For Macmillan he was initially churning out static templates on an SCSS BEM architecture, but soon moved on to managing the team (three developers), assigning and tracking tasks using a Trello board he introduced, and helping me nudge the team towards an integrated, Web Components based production pipeline. I enjoyed John's productivity and attitude, and I very much look forward to working together again."
- "
I worked with John Kavanagh on a high profile, large‑scale project at a digital agency. John was great to work with, solving problems without any input and contributing to the project way beyond what was expected. I'd happily work with him again and would easily recommend his talent to everyone!"
- "
I had the pleasure of working closely with John Kavanagh at Selfridges. He is an exceptional programmer who consistently delivered high‑quality work. John possesses a deep understanding of exceptional front‑end development skills and has a remarkable ability to tackle complex problems with creative and effective solutions.
What sets John apart is not only his technical expertise but also his strong work ethic and dedication to delivering results. He is a reliable and proactive team player, always willing to go the extra mile to ensure project success. I was particularly impressed with his ability to help with issues and make the explanations simple and succinct.
Beyond his technical skills, John is a pleasure to work with. He communicates effectively, collaborates seamlessly with team members, and approaches challenges with a positive and solution‑oriented mindset."
