A CLI tool for tech job seekers to discreetly manage their MiraJobs account from the terminal and explore new opportunities without risking their current role, powered by AI.
You never know when the next wave of layoffs will come, so why not create an anonymous profile and let recruiters "apply" to you?
- Create an anonymous job seeker profile directly from your terminal. AI is here to help.
- Recruiters contact you with job proposals.
- If a proposal interests you, reveal your identity and proceed as usual.
- Linux, macOS or Windows
- Node.js 18+ (recommended 20+)
Global install:
npm install -g mjctl
mjctl --helpOr run from source in this repo:
npm install
npm run build
node bin/mjctl --helpNotes:
- The CLI is exposed via the npm
binentry (mjctl) with a shebang; runningnode bin/mjctl --helpafter build works locally as well. - Tokens are stored using an encrypted file-based keychain.
- Passwordless authentication (OTP by email).
- Short‑lived access tokens with automatic refresh; tokens are rotated and never echoed.
- Secure token storage:
- Encrypted file keychain (PBKDF2 + AES‑GCM). By default a machine footprint–based passphrase is
used; set
MJCTL_KEYCHAIN_PASSPHRASEin.envfor an even higher level of security.
- Encrypted file keychain (PBKDF2 + AES‑GCM). By default a machine footprint–based passphrase is
used; set
- Local PII redaction:
- When using server-side AI to automatically fill out your profile based on a resume (CV), it is
recommended to first remove your personal identifiable information (PII) locally. See “Redacting
a resume” below or run:
mjctl redact ./resume.pdf
- When using server-side AI to automatically fill out your profile based on a resume (CV), it is
recommended to first remove your personal identifiable information (PII) locally. See “Redacting
a resume” below or run:
mjctl auth login --email you@example.com- Enter the code from your email.
- Check status (optionally):
mjctl auth status
- Create an empty profile (provide title only):
mjctl profiles create --title "Senior Front-End Developer"
- Create a pre-filled profile using AI from a resume:
mjctl profiles create --from-resume ./resume.pdf
- The server returns a draft YAML, which is saved locally (e.g.,
./profile-<ID>.yaml). Edit it in your editor to fill out details. - Save updates back to server:
mjctl profiles save ./profile-<ID>.yaml -y
- Consider creating multiple profiles, each tailored for a specific role or skill set.
- Auto-detect by IP using ip2location.com:
mjctl location set --detect
- Manual (non-interactive):
mjctl location set --country-code US --region "California" --city "San Francisco" -y
- Interactive picker (default if no flags):
mjctl location set
- Show current saved location:
mjctl location show
You will receive an email once the profile is approved and becomes visible to recruiters.
You can redact any personally identifiable information (PII) from your resume locally before using
it in mjctl profiles create --from-resume for maximum confidentiality.
mjctl redact ./resume.pdf- Output:
./resume.redacted.txt./resume.pii.report.json
- Modes: default masking/hash per PII type; PDF mode adds heading-based name detection.
- Review locally before upload.
When a recruiter hires a jobseeker via Mirajobs they pay a commission fee. You can refer jobseekers and recruiters and earn revenue share for each hire.
- Auth
mjctl auth login [--email you@example.com]mjctl auth statusmjctl auth logout
- Profiles
mjctl profiles list [--json]mjctl profiles load <idOrSlug> [--out ./profile-<id>.yaml] [-f]mjctl profiles create [--title "..."] [--from-resume ./resume.pdf] [--out ./profile-<id>.yaml]mjctl profiles save <fileOrId> [--validate-only] [-y]mjctl profiles delete <idOrSlug> [-y]
- Location
mjctl location show [--json]mjctl location set [--detect] [--country-code CC --region NAME --city NAME] [-y]
- Redaction
mjctl redact <file.pdf|txt> [--out ./outputBase]- Produces:
base.redacted.txt andbase.pii.report.json
- Affiliate Program
mjctl affiliate linkmjctl affiliate stats
Environment variables (prefix MJCTL_):
- MJCTL_KEYCHAIN_PASSPHRASE: Optional passphrase for file backend; if unset, a machine-specific default is derived
Variables can be stored in .env file. See src/lib/config.ts for defaults.
- “No auth token found”
- Run:
mjctl auth login --email you@example.com
- Run:
- “Access denied” or token expired
- The client auto-refreshes tokens; re-run or
mjctl auth loginif refresh fails.
- The client auto-refreshes tokens; re-run or
- Keychain decryption failed
- The file backend uses a passphrase. If it changed, you may need to re-login:
mjctl auth logout- Optionally set
MJCTL_KEYCHAIN_PASSPHRASE, then: mjctl auth login --email you@example.com
- The file backend uses a passphrase. If it changed, you may need to re-login:
- Location ambiguity (non-TTY)
- Provide precise --region/--city or run interactively.
- Run locally:
npm run dev(ts-node via tsx) - Build:
npm run build(outputs todist/) - Test:
npm test(Vitest)
MIT — see LICENSE.