Commit Graph

185 Commits

Author SHA1 Message Date
Claude 16fb29cc12 i18n(innehåll): komplett ingrediensöversättning (362×11) + receptöversättnings-verktyg
Ingredienser: fyllde luckan från 101 till 362 för da/de/es/fi/fr/it/nb/nl/pl/pt
(engelska hade redan alla 362). Nu 3982 översättningar, 11 språk kompletta – en
spansk/tysk/fransk användare ser ingrediensnamn på sitt språk, inte svenska.
Författat av språkexperter per språk, verifierat mot 362-listan + kvalitetskoll.

Recept: 407 recept har 0 översättningar (svensk källa visas). Lade till två
körbara skript för AI-pipelinen (kräver din Gemini-nyckel i workern):
- scripts/translate-recipes.ts [språk|all]  – köar TRANSLATE_RECIPE för alla
  publicerade recept × språk, idempotent (hoppar redan gjorda).
- scripts/publish-translations.ts [språk|all] – publicerar de utkast som klarat
  den inbyggda verifieringen (numbersPreserved/stegantal/confidence); övriga
  stannar som utkast för granskning.

Verifierat mot testdatabas: ingredient_translations 3982 rader/11 språk kompletta;
enqueue köar 405 jobb; processor skapar draft_ai+ok; publish publicerar; steg-
översättningar följer med och serveras.
2026-08-20 18:35:59 +00:00
Claude ac87bd8d77 feat(skanna): notis om att foto kostar en skanning (streckkod gratis)
Behaller maltidsfoto men informerar: 'Varje foto raknas som en skanning av din
kvot. Streckkod ar alltid gratis.' visas pa Skanna-skarmen under kvot-raden.
Ny i18n-nyckel scan.costNote x 12 sprak. Verifierat: mobil-typecheck gront.
2026-08-20 16:48:54 +00:00
Claude 34b5ca2f9d chore(skanna): ta bort 'bäst före datum'-knappen (fyllde ingen funktion)
Tar bort expiry_date ur skanningsknapparna pa Skanna-fliken. Sjalva scan-typen
finns kvar i backend/enums (ofarligt), bara knappen forsvinner. Verifierat:
mobil-typecheck gront.
2026-08-20 16:42:18 +00:00
Claude 364603d571 feat(streckkod): Klar-knapp for att bekrafta + ga tillbaka ur skannern
Efter lyckad lasning/produktbidrag fanns bara 'Skanna igen'. Nu finns en tydlig
knapp som bekraftar och gar tillbaka dit man kom ifran (router.back):
'Stammer - klar' nar man just bidragit med foto, annars 'Klar'. 'Skanna igen'
finns kvar som sekundar, och 'Fota baksidan' visas nar info saknas.
Nya i18n-nycklar barcode.done + barcode.looksRight x 12 sprak.

Verifierat: mobil-typecheck gront.
2026-08-20 16:40:11 +00:00
Claude d75500bebd fix(streckkod+kvitto): sparad-bekraftelse, fettvarden, kvitto-antal
Streckkod / produktbidrag:
- Tydlig bekraftelse 'Sparad i delade katalogen - tack!' visas nu efter att en
  fotad produkt lasts av, sa man ser att bidraget gick fram (forut bara
  'Skanna igen' utan aterkoppling).
- Naringsetiketter laser nu ocksa enkelomattat och fleromattat fett (t.ex.
  olivolja visar tre fettrader). Nya valfria falt monounsaturatedFatG/
  polyunsaturatedFatG i NutritionValues + READ_NUTRITION_LABEL + prompt +
  produktpanelen. Obligatoriska EU-falt oforandrade.

Kvitto:
- Rader som ar samma vara (samma normaliserade namn + enhet) slas nu ihop till
  EN vara med ratt antal - '2 x mjolk' pa kvittot blir en vara a 2 st i stallet
  for tva rader a 1 st. Priser summeras, rabatter dras som forut. En kvittorad
  raknas som minst 1 exemplar aven om antal saknas.

Verifierat: typecheck hela repot gront, nutrition-engine 19/19, ai-contracts
24/24, worker 23/23, api 104/104, samt repro mot testdatabas (2 mjolk-rader ->
1 vara a 2; olivolja sparar fett/mattat/enkel-/fleromattat).
2026-08-20 14:37:45 +00:00
Claude cac98b8dc7 fix(veckoplan+streckkod): byt ratt, planera om, variation, man-son + fota fram/bak
Veckoplan/kalender:
- Byt ratt: PATCH satter nu titeln (och portioner/status) efter det nya
  receptet, inte bara recipeId - annars visade kalendern kvar gamla ratten.
