DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
개인 헤드헌터 fuzzyHR가 가치 있는 포지션을 찾아 이력서·자소서를 맞춤 제작하고 구직을 지속시킴
Your personal headhunter. fuzzyHR finds the roles worth your time, tailors your CV and cover letter for each, and keeps your search moving.
생산성TypeScript · CSSGitHub @carecentrale온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.