Baby Suite: tre små apper, tre synkmodeller
Tre webapper for de første månedene med baby: en rietimer, en logg for mat, søvn og bleier og en bekkenbunnstrener. Hver av dem synkroniserer mellom telefoner med en konfliktmodell valgt ut fra dataene. Vi laget dem til eget bruk, og loggen er i daglig bruk.
- Status
- I daglig bruk
- Frontend
- Ren JavaScript, uten rammeverk eller byggesteg
- Backend
- Cloudflare Workers og KV, nå selvhostet på Node.js
- Kildekode
- Privat — gjennomgang på forespørsel
Hva den gjør
En synkmodell per app
Rietimeren synker hele tilstanden, og siste skriving vinner, siden det er én person som tar tiden. Loggen slår sammen oppføring for oppføring, med slettemarkører, så to som logger samtidig aldri mister et trykk. Treneren legger bare til nye økter.
Web Push uten avhengigheter
VAPID-signering og aes128gcm-kryptering av innholdet skrevet rett på WebCrypto, 87 linjer til sammen, og kontrollert med en frakoblet runde med kryptering og dekryptering.
Varsler når appen er lukket
Varslingsreglene sjekkes på serveren hvert femte minutt, per enhet, med fire hastenivåer fra et stille varsel til en alarm som ringer, og med stilletid.
Gratisnivået som designregel
Alt ble bygget for å holde seg innenfor Cloudflares gratisnivå. Da én cron-jobb brukte 87 % av den daglige KV-kvoten for listekall, samlet vi push-abonnementene i én post per synkgruppe, slik at cron-jobben ikke gjør et eneste listekall, og skrev kvoteregnestykket inn i repoet som en fast regel.
Frakoblet først
Loggen og treneren er installerbare PWA-er med en service worker som prøver nettet først: de åpner uten dekning, og en ny versjon lastes inn neste gang appen åpnes.
Øyeblikksbilder og arkiv
En daglig jobb tar øyeblikksbilde av hver synkgruppe, beholder 14 dager med sikkerhetskopier og flytter oppføringer eldre enn 35 dager til månedsarkiv, slik at den aktive tilstanden holder seg liten.
Aktuelt hvis du ser etter…
Baby Suite er et privat prosjekt som ikke kan lastes ned, så denne siden handler om hvordan det er bygget og hva vi kan lage for deg.
- Babylogg-app som kan deles: loggen for mat, søvn og bleier slår sammen oppføring for oppføring med slettemarkører, så to som logger samtidig aldri mister et trykk.
- Rietimer som synker mellom telefoner: timeren synker hele tilstanden, og siste skriving vinner, siden det er én person som tar tiden.
- Push-varsler fra en webapp som er lukket: serveren sjekker varslingsreglene hvert femte minutt per enhet og sender Web Push, fra et stille varsel til en alarm som ringer, med stilletid.
- En webapp som åpner uten dekning og synker mellom brukerne: vi lager små apper som dette for kunder, velger konfliktmodell ut fra dataene og regner på kvotene før lansering.
Vi bygger dette for kunder: Skreddersydd programvare og interne verktøy
Slik fungerer den
- 01
Logg
Hvert trykk lagres først på telefonen.
- 02
Synk
En jevnlig sjekk sender bare det serveren mangler.
- 03
Slå sammen
Hver app løser konflikter med modellen som passer dataene.
- 04
Varsle
En jobb på serveren sjekker reglene og sender et push-varsel, enten appen er åpen eller ikke.
Slik er den bygget
Hver app er én HTML-side i ren JavaScript, uten rammeverk og uten byggesteg. Synkroniseringen gikk via én Cloudflare Worker og ett KV-navnerom per app, og hver gjentakende operasjon ble budsjettert mot gratisnivået: pollingintervaller og cron-frekvens er regnet ut fra kvotene, pollingen stopper når fanen er skjult, og klientene hopper over skrivingen når serveren allerede har dataene.
Senere flyttet vi appene til vår private skyinfrastruktur, som en liten Node.js-tjeneste i Docker. Worker-koden kjører der uendret, oppå en filbasert erstatning for KV med atomiske skrivinger. Den gamle og den nye løsningen gikk side om side under flyttingen, og dataene ble kontrollert identiske, oppføring for oppføring, før noen enhet byttet over.
Ingeniørarbeidet
- Web Push på 87 linjer WebCrypto, uten biblioteker
- Listekall fra cron-jobben kuttet fra rundt 600 i døgnet til null
- Varslingsregler per enhet, fire hastenivåer og stilletid
- Worker-koden flyttet til egen server uten endringer
Spørsmål
Kan jeg laste ned Baby Suite?
Nei. Baby Suite er et privat prosjekt og er ikke tilgjengelig for publikum. Vi lager apper som dette for kunder.
Hvordan kan to telefoner logge i samme logg uten at noe forsvinner?
Loggen slår sammen hver oppføring for seg og merker slettinger i stedet for å fjerne dem, så trykk fra to telefoner i samme øyeblikk blir tatt vare på. Timer-appen bruker i stedet «siste skriving vinner», siden det bare er én som tar tiden.
Virker appene uten dekning?
Loggen og treneren er installerbare PWA-er med en service worker som prøver nettet først, så de åpner uten dekning. Hvert trykk lagres først på telefonen, og en jevnlig sjekk sender serveren bare det den mangler.
Vil du ha noe lignende?
Små apper fortjener samme ingeniørarbeid som store: velg konfliktmodell ut fra dataene, regn på kvotene før du leverer, og ta inn en avhengighet bare når den gjør seg fortjent til plassen.
Ta kontakt