Connections Maker
Build your own NYT Connections-style puzzle and hand it to a friend with one link, no account, no server, nothing to sign up for.
The New York Times Connections puzzle is great, but there's exactly one a day and you can't make your own. I wanted to build a private puzzle for a friend's birthday (sixteen words, four hidden categories), and there was no clean way to do it without standing up an account system and a database to hold a few dozen words.
So I skipped the backend entirely. Connections Maker lets you author a puzzle in the browser and the whole thing (words, groups, labels, colors) gets packed into the share URL itself. There's no account to create, nothing stored on a server I run, and no link that quietly expires. You send the URL, the recipient opens it, and the puzzle is just there.
Authoring one
- Four groups of four: each group takes a category name, exactly four words, and one of the four fixed difficulty colours, yellow for the gimmes through green and blue to purple for the trap. A title and an author line are optional.
- The form refuses a broken puzzle: it checks as you type and will not generate a link until all sixteen words are filled, no word repeats anywhere in the puzzle, and all four colours are distinct. The same check runs again when a link is opened, so a hand-edited or truncated URL is rejected rather than played.
- A dice button for the group you're stuck on: 393 ready-made categories ship with the app, 101 yellow, 99 green, 100 blue and 93 purple, 1,572 words in total. A roll prefers templates whose words collide with nothing already in your puzzle, and you can keep rolling, edit the result, or take it as-is. Whole puzzles can also be pasted in or copied out as JSON.
- Drafts survive the tab closing: up to ten in-progress puzzles autosave to local storage as you work.
How the link works
Generating a share link serialises the puzzle to JSON, encodes it as base64url and hangs it off
the URL as ?p=…. That link is the puzzle. Nothing is written to a database, nothing
expires, and no server of mine ever sees the words. It rides in a query string rather than a
hash fragment for a specific reason: chat apps and unfurlers truncate at #, so every
puzzle used to preview as the homepage. Links made in the old #p=… form still open.
A full puzzle URL runs 500 to 800 characters, which SMS refuses to auto-link and will happily split across message segments mid-link. So the app asks TinyURL to shorten it and hands you the short version. Worth saying plainly: that step sends the puzzle through TinyURL's servers rather than straight to the recipient. If TinyURL is unreachable the label changes to "shortener unavailable" and you copy the full link, which works identically.
Playing it
- Four mistakes: pick four tiles and submit. Guess three of four right and it tells you "one away"; guess wrong and the tiles shake. Four wrong guesses ends the puzzle.
- The usual conveniences: a Fisher-Yates shuffle button, deselect-all,
Enterto submit a full selection andEscapeto clear it. Solved groups collapse into a coloured banner. - A recap you can paste: win or lose, the results screen reveals all four groups and builds the emoji grid of your guesses, the way the real thing does.
- Three example puzzles: the home screen loads one at random for anyone who just wants to see it work before authoring anything.
Built with
React 19 · TypeScript · Vite 8 · Tailwind v4, with canvas-confetti for the win animation. No router and no state library, navigation is history.pushState. Four dark themes, remembered between visits. Deployed as a static build to GitHub Pages, so there is nothing to run, scale or pay for; the only things that leave the browser are the share link when TinyURL shortens it and a cookieless visit counter.