All projects Wichtle · Write-up
Wichteln with a sealed drawWichteln mit versiegelter Auslosung
Wichtle runs a group’s Wichteln from one link in the group chat: each person taps their name, adds wishes and, for a present by post, an address, and the server draws who gives to whom. The host follows every step and never sees the pairs, unless a code the server checks opens them.Wichtle führt das Wichteln einer Gruppe über einen Link im Gruppenchat: Alle tippen ihren Namen an, schreiben Wünsche dazu und, für ein Geschenk per Post, eine Adresse, und der Server lost aus, wer wen beschenkt. Die Orga verfolgt jeden Schritt und sieht die Paare nie, außer ein Code, den der Server prüft, öffnet sie.
wichtle.ewolution.cloud Source
- Type
- Web appWeb-App
- Stack
- Svelte 5 · Node · SQLite
- Year
- 2026
- Code
- Public on GitHubÖffentlich auf GitHub
One link in the group chat
Wichtle is for Wichteln, Secret Santa as it’s played in German offices and families: everyone draws someone to give a present to, and nobody knows who drew them until the party. The host starts a group with its name and the party’s date, and if they like a budget, a place and time and a note. The names go in typed or pasted one per line, or people add themselves from the group’s page until the draw. Then the host posts one link in the group chat, and each person taps their own name. That device keeps their own link from then on, “My link” copies it for a second one, and if someone tapped the wrong name, the host frees it again and the link it gave stops working.
Tapping is the only way in. Messengers fetch every link they see for its preview, so a claim, an opened draw and every secret come from a request sent after a tap, never from loading a page, and no page carries a drawn name, a wish or an address. A preview shows the group’s name and nothing more.
Wishes, and where the present goes
Everyone writes up to eight wishes, each with a link they paste themselves if they like, which Wichtle shows as it is and never fetches, and a line for what they’d rather not get: no more mugs, no alcohol, an allergy. Each says whether they’ll be at the party or want the present posted, and only those who want post give an address, a free block with the name on the parcel, since parcels go abroad too. The person who draws them is the only one who sees it, and a changed wish shows as changed.
A draw nobody can see into
The server draws, with Node’s cryptographic randomness, before anything is shown. Couples and households never draw each other: the host ties their names together on the group’s street, where every household is one paper-cut house. The host picks the shape. One closed chain runs through everyone, so no two people give to each other; any fair draw only keeps people from drawing themselves and their household. Both are drawn by trying random orders until one fits, which keeps every allowed draw exactly as likely as any other; only where that would take too long, with large households, a randomised search takes over. Wichtle says before the draw when none can work, a household of more than half the group.
The draw can be quiet, the host presses Draw and people look whenever they like, or live: the host’s screen, shared on the call or in the room, lights a candle arch, one candle per person, and every page that’s open opens its door at the same moment. Behind the door, an Advent door with the party’s day on it, is the name, the wishes, and the address if there is one.
Steps for the host, not pairs
The host takes part too, so the host’s page shows how things stand, never who has whom. Every person is a house whose window lights once they’ve joined, and a table follows each one: joined, draw opened, present ready, and for each person a present by post is meant for, on its way and arrived. That last one is kept per recipient on purpose, since a giver’s “posted” would tell the host their person wants post, half a pair. A reminder for the group chat names whoever hasn’t joined, opened or got their present ready yet.
When someone drops out or joins late after the draw, the host chooses: patch the draw with the fewest changes, so one person’s draw changes, two in rare cases, and the host’s page says that much and not whose, or draw everyone again. For when something goes wrong, the host sets an unseal code when starting the group. The server keeps only a scrypt hash of it, allows five tries in fifteen minutes, and a right code opens every pair and address on that device for thirty minutes, held only in the page, and writes the opening in the host’s log. The same code and the group’s link give a lost host a new host link, and the old one stops working.
A practice run
Before the real one, the home starts a practice group: nine made-up colleagues, two of them a couple, who join, write wishes and addresses, open their draws and tick their steps on their own over a few minutes. The host can try everything on them, a live draw, the reminder, the unseal, a drop-out, and open any colleague’s page to see what a participant sees. Every page says it’s practice, and the group is deleted after a day.
Gone after the party
There are no accounts: the links are the keys, each with 128 random bits, and the groups a device has opened are listed on it. The party’s date is required because everything is deleted 30 days after it, names, wishes, addresses, the pairs and the log, or sooner when the host deletes the group, and every page says when. The server is Node with no dependencies and its built-in SQLite, set to overwrite what it deletes. The pages ask search engines not to index them, and Census, the family’s visit counter, sees /g, /p and /h without their keys. The tokens and components come from Folio, the family’s shared library, in German first and English beside it, light and dark.
Ein Link im Gruppenchat
Wichtle ist fürs Wichteln: Alle ziehen jemanden, den sie beschenken, und niemand weiß bis zur Feier, wer einen gezogen hat. Die Orga legt eine Gruppe mit ihrem Namen und dem Datum der Feier an, wenn sie mag mit Budget, Ort und Uhrzeit und einer Notiz. Die Namen kommen getippt oder als Liste eingefügt hinein, einer pro Zeile, oder die Leute tragen sich bis zur Auslosung selbst auf der Seite der Gruppe ein. Dann schickt die Orga einen Link in den Gruppenchat, und alle tippen ihren eigenen Namen an. Das Gerät behält von da an den eigenen Link, „Mein Link“ kopiert ihn für ein zweites, und wer den falschen Namen erwischt hat, dem gibt die Orga ihn wieder frei; der Link, den er gab, geht dann nicht mehr.
Antippen ist der einzige Weg hinein. Messenger rufen jeden Link, den sie sehen, für ihre Vorschau ab, deshalb kommen ein angetippter Name, ein geöffnetes Los und jedes Geheimnis aus einer Anfrage nach einem Tipp, nie aus dem Laden einer Seite, und keine Seite enthält einen gezogenen Namen, einen Wunsch oder eine Adresse. Eine Vorschau zeigt den Namen der Gruppe und sonst nichts.
Wünsche, und wohin das Geschenk geht
Alle schreiben bis zu acht Wünsche, jeden mit einem Link, den sie selbst einfügen, wenn sie mögen, den Wichtle so zeigt, wie er ist, und nie abruft, und eine Zeile dafür, was sie lieber nicht bekommen: keine Tassen mehr, keinen Alkohol, eine Allergie. Alle sagen, ob sie auf der Feier sind oder das Geschenk per Post möchten, und nur wer Post möchte, gibt eine Adresse an, ein freier Block mit dem Namen auf dem Paket, denn Pakete gehen auch ins Ausland. Sehen kann sie nur, wer die Person zieht, und ein geänderter Wunsch zeigt sich als geändert.
Eine Auslosung, in die niemand hineinsieht
Der Server lost aus, mit Nodes kryptografischem Zufall, bevor irgendetwas gezeigt wird. Paare und Haushalte ziehen sich nie gegenseitig: Die Orga bindet ihre Namen in der Straße der Gruppe zusammen, wo jeder Haushalt ein Haus aus Scherenschnitt ist. Die Orga wählt die Form. Eine geschlossene Kette läuft durch alle, sodass sich nie zwei gegenseitig beschenken; jede faire Auslosung hält nur davon ab, sich selbst und den eigenen Haushalt zu ziehen. Beide entstehen, indem zufällige Reihenfolgen probiert werden, bis eine passt, was jede erlaubte Auslosung genau so wahrscheinlich macht wie jede andere; nur wo das zu lange dauern würde, bei großen Haushalten, übernimmt eine zufällige Suche. Wichtle sagt vor der Auslosung, wenn keine gehen kann, bei einem Haushalt mit mehr als der Hälfte der Gruppe.
Die Auslosung kann still sein, die Orga drückt auf Auslosen und alle schauen, wann sie mögen, oder live: Der Bildschirm der Orga, im Call geteilt oder im Raum, zündet einen Lichterbogen an, eine Kerze pro Person, und jede Seite, die offen ist, öffnet im selben Moment ihr Türchen. Hinter dem Türchen, einem Adventstürchen mit dem Tag der Feier darauf, stehen der Name, die Wünsche und die Adresse, wenn es eine gibt.
Schritte für die Orga, keine Paare
Die Orga macht selbst mit, deshalb zeigt ihre Seite, wie es steht, nie, wer wen hat. Jede Person ist ein Haus, dessen Fenster aufleuchtet, sobald sie dabei ist, und eine Tabelle verfolgt jede: dabei, Los geöffnet, Geschenk bereit, und für jede Person, an die ein Geschenk per Post geht, unterwegs und angekommen. Das Letzte steht mit Absicht bei der beschenkten Person, denn ein „verschickt“ der schenkenden würde der Orga verraten, dass deren Person Post möchte, ein halbes Paar. Eine Erinnerung für den Gruppenchat nennt alle, die noch nicht dabei sind, ihr Los nicht geöffnet oder ihr Geschenk noch nicht bereit haben.
Wenn nach der Auslosung jemand abspringt oder dazukommt, entscheidet die Orga: die Auslosung mit den wenigsten Änderungen flicken, sodass sich das Los einer Person ändert, selten zweier, und die Seite der Orga sagt so viel und nicht, wessen, oder alle neu auslosen. Für den Fall, dass etwas schiefgeht, setzt die Orga beim Anlegen einen Entsiegel-Code. Der Server behält davon nur einen scrypt-Hash, erlaubt fünf Versuche in fünfzehn Minuten, und ein richtiger Code öffnet jedes Paar und jede Adresse auf diesem Gerät für dreißig Minuten, nur in der Seite gehalten, und schreibt das Öffnen ins Protokoll der Orga. Derselbe Code und der Link der Gruppe geben einer Orga, die ihren Link verloren hat, einen neuen, und der alte geht nicht mehr.
Ein Probelauf
Vor dem echten startet die Startseite eine Probegruppe: neun ausgedachte Kolleg:innen, zwei davon ein Paar, die beitreten, Wünsche und Adressen schreiben, ihre Lose öffnen und ihre Schritte abhaken, von selbst über ein paar Minuten. Die Orga kann an ihnen alles ausprobieren, eine Live-Auslosung, die Erinnerung, das Entsiegeln, eine Absage, und die Seite jeder Kollegin und jedes Kollegen öffnen, um zu sehen, was die Teilnehmenden sehen. Jede Seite sagt, dass es eine Probe ist, und die Gruppe wird nach einem Tag gelöscht.
Weg nach der Feier
Konten gibt es keine: Die Links sind die Schlüssel, jeder mit 128 zufälligen Bit, und die Gruppen, die ein Gerät geöffnet hat, listet es selbst. Das Datum der Feier ist Pflicht, weil 30 Tage danach alles gelöscht wird, Namen, Wünsche, Adressen, die Paare und das Protokoll, oder früher, wenn die Orga die Gruppe löscht, und jede Seite sagt, wann. Der Server ist Node ohne Abhängigkeiten mit seinem eingebauten SQLite, so eingestellt, dass es überschreibt, was es löscht. Die Seiten bitten Suchmaschinen, sie nicht aufzunehmen, und Census, der Besuchszähler der Familie, sieht /g, /p und /h ohne ihre Schlüssel. Tokens und Komponenten kommen aus Folio, der gemeinsamen Bibliothek der Familie, auf Deutsch zuerst und Englisch daneben, hell und dunkel.