Kiwi by Circuit Forge LLC — Pantry tracking + leftover recipe suggestions; barcode/receipt OCR
- cloud_session.py: CLOUD_AUTH_BYPASS_IPS with CIDR support; X-Real-IP for Docker bridge NAT-aware client IP resolution; local-dev DB path under CLOUD_DATA_ROOT for bypass sessions - compose.cloud.yml: thread CLOUD_AUTH_BYPASS_IPS from shell env; document Docker bridge CIDR requirement in .env.example - nginx.cloud.conf + nginx.conf: client_max_body_size 20m for barcode uploads - barcode_scanner.py: EXIF orientation correction (PIL ImageOps.exif_transpose) before cv2 decode; rotation coverage extended to [90, 180, 270, 45, 135] to catch sideways barcodes the 270° case was missing - llm_recipe.py: CF-core VRAM lease acquire/release wrapping LLMRouter calls - tasks/runner.py + config.py: COORDINATOR_URL + recipe_llm VRAM budget (4GB) - recipes.py: per-request Store creation inside asyncio.to_thread worker to avoid SQLite check_same_thread violations - download_datasets.py: HF_PARQUET_FILES strategy for repos without dataset builders (lishuyang/recipepairs direct parquet download) - derive_substitutions.py: use recipepairs_recipes.parquet for ingredient lookup; numpy array detection; JSON category parsing - test_build_flavorgraph_index.py: rewritten for CSV-based index format - pyproject.toml: add Pillow>=10.0 for EXIF rotation support |
||
|---|---|---|
| app | ||
| docker/web | ||
| frontend | ||
| scripts | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| compose.cloud.yml | ||
| compose.yml | ||
| Dockerfile | ||
| environment.yml | ||
| manage.sh | ||
| PRIVACY.md | ||
| pyproject.toml | ||
| README.md | ||
🥝 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.
Status: Pre-alpha · 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
- Receipt OCR — extract line items from receipt photos automatically (Paid tier)
- Recipe suggestions — LLM-powered ideas based on what's expiring (Paid tier, BYOK-unlockable)
- Leftover mode — prioritize nearly-expired items in recipe ranking (Premium tier)
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 | ✓ | ✓ | ✓ |
| Receipt OCR | BYOK | ✓ | ✓ |
| Recipe suggestions | 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)