Commit Graph

200 Commits

Author SHA1 Message Date
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
Claude c72c7ec25a fix(skann): dubblett-koll aven inom samma foto (intra-batch)
Tva traffar pa samma vara i ETT foto (t.ex. "helmjolk 4dl" + "helmjolk 8dl")
dubbellagrades, eftersom activeItems hamtades en gang fore loopen och nyss
inlagda varor inte lades tillbaka. Nu pushas varje inlagd vara till
activeItems sa resten av batchen slar ihop mot den. Cross-scan-dedup fanns
redan; det har tacker fallet inom samma bild.
2026-08-18 17:48:01 +00:00
Claude 1df3943d29 fix(recept): uppdatera "Vad ska vi ata?" automatiskt nar lagret andras
Nar man raderade varor i Matlager uppdaterades inte receptforslagen (coverage
stod kvar pa t.ex. 50% tills man tvang-reloadade appen). Orsak: radering
invaliderade inte ["what-to-eat"]-cachen. Cooking + scan-review gjorde redan
detta; nu foljer kitchen (radering), barcode, meal-boxes och shopping samma
monster sa forslagen alltid speglar aktuellt lager.
2026-08-18 16:28:31 +00:00
Claude 3942890d6f fix(matlager): stada upp – flytta lager till egen vy, gruppera per plats, fixa limit-bugg
- BUGG: kitchen hamtade ?limit=500 men schemat tillat max 200 -> 400-fel nar man
  gick in i matlager / tryckte "+N till". Hojer inventoryQuerySchema.limit till 500.
- Hem: tar bort den roriga inline-listan (matlager lag kvar under Hemma). Ersatts
  med ett "Matlager"-kort med genvagsknappar per plats (Kyl/Frys/Skafferi) + "Allt".
- Matlager-skarmen: grupperad per plats med rubrik + antal, sorterad pa namn,
  plats-filter via chips ELLER djuplank (?loc=), sok, markera flera, massradering.
- Byter skarmtitel "Ditt kok" -> "Matlager".
- Fixar aven en latent hooks-ordningsbugg i home (useFocusEffect efter early return).
2026-08-18 16:02:57 +00:00
Claude 610910ccf0 feat(inventory): matlager-hantering – sök, plats-filter, markera flera, massradering
- API: POST /v1/inventory/bulk-delete (mjuk radering, ägar-kontroll, correction-tx)
- Mobil: "Ditt kök" görs om till hanteringsvy – sök, filter Kyl/Frys/Skafferi,
  sortering på plats+namn, markera flera (som mejlklient), Ta bort valda / Töm listan
- Hem: "+N till" blir klickbar och tar dig till Ditt kök
2026-08-18 15:22:59 +00:00
Claude 684743ae95 fix(inventory): robustare dedup vid skann + borttag pa startsidan
Dedup vid /v1/scans/:id/confirm matchade bara pa exakt (skiftlageskansligt)
namn eller identiskt katalog-id, sa omfotografering av samma hylla skapade
dubbletter. Ny normalizeItemName (gemener, accenter, storlek bort; behaller
fetthalt-siffror) + matchning pa katalog-id ELLER normaliserat namn mot
aktivt hushallslager.

