Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기sake sommelier app
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A sake companion. Three flagship surfaces: label scan, chat recommender, taste profile. Live: — English preview is live. German edition is intentionally on a coming-soon page until the Impressum (§5 DDG) is in place; see ADR-0008. _Snapshot generated 2026-09-30 from GitHub Issues + merged PRs. Regenerate with pnpm progress. Detail: docs/PROGRESS.md._ Yawaragi-mizu (和らぎ水) is the water drunk between sake sips — a palate reset, not a replacement. This app accompanies and clarifies; it doesn't compete with the sake.README 전문 보기 ↗
A sake companion for people who can't read the label. Point the camera at a bottle, a menu or a shop shelf; Yawaragi tells you what it is, what it tastes like, and — once you have rated a few — which one on the list is for you.
Live: https://yawaragi.dev — English is live. German is on a coming-soon page until the Impressum (§5 DDG) is in place; see ADR-0008.
Yawaragi-mizu (和らぎ水) is the water drunk between sake sips — a palate reset, not a replacement. This app accompanies and clarifies; it doesn't compete with the sake.
For anyone (after the 18+ gate):
With an account (a private beta today, see ADR-0020). Without one, look through a sample collection — made-up tastings of real sakes, read-only:
evals/label-scan-jp/README.md. A quarterly workflow opens an issue asking for the check again.source values from the schema to the screen; anything a model produced wears a "Read by AI" badge with an explanation sheet (ADR-0005).design/; every port is checked against them, and docs/design-questions.md is the running list of what the build asked the designers.Previously named "Kanpai"; renamed to avoid collision with KANPAI London Craft Sake Brewery — see ADR-0004.
src/app/globals.css.@ai-sdk/mcp connecting to our own MCP serverflowchart TD
V[Visitor] --> P["src/proxy.ts<br/>Clerk → next-intl<br/>→ age gate, session cookie"]
P --> Site["(site): landing, Learn,<br/>privacy, imprint"]
P --> App["(app): Home · Scan · Collection · Palate<br/>sake, bottling, search, account"]
App --> ScanAction["lib/scan/scan-action"]
ScanAction --> RateLimit["lib/rate-limit<br/>anonymous session + Upstash"]
ScanAction --> Vision["lib/ai/vision<br/>Haiku 5.5 → Sonnet 5.5 retry"]
ScanAction --> Resolve["lib/sakenowa<br/>resolve-scanned-label"]
App --> ListAction["lib/scan/list-action<br/>menu and shelf"]
ListAction --> ListReader["lib/ai/vision/list-reader<br/>Sonnet 5.5"]
ListAction --> Rank["lib/scan/rank-list<br/>(no model call)"]
Resolve --> DB[("Supabase Postgres<br/>Sakenowa mirror<br/>+ manual curation")]
App --> DB
App --> Gate["lib/auth/maintainer<br/>(private beta allowlist)"]
Gate --> Stores["journal · cellar · own bottlings<br/>lib/taste, lib/collection"]
Stores --> KV[("Upstash Redis<br/>versioned records")]
Backup["/api/cron/backup-collection<br/>daily"] --> KV
Backup --> Bucket[("Supabase Storage<br/>private backups, 30 kept")]
Ingest["/api/cron/ingest<br/>daily"] --> DB
Sakenowa["Sakenowa Data API"] --> Ingest
App --> Suggest["suggest (behind a flag)<br/>AI SDK tool loop"]
Suggest --> MCP["@yawaragi/sakenowa-mcp"]
MCP --> DB
Vision --> Anthropic["Anthropic Claude"]
ListReader --> Anthropic
Suggest --> Anthropic
Anthropic -.-> Langfuse["Langfuse (EU)<br/>traces, no prompts in prod"]
Built: the catalogue mirror and its daily ingest, the scan with every outcome the design specifies, search, the bottle and bottling pages, Learn, and — for the private beta — the journal, Palate, Cellar, own bottlings and menu/shelf ranking. The UI matches design v1.7.1 except where CLAUDE.md says otherwise. Suggestions ("Ask") are built but hidden in v1 for cost and latency (#299).
Before a public launch: opening the journal to everyone (with self-service export and deletion), separate data for production and previews, the remaining vendor DPAs, and the German Impressum. See docs/PRE-GO-LIVE.md.
packageManager field pins it for corepack enable)DOCKER_HOST set) — required by pnpm test:integration / pnpm verify. On Linux, after installing Docker Engine, add your user to the docker group (sudo usermod -aG docker $USER then re-login). Docker Desktop, Colima, OrbStack, and rootless Docker all work; testcontainers auto-detects.pnpm install
cp .env.example .env.local # fill in API keys
docker pull postgres:16-alpine # one-time; the integration runner reuses this image
pnpm dev
| Command | Purpose |
|---|---|
pnpm dev | Next dev server |
pnpm test | Vitest unit suite, single run |
pnpm test:watch | Vitest watch mode |
pnpm test:integration | Vitest integration suite (testcontainers; needs Docker) |
pnpm test:e2e | Playwright |
pnpm test:smoke | Key routes against a production build (run pnpm build first); with SMOKE_BASE_URL=https://yawaragi.dev, against the live site instead (read-only) — CI does that after every production deploy |
pnpm lint | ESLint |
pnpm typecheck | tsc --noEmit |
pnpm migrate | Apply pending SQL files in supabase/migrations/ to MIGRATE_DATABASE_URL |
pnpm ingest | Refresh Sakenowa data into Supabase |
pnpm rate-limit:reset | Reset the anonymous rate limits in Upstash so the next scan starts at 5/5 — every visitor's, not just yours; says how many and asks first (-- --bucket scan or suggest, -- --yes) |
pnpm journal:export | Export a maintainer's collection (journal, cellar, own bottlings) to JSON — GDPR portability + durability backstop. Output holds personal data — gitignored; delete when done |
pnpm journal:restore | Write an export or a daily backup back into Upstash (idempotent; --dry-run validates only) |
pnpm journal:erase | GDPR erasure: a user's journal, cellar, own bottlings and backups (reports only without --yes) |
pnpm db:resync | One-shot: db:reset --yes && migrate && ingest |
pnpm verify | Full chain (lint + typecheck + test + integration + e2e + audits) — needs Docker |
pnpm eval <suite> | Run an eval suite: , , , . See (the label scan runs offline from saved reads with ) |
CLAUDE.md — agent operating instructions, conventions, anti-patternsCONTEXT.md — domain glossary; read before naming variables/typesdocs/adr/ — architecture decision recordsdocs/PRE-GO-LIVE.md — hard gates before any public launchdocs/deploying.md — Vercel deployment, env vars, vendor DPAs, plan-tier auditdocs/NAMING-RESEARCH.md — naming decision rationaleThe MCP server that exposes the Sakenowa-mirrored sake catalogue lives in its own repo at yawaragi-dev/sakenowa-mcp and is consumed by this app as the npm package @yawaragi/sakenowa-mcp. v0.0.1 reserves the npm name; v0.1.0 is in development — six read-only tools over the Sakenowa schema, per the spec doc and issue tree. The server deliberately depends on neither Next.js nor Clerk nor any Yawaragi-specific logic, so anyone with a Sakenowa mirror in Postgres can run it standalone. See docs/adr/0003-mcp-server-extractability.md.
Sake data is sourced from the Sakenowa Data API. "Flavor Chart" is a registered trademark of Sakenowa.
Open-core. Application code is All Rights Reserved; the cross-beverage map (CC BY-NC-SA 4.0), the glossary (CC BY-SA 4.0), and the Zod schemas (MIT) are permissively licensed. See docs/LICENSE-STRATEGY.md and LICENSE.
The MCP server @yawaragi/sakenowa-mcp lives in its own repo and is MIT-licensed.
docs/adr/, 200+ unit test files, 8 integration suites against a real Postgres, 28 Playwright specs (one of them a smoke test against a production build).@yawaragi/sakenowa-mcp.label-scan-jplabel-scan-pairslist-read-jpsuggest-jpevals/<suite>/README.mdLABEL_SCAN_EVAL_OFFLINE=1