Kiwi by Circuit Forge LLC — Pantry tracking + leftover recipe suggestions; barcode/receipt OCR
Find a file
pyr0ball a523cb094e perf(browser): replace LIKE scans with FTS5; cache category counts
- Add migration 021: recipe_browser_fts FTS5 table on category + keywords
  columns, eliminating LIKE '%keyword%' full sequential scans on 3.1M rows
- _count_recipes_for_keywords now uses FTS5 MATCH (O(log N) vs O(N))
- browse_recipes reuses cached count, eliminating the second COUNT(*) scan
  per page request; ORDER BY r.id replaces the unindexed ORDER BY title sort
- Module-level _COUNT_CACHE keyed by (db_path, keywords) means domain-switch
  category counts are computed once per process lifetime

feat(find): dietary preset grid, Big 9 allergen pills, Hard Day Mode surface

- Dietary constraints replaced with toggle-button preset grid (8 options)
  + free-text "Other" field; removes dense freeform text input
- Allergies replaced with Big 9 pill picker (peanuts, tree nuts, shellfish,
  fish, milk, eggs, wheat, soy, sesame) + "Other" for custom entries
- Hard Day Mode surfaced as a standalone aria-pressed button above the
  dietary collapsible; no longer buried inside a collapsed section
- Active-state dot indicators on both collapsibles show filter engagement
  at a glance without expanding

fix(a11y): aria-describedby wiring for wildcard checkbox and tag inputs (#40)

- Persistent hint spans replace placeholder-only instructions for constraint
  and allergy fields (WCAG 3.3.2)

fix(browse): auto-select highest-count category on domain switch (#41)

- Eliminates the 3-decision cold start (domain → category → content)
- Surprise Me button added for zero-decision random navigation
2026-04-08 23:10:48 -07:00
app perf(browser): replace LIKE scans with FTS5; cache category counts 2026-04-08 23:10:48 -07:00
docker/web fix: nginx /kiwi/ alias for direct port access 2026-04-01 17:06:59 -07:00
frontend perf(browser): replace LIKE scans with FTS5; cache category counts 2026-04-08 23:10:48 -07:00
scripts feat: recipe engine — assembly templates, prep notes, FTS fixes, texture backfill 2026-04-02 22:12:35 -07:00
tests feat: migrate feedback endpoint to circuitforge-core router 2026-04-05 17:57:36 -07:00
.env.example feat: saved recipes, recipe browser, and recipe detail panel 2026-04-08 14:35:02 -07:00
.gitignore feat: saved recipes, recipe browser, and recipe detail panel 2026-04-08 14:35:02 -07:00
.gitleaksignore chore: suppress initial-commit .env false positives in gitleaksignore 2026-04-03 18:57:50 -07:00
compose.cloud.yml feat: saved recipes, recipe browser, and recipe detail panel 2026-04-08 14:35:02 -07:00
compose.override.yml feat: saved recipes, recipe browser, and recipe detail panel 2026-04-08 14:35:02 -07:00
compose.yml chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
Dockerfile chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
environment.yml feat: wire cf-orch agent sidecar and scheduler coordinator integration (closes #7) 2026-04-02 22:57:21 -07:00
LICENSE-BSL chore: menagerie alignment — LICENSE files, gitignore CLAUDE.md, circuitforge-hooks 2026-04-02 23:20:35 -07:00
LICENSE-MIT chore: menagerie alignment — LICENSE files, gitignore CLAUDE.md, circuitforge-hooks 2026-04-02 23:20:35 -07:00
manage.sh feat: saved recipes, recipe browser, and recipe detail panel 2026-04-08 14:35:02 -07:00
PRIVACY.md chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
pyproject.toml chore: bump pyproject.toml version to 0.2.0 2026-04-08 22:16:38 -07:00
README.md feat: saved recipes, recipe browser, and recipe detail panel 2026-04-08 14:35:02 -07:00

🥝 Kiwi

Part of the CircuitForge LLC "AI for the tasks the system made hard on purpose" suite.

Pantry tracking and leftover recipe suggestions.

Scan barcodes, photograph receipts, and get recipe ideas based on what you already have — before it expires.

LLM support is optional. Inventory tracking, barcode scanning, expiry alerts, CSV export, and receipt upload all work without any LLM configured. AI features (receipt OCR, recipe suggestions, meal planning) activate when a backend is available and are BYOK-unlockable at any tier.

Status: Beta · CircuitForge LLC


What it does

  • Inventory tracking — add items by barcode scan, receipt upload, or manually
  • Expiry alerts — know what's about to go bad
  • Recipe browser — browse the full recipe corpus by cuisine, meal type, dietary preference, or main ingredient; pantry match percentage shown inline (Free)
  • Saved recipes — bookmark any recipe with notes, a 05 star rating, and free-text style tags (Free); organize into named collections (Paid)
  • Receipt OCR — extract line items from receipt photos automatically (Paid tier, BYOK-unlockable)
  • Recipe suggestions — four levels from pantry-match to full LLM generation (Paid tier, BYOK-unlockable)
  • Style auto-classifier — LLM suggests style tags (comforting, hands-off, quick, etc.) for saved recipes (Paid tier, BYOK-unlockable)
  • Leftover mode — prioritize nearly-expired items in recipe ranking (Premium tier)
  • LLM backend config — configure inference via circuitforge-core env-var system; BYOK unlocks Paid AI features at any tier
  • Feedback FAB — in-app feedback button; status probed on load, hidden if CF feedback endpoint unreachable

Stack

  • Frontend: Vue 3 SPA (Vite + TypeScript)
  • Backend: FastAPI + SQLite (via circuitforge-core)
  • Auth: CF session cookie → Directus JWT (cloud mode)
  • Licensing: Heimdall (free tier auto-provisioned at signup)

Running locally

cp .env.example .env
./manage.sh build
./manage.sh start
# Web: http://localhost:8511
# API: http://localhost:8512

Cloud instance

./manage.sh cloud-build
./manage.sh cloud-start
# Served at menagerie.circuitforge.tech/kiwi (JWT-gated)

Tiers

Feature Free Paid Premium
Inventory CRUD
Barcode scan
Receipt upload
Expiry alerts
CSV export
Recipe browser (domain/category)
Save recipes + notes + star rating
Style tags (manual, free-text)
Receipt OCR BYOK
Recipe suggestions (L1L4) BYOK
Named recipe collections
LLM style auto-classifier BYOK
Meal planning
Multi-household
Leftover mode

BYOK = bring your own LLM backend (configure ~/.config/circuitforge/llm.yaml)

License

Discovery/pipeline layer: MIT AI features: BSL 1.1 (free for personal non-commercial self-hosting)