Mobil: 'Ta bort' fanns bara i Ditt kok. Lade borttag pa startsidans
lager-rader (befintlig DELETE /v1/inventory/items/:id).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WZdew6cWn1MeHqoYWFfxzo
2026-08-18 14:44:03 +00:00
Claude 75591bb294 fix(subscriptions): free-niva 5 AI-skanningar (beslut Johan)
Free 10->5 i kod, test, paywall-copy (12 sprak) och docs. Full trappa: free 5 / trial 14d 25 skann / premium 100/200/400.
2026-08-17 17:34:55 +00:00
Claude 88876a24b7 fix(subscriptions): trial 14 dagar konsekvent i UI/docs/legal/butik
TRIAL_DAYS var redan 14 i koden men auth.trialNote (12 sprak), butiksmetadata, juridik-utkast, API-ref, exec-summary och UX-doc sa 7. Nu 14 overallt. Rorde EJ icke-trial 7-dagar (inbjudningslank, backup, S3-lifecycle, grace, retention). Beslut: Johan (battre onboarding).
2026-08-17 17:04:00 +00:00
Sven (AAMOS AI) 856b620891 fix(i18n): platta swap till punktnycklar + fyll paritetslucka (24 sv-nycklar) i 11 sprak, sv-fallback 2026-08-17 22:47:04 +07:00
Sven (AAMOS AI) 0478f7c930 feat(mobile): MIKRO WEEK-4b lägg swap-nycklar i 12 språkfiler 2026-08-17 21:57:40 +07:00
Sven (AAMOS AI) 375a951be1 feat(mobile): MIKRO WEEK-4 byt ut måltid i veckoplanen (swap-vy) 2026-08-17 21:50:18 +07:00
Sven (AAMOS AI) 6dcc404dc1 feat(mobile): MIKRO MEAL-2 tidsstyrd måltid i Vad ska vi äta 2026-08-17 21:41:59 +07:00
Sven (AAMOS AI) 6fe1955c9f feat(mobile): MIKRO POLISH-3 optimistisk favoritmarkering med rollback 2026-08-17 21:38:48 +07:00
Sven (AAMOS AI) 653f94de86 feat(mobile): MIKRO POLISH-2 cyklande laddningsmeddelanden på scan-väntan 2026-08-17 21:17:24 +07:00
Sven (AAMOS AI) b1a93be974 feat(mobile): MIKRO POLISH-1 haptik + tryck-skala i Button/Card 2026-08-17 21:01:09 +07:00
Sven (AAMOS AI) 260f816c83 feat(recommendations): MIKRO MEAL-1 måltids-lämplighet i rankningen (nedvikta frukost/dessert vid huvudmåltid) 2026-08-17 20:37:47 +07:00
Sven (AAMOS AI) 9473329708 feat(mobile): MIKRO STARS-3 byt mot Toppval-tagg på första förslaget 2026-08-17 20:13:54 +07:00
Sven (AAMOS AI) 343a18393a feat(mobile): MIKRO WEEK-3 interaktiv planera veckan-ruta (dagar x måltider) 2026-08-17 20:07:23 +07:00
Sven (AAMOS AI) 5a47140b76 feat(mobile): MIKRO STARS-2 visa snittbetyg på Vad ska vi äta-korten 2026-08-17 19:54:38 +07:00
Sven (AAMOS AI) 97b5baa367 feat(weekplan): MIKRO WEEK-2 dagliga måltidsslots (vardag middag, helg lunch+middag) 2026-08-17 19:17:27 +07:00
Sven (AAMOS AI) 9777c2ff1b fix(api): round estimated shopping price to integer minor units 2026-08-16 22:49:09 +07:00
Sven (AAMOS AI) 8fe8900722 feat(mobile): week plan always starts today and moves forward 2026-08-16 22:36:22 +07:00
Sven (AAMOS AI) 05c6cf9e04 feat(mobile): refresh entitlements after scan + route QUOTA_EXCEEDED to paywall 2026-08-16 22:17:15 +07:00
Sven (AAMOS AI) baa5f6447a feat(worker): refund AI scan quota on definitive job failure + sanitize DLQ jobId 2026-08-16 21:43:19 +07:00
Sven (AAMOS AI) c0a15bb1b5 feat: kitchen screen, scan dedup, gemini-3.5-flash-lite, seed grapes/beetroot/pea shoots 2026-08-16 20:13:49 +07:00
Sven (AAMOS AI) d098bf705e feat(mobile): Sparade recept-sida (sökbar favoritlista) + länk på hemma (SAVED-1) 2026-08-16 00:55:32 +07:00
Sven (AAMOS AI) c2a8aa8fa1 feat(mobile): hemma-knapparnas skärmar som modaler (UX-3) 2026-08-16 00:38:55 +07:00
Sven (AAMOS AI) c115c3cb4b fix(mobile): enradiga snabblänks-etiketter + svep-tillbaka på hela sidan (UX-2) 2026-08-16 00:27:53 +07:00
Sven (AAMOS AI) 8035093ae5 feat(mobile): levande knappar – press-scale på Card + haptik på snabblänkar (UX-1) 2026-08-16 00:20:59 +07:00
Sven (AAMOS AI) bcd5f6d0db fix(mobile): montera inte om trädet när språket är oförändrat – bevarar nav-stacken (NAV-1) 2026-08-16 00:03:56 +07:00
Sven (AAMOS AI) 84a1606dd0 feat(mobile): glömt-lösenord via Firebase + upprepa-lösenord-fält (POLISH-2) 2026-08-15 23:20:32 +07:00
Sven (AAMOS AI) 448a523d64 fix(mobile): logga ut ur Firebase vid utloggning (POLISH-1) 2026-08-15 23:02:30 +07:00
Sven (AAMOS AI) 5f547708ae feat(auth): koppla login/register till Firebase → /v1/auth/session (AUTH-5) 2026-08-15 20:47:11 +07:00
Sven (AAMOS AI) 8352c3a0ce feat(mobile): FirebaseAuthProvider (e-post/lösen) bakom AuthProvider-gränssnittet (AUTH-4) 2026-08-15 20:39:29 +07:00
Sven (AAMOS AI) 8f61ef1592 feat(api): /v1/auth/session – växla Firebase-ID-token mot intern session (AUTH-3) 2026-08-15 20:22:09 +07:00
Sven (AAMOS AI) f417902ac9 feat(api): TokenVerifier-gränssnitt + FirebaseTokenVerifier (AUTH-2) 2026-08-15 19:37:11 +07:00