Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기AI-powered memory tracking app
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Larder is an AI-powered inventory tracker that turns grocery receipts into a smart kitchen. Upload a photo of any receipt and Claude AI extracts every item — name, quantity, category, price, and estimated shelf life — into a pantry view that warns you before things expire. The average US household wastes ~$1,500 of food a year; Larder helps you fix that.README 전문 보기 ↗Larder is an AI-powered inventory tracker that turns grocery receipts into a smart kitchen. Upload a photo of any receipt and Claude AI extracts every item — name, quantity, category, price, and estimated shelf life — into a pantry view that warns you before things expire. The average US household wastes ~$1,500 of food a year; Larder helps you fix that.
A production full-stack application built with Next.js 16 + React 19 on the frontend, FastAPI + Python on the backend, Supabase (Postgres + JWT auth) for data and identity, and Anthropic Claude for AI-powered receipt parsing. Deployed across Vercel and Render with GitHub Actions CI/CD.
Screenshots are checked into docs/screenshots and captured from the local production builds with a seeded demo pantry session.
| Pantry dashboard | Expiring soon |
|---|---|
| Scan receipt | Settings |
|---|---|
| Marketing landing page |
|---|
A complete end-to-end product built solo — frontend, backend, database, auth, AI integration, DevOps, and design.
| Area | Where it lives |
|---|---|
| Frontend engineering | 3 Next.js 16 App Router apps (web + marketing + docs), 11 routes, ~3,500 LOC of TypeScript/React |
| Backend engineering | FastAPI service with 10 endpoints, Pydantic v2 validation, dependency injection, lifespan hooks |
| Authentication & security | Supabase JWT (ES256) verification with JWKS, key-rotation fallback, type-email-to-confirm flows for destructive actions |
| Database design | Postgres schema with soft deletes, status state machine, re-purchase inference, indexed queries |
| AI / ML integration | Claude vision API for receipt parsing, structured JSON extraction, shelf-life estimation |
| DevOps & deployment | Three independent deploy targets (2× Vercel, 1× Render), explicit CORS allowlist via FRONTEND_URL, env-var-driven config |
| CI/CD | GitHub Actions: ruff lint, Next.js typecheck, auto-merge on green with retry loop |
| Product & UX design | Warm earthy design system, Notion-style sidebar, Headspace-inspired marketing site, animated mockups |
| Compliance | GDPR-friendly account deletion (cascades pantry + receipts + auth user), public privacy policy |
| URL | |
|---|---|
| 🏠 Marketing site | https://larder-website.vercel.app |
| 📱 Web app | https://larder-theta.vercel.app |
| 📖 Docs | https://larder-website.vercel.app/docs |
| 🔒 Privacy policy | https://larder-website.vercel.app/privacy |
| ⚙️ Backend API | https://larder.onrender.com |
| ❤️ Health check | https://larder.onrender.com/health |
| 💻 Source | https://github.com/Chinmay1220/Larder |
/expiring page grouped into Expired / Today / Next 3 daysPASSWORD_RECOVERY event handlingrequestAnimationFrame-based count-up stats@keyframes marquee ticker stripLarder treats Claude as a first-class component, not a wrapper.
canonical_name, category, quantity, unit, price, shelf_life_days); responses are then parsed and validated through Pydantic v2 before insertCode: backend/app/services/vision.py and backend/app/api/receipts.py
| Layer | Tech |
|---|---|
| Frontend | Next.js 16 (App Router), React 19, TypeScript, Tailwind v4 |
| Backend | FastAPI, Pydantic v2, Uvicorn |
| Database & auth | Supabase (PostgreSQL, Row-Level Security, JWT) |
| AI | Anthropic Claude (claude-sonnet) — vision + structured extraction |
| File processing | Pillow (images), python-docx (Word), openpyxl (Excel), pdf parsing |
| Rate limiting | slowapi |
| Hosting | Vercel (frontend × 2), Render (Python backend) |
| CI/CD | GitHub Actions — ruff lint, Next.js typecheck, auto-merge on green |
┌────────────────────┐ ┌────────────────────┐
│ Marketing site │ │ Web app │
│ larder-website │ │ larder-theta │
│ (Next.js / SSG) │ │ (Next.js / CSR) │
└────────────────────┘ └─────────┬──────────┘
│ JWT (ES256)
▼
┌────────────────────┐
│ FastAPI backend │
│ larder.onrender │
│ │
│ ┌──────────────┐ │
│ │ /receipts │──┼──▶ Anthropic Claude
│ │ /pantry │ │
│ │ /account │ │
│ └──────┬───────┘ │
└─────────┼──────────┘
▼
┌────────────────────┐
│ Supabase │
│ • auth.users │
│ • pantry_items │
│ • receipts │
└────────────────────┘
status field (active, consumed_manual, consumed_inferred, expired, deleted) for full audit history. Re-purchase inference auto-marks duplicate active items as consumed_inferred when a new receipt adds the same canonical name.localhost plus the exact origins listed in FRONTEND_URL (comma-separated). There is deliberately no wildcard *.vercel.app regex, so arbitrary preview origins can't call the API; add a new front-end origin by setting the env var./decrement endpoint reads and updates quantity in one round-trip, marking the item consumed if it drops below 1.pantry-poc/
├── backend/ # FastAPI backend
│ ├── app/
│ │ ├── api/ # Route handlers (receipts, pantry, account)
│ │ ├── services/ # Business logic (vision, pantry_state)
│ │ ├── auth.py # JWT verification (ES256 + HS256 fallback)
│ │ ├── db.py # Supabase client
│ │ ├── limiter.py # Rate limiter config
│ │ └── main.py # FastAPI app + CORS + lifespan
│ ├── scripts/
│ │ └── nightly_expiry.py
│ └── requirements.txt
│
├── web/ # Next.js consumer app (auth-gated)
│ ├── app/
│ │ ├── page.tsx # Pantry dashboard
│ │ ├── scan/ # Receipt upload page
│ │ ├── login/ signup/ forgot-password/ reset-password/
│ │ ├── settings/ # Profile, password, account deletion
│ │ ├── expiring/ # Items expiring within 3 days
│ │ └── AppShell.tsx # Sidebar + mobile nav wrapper
│ └── lib/supabase.ts
│
├── website/ # Next.js marketing site
│ ├── app/
│ │ ├── page.tsx # Landing page
│ │ ├── docs/
│ │ └── privacy/
│ └── components/ # Nav, Footer, animated sections, FAQ, etc.
│
├── render.yaml # Render deployment config
├── .github/workflows/ # CI: lint, build, auto-merge
└── README.md
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
Required env vars (backend/.env):
SUPABASE_URL=https://<project>.supabase.co
SUPABASE_SERVICE_KEY=<service role key>
ANTHROPIC_API_KEY=<key from console.anthropic.com>
FRONTEND_URL=http://localhost:3000
DEV_MODE=true
cd web && npm install && npm run dev
Required env vars (web/.env.local):
NEXT_PUBLIC_SUPABASE_URL=https://<project>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon key>
NEXT_PUBLIC_API_URL=http://localhost:8000
cd website && npm install && npm run dev
All authenticated endpoints expect Authorization: Bearer <Supabase JWT>.
| Method | Path | Purpose |
|---|---|---|
POST | /receipts | Upload a receipt; returns extracted items |
GET | /pantry | List all active items |
GET | /pantry/expiring?days=3 | Items expiring within N days |
POST | /pantry | Manually add an item |
PATCH | /pantry/{id} | Edit an item |
PATCH | /pantry/{id}/consumed | Mark fully used |
PATCH | /pantry/{id}/decrement | Atomic quantity −1 |
DELETE | /pantry/{id} | Soft delete |
DELETE | /account | Hard delete account + cascade |
GET | /health | Liveness probe |
pantry_items| Column | Type | Notes |
|---|---|---|
id | uuid | PK |
user_id | uuid | FK → auth.users |
canonical_name | text | lowercased on insert |
category | text | enum-checked at API layer |
quantity | numeric | |
unit | text | |
price | numeric | nullable |
purchased_at | timestamptz | |
est_expiry | timestamptz | indexed |
consumed_at | timestamptz | nullable |
shelf_life_days | int | Claude estimate |
source_receipt_id | uuid | nullable, FK → receipts |
status | text | active, consumed_manual, consumed_inferred, expired, deleted |
receipts| Column | Type |
|---|---|
id | uuid (PK) |
user_id | uuid (FK → auth.users) |
uploaded_at | timestamptz |
item_count | int |
larder-website, deploys from mainlarder-theta, deploys from mainlarder, deploys from mainA merge to main triggers all three deploys via webhook.
Two scheduled GitHub Actions keep the free-tier services warm:
keepalive.yml — pings the Render /health endpoint every ~14 min so the backend never cold-starts (Render sleeps after 15 min idle).nightly.yml — runs the expiry sweep daily, which doubles as Supabase traffic so the database never pauses (Supabase free tier pauses after ~7 days idle).⚠️ Gotcha: GitHub auto-disables scheduled workflows after 60 days with no repo commits — which would silently stop the keepalive and pause Supabase. A commit to
mainresets that clock. Services last verified active: 2026-08-10.
MIT — built by Chinmay Sawant.