尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A self-assessment instrument for personal digital exposure, built as a research prototype. A visitor assesses their own data across three surfaces — credential exposure, account (email) exposure, and LLM attribute inference — and receives an illustrative exposure index and remediation.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗A research MVP for assessing your own digital exposure: verified email breach lookups, k-anonymity password checks, a transparent Breach Risk score, a vetted action plan with residual-risk tracking, GDPR request letters, and ExpoBot — an AI assistant constrained to that action plan. MSc thesis prototype, Óbuda University.
👉 Live: https://exposurescope.vercel.app/
Research demonstrator. Not a commercial security product and not a substitute for professional security advice.
email + consent ─► /api/verify/start ─ rate limits ─► 6-digit code by email
◄─ signed CHALLENGE token (holds a keyed tag of the code, not the code)
code ───────────► /api/verify/check ─► signed SCAN token (15 min, bound to that email)
email + SCAN ───► /api/breach ─ token + rate limits + daily cap ─► HIBP / DeHashed
merge + dedupe → Breach Risk score → signed REPORT token (60 min)
question+REPORT ► /api/chat ─ context built server-side ─► Claude, agent loop
◄─ tools run on the SIGNED report (≤5 model calls) ─►
◄─ { answer, actionIds, letters, used } — all checked server-side
password ───────► (browser only) SHA-1 → first 5 chars ─► Pwned Passwords (padded)
Zero storage. No database. State that must survive between steps travels as signed, expiring tokens held in the browser's memory. The only server-side traces are rate-limit counters keyed by HMAC hashes, which expire within 24 hours.
| Path | Role |
|---|---|
lib/config.js | Every environment variable; testing switches gated to dev/preview |
lib/crypto.js | Web Crypto helpers: base64url, HMAC, keyed hashes, unbiased codes |
lib/tokens.js | Stateless signed tokens (challenge / scan / report) |
lib/ratelimit.js | Fixed-window limits (Upstash or in-memory) |
lib/http.js | JSON responses, error codes, body size caps, input normalisation |
lib/mailer.js | Verification email via Resend |
lib/sms.js | Verification SMS via Twilio (phone path; absent by default) |
lib/sources.js | HIBP + DeHashed lookups, cross-source merge, demo fixtures |
lib/score.js | Thesis Breach Risk component B (pure functions) |
lib/playbook.js | Vetted actions + residual-risk model |
lib/expobot.js | ExpoBot guard rails (trusted context, closed action set, output checks) |
lib/agent.js | ExpoBot v2: the agent's tools, its bounded loop, and output validation |
lib/gdpr.js | Article 15 / 17 request letters |
lib/content.js | Learn-tab text |
app/api/* | Thin routes wiring the libraries to HTTP |
app/page.js | The UI flow; components in app/components/ |
app/privacy/page.js | Privacy notice (must match what the code does) |
scripts/selftest.mjs | Offline tests for everything in lib/ |
scripts/redteam.mjs | Adversarial tests: a hostile model driven through the real agent loop |
npm install
cp .env.example .env.local # then set EXPOSIO_DEMO=1 and EXPOSIO_SHOW_CODE=1
npm run selftest # offline tests, no keys needed
npm run redteam # adversarial tests, no keys needed
npm run dev # http://localhost:3000
With the testing flags on, any address returns example breach data
([email protected] returns none) and the verification code appears on screen.
EXPOSIO_DEMO=1 and EXPOSIO_SHOW_CODE=1 also work on Vercel Preview
deployments, which sit behind Vercel's login — useful for showing the product
before the Resend and breach-data accounts are set up. They are ignored on
production, and the interface shows a banner whenever they are active.
EXPOSIO_SECRET, RESEND_API_KEY, EXPOSIO_FROM_EMAIL, HIBP_API_KEY
(and optionally DEHASHED_*, ANTHROPIC_API_KEY, UPSTASH_*, EXPOSIO_CONTACT_EMAIL, EXPOSIO_ETHICS_REF)./api/* as an outer layer.EXPOSIO_ETHICS_REF.ExpoBot v2 is an agent, not a chat wrapper. Rather than being told more in its prompt, it is given tools over the user's server-signed report and must look things up before it speaks:
| Tool | Answers | Computed by |
|---|---|---|
list_actions | which vetted actions apply, and what each is worth in points | lib/playbook.js |
simulate_fixes | "how much would this actually help?" | residualScore() |
breach_details | which breach drives the score, and why | lib/score.js |
respond | the final answer: action IDs + optional GDPR letters | validated server-side |
The design question is not "is the model good?" but "what can a bad model do?"
Six layers answer it, and scripts/redteam.mjs proves each one by running a
deliberately hostile model through the real loop in lib/agent.js:
BREACHES>>> … cannot
escape the fence and be read as instructions.MAX_TOOL_ROUNDS + 1 model calls, then respond is forced.npm run redteam # 18 attacks, offline, no API key
npm run redteam:live # also sends real jailbreak prompts to the live model
Live mode asserts the same containment properties against the real model — it never checks whether the model "behaved well", only whether the server let anything through.
B_raw = Σ severity × exp(−0.002 × age_days), score = min(1, B_raw / 0.8) × 100.
Severity: payment + passwords 1.0 · passwords 0.7 · phone/address 0.4 · email only 0.2.
Records without a breach date assume an age of 730 days (shown as "undated*").
The UI calls this the Breach Risk score — it is component B of the thesis Exposure
Score, whose other four components are not yet measured. Residual-risk factors in
lib/playbook.js are provisional and meant to be calibrated in a user study.