Skip to content
Wróć do projektów
Aplikacja

Secret Santa

Losowanie par na wymianę prezentów, w którym nawet organizator nie zna wyników.

Rok
2026
Status
Online
Rola
Solo: backend, frontend, bezpieczeństwo.
Secret Santa

Organizator wpisuje uczestników, a aplikacja losuje pary i generuje osobny, podpisany link dla każdej osoby. Wynik widzi wyłącznie właściciel danego linku, a organizator, nawet gdy sam bierze udział, widzi tylko to, kto już zajrzał. Bez kont po stronie uczestników, bez zbierania adresów e-mail.

Technologie

  • Python
  • Flask 3
  • SQLAlchemy 2
  • itsdangerous
  • pytest
  • Vanilla JS
  • REST APIs

Zastosowanie

  • Nikt nie losuje samego siebie i nikt nie trafia na osobę, która wylosowała jego: przy braku ograniczeń przetasowany cykl, a gdy trzeba rozdzielić pary, solver z twardym limitem kroków.
  • Linku nie da się podrobić ani użyć nie tej osobie: każdy jest podpisany, a część rozpoznająca uczestnika jedzie w tym kawałku adresu, którego przeglądarka nie wysyła na serwer, więc nie zostaje w logach.
  • Organizator widzi tylko to, kto już zajrzał, i pilnuje tego test, który nie przejdzie, jeśli w tej odpowiedzi kiedykolwiek pojawi się para.
  • Konto jest opcjonalne i celowo bezsilne: pamięta Twoje wydarzenia i na tym kończą się jego uprawnienia.
  • Działa na najtańszym hostingu, jaki jest: bez kroku budowania, bez Node'a, a ten sam kod stoi na SQLite lokalnie i na MySQL na produkcji.

Jak jest zrobione

  • REST API odseparowane od statycznego frontendu: 15 endpointów, 81 testów w pytest.
  • Losowanie: cykl Hamiltona w czasie liniowym bez wykluczeń, backtracking z heurystyką MRV i limitem kroków przy wykluczeniach, losowość z CSPRNG.
  • Tokeny podpisane HMAC na osobnej soli, ze składnikiem jednorazowym z bazy, dzięki czemu pojedynczy link da się unieważnić.
  • Sesje z ochroną CSRF ograniczoną do żądań uwierzytelnianych ciasteczkiem oraz reset hasła bez tabeli tokenów: w ładunku siedzi odcisk aktualnego hasła, więc zmiana zużywa link.
  • SQLAlchemy w całości, więc SQLite lokalnie i MySQL albo PostgreSQL na produkcji bez zmian w kodzie.

Organizator

Uczestnik

Ciemny motyw

Zbudujmy coś razem

Masz coś w głowie? Nawet pół pomysłu wystarczy, żeby zacząć rozmowę. Na każdą wiadomość odpowiadam, nawet jeśli odpowiedź brzmi, że ktoś inny lepiej się do tego nadaje.

Odpowiedź w ciągu 24 godzin, ze wstępną wyceną i pomysłem na realizację.

Mieszkam w Belgii, pracuję zdalnie z klientami po polsku i po angielsku.