Min egen handleliste-app i Rust med lokal LLM
Min egen handleliste-app i Rust med lokal LLM
Bring
I lang tid har vi brukt Bring som handleliste i familien. Den løser mange behov, men den prøver dessverre å løse mer enn jeg ønsker. Vi trenger en enkel liste, men vi får med endel ting som bare er i veien og skaper støy. Synkroniseringen er ustabil, og det å finne frem i appen er mer komplisert enn det burde være.
Mine krav var egentlig ganske enkle:
- Legge til og krysse av varer som skal handles.
- Dele listen med familien.
- «Live» oppdateringer når noen er i butikken.
Grocy
Jeg fant ut at Grocy kunne løse mine behov og at det var lett å installere på Coolify. Dessverre var installasjonen den eneste positive opplevelsen jeg hadde med Grocy. Applikasjonen virket mere myntet på prepperen som vil ha full kontroll over beredskapslageret, enn en som ønsker å erstatte notatblokka på kjøkkenbenken.
Hva med å lage det selv?
Da jeg satt der og så på kravene, tenkte jeg: «Dette høres jo ut som en enkel oppgave for en kodeagent.» I tillegg vil dette være en fin mulighet til å få testet lokal LLM og pi-kodeagent!
Arkitektur
Jeg bestemte meg for en veldig enkel arkitektur. Alt skulle skje i backend. Deploy på coolify vha docker-compose.
Tech stacken
Valgene mine var preget av et ønske om sikkerhet og enkelhet gjennom compile-time sjekking:
- Rust: Typesikkert, raskt, behagelig, lite fotavtrykk i produksjon.
- SQLx: Gir mulighet til å sjekke SQL-statements og mapping mot databaseskjemaet under kompilering.
- Askama: Et bibliotek som gir typesikre templates .
- HTMX: For å få «live» følelsen uten å måtte bygge en Single Page Application.
- SQLite: En lynrask, embedded database, som med litt konfigurering oppfører seg som en ekte database.
- Litestream: Kontinuerlig backup av SQLite til S3
For å holde det så enkelt som mulig, valgte jeg bort innlogging fullstendig. I stedet bruker appen en UUID i URL-en for hver liste. Deler du lenken, deler du listen. Mister du URL-en, mister du listen. For å hindre at folk bruker appen som gratis lagringsplass la jeg inn en begrensning: ingen vare kan ha et navn på mer enn 256 tegn.
Dette er en enkel form for sikkerhet; applikasjonen trenger ikke være den mest sikre i verden, den trenger bare å være en del bedre enn de verste. For å sitere The Imitation Game:
There are two people in a wood, and they run into a bear. The first person gets down on his knees to pray; the second person starts lacing up his boots. The first person asks the second person, “My dear friend, what are you doing? You can’t outrun a bear.” To which the second person responds, “I don’t have to. I only have to outrun you.”
Hva prøver du egentlig å løse?
Jeg fortalte Stein Kåre om denne minimalistiske stacken uten innlogging. Han var enig i at arkitekturen var stilig, men stilte meg spørsmålet:
«Men hvorfor bruker du ikke bare Apple Reminders?»
Han viste meg hvordan den fungert og vi oppsummerte følgende:
Ulemper
- Fungerer kun på Apple enheter
Fordeler:
- Allerede installert på alle Apple enheter
- Enkelt å dele med hele familien
- Kan legge til ting vha Siri
Muligheten til å legge inn varer ved å snakke til telefonen var tunga på vektskåla. Kanskje er det akkurat denne lave terskelen som gjør at tenåringen i huset vil klare å legge til Nugatti på handlelista (før han setter den tomme boksen tilbake i skapet).
Overflod
Noe som er enda viktigere nå som det er blitt så lett å legge til kode, er å sjekke om vi har noe kode som kan slettes. Det er lett å se på GitHub at vi produserer mer kode enn noen gang før, men er det egentlig en god ting? Plutselig sitter vi her med analysis paralysis når vi skal velge bibliotek fordi det finnes 10 alternativer som er ganske vanskelige å skille fra hverandre. Og når vi prøver å finne en måte å måle "helsen" til de ulike alternativene så finnes det også der minst 10 prosjekter for å gjøre akkurat dette.
Når det lages så mye nytt er det vanskelig for produsenter å få fotfeste, og det er også vanskelig for brukere å se hva som har fotfeste. I det siste har de nyttigste kommentarene på reddit-poster som: «Jeg har laget A» vært: «Hvorfor bruker du ikke bare B som finnes fra før».
Konklusjon
Det har blitt mye lettere å lage noe som er spesialisert for egne behov. Men det at det er lett å lage noe, betyr ikke at det bør lages. Og selv om det er lett å dele så er det ikke nødvendigvis til alles beste at det blir delt.
Så, hva skjedde? Jeg endte opp med å bruke Apple Reminders. Jeg slettet deploymenten min og jeg slettet git-repoet på Codeberg.
Kanskje vi i større grad skal bruke AI til å utforske de ulike alternativene som finnes, for så å bruke kreftene våre på å styrke fotfestet til det alternativet vi har valgt?
