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.

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.

