DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Working name. Your personal headhunter: brief it once, and every morning it finds the roles worth your time, writes a CV and cover letter for each one you approve, and reminds you to follow up.
Live at https://fuzzyhr.vercel.app · Built by Nicola Delnero with Claude.
Signed-out visitors get a demo at /app with sample data.
/admin shows headline numbers, spend on your Claude key against today's cap, every user (searchable), and a per-user page with their brief, CV, applications, AI usage, briefings and a full activity timeline. /admin/activity is a live feed of everything across the site, filterable by event. Admins are users with role admin in the database: the first account ever created becomes admin automatically, and admins can make others admin from a user's page (but can't remove their own access). ADMIN_EMAILS in Vercel also works as a fallback. Everyone else gets a 404. Users' AI keys are never shown, only their last 4 characters.| Part | Choice |
|---|---|
| App | Next.js 16 (App Router), React 19, TypeScript |
| Hosting and schedule | Vercel, with Vercel Cron for the morning hunt (vercel.json) |
| Sign-in | Clerk (proxy.ts, lib/auth.ts) |
| Database | Postgres via DATABASE_URL (Neon on Vercel), using the postgres client. Tables are created on first use (lib/db.ts). |
| Writing | Claude via @anthropic-ai/sdk with structured JSON output (lib/ai.ts) |
| Job postings | Public Greenhouse and Lever board APIs, free and keyless (lib/hunt/sources.ts) |
| PDF CVs | unpdf text extraction |
The site degrades safely: with no keys set it runs as the public demo; each feature switches on when its key arrives.
Set these in Vercel → Project → Settings → Environment Variables.
| Name | Set by | What it does |
|---|---|---|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, CLERK_SECRET_KEY | Clerk integration | Turns on sign-up and sign-in |
DATABASE_URL | Neon integration | Turns on accounts and saved data |
ENCRYPTION_KEY | Optional | Encrypts saved AI keys. Without it, fuzzyHR derives one from CLERK_SECRET_KEY. If set later, keys saved before keep working. |
ANTHROPIC_API_KEY | Optional | Fallback for fuzzyHR's own AI key. Normally the owner pastes it in Admin → fuzzyHR's AI key instead, which takes priority. |
HOUSE_DAILY_LIMIT_PER_USER | Optional | Claude requests per free-week user per day on fuzzyHR's key (default 10) |
HOUSE_DAILY_LIMIT_TOTAL | Optional | Claude requests per day across all users on fuzzyHR's key (default 200). Your ceiling on spend. |
ANTHROPIC_MODEL | Optional | Claude model, defaults to claude-sonnet-5-5 |
OPENAI_MODEL | Optional | Forces one model for OpenAI keys instead of picking the newest |
ADMIN_EMAILS | Optional | Extra way to grant /admin: comma-separated sign-in emails (admins are normally set in the database) |
CRON_SECRET | Optional | Restricts the morning hunt URL to Vercel Cron. Without it, the hunt URL is public but runs at most once every 20 hours. |
ADZUNA_APP_ID, ADZUNA_APP_KEY | Optional, free at developer.adzuna.com | Adds Adzuna job search to the hunt |
JOOBLE_API_KEY | Optional, free at jooble.org/api/about | Adds Jooble job search to the hunt |
fuzzyHR's own AI key can be left out while testing; the owner adds it later in Admin, with no Vercel changes. Users then see "Free AI writing is switching on soon": hunting, matching and the tracker work, and anyone can add their own key. When someone tries an AI feature or presses Notify me, it's logged as ai_wanted. The admin overview turns that into a "Time to add your Anthropic key" alert, with a count on the workspace's Admin link. It ignores admins, and users marked as testers on their admin page. Once the key is saved in Admin, the same box offers to give everyone waiting a fresh 7-day free week.
See VERSIONING.md. Releases are tagged (v0.7.0), notes for users live in lib/changelog.ts and show at /whats-new, and Admin → Versions rolls the live site back one step.
English and French (Quebec). Visitors in Quebec, by Vercel's x-vercel-ip-country-region header, get French by default; everyone else gets English. The EN/FR switch saves the choice in the fz_lang cookie, which always wins. Translations are gettext style in lib/i18n/fr.ts: the English text is the key, so a missing entry falls back to English. Server messages and saved match reasons are translated with translateMessage (exact text, then patterns). Each user's language is saved so the AI writes its reviews in it. The Privacy Policy and Terms have full French versions (app/privacy/fr.tsx, app/terms/fr.tsx). The admin area stays in English.
Admin → Payments: paste a Stripe secret key and fuzzyHR creates the product, monthly CAD and USD prices (tax included), a webhook endpoint and a customer portal in that Stripe account. Prices and allowances (tailored applications a month, AI requests a day) are set there too, along with an on-sale switch. Personal subscribers use fuzzyHR's AI key within those allowances. Stripe's webhooks (/api/stripe/webhook, signature-checked) keep each user's plan in sync. Deleting an account cancels its subscription.
Personal is sold in Canada (CAD) and the US (USD) only, chosen from Vercel's x-vercel-ip-country header; elsewhere the price is shown but checkout is refused. Users can pause (1 to 3 months, or until they resume) or say they got a job: hunting, reminders and Autopilot stop, and Stripe billing is paused (pause_collection) while they keep Personal until the end of the paid month. Resuming after that month starts a new one immediately.
lib/hunt/boards.ts), the companies each user follows, and, when keys are set, Adzuna and Jooble searches built from each user's roles and cities. Duplicates are merged.The review and Autopilot run in the morning job while time allows, and otherwise from the workspace when the user opens it. Each review or write is one AI request, counted against the free-week caps on fuzzyHR's key.
Changes to environment variables apply on the next deploy.
app/
page.tsx Landing page
app/page.tsx Workspace: live if signed in, demo otherwise
app/doc/[id]/page.tsx Tailored CV and cover letter, 3 templates, print to PDF
sign-in/, sign-up/ Clerk forms
admin/ Owner-only: overview and users, activity feed, user detail
api/me/... The signed-in user's workspace API
cv Upload CV, get a suggested brief
brief Save brief, rescan the last 3 weeks
hunt Hunt now (10-minute cooldown)
pass Never show a posting again
applications, [id], [id]/tailor
claude-key Save (checked, encrypted) or remove the user's own key
api/cron/hunt The morning hunt for every active user
components/workspace/ Live.tsx, Demo.tsx, shared parts.tsx
lib/
hunt/ Scoring, sources, follow-up rules, sample data
ai.ts Prompts, schemas, Claude and OpenAI clients, model picking
activity.ts, describe.ts Activity log and its readable descriptions
admin.ts Admin access check and queries
claude.ts Which key pays, daily caps, usage tracking
crypto.ts Encryption for saved keys
db.ts, seekers.ts, store.ts Database
auth.ts, api.ts Who is calling, shared API helpers
markdown.ts Safe Markdown → HTML for documents
scripts/build_preview.py Builds the claude.ai preview from a static export
npm install
cp .env.example .env.local # fill in what you have
npm run dev
Without Clerk keys you can still test the signed-in workspace locally: set FUZZY_DEV_USER=me (ignored on Vercel), DATABASE_URL to any Postgres, and FUZZY_SAMPLE_JOBS=1 to use sample postings instead of live boards.
MIT. See LICENSE.