尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Monorepo for the Developer Hub (skill validation layer) described in
PLAN.md: candidates connect their GitHub account and get a
profile dashboard showing language breakdown, activity, and repo quality
signals — one input alongside manual technical screening, not a replacement
for it.
• Node 20+
• pnpm (corepack enable or npm i -g pnpm)
• Two GitHub OAuth Apps (web and mobile need separate ones — see below)檢視完整 README ↗Monorepo for the Developer Hub (skill validation layer) described in
PLAN.md: candidates connect their GitHub account and get a
profile dashboard showing language breakdown, activity, and repo quality
signals — one input alongside manual technical screening, not a replacement
for it.
apps/web Next.js dashboard (App Router, TypeScript, Tailwind, NextAuth)
apps/mobile Expo/React Native app (TypeScript)
packages/shared Branding tokens, shared types, GitHub API client
corepack enable or npm i -g pnpm)Create both apps at https://github.com/settings/developers:
http://localhost:3000/api/auth/callback/githubipskill://
(GitHub OAuth Apps only support one fixed callback URL each, and the
mobile app redirects to a custom ipskill:// scheme instead of a
localhost URL, so it can't share the web app's OAuth App.)Copy the env files and fill in the values:
cp apps/web/.env.example apps/web/.env.local
cp apps/mobile/.env.example apps/mobile/.env
apps/web/.env.local: GITHUB_CLIENT_ID/GITHUB_CLIENT_SECRET (web app),
GITHUB_MOBILE_CLIENT_ID/GITHUB_MOBILE_CLIENT_SECRET (mobile app — the
secret is only ever used server-side in apps/web's token-exchange route),
NEXTAUTH_SECRET (openssl rand -base64 32), NEXTAUTH_URL,
SUPABASE_URL/SUPABASE_SERVICE_ROLE_KEY (work history storage — see
below).apps/mobile/.env: EXPO_PUBLIC_GITHUB_CLIENT_ID (the mobile app's client
ID only — never the secret), EXPO_PUBLIC_AUTH_BACKEND_URL pointing at the
running apps/web instance.Unlike Skills/Projects, work history, certifications, and skill test results
aren't sourced from GitHub — they need real storage. The ipskill Supabase
project holds:
work_experience (company, role, location, dates, description)certifications (name, issuer, issue/expiry dates, credential ID/URL,
description)skill_test_templates / skill_test_questions / skill_test_attempts —
lightweight, in-house multiple-choice tests (3 seeded: JavaScript, Python,
SQL fundamentals). This is deliberately not a real code-execution sandbox;
the plan (see improvements.md) is to migrate to a proctored third-party
vendor (CodeSignal/HackerRank/Coderbyte) once there's revenue to justify
it. Correct answers (correct_index) never leave the server — /start
only ever returns question text and choices, and scoring happens in
/api/skill-tests/attempts/[id]/submit.All are keyed by the candidate's GitHub numeric ID (stable across username changes, unlike the login string).
There's no Supabase Auth involved — auth is still GitHub OAuth via NextAuth.
Both tables have Row Level Security enabled with no policies, so the
only way to read or write them is the service-role key, and that key is
only ever used server-side (apps/web/src/lib/supabase.ts, guarded by the
server-only import). Every /api/experience and /api/certifications
route re-derives the candidate's identity from the authenticated NextAuth
session before querying — a request can never read or write another
candidate's rows by passing a different ID, since the ID isn't taken from
the request at all.
Grab SUPABASE_SERVICE_ROLE_KEY from the Supabase dashboard (Project
Settings → API → service_role) — it's a secret and isn't obtainable through
tooling, by design.
The mobile app can't hold an OAuth client secret, so it exchanges its GitHub
authorization code for an access token via apps/web's
/api/mobile/github-token route rather than talking to GitHub's token
endpoint directly. This means apps/web needs to be running for mobile login
to work.
pnpm install
pnpm dev:web # http://localhost:3000
pnpm dev:mobile # Expo dev server
Set ALLOW_TEST_LOGIN=true in apps/web/.env.local to register an extra
"test-account" NextAuth provider and show a "Continue as Test User" button
on the login page. It logs straight into a fixture developer profile with
realistic GitHub-shaped data (repos, languages, skill fingerprint, commit
history) — no real OAuth round trip, no GitHub access token needed — so
every GitHub-derived page (Profile, Skills, Projects, Analytics) can be
exercised end to end. Supabase-backed features (Experience, Certifications,
Verified Skills, the display-name override) still need a real
SUPABASE_SERVICE_ROLE_KEY to read/write data, since those aren't mocked.
Never set ALLOW_TEST_LOGIN on a real deployment — it's deliberately not
gated by NODE_ENV (Vercel builds preview deployments with
NODE_ENV=production too), so leaving it unset is what keeps the bypass
from existing at all outside your own machine.
name field) — all backed by Supabase, scoped per-candidate via the
authenticated session.PLAN.md — this repo currently covers the Developer Hub only.