← All work

Secret Santa

Privacy-first, zero-data-retention Secret Santa pairing tool. Client-side only.

View project →

What I built

A Secret Santa pairing tool that runs entirely in the browser with no server, no database, no accounts, and no data retention. You enter the participants, it generates the pairings, everyone gets their assignment, and then it’s gone. Nothing is stored anywhere.

The pairings are generated client-side using a Fisher-Yates shuffle with exclusion rules (so you don’t get assigned yourself, and optionally so couples don’t get each other). The assignments are distributed via individual shareable links that encode the recipient’s name in a way that doesn’t reveal the full pairing list — so you can share a link and the recipient sees only their own assignment.

What problem it solved

Most Secret Santa tools you find online require you to enter everyone’s email addresses and hand over contact data to a third party. I’ve never loved that, especially for something as casual as an office or family Secret Santa. The data has no reason to exist beyond the moment of the pairing.

The zero-retention approach isn’t a gimmick — it’s the correct design decision for this use case. The participants’ names don’t need to be stored. The pairings don’t need to be stored. The only thing that needs to persist is each person’s knowledge of their own assignment, and a shareable link handles that without any infrastructure.

What I learned

Building something with a deliberate privacy constraint from the start produces a cleaner design than retrofitting privacy onto an existing architecture. Not having a database meant thinking carefully about what state actually needs to exist and for how long.

The link-based distribution mechanism required some thought — you want the link to convey enough information for the recipient to see their assignment without revealing the full pairing list to anyone who intercepts it. A simple hash of the pairing data handles this adequately for the stakes involved (it’s a gift exchange, not state secrets).

Tech used

Vanilla JavaScript, no frameworks. Runs entirely client-side — no build step required, no dependencies beyond what the browser provides. Hosted as a static file. The URL structure does the work that a database would otherwise do.