- Planera om veckan: ersatter nu veckans plan (raderar tidigare + entries via
  kaskad) sa man aldrig far dubbletter och alltid ser den nya planen. Nytt
  plan-id ger ocksa ny variation.
- Variation: liten deterministisk jitter per recept, seedad pa plan-id +
  veckostart, sa olika veckor OCH omgenereringar blir olika. Tackning/utgang
  dominerar fortfarande. Skalas av varietyLevel.
- Veckoplaneraren visar alltid mandag-sondag (mondayOf), oavsett dagens dag.

Streckkod (fota okand produkt):
- Fotar nu fram- OCH baksida (multi-foto) sa AI:n far bade namn (fram) och
  naring/innehall (bak). Prompt uppdaterad for flera bilder.
- Worker uppdaterar en befintlig delad produkt aven utan nytt namn (behaller
  namnet, fyller pa naring/innehall/allergener) - och sparar ny produkt aven
  fran baksidesfoto (fallback-namn) sa data inte tappas.
- Produktpanelen visar 'Fota baksidan (naring & innehall)' nar info saknas, sa
  man kan komplettera en halvfardig produkt. Fel visas som dialog utan att
  tappa vyn.
- 5 nya i18n-nycklar x 12 sprak.

Verifierat: typecheck (ai-contracts/worker/api/mobil), worker 23/23,
ai-contracts 24/24, api 104/104, samt repro mot testdatabas (byt ratt satter
titel; planera om ger 1 plan; 3 veckor + omgenerering varierar; delvis produkt
kompletteras och behaller namnet).
2026-08-20 13:45:35 +00:00
Claude 2f596060b4 feat(streckkod): okand produkt -> fota forpackning -> spara i delad katalog
Okand streckkod erbjuder nu 'Fota forpackningen' direkt i streckkodsvyn.
Fotot lases av (naring/allergener/innehall) och produkten UPSERTas i den
DELADE products-katalogen kopplat till GTIN (dataSource=user_scanned,
verificationStatus=unverified, createdByUserId=anvandaren) sa nasta person
som skannar samma kod far den direkt. Produkten laggs INTE till i lagret.

Naringsdeklaration-knappen tas bort som egen ingang - flodet vavs in i
streckkodsskanningen. product_package/nutrition_label -> READ_NUTRITION_LABEL
avslutar som 'completed' med result.product (ingen awaiting_confirmation).

- validation: barcode-falt i createScanInput.context
- worker: ny gren i processScanJob som skriver till products + returnerar tidigt
- mobil: inline contributePhoto (fota -> ladda upp -> polla -> visa info)
- scan: ta bort naringsdeklaration-knappen
- i18n: barcode.contributing.* + uppdaterad unknownBody pa 12 sprak

Verifierat: typecheck (validation/worker/api/mobil), worker 23/23, api 104/104,
och repro mot testdatabas (products-upsert, ingen inventory, idempotent aterskann).
2026-08-20 11:57:58 +00:00
Claude fd4670d6b7 chore(hem): ta bort Matlador-knapp + matsvinn-widget
Matlador-QuickLink borttagen (koden ligger kvar); kvarvarande knappar
(Inkopslista/Hushall/Profil) skalar jamnt via flex:1. Matsvinn-widgeten
i matbudgeten borttagen (fyllde ingen funktion); 'denna vecka' kvar.
2026-08-20 00:54:32 +00:00
Claude ceceb63e8e fix(veckoplan): byt-ratt-fel, navigera veckor, lagg till maltid manuellt
- Byt rätt gav 'något gick fel': limit=30 översteg schemats tak (20).
  Höjt taket till 50, byt rätt hämtar 40 + sök vilken rätt som helst.
- Veckonavigering: pilarna byter nu VECKA (weekOffset) i stället för att
  bara flytta markerad dag -> går att planera nästa vecka. Titel visar
  veckans datumintervall; bakåt spärras före denna vecka.
- Lägg till måltid: ny POST /v1/week-plans/:id/entries + knapp 'Lägg till
  måltid' (väljer måltidstyp -> receptväljaren i lägg-till-läge) + knapp
  'Planera om veckan'. Går nu att fylla en tom dag igen.
