Saleor Store
우리 컬렉션을 쇼핑하세요
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A project that tests whether a 3D modeling mouse project can be used to help buyer decision.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Scan your hand with your phone. Get mice that actually fit it.
Open_Mouse measures a hand from three guided photos against a printed
calibration sheet, scores every mouse in its catalogue on six dimensions of fit,
renders your measured hand on the recommended shells in 3D, and explains the
result in plain language.
Testing whether 3D shape modelling can genuinely help a buying decision —
rather than the usual "large hands: buy a large mouse."README 전문 보기 ↗Palmate is the public name of this project. Try it at https://palmate.kirby-fivesenses.com/.
Measure your hand with a phone photo. See which mice fit it.
Open_Mouse compares a measurement of your hand with the published dimensions of each mouse in its catalogue (408 gaming mice from 23 brands listed on the site, 2026-10-28), scores every mouse that isn't excluded (wrong hand, vertical) on six aspects of fit, and explains the ranking in plain language. The question behind it: can a measured hand beat "large hands, buy a large mouse"?
It gives a fit estimate to help a buying decision. It is not a medical or health tool and does not diagnose, treat or prevent anything.
Main flow: blank paper, live camera (/scan/easy). Lay your hand flat on a
blank sheet of A4 or Letter paper on a darker table and hold your phone above it.
The live camera finds the four paper edges and takes the photo once they are
locked. The paper's known size is the ruler.
Printed-sheet flow (/sheet, then /scan). The earlier calibration: print a
sheet carrying six ArUco markers (four flat on the sheet, two on a flap you fold
up for the side shot; identical on A4 and Letter) and photograph your hand with
the sheet in frame. Both pages are closed on the production site (they answer
404 there, like the demo routes) and still run locally; whether to keep the flow
is pending.
Until that is decided it is mainly used for checking the blank-paper
measurement against ground truth (a learning kit for that is in development).
No paper: type your hand length. A "No paper? Use a ruler instead" entry lets
you measure your hand length with a ruler (wrist crease to middle fingertip) and
type it in. You still take the photo: the typed length replaces the paper as the
scale, so this mode has no perspective correction and every other measurement
inherits your ruler error. It is behind a build-time flag,
NEXT_PUBLIC_TYPED_HAND_LENGTH_ENTRY=1, and is off by default while the
photo measurement is validated.
user-length, which includes
referenceMm: the hand length you typed (the same number is then stored as your
hand length).RATE_LIMIT_KEY_SECRET environment
variable (see .env.example); when it is not set, the code falls back to a
fixed, non-secret salt (the hash can then be reversed by brute force) and logs a
warning. Whether production sets it is unconfirmed.users table, your name, email address,
whether the email is verified (emailVerified) and profile image; in the
accounts table, your Google account ID (provider_account_id) and the OAuth
data Google returns (access, refresh and ID tokens, token type, expires_at,
scope and session_state); and in auth_sessions, a session token with its
expiry. The schema also defines verification_tokens; whether Google sign-in
writes to it was not confirmed. Google OAuth is a third party in that flow. A
signed-in user's scans are kept until that user deletes them.src/server/analysis/input.ts). The app is hosted on
Vercel with a Neon Postgres database; this repository does not control their own
logs. MediaPipe's library tries to send usage metrics to Google (its own privacy
notice says so); the app's Content-Security-Policy blocks that request, see
.Next.js 15 (App Router) and React 19, TypeScript (strict), Drizzle ORM with Neon
Postgres over the HTTP driver, Auth.js (Google, optional), MediaPipe Tasks Vision
and js-aruco2 in the browser, Google Gemini through @google/genai (server side
only), Zod for the shared contracts, Vitest and Playwright, deployed on Vercel.
Licences of what is redistributed: NOTICE.
Use Node.js 24 and npm.
npm ci
npm run dev # http://localhost:3000
Most pages and the whole test suite work without credentials. For anything that
reads or writes the database, copy .env.example to .env.local and fill in the
values for a development Neon branch. Never use production credentials locally.
npm run typecheck
npm run lint
npm run format:check
npm run test # unit tests (Vitest)
npm run db:check # migration history
npm run build
npx playwright install chromium
npm run test:e2e # all Playwright projects against `next dev`
Playwright starts its own dev server on port 3100 (PLAYWRIGHT_PORT changes it,
so several worktrees can run side by side; PLAYWRIGHT_REUSE_SERVER=1 attaches to
a server you started). Its projects are desktop Chromium, a Pixel 7 profile, and
three that feed Chromium's fake camera a fixture video. npm run test:e2e:live
runs a smaller suite against a real deployment with nothing mocked; it is also a
manual GitHub Actions workflow.
Edit src/db/schema.ts, run npm run db:generate, and commit the SQL and
metadata it writes to drizzle/. npm run db:check checks the history; CI
regenerates migrations and fails if the schema has drifted. Do not use schema
push. Neon has two branches: main (production) and preview (shared by every
pull request preview). A preview build migrates and seeds preview through
npm run vercel-build; production migrations are applied deliberately, by hand,
before releasing code that needs them. Seeds must stay idempotent and migrations
additive.
The catalogue is seeded from manufacturers' own published dimensions, with
shape descriptors derived independently via
docs/shape-rubric.md. No third-party database is
redistributed. Licensed reference data used during development stays outside this
repository and is never committed.
See CONTRIBUTING.md. Report vulnerabilities privately as
described in SECURITY.md; do not open a public issue for them.
To be decided (pending). No licence has been chosen yet, so no permission to
reuse the code is granted beyond what GitHub's Terms of Service give anyone who
can see a public repository. Third-party components keep their own licences; see
NOTICE.
Palmate 是這個專案對外的名稱,網址:https://palmate.kirby-fivesenses.com/。
Open_Mouse 用手機拍一張手部照片,量出手的尺寸,再和型錄裡各型號滑鼠的公開尺寸比對(2026-10-28 網站列出 23 個品牌、408 款電競滑鼠), 給出適合度排名,並用白話說明原因。它只提供購買時的適合度估計,不是醫療或健康工具,不做任何診斷或治療宣稱。
/sheet、/scan;要印 6 個標記),正式站已關閉(回應 404),只在本機可用;是否保留尚未決定。目前主要用來對照空白紙流程的量測結果。NEXT_PUBLIC_TYPED_HAND_LENGTH_ENTRY,預設關閉。這個模式送出的 calibration 是 user-length,含 referenceMm(你輸入的手長)。NOTICE。npm ci、npm run dev;檢查用 npm run typecheck、lint、format:check、test、db:check、test:e2e。細節見上方英文段落與 CONTRIBUTING.md。NEXT_PUBLIC_GA_ID (local runs, CI and previews are not), it loads no
third-party analytics script either, and its Content-Security-Policy allows no
third-party origins for scripts or connections (it does allow inline scripts,
which Next.js needs; see next.config.ts). In a build with that ID, Google
Analytics 4 is requested only after a visitor accepts the cookie banner, and
only that build's policy names Google's analytics hosts; what GA4 may receive
is listed in src/client/analytics/ga4.ts. For images it allows one
third-party origin, lh3.googleusercontent.com, from which a signed-in user's browser loads
their Google profile picture, so Google's image host sees that browser's IP
address and User-Agent (the request sends no referrer).