€4,51 / mies. 🤙 zero App Store self-hosted 💾 bez AI, sama matma
Case study · Aplikacja Splitka

Dziel koszty,
nie znajomości.

Mobilna aplikacja (PWA) do rozliczania wspólnych wydatków w domu. Dodajesz paragon w trzech tapnięciach — ona pilnuje sald i mówi, kto komu ile wisi. Na koniec okresu wychodzicie na zero minimalną liczbą przelewów.

Na produkcji, w codziennym użyciu od czerwca 2026
przewiń
Skąd pomysł

Wspólny dom to wspólne wydatki — i ciągłe „kto ostatnio płacił”.

Rewolut Groups robi to ślamazarnie i bez żadnej analityki. Splitka miała być szybsza, konkretna i policzyć wszystko sama — bez AI, bez cudzej chmury, na własnym serwerze. Cały sens to jedna pętla, którą da się przejść w kilka sekund:

1
Dodaj wydateknumpad, kategoria, kto płacił
→
2
Salda liczą się samezielone = do odzyskania, czerwone = do oddania
→
3
Rozliczminimalna liczba przelewów
Jak to wygląda

Pięć ekranów, jedna pętla.

Mobile-first, ale na desktopie rozkłada się w pełny układ z boczną nawigacją. Poniżej realne zrzuty z produkcji.

Ekran główny Splitki — saldo, budżet i lista do rozliczenia
Głównasaldo, budżet, do rozliczenia
Ekran dodawania wydatku — numpad i kategorie
Dodajnumpad, kategorie, split
Ekran analityki — wydatki wg kategorii
Analitykatrendy, kategorie, sklepy
Ekran kosztów stałych — abonamenty i raty
Koszty stałeabonamenty, raty, czynsz
Ekran ustawień — profil i grupa
Ustawieniaprofil, grupa, zaproszenia
← przesuń, by zobaczyć więcej →
Na desktopie

Ten sam produkt, pełny układ.

Aplikacja nie jest tylko „telefonem na środku ekranu”. Powyżej 1024 px przełącza się na boczną nawigację, dwukolumnowy dashboard i powiększoną typografię — osobny widok, nie rozciągnięta makieta.

splitka.ffrydrychowski.pl
Splitka na desktopie — dashboard z boczną nawigacją
splitka.ffrydrychowski.pl/analytics
Splitka na desktopie — analityka
Pod maską

Prosty stack, który nie potrzebuje niańki.

Cały pomysł na architekturę: jak najmniej ruchomych części. Statyczny frontend, jeden binarny backend, jeden plik bazy — i serwer za cztery i pół euro miesięcznie.

⚡

Frontend

SvelteKit w trybie adapter-static — cała aplikacja to zwykłe pliki, bez serwera w tle. Ładuje się natychmiast, a z przeglądarki instalujesz ją przez „Dodaj do ekranu” i działa jak natywna.

SvelteKit · PWA
🗄️

Backend

PocketBase — jeden mały program w Go, który daje logowanie, API, real-time i panel admina od ręki. Lekki i samowystarczalny, bez zszywania pięciu usług w chmurze.

PocketBase · self-hosted
💾

Baza danych

SQLite pod PocketBase. Dla 2–10 domowników w zupełności wystarcza, a backup to skopiowanie jednego pliku. Osiem kolekcji: grupy, wydatki, okresy, rozliczenia, koszty stałe…

SQLite · 8 kolekcji
🌐

Hosting

Własny serwer za kilka euro miesięcznie. Ruch idzie przez reverse proxy z certyfikatem HTTPS, a usługa sama wstaje po każdym restarcie. Pełna kontrola, zero cudzej chmury.

Własny VPS · HTTPS
Klient
PWA
statyczny build serwowany jako zwykłe pliki
→
Warstwa wejścia
Reverse proxy
certyfikat HTTPS i kierowanie ruchu na właściwą usługę
→
API + Auth
PocketBase
REST, real-time i panel admina · dane w SQLite
Dlaczego tak

Cztery decyzje, które ukształtowały projekt.

PlatformaPWA, nie natywna

Zero App Store, zero recenzji, zero czekania na akceptację. Wysyłasz link, klikasz „Dodaj do ekranu” — gotowe. Aktualizacja wchodzi automatycznie przy następnym otwarciu.

BackendPocketBase, nie Firebase

Self-hosted, więc dane siedzą na moim serwerze, a nie u Google. Auth, API i real-time w komplecie — bez zszywania pięciu usług w chmurze.

InteligencjaZero LLM

Rozliczanie długów to czysta matematyka, nie zadanie dla modelu. Szybkość i przewidywalność są tu ważniejsze niż modne bajery — aplikacja liczy natychmiast i zawsze tak samo.

BazaSQLite

Najprostsze narzędzie, które w zupełności wystarcza dla kilku osób. Brak osobnego serwera bazy, brak konfiguracji, backup w jednym pliku.

Ciekawe momenty

Trzy problemy, które trzeba było rozgryźć.

Algorytm

Minimalna liczba przelewów

Zamiast „każdy każdemu” aplikacja liczy najmniejszy zestaw transferów wyrównujących salda: bierze największego wierzyciela i największego dłużnika, paruje ich w jeden przelew, powtarza. Prosty greedy — cztery osoby wychodzą na zero w 2–3 przelewach zamiast sześciu.

Bug

Data, która cofała się o dzień

new Date(...).toISOString() zamieniał lokalną północ na czas UTC — a w Polsce (UTC+2) to godzina 22:00 dnia poprzedniego, więc wydatek lądował o dobę wcześniej. Fix: budowanie daty jako czysty string YYYY-MM-DD, bez żadnej konwersji stref.

Prywatność

Prywatne wydatki, które nie mogą wyciekać

Na start dashboard i analityka ładowały wszystkie wydatki grupy — łącznie z cudzymi prywatnymi, które robiły się widoczne i wliczane w nie swoje salda. Fix: filtr już na poziomie zapytania, więc cudze prywatne wpisy w ogóle nie opuszczają serwera.

~4,51 €
miesięcznie za cały hosting
< 3
tapnięcia, by dodać wydatek
8
kolekcji w bazie danych
50–100 MB
RAM po stronie backendu
VI 2026
na produkcji, w codziennym użyciu