Verifierat: swap 200 (40 varierade), add-entry 201, delete 200, api 104/104.
2026-08-20 00:54:32 +00:00
Claude 9b3456b080 feat(veckoplan): tillbehor (t.ex. potatisgratang) foreslar proteinbit
Rena tillbehor utan protein i titeln (potatisgratang, mos, pommes) far
en not: 'servera med en proteinbit (ryggbiff/entrecote, kyckling, fisk
eller tofu/halloumi)'. Kott-/korv-/fiskgratanger raknas som hela ratter.
Verifierat mot riktig data: 5 av 19 gratang-traffar klassas som tillbehor,
inga falska traffar pa proteinratter.
2026-08-19 23:54:34 +00:00
Claude ec33634b3d feat(plan): atgardspanel som bottenpanel (Modal) i stallet for Alert
Klick pa en maltid oppnar en egen panel: 'Jag lagade detta' (ratt dag),
'Byt ratt', 'Ta bort'. Ingen 'Avbryt' - tryck utanfor for att stanga.
Kanns mer enterprise an systemets Alert-ruta.
2026-08-19 23:54:34 +00:00
Claude ceaf0de0c2 feat(byt-ratt): sok bland ALLA recept vid byte
Byt-ratt-skarmen far ett sokfalt. Med sokning filtreras maltidstyp bort
pa servern -> byt till vilken ratt som helst. Utan sokning visas breda
forslag for slotten (view=swap).
2026-08-19 23:54:34 +00:00
Claude fbf5c82ccc feat(prenumeration): egna recept endast for betalande kunder - inte trial
communityPublish satts till false aven under trial (ovriga premium-
funktioner ingar fortfarande i provperioden). Endast betalda planer
(household/family/large_household) far skicka in egna recept. Uppdaterat
premium-meddelandet i appen (11 sprak + sv) sa det inte langre antyder
att provperioden lases upp funktionen. Verifierat: subscriptions 10/10,
api 104/104, typecheck gron.
2026-08-19 23:44:08 +00:00
Claude 56f4a98472 chore(i18n): oversatt nya app-texter till 11 sprak + cookedLog-nycklar
QR-produktinfo (barcode.info.*), egna recept (submit.*) och 'har du
lagat denna' (cookedLog.*) fyllda i en/da/nb/de/nl/fr/es/it/pt/fi/pl
(39 nycklar/sprak). Slutar falla tillbaka pa svenska.
2026-08-19 23:33:32 +00:00
Claude 122122f10a feat(lager): dedup per forvaringsplats + tydlig Ta bort per rad
Skann-bekraftelse slar bara ihop dubbletter inom SAMMA plats (mjolk i
kyl != mjolk i frys) + hoppar over tomma poster. Lagerlistan far en
tydlig 'Ta bort' direkt pa varje rad (inte bara via markering).
2026-08-19 23:33:32 +00:00
Claude c6c82ea520 feat(recept): 'Har du lagat denna?' - logga + rakna av lager
Ny ruta langst ner pa receptet: registrera att man lagat ratten sa
r:knas ravarorna av fran lagret och maltiden loggas (aven utan kalender).
Saknade ravaror hoppas over utan krasch (befintlig /cook-endpoint).
2026-08-19 23:33:32 +00:00
Claude 3f0f6953bb fix(mobil-nav): stabil tillbaka-knapp (slutar blinka/hoppa)
Chevron utan textetikett (headerBackButtonDisplayMode: minimal) sa
'tillbaka'-labeln inte mats om och blinkar 2-3 ggr under push.
2026-08-19 23:33:32 +00:00
Claude 0cc8f036d6 fix(inkopslista): visa den genererade listan (inte en gammal tom)
POST aterananvander EN aktiv lista per veckoplan (staplar inte nya),
GET sorterar nyaste forst, och appen navigerar med listId. Tidigare
hamnade de genererade raderna i en lista skarmen inte visade -> tomt.
2026-08-19 23:33:32 +00:00
Claude 393bc35ac0 feat(veckoplan): fyll alla maltider, variation, ratt maltidstyp + plan-atgarder
Veckoplanen fyller nu ALLA slots (stegvis fallback, inga tomma dagar),
undviker tva soppor/samma kok i rad och styr soppor mot lunch (inte
middag). Default lunch+middag varje dag. Plan-atgarder: 'Jag lagade
detta' bara ratt dag; 'Hoppa over' ersatt med 'Ta bort' (ny DELETE
/v1/week-plans/:id/entries/:entryId). Verifierat mot 393 recept:
14/14 slots fyllda, 0 upprepningar, 0 soppor pa middag.
2026-08-19 23:33:32 +00:00
Claude 5867a95d64 fix(byt-ratt): bredda urvalet - alla lampliga ratter, inte bara det man har hemma
Ny 'swap'-vy i rekommendationsmotorn med lag tackningsvikt (30->6) sa
betyg/smak/ratt maltidstyp styr i stallet for 'har hemma'. Byt rätt-
skarmen anropar view=swap, kringgar vardags-tidsgransen och hojer limit
till 20. Loser: bara ~5 val vid byte.
2026-08-19 23:33:32 +00:00
Claude 0e057bc25d feat(egna-recept): knapp i Hem + inmatningsmall for egna recept
Ny knapp 'Skicka in eget recept' i Hem, direkt under 'Dina sparade
recept' (samma kort-stil). Ny skarm submit-recipe: enkel mall (titel +
ingredienser med mangd/gram/kilo + tillagning). Skickas som fritext ->
AAMOS strukturerar -> workern AI-granskar, dubblettkollar, finskriver
och auto-publicerar, markt med anvandarens namn.

