Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Hotdog or Not Hotdog — upload an image, an AI vision model says whether it's a hotdog
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Upload a photo and an AI vision model tells you whether it's a hotdog — with a one-line reason — and keeps a history of your past checks.
Live: https://hotdog-or-not.vercel.app
sequenceDiagram
autonumber
participant B as Browser
participant A as API (Next.js route handlers on Vercel)
participant S as Supabase Storage
participant O as OpenAI (vision)
participant D as Supabase Postgres
B->>B: Validate type (JPEG/PNG/GIF/WebP) and size (≤ 4 MB)
B->>A: POST /api/hotdog-image-uploads { mediaType, byteSize }
A->>S: Create signed upload URL in temp bucket
A-->>B: { uploadUrl, tempImagePath }
B->>S: PUT image bytes (direct, never through the API)
B->>A: POST /api/hotdog-classifications { tempImagePath }
A->>S: Check ownership, re-validate stored type/size, download
A->>O: Classify (structured output → { isHotdog, reason })
A->>S: Move image to the private `hotdog-images` bucket
A->>D: Insert classification row
A-->>B: Result + signed read URL (1 h)
HttpOnly, Secure, SameSite=Lax session cookie issued by proxy.ts. Storage paths use a separate non-secret folder id, so the cookie value never appears in a URL.import 'server-only'). Every table has row-level security enabled with no policies, and both buckets are private.tempImagePath. A retry after success returns the existing record.| Area | Choice |
|---|---|
| App | Next.js 16 (App Router, Cache Components), React 19, TypeScript |
| Styling | Tailwind CSS v4 with design tokens in app/globals.css (light and dark) |
| AI | OpenAI Responses API with structured outputs validated by zod (gpt-5.4-mini, low image detail) |
| Data | Supabase Postgres + Storage (London, eu-west-2) |
| Hosting | Vercel (functions in London, lhr1) |
| Tooling | Node 24, Yarn 4, Vitest, ESLint, Prettier |
app/ Routes; app/api/**/route.ts are thin adapters to server/ handlers
components/ UI by domain; components/primitives/ for shared building blocks
hooks/ Stateful UI logic, kept out of components
controllers/ API controller instances used by the browser
server/ Server-only: api/[domain]/ handlers + services, clients/ (OpenAI, Supabase)
shared/ Isomorphic types, constants, validators, API controllers
supabase/ Local Supabase config + SQL migrations (tables, RLS, storage buckets)
test/ API tests and shared fakes
Request flow: component → hook → shared/controllers → app/api/**/route.ts → server handler → service → client.
Conventions and rules live in CLAUDE.md and guidelines/. Feature plans live in plans/.
Prerequisites: Node 24 (nvm), Corepack (ships with Node, provides Yarn 4), and Docker (for local Supabase).
nvm use
corepack enable
yarn install
yarn db:start # starts local Supabase and applies migrations; prints the keys
cp .env.example .env.local # fill in the values below
yarn dev # http://localhost:3000
| Variable | Where to get it |
|---|---|
OPENAI_API_KEY | https://platform.openai.com/api-keys |
SUPABASE_URL | http://127.0.0.1:54321 locally; Project URL in the Supabase dashboard |
SUPABASE_SERVICE_ROLE_KEY | yarn supabase status -o env locally; Project Settings → API Keys in the dashboard |
All three are server-only — never prefix them with NEXT_PUBLIC_.
| Command | What it does |
|---|---|
yarn dev | Dev server (web + API) |
yarn typecheck | Generate route types and run tsc |
yarn lint | ESLint |
yarn test / yarn test:run | Vitest (watch / single run) |
yarn build | Production build |
yarn db:start / db:stop / db:reset | Local Supabase lifecycle |
yarn db:types | Regenerate the Postgres types in shared/types/database/ |
yarn db:push | Apply migrations to the linked remote project |
*.test.ts).test/api-tests/ call the real route handlers with fake OpenAI and Supabase clients from test/helpers/, so the suite needs no network access or secrets.Pushing to main deploys to production on Vercel; other branches get preview deployments. Database changes are SQL migrations in supabase/migrations/, applied with yarn db:push before the code that needs them is deployed. Step-by-step setup is in CLAUDE.md → Deploy.
plans/.docs/production-readiness.md.