TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
A personal AI headhunter that finds the jobs that fit you and writes your application for each one.
ProductivityTypeScript · JavaScriptGitHub @BrovinchessOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Career Ninja (formerly Unemploy) is your own AI headhunter. Each user launches a Hello Minds agent (a Mind) per resume. The Mind finds matching jobs every day and writes an application pack for each; Unemploy checks every pack against the resume and shows the user a shortlist to act on.
With HM_CLIENT_ID empty the app runs in demo mode: sign-in, the Mind, top-ups and job delivery are simulated, so no cognition is spent. Demo-only shortcuts appear on the activate and resume steps.
Postgres (Supabase in production). Tables are defined in src/db/schema.ts; migrations live in drizzle/.Read the full README ↗Career Ninja (formerly Unemploy) is your own AI headhunter. Each user launches a Hello Minds agent (a Mind) per resume. The Mind finds matching jobs every day and writes an application pack for each; Unemploy checks every pack against the resume and shows the user a shortlist to act on.
Plan: https://claude.ai/code/artifact/ddb1d976-1ebc-44a7-b390-40dfbc2ff66c
npm install
cp .env.example .env.local # then set DATABASE_URL (see Database)
npm run dev
With HM_CLIENT_ID empty the app runs in demo mode: sign-in, the Mind, top-ups and job delivery are simulated, so no cognition is spent. Demo-only shortcuts appear on the activate and resume steps.
Postgres (Supabase in production). Tables are defined in src/db/schema.ts; migrations live in drizzle/.
| Table | Holds |
|---|---|
users | One row per Hello Minds account: username, time zone, OAuth tokens |
sessions | Sign-in sessions (cookie id → user) |
profiles | One per headhunter: its Mind, resume, preferences, ingest key hash, status |
jobs | Jobs the Mind delivered, with match score, fit notes and the user's status |
packs | The application pack for each job: cover letter, answers, claims with resume evidence |
ingest_log | Every push a Mind made, accepted or rejected, with reasons |
Row Level Security is on for every table with no policies, so Supabase's public Data API can't read them; the app connects directly as the database owner.
DATABASE_URL to Supabase's pooler connection string in transaction mode (port 6543), in Vercel → Settings → Environment Variables.src/db/schema.ts, run npx drizzle-kit generate, then npm run db:migrate with DATABASE_URL pointing at Supabase (session mode, port 5432).npm run db:local starts a Postgres-compatible server on port 5433 (data in ./data). Set DATABASE_URL=postgres://postgres:[email protected]:5433/postgres and run npm run db:migrate once.9d700784-07a2-4ef9-a906-152c00b04528), redirect URIs https://careerninja.app/auth/callback and http://localhost:3000/auth/callback. (An older client named "Unemploy" also exists; its name can't be changed.)HM_CLIENT_ID, APP_URL, TOKEN_ENCRYPTION_KEY, CRON_SECRET (see .env.example).APP_URL must be reachable from the internet: Minds POST their jobs to $APP_URL/api/ingest.In production:
vercel.json) nudges headhunters that have been quiet for 30+ hours, at most once a day for three days, and clears expired sessions.| Piece | Where |
|---|---|
| Hello Minds OAuth (PKCE) and token refresh | src/lib/minds/oauth.ts, src/lib/minds/client.ts |
| Simulated Mind for demo mode | src/lib/minds/mock.ts |
| Brief sent to each Mind, and the ingest contract | src/lib/brief.ts (contract served at GET /api/ingest?brief=1) |
| Ingest endpoint: validates every job and pack | src/app/api/ingest/route.ts, src/lib/ingest.ts |
| Setup: launch, activate, resume, preferences | src/app/profiles/[id]/setup |
| Shortlist, tracker, settings | src/app/app |
| Database schema | src/db/schema.ts, drizzle/ |
The ingest endpoint rejects, with a hint the Mind can act on: unwanted work settings, jobs outside the user's country, avoided companies, any claim whose evidence isn't quoted word for word from the resume, duplicates, dead links, and anything over the user's daily limit. Every reply also carries the user's recent skip reasons, so the Mind learns without an extra billed message.