Početna / Radovi
Household — Self-hosted PWA za upravljanje kućanstvom namijenjen obiteljima Stranica uživo ↗
PWA za obiteljsku produktivnost

HouseholdSelf-hosted PWA za upravljanje kućanstvom namijenjen obiteljima

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.

UlogaDesign + full-stack
Godina2026
TehnologijeLaravel 13, Vue 3 + TS, MariaDB
PovršinaInstallable PWA + admin SPA
Uživohousehold.brokenlogic.studio
Household nadzorna ploča s prikazom zajedničkog popisa za kupnju, traku razine/XP-a kućanstva i pločice modula
Snimka uskoro
Stvarno vrijeme

Popisi za kupnju koji se sinkroniziraju uživo unutar kućanstva

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.

  • Laravel Reverb emitira ShoppingListUpdated događaje koji se konzumiraju putem Laravel Echo
  • Web Push (VAPID) isporučuje obavijesti o dodanim stavkama i postignućima na instalirane PWA-ove
  • Obavijesti u redu izvršavaju se pod workerom kojim upravlja Supervisor
Snimka uskoro
Privatnost

Zero-knowledge trezor za kartice vjernosti

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.

  • PBKDF2 (100k iteracija, SHA-256) izvodi AES-GCM ključ iz PIN-a na strani klijenta
  • Poslužitelj pohranjuje samo vault_salt i vault_authenticator — provjera se obavlja dešifriranjem sentinela
  • Kartice se prikazuju kao skenirajući barkodovi/QR putem jsBarcode i html5-qrcode
Snimka uskoro
Integracija

Usporedba cijena namirnica iz zasebnog API-ja cijena

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.

  • PricesService poziva endpointe za pretragu proizvoda, košaricu i lance s bearer tokenom
  • Usporedba košarice vraća ukupne iznose na razini lanca za cijeli popis
  • Poveznice na proizvode pohranjuju se po prehrambenoj stavci putem namjenske tablice poveznica cijena
Snimka uskoro
Gamifikacija

Kućanstva napreduju u razinama dok obavljaju zadatke

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.

  • XpService dodjeljuje XP i razine; AchievementService provjerava pragove po kategoriji
  • Meta postignuća otključavaju se za skupljanje skupova tajnih/netajnih postignuća
  • Otključavanja se šalju kao obavijesti svakom članu kućanstva
Snimka uskoro
Onboarding i rast

Pozivnice, preporuke i vođeno prvo pokretanje

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.

  • Sanctum sesije uz Socialite Google prijavu
  • Potpisani URL-ovi za dijeljenje pozivnica, preporuka, recepata i postignuća
  • Iskorištene preporuke dodjeljuju kredite i hrane napredak postignuća
Snimka uskoro
Dvojezični PWA

Instalabilan, svjestan offline načina i potpuno lokaliziran

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.

  • vite-plugin-pwa s autoUpdate registracijom i web app manifestom
  • vue-i18n s dvije potpune jezične datoteke (en, hr)
  • Uređivanje recepata u obogaćenom tekstu putem Tiptap
Arhitektura

Laravel JSON API i Vue SPA, povezani WebSocketima i jednim vanjskim servisom — sve na jednom samostalno upravljanom VPS-u.

Klijent
Vue 3 SPA · installable PWA
TypeScript SPA s TanStack Query za stanje poslužitelja i Pinia za stanje klijenta; instalira se i automatski ažurira kao PWA.
Edge
Nginx · Reverb WebSocket proxy
Nginx poslužuje SPA ljusku i proxyja /app WebSocket nadogradnju prema Reverbu; Let's Encrypt terminira TLS.
Aplikacija
Laravel 13 API · queue + broadcast workeri
Bezstanjski JSON API (Sanctum autentikacija) s tankim kontrolerima nad servisnim klasama; Supervisor održava Reverb i queue workere živima.
Podaci i vanjski servisi
MariaDB · prices API
MariaDB je sustav zapisa; samostalni servis cijena konzumira se preko autenticiranog HTTP API-ja za usporedbu cijena.
Riješeni izazovi
01

Pohrana tajni kartica vjernosti koje poslužitelj nikad ne može pročitati

Problem

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.

Rješenje

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.

02

Održavanje sinkroniziranosti zajedničkih popisa za kupnju bez pollinga

Problem

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.

Rješenje

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.

03

Povlačenje cijena namirnica uživo iz zasebne baze koda

Problem

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.

Rješenje

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.

04

Učiniti obveze nagrađujućima bez pay-to-win mehanika

Problem

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.

Rješenje

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.

Kako je izrađeno
Backend i API
Laravel 13, PHP 8.3, Sanctum, Socialite, API Resources, Form Requests, PHP enums
Frontend
Vue 3, TypeScript, TanStack Query, TanStack Table, Pinia, Vue Router, Tailwind v4, shadcn-vue / reka-ui, Tiptap, vue-i18n
Stvarno vrijeme i integracije
Laravel Reverb (WebSockets), Laravel Echo, Web Push (VAPID), prices API (HTTP), vite-plugin-pwa
Infrastruktura i kvaliteta
MariaDB, Nginx, Supervisor, GitHub Actions deploy, Let's Encrypt, Laravel Pint, ESLint + Prettier, vue-tsc

Potpun, self-hostable proizvod za upravljanje kućanstvom — u stvarnom vremenu, enkriptiran tamo gdje je važno i isporučen na VPS jednom deploy skriptom.