Hanterar 402/PREMIUM_REQUIRED snyggt (egna recept ingar i Premium/trial;
gratisnivan ser uppgraderingsvy i stallet for ratt fel). Backend fanns
redan (POST /v1/recipes + STRUCTURE_RECIPE_TEXT).
2026-08-19 21:54:28 +00:00
Claude f45eb5724b feat(streckkod): visa produktinfo i stallet for lagg-till + fixa avbryt-buggen
QR/streckkod ar nu ett rent informationsflode: skanna for att SE vad
produkten innehaller. Panelen visar full naring per 100 g (energi,
fett/mattat, kolhydrat/socker, fiber, protein, salt), allergener,
'kan innehalla spar av', ingredienslista (Innehall) och kalla. Ingen
'lagg till'-knapp langre.

Buggfix: kameran triggar onBarcodeScanned manga ggr/sek och state-
flaggorna uppdaterades asynkront -> parallella uppslag staplade tva
Alert-rutor (okand forst, produkten bakom -> syntes forst efter Avbryt).
Nu synkront ref-las + panel i stallet for Alert.
2026-08-19 21:50:37 +00:00
Claude 24743fc58f fix(inkopslista): sortera bakning/chark/skaldjur/krydda/dryck till ratt avdelning
CATEGORY_TO_SECTION saknade dessa kategorier, sa varorna hamnade under
'Ovrigt'. Nu: bakning+krydda -> Kryddor & bakning, chark -> Chark,
skaldjur -> Fisk & skaldjur, dryck -> Dryck. Fixar aven aldre varor
(t.ex. julskinka/chark) som redan fanns men sorterades fel.
2026-08-19 21:38:30 +00:00
Claude ba776daaa1 feat(egna-recept): auto-publicera anvandarrecept efter AI-kontroll + dubblettkoll
Publiceringsflodet for anvandarinskickade recept gar nu hela vagen
automatiskt: submitted -> AI-granskning -> dubblettkontroll -> published.
Bara AI-underkanda eller exakta dubbletter (jaccard >= 0.9) stoppas.
Tidigare hamnade allt i in_moderation for manuell granskning.
2026-08-19 21:17:01 +00:00
Claude e3cced8b62 feat(sok): fuzzy kock-sok + 'Menade du...?'-forslag
Felstavade kocknamn hittar ratt kock: aliaslista (remsey/ramsey -> Gordon
Ramsay) + trigram word_similarity (ramzay/otolengi). Ger nolltraffar ett
'Menade du <term>?'-forslag (tappbart) mot titlar, kocknamn, ingredienser.
2026-08-19 20:55:03 +00:00
Claude 2a7f366f6a feat(kockrecept): 10 kockars signaturratter, diskret krediterade
Egna formuleringar av kanda signaturratter (Ramsay, Oliver, Lawson, Ottolenghi,
Samuelsson, De Laurentiis, Lagasse, Garten, Blanc, Stein). Ligger bland alla
andra recept, samma kort/vyer/filter; diskret 'Kalla: <kock>' via
creatorDisplayName, ingen flik/badge. Sokbara pa kocknamn.
2026-08-19 20:18:03 +00:00
Claude b052d919cf feat(sok): bredare sok - hogtidsnamn, ingredienser och kock
Soket matchar nu aven hogtidsnamn (julafton -> julmat), ingredienser (lax ->
alla laxrecept) och kocknamn (ramsay -> Gordon-recept), utover titel/trigram.
Fortfarande inga falska traffar (pannkakor ger bara pannkakor).
2026-08-19 20:18:03 +00:00
Claude 15e48c8704 feat(priser): kvittopris -> lager + blandat marknadspris per ingrediens
Bekraftade kvittovaror far sitt netto-pris (efter rabatt) i lagret. Prisupp-
skattningar anvander nu ett robust marknadssnitt: median av observerade pris/kg
fran lagret, klampat mot schablonen och viktat efter antal observationer -> ett
'realtidsnara' pris dar en extremt dyr/billig butik inte drar ivag snittet.
2026-08-19 20:18:01 +00:00
Claude c13edae2fa fix(kvitto): visa produkter fran kvittoscanning (mappa lines -> items)
Gemini laste kvittot korrekt men resultatet ('lines') slangdes bort: hela
bekraftelseflodet (app scan-review + API extractProposals/annotate) forvantar
sig 'items' i foto-format. Darfor blev VARJE kvitto tomt. Mappar nu icke-
rabattrader till items och kor samma kanoniska namnmatchning som for foton.
2026-08-19 19:01:14 +00:00
Claude bde08a0d2f fix(vad-ska-vi-ata): visa betyg (stjarnor) i listan
ScoredRecommendation som rankAll returnerar bar inte ratingAverage/ratingCount,
sa svaret till mobilen saknade dem helt -> stjarnorna syntes aldrig aven efter
satt betyg. Aterkopplar nu betyg per recept fran kandidaterna i svaret.
2026-08-19 17:28:14 +00:00
Claude 935c613c75 fix(mobil-webb): krascha inte pa webben (Firebase-persistens)
getReactNativePersistence/AsyncStorage finns inte i webb-bygget (react-native-
web) och gav 'Cannot read properties of undefined (reading bind)' vid start.
Pa webben anvands nu Firebases standard-webblagring (getAuth), pa native
AsyncStorage som forr. Gor att webbversionen kan koras for felsokning.
2026-08-19 17:20:39 +00:00
Claude fcd5c7989f fix(inkop): stabil ordning i inkopslistan (id som tie-breaker + sortOrder pa nya varor)
Varor som lades till via recept/manuellt fick alla sortOrder=0. GET-listan
sorterade pa (sektion, sortOrder) utan stabil brytare, sa nar en rad bockades
av (UPDATE) kastades ordningen om - varorna hoppade. Nu: id som sista
sorteringsnyckel (total, deterministisk ordning) + nya varor far nasta
sortOrder sa de laggs sist.
2026-08-19 16:50:18 +00:00
Claude 2e702d6582 fix(rekommendationer): vardagens tidsgräns gömmer inte längre högtids-/bakrecept
Buggen: när användaren uttryckligen valde en högtid (t.ex. Kräftskiva), en
tagg (Baka) eller sökte, hårdfiltrerade scoreCandidate bort alla recept vars
totalTimeMinutes översteg hushållets maxCookingMinutesWeekday (parts.time=-1,
rankAll släpper <0). De smala högtidspoolerna kollapsade då till 0-1 recept
trots att flera fanns korrekt taggade.

Reproducerat mot riktig seedad databas: med en 20-min vardagsgräns gav
kräftskiva 2, grillsäsong 2, skolstart 0, bak nästan tomt. Med fixen ger de
4, 5, 3 respektive 18 – medan standardvyn "Rekommenderat" fortfarande
respekterar tidsgränsen (3 snabba middagar).

Fix: uttrycklig avsikt (holiday/tag/search) förbigår vardagens tidsgräns –
tiden blir mjuk rankning i stället för hårt filter. En uttrycklig q.maxMinutes
i förfrågan respekteras fortfarande. Regressionstest låser mekanismen.
2026-08-19 15:10:04 +00:00
Claude de279a7c01 fix(skan+sok): robust kvitto-enheter, titel-/fuzzy-sok, hogtidsfilter
Kvitto-skanning (rapporterad krasch 'svar matchar inte schema … invalid value'):
- AI-skan-enheter (kvitto/kyl/maltid) normaliseras nu fore validering:
  'st'->COUNT, 'kg'->KILOGRAM, 'forp'/'pase'->PACKAGE osv. Okand enhet -> null
  i stallet for att falla hela svaret. Skarpt kvitto-prompt med exakt enhetslista.
  17 nya tester bevisar normaliseringen.

Sok pa 'Vad ska vi ata':
- Endast TITELN (inte beskrivningen) -> 'pannkaka' ger inte langre appelkompott
  (som bara namnde pannkakor i beskrivningen).
- Stavningstolerant via trigram-similarity: 'pankakor' hittar pannkakor.

Hogtidsknapparna (kraftskiva/grill/jul ...):
- Filtrerar nu pa recept-holidayTag (slug) i stallet for en titelsok som gav
  tomt. Har event inga recept an visas ett arligt tomt-lage.

Full typecheck gron, ai-contracts 24 tester grona.
2026-08-19 14:09:45 +00:00
Claude dc5df13f25 fix(vad-ska-vi-ata): fungerande titelsok, hogtider under sokrutan, ratta bakverk, ta bort separata bladdra-lankar
- Sok fungerar nu: what-to-eat tar ?search= och filtrerar recept pa titel/
  beskrivning BLAND ALLA recept (t.ex. 'pannkaka' hittar pannkakor), oavsett
  vald flik. Sokrutan skickar nu search i stallet for craving.
- Hogtids-/sasongsknapparna (kraftskiva, grill, skolstart) ligger nu direkt
  UNDER sokrutan, inte nere bland recept-forslagen.
- Saffransbullar + lussekatter ur 'Frukost' (mealTypes dessert+breakfast ->
  dessert). Bakverk hor inte till frukost i Sverige.
- Bort med 'Alla recept & sok'-lanken pa forstasidan och 'Bladdra bland recept'
  pa Hemma - allt nas nu via flikarna/soket pa 'Vad ska vi ata'.

Full typecheck gron.
2026-08-19 12:58:59 +00:00
Claude 3d8bd68fe0 feat(vad-ska-vi-ata): identisk vy i alla flikar + enhetliga rutor
Alla kategori-flikar anvander nu SAMMA rekommendations-motor (what-to-eat)
som 'Rekommenderat', sa vyn blir identisk overallt:
- sok fungerar i alla flikar, %-hemma och stjarnor visas, samma kort-layout,
  och samma paginering med 'Visa fler' (5 at gangen).
- Backend: what-to-eat tar nu valfri ?tag= (Baka-fliken filtrerar pa 'baking'
  i stallet for maltidstyp; mealType styr bara poangsattningen).
- Enhetliga chip-rutor: Button far en style-prop, flikarna ligger i 2 kolumner
  med lika bred ruta (48%), centrerad text som krymper vid behov.
- 'Toppval' visas bara pa forsta sidan. 'Alla recept & sok' kvar som lank.

Full typecheck 20/20.
2026-08-19 12:29:21 +00:00
Claude 0a16f1fefa fix(vad-ska-vi-ata): ratta 400-bugg (limit 30 > max 20) + kategorier filtrerar in-place
- KRITISKT: what-to-eat-anropet hade limit=30 men schemat tillater max 20
  -> 400 Bad Request -> tom sida med 'nagot gick fel'. Det var alltsa INTE
  uppkopplingen. Andrat till limit=20.
- Kategori-flikarna (Frukost/Lunch/Middag/Mellanmal/Efterratt/Baka) filtrerar
  nu recepten PA SAMMA sida i stallet for att navigera till bladdra-vyn.
  'Rekommenderat' visar de personliga forslagen som forut.
- ErrorView visar nu riktig HTTP-status (t.ex. [400]) sa fel gar att diagnosa.
- '/recipes' finns kvar via 'Alla recept & sok' for full bladdring + sok.

Mobil typecheck gron.
2026-08-19 12:16:04 +00:00
Claude fab8fa5ba9 fix(inkop+recept): delvis-kop, radera-vara, bort med plattformen-taggen
- Inkopslista /complete: kopte (markerade) varor laggs i lagret OCH tas bort
  ur listan; OMARKERADE varor blir kvar (handla i flera butiker). Listan
  arkiveras forst nar den ar tom. Tidigare markerades HELA listan completed
  sa allt forsvann.
- Ny radera-knapp (x) per vara med bekraftelse - ta bort nagot man angrat
  utan att kopa det (DELETE-endpointen fanns redan).
- Bort med '✓ plattformen'-taggen pa recept + bladdra (satt pa nastan alla
  editorial-recept och sag efterblivet ut). Namn visas fortfarande bara for
  anvandarskapade recept (creatorDisplayName).

Typecheck: api + mobil gron.
2026-08-19 00:52:10 +00:00
Claude 242e09d59b fix(recept): bakverk ur mellanmal + sub-kategorier, bladdra pa forstasidan, relevantare forslag
Kategorisering (din notis - bakverk hor till Baka, inte mellanmal):
- Sub-typer bread/bun/pie/cake/cookie i RECIPE_TAGS.
- Bullar/kakor/pajer/chokladbollar -> dessert (inte snack) + sub-tagg; brod
  -> breakfast. Befintliga lussekatter/saffransbullar taggas 'bun'.
- Browse: sub-chips under Baka (Brod/Bullar/Paj/Tartor & kakor/Smakakor).

Bladdra pa forstasidan (din onskan):
- Kategori-genvagar pa 'Vad ska vi ata' -> oppnar bladdraren forvald
  (/recipes?cat=). recipes.tsx laser ?cat=.

Relevantare 'Vad ska vi ata' (snurrar samma triviala):
- view=pantry -> view=default (tackning vager tungt men inte allenaradande,
  ger variation), limit 15 -> 30 (storre pool sa 'Visa fler' upprepar senare).

Felsokning inkopslista:
- Tydligare felmeddelande (HTTP-status vs natverksfel) sa root cause syns.

Full typecheck 20/20, invariant-test gront.
2026-08-19 00:20:30 +00:00
Claude 100d70dc2d feat(recept): Baka-kategori + 16 nya redaktionella recept
- Ny 'baking'-tagg (RECIPE_TAGS, text[] - ingen migration). Browse-vyn far
  en 'Baka'-chip som filtrerar pa taggen; befintliga lussekatter +
  saffransbullar taggas ocksa.
- extra-recipes.ts: 16 nya recept som fyller de glesa kategorierna -
  4 bak (kanelbullar, kardemummabullar, appelsmulpaj, frukostfrallor),
  3 frukost, 3 mellanmal (tomma kategorin -> fylld), 3 efterratt, 3 lunch.
- Endast verifierade canonical-ingredienser + berakningsbara enheter, sa
  seed harleder narings-/allergendata utan att krascha (run.ts 675/691).
- Nytt rent invariant-test (ingen DB) kor riktiga computeRecipeNutrition pa
  alla 16: id:n finns, naring berakningsbar, inga slug-krockar. 5 tester grona.
- Seed ar additiv (onConflictDoUpdate) - 'pnpm db:seed' lagger till + taggar
  om utan dataforlust. Full typecheck 20/20.
2026-08-18 23:35:47 +00:00
Claude 7d0fca0dad feat(recept): bladdra-skarm med maltidskategorier + fritextsok
- Ny skarm /recipes: kategori-chips (Alla/Frukost/Lunch/Middag/Mellanmal/
  Efterratt) + sok. Backend: befintliga GET /v1/recipes (mealType, search).
- Kategorierna ar de RIKTIGA MEAL_TYPES (1:1 mot datan) - inga pahittade
  filter. Etiketter ateranvander myday.mealType.* (redan 12 sprak).
- Tomma kategorier visar arligt tomt-lage (katalogen ar idag middagstung:
  ~240 middag, 8 frukost, 3 efterratt, 0 mellanmal) i stallet for att gommas.
- Ingang fran hemskarmen bredvid Sparade recept. Query-strang byggs som
  resten av appen (template + encodeURIComponent).
- Ingen ny tabb (baren har redan 5). Mobil typecheck gron.
2026-08-18 23:03:21 +00:00
Claude 2587ff539b feat(diet): lagg till nordisk/carnivore/paleo + LCHF som matvanor med mjuk rankning
- DIET_PATTERNS: +nordic, +carnivore, +paleo (migration 0029). Ingen separat
  "lchf" - LCHF tacks av befintliga "low_carb" for att undvika dubblett med
  keto/low_carb. UI visar low_carb med etiketten "LCHF".
- Mobil onboarding + profil: 9 rena val (allatare..carnivore), 12 sprak.
- recommendation-engine: ny mjuk dietAffinity-poangterm (0-1, neutral 0.5).
  Rankar recept mot matvanan - ALDRIG hart filter (uteslutande matvanor,
  religion, allergener hanteras redan deterministiskt i sakerhetsfiltret).
  low_carb/keto: lag kolhydrat. carnivore: hog protein + lag kolhydrat.
  paleo: glutenfri/laktosfri-proxyer. nordic: svenskt/nordiskt kok + sasong.
- 6 nya tester (35 grona). Full typecheck 20/20 + mobil gron.
2026-08-18 23:03:21 +00:00
Claude 3d86580cd7 fix(recept): skicka mangd+enhet+katalog-id till inkopslistan (inte bara namn)
"Lagg till i inkopslistan" skickade bara displayName -> allt blev "1 st".
Nu skickas ratt mangd + enhet (t.ex. socker 2 dl, jast 20 g) och katalog-id sa
servern slar ihop med ev. befintlig rad i stallet for att dubblera.
2026-08-18 22:23:48 +00:00
Claude d141196c21 feat(recept): visa vad du saknar + lagg till i inkopslistan
Receptdetaljen (GET /v1/recipes/:id) returnerar nu coverage {percent, missing}
via samma computeCoverage som rekommendationerna, sa "du har X% hemma" stammer.
Recept-skarmen visar procenten + listan pa saknade ingredienser och en
"Lagg till N i inkopslistan"-knapp (skapar lista om ingen finns). Uppfyller
loftet i explain.ts ("resten hamnar pa inkopslistan").
2026-08-18 22:09:34 +00:00
Claude e7e884d8aa fix(kock): ta bort buggig in-app-timer, ersatt med statisk tidshint
Timern (setInterval-nedrakning per steg) forsvann vid stegbyte och hade ingen
bakgrund/notis. Borttagen helt – visar nu bara stegets ungefarliga tid som text
("⏱ 5 min – anvand din telefons egen timer"). Ingen nedrakning, ingen bugg.
2026-08-18 21:56:35 +00:00
Claude 55b03b5039 feat(kvot): debitera AI-skanning PER BILD + fixa dubbeldebitering
Johans beslut: en skanning debiteras per bild (6 foton = 6 skanningar), streckkod
gratis. consumeAiScan tar nu units=imageCount och kollar att hela ryms.
Refunden ger tillbaka lika manga (antal bilder) vid misslyckat jobb. Appen kapar
antalet foton till kvarvarande kvot och gar till paywall om 0 (servern ar dock
den slutgiltiga grinden).

Hittade + fixade en PRE-EXISTING bugg pa vagen: kvoten drogs bade vid skapande
(consumeAiScan) OCH vid slutford analys (recordAiUsage aiScans:1) -> varje LYCKAD
skanning kostade 2 enheter, dolt av att appen bara uppdaterade raknaren vid start.
Nu dras kvoten exakt en gang, vid skapandet. Enbildsanvandare far alltsa nu sina
fulla 5 gratis-skanningar (var tidigare ~2,5).
2026-08-18 21:13:58 +00:00
Claude 3bb1d309bc feat(skann): flera bilder i EN skanning for kyl/frys/skafferi/ingredienser
Mobilen hardkodade imageCount:1. Nu kan man ta flera vinklar av samma plats i
en och samma skanning (kamera: ta en till mellan varje; galleri: flerval, tak 6
= schemats max). Worker skickade redan alla bilder till modellen tillsammans och
prompten sager "lista varje vara en gang", sa modellen dedupar over bilderna;
scan-review-markeringen fangar residual. En skanning = en kvotenhet oavsett
antal bilder. Enkel-typer (tallrik/kvitto/datum) tar fortf. en bild.
2026-08-18 20:25:49 +00:00
Claude ee5eb32e09 chore(modell): rikta ALLT mot gemini-3.1-flash-lite + fixa kostnadsberakning
Koden/docs pastod overallt gemini-3.5-flash-lite fast .env kor 3.1. Nu enhetligt
3.1 i .env.example, config.ts-default, gemini.ts-default, tester, eval och docs
(09 + 10). Dessutom en RIKTIG bugg: estimateCostUsd rakna pa 3.5-priser
($0,30/$2,50) medan vi kor 3.1 -> overskattade spend och troffade budgetlarmet
for tidigt. Nu 3.1-priser ($0,25/$1,50). docs/10 helt omraknad pa 3.1 (per
uppgift, per anvandare, skala, 100k-trial-scenariot). Referenslinje kvar som
visar 3.5-priset for att motivera valet.
2026-08-18 20:16:37 +00:00
Claude 7c06516e1e fix(skann): finetune dubblett – ta aldrig bort automatiskt, jamfor ej inom samma foto
Johans test visade tva falska positiva: 3:e smetana pa annan hylla forsvann,
och 2 olika gradde i EN bild -> bara en rakna, andra bortrensad. Orsak: (1)
auto-avmarkering tog bort riktiga varor, (2) varor jamfordes mot varandra inom
samma foto. Fix: markera men ta ALDRIG bort automatiskt (rejected=false, du
valjer); jamfor bara inom samma skanning nar det finns FLERA foton (overlapp),
aldrig tva behallare i ett och samma foto. Verifierat mot alla tre fallen.
2026-08-18 19:19:04 +00:00
Claude 2aaa7f9b3f feat(skann): markera troliga dubbletter i granskningen innan bekraftelse
Enligt Johans onskan: appen forstar sjalv nar en vara troligen redan finns
(samma katalog-id ELLER liknande namn, aven om AI:n laser den olika fran en
annan vinkel) och markerar den i skann-granskningen. Hog sakerhet (>=0.7) =
avmarkerad som standard men syns tydligt och gar att angra; lagre = markerad
men kvar sa du valjer. Jamfor bade mot aktivt lager och tidigare varor i samma
skanning. Ingen auto-hopslagning utan bekraftelse (spec 9). GET /v1/scans/:id
annoterar varje forslag med possibleDuplicate {name, reason, score}.
2026-08-18 18:57:18 +00:00