Household je self-hosted web aplikacija koja se može instalirati i pretvara svakodnevne obveze vođenja kućanstva — popise za kupnju, recepte, kartice vjernosti, zadatke — u lagano gamificiran zajednički prostor. Laravel JSON API pokreće Vue 3 SPA, uz sinkronizaciju u stvarnom vremenu preko WebSocketa, integraciju sa zasebnim hrvatskim API-jem cijena namirnica te zero-knowledge enkriptirani trezor (bez znanja poslužitelja) za kartice vjernosti.
Household je potpun proizvod za upravljanje kućanstvom, a ne demo: Laravel 13 JSON API koji poslužuje Vue 3 + TypeScript single-page aplikaciju koja se instalira kao PWA. Pokriva popise za kupnju, katalog namirnica, recepte, kartice vjernosti i zadatke, uz sinkronizaciju u stvarnom vremenu preko WebSocketa, Web Push obavijesti i Google OAuth — sve pokretano na jednom samostalno upravljanom Ubuntu VPS-u iza Nginxa, s workerima kojima upravlja Supervisor i deployom putem GitHub Actions.
Dva se elementa ističu tehnički. Trezor kartica vjernosti je zero-knowledge: brojevi kartica enkriptiraju se u pregledniku pomoću AES-GCM ključa izvedenog kroz PBKDF2, a backend pohranjuje samo salt i neproziran authenticator — ne može ni čitati ni dešifrirati kartice. A usporedba cijena poseže u potpuno zaseban Laravel + Postgres servis (prices projekt) preko autenticiranog HTTP API-ja, pa velik hrvatski skup podataka o namirnicama pokreće usporedbe košarice a da nikad nije povezan u ovu bazu podataka.
Izgrađen je tako da djeluje nagrađujuće bez da bude gimmick: XP/sustav postignuća pretvara obveze u zajednički napredak kućanstva, uz zaštite tako da gamifikacija nikad ne iskrivljuje stvarne podatke ni ne zaključava stvarne značajke. Osmišljen je, integriran i isporučen od početka do kraja kao jedna koherentna aplikacija — a brojke i tvrdnje iznad preuzete su izravno iz izvornog koda, a ne procijenjene.
Promjene na popisu emitiraju se preko WebSocketa pa se zaslon svakog člana ažurira čim se stavke označe — bez osvježavanja, bez pollinga. Web Push obavijesti dosežu članove čak i kad je aplikacija zatvorena.
Brojevi kartica vjernosti enkriptiraju se u pregledniku pomoću PIN-a kućanstva; poslužitelj nikad ne vidi otvoreni tekst ni PIN. Pohranjuje samo salt i neproziran authenticator token, pa curenje baze podataka ne otkriva ništa upotrebljivo.
Stavke s popisa za kupnju mogu se povezati sa stvarnim hrvatskim prehrambenim proizvodima i usporediti među trgovačkim lancima, povlačeći podatke uživo iz samostalnog servisa cijena preko autenticiranog HTTP API-ja.
Dovršavanje popisa, izgradnja kataloga i pozivanje članova nagrađuju XP-om i otključavaju postignuća — uključujući tajna i meta postignuća — pretvarajući rutinske obveze u zajednički napredak.
Nova kućanstva postavljaju se kroz onboarding čarobnjak, mogu prilagoditi svoju temu i rasti putem potpisanih poveznica za pozivnice i preporuke — uz Google OAuth kao alternativu prijavi e-poštom.
Aplikacija se instalira na početni zaslon kao PWA s automatski ažurirajućim service worker resursima i isporučuje potpunu englesko/hrvatsku lokalizaciju kroz cijelo sučelje.
Brojevi kartica vjernosti osjetljivi su i dijele se unutar kućanstva, ali self-hosted aplikacija na jednom VPS-u udaljena je samo jedan database dump od njihova curenja. Enkripcija na strani poslužitelja i dalje ostavlja ključeve na istom uređaju kao i podatke.
Enkripcija se odvija u potpunosti u pregledniku: PBKDF2 (100k iteracija) izvodi AES-GCM ključ iz PIN-a kućanstva, a pohranjuju se samo nasumični salt i enkriptirani sentinel 'authenticator'. Poslužitelj ne može ništa provjeriti niti dešifrirati — curenje daje saltove i ciphertext, ne brojeve kartica.
Više članova kućanstva istovremeno kupuje i uređuje popise; zastarjeli zasloni uzrokuju dvostruke kupnje i zbunjenost. Polling API-ja bio bi rasipan i spor za aplikaciju veličine obitelji na skromnom hardveru.
Mutacije popisa emitiraju ShoppingListUpdated preko Laravel Reverb, koji se na strani klijenta konzumira putem Laravel Echo, pa se sučelja usklađuju u stvarnom vremenu. Web Push (VAPID) pokriva slučaj zatvorene aplikacije, dok i broadcast i queue workere održava živima Supervisor uz blago ponovno pokretanje pri svakom deployu.
Usporedba cijena treba velik, često ažuriran hrvatski skup podataka o namirnicama koji ne pripada unutar aplikacije za upravljanje kućanstvom. Povezivanje dviju baza podataka isprepleo bi dva nepovezana projekta.
Cijene žive u samostalnom Laravel + Postgres servisu; Household s njim komunicira samo kroz tanki PricesService preko autenticiranog HTTP API-ja (pretraga proizvoda, košarica, lanci). Prehrambene stavke drže poveznicu na udaljeni proizvod, a usporedba košarice vraća ukupne iznose po lancu — čime obje aplikacije ostaju neovisno deployable.
Gamifikacija lako može postati šum ili zaključati stvarnu funkcionalnost iza kozmetičkih 'klasa'. Cilj je bio motivacija, a ne paywall ili grind koji iskrivljuje temeljne podatke.
XpService i AchievementService dodjeljuju XP i otključavaju postignuća na temelju stvarne aktivnosti (dovršeni popisi, veličina kataloga, članovi, preporuke), uz zaštite od zlouporabe na razini brojača kako bi statistika ostala iskrena. Tajna i meta postignuća nagrađuju skupljanje skupova — sve kozmetičko, bez ijedne značajke zaključane iza napretka.