Model connection
Eregion reads .env in the project folder. Variables set in your shell override it. Restart the server after changing settings.
| Variable | Default | Purpose |
|---|---|---|
LLM_MODEL_ID | Required | Main model for chat, planning, writing and verification |
LLM_API_KEY | Provider default | API credential for your provider |
LLM_BASE_URL | Client default | Custom OpenAI-compatible endpoint |
LLM_TIMEOUT | 45 s | Timeout for one provider request |
LLM_MAX_RETRIES | 0 | Client retry setting |
LLM_FAST_MODEL_ID | Main model | Optional model for routine actions |
LLM_EXTRACTION_MODEL_ID | Main model | Optional model for extraction and matching |
LLM_AGENT_REASONING | Unset | none to high, if your provider supports it |
LLM_EXTRACTION_REASONING | Unset | Same, for the extraction model |
The model must support tool calling and structured output. Visual browser backup also needs image input.
Job sources
Searches use public company boards and, once you set it up, LinkedIn. No paid search key is needed.
| Source | Setup | Notes |
|---|---|---|
| Company boards | None | 118 Greenhouse, Lever, Ashby and Workday boards, each verified through its public API |
| LinkedIn (local MCP server) | One-time sign-in | Read-only search and job details; 26 calls per task, or 50 for larger searches. Stops on sign-in or rate-limit problems |
| A link or job text | None | Paste it in chat, or use Eregion Lens on any job page |
Set up LinkedIn
- Install the pinned
mcp-server-linkedin==4.27.0in its own environment - Copy
docs/examples/linkedin-mcp.json, adjust the paths, and pointMCP_CONFIG_PATHat it in.env - Sign in once with the server's
--loginmode in a separate browser profile, never your everyday one
Jev fast fit scoring
Optional. With Jev on, fit scoring uses Typesafe's Jev decision model alone, batches up to sixteen jobs, and caches decisions on your computer. Conversation and writing still use your main model.
Jev: 150 real postings scored inside 13 live searches (October 14), 2.1 Jev requests each and none failed; time is the sum of every Jev request. Main model: one synthetic job, cold (October 9). Measurements and caveats
TYPESAFE_API_KEY=your-typesafe-key
TYPESAFE_BASE_URL=https://api.typesafe.ai
TYPESAFE_DEFAULT_MODEL=jev-latest
TYPESAFE_ENABLED=true
TYPESAFE_CAREER_ENABLED=false
| Variable | Default | Purpose |
|---|---|---|
TYPESAFE_ENABLED | false | Jev fit scoring for chat, quick analysis and saved jobs, plus option mapping and job screening |
TYPESAFE_CAREER_ENABLED | false | Also memory, question and evidence helpers. Needs the switch above |
TYPESAFE_FIT_MODEL | jev-1.13.0 | Exact Jev release for fit scoring |
TYPESAFE_FIT_TIMEOUT | 12 s | Per fit request, 0.1–60 s, no automatic paid retries |
TYPESAFE_FIT_CACHE_PATH | Next to the database | Local decision cache |
- Decisive answers are cached for 24 hours, uncertain ones for 5 minutes
- Undecided requirements stay unresolved and the score becomes a range
- No fallback to the main model: if Typesafe fails, scoring fails
- Sends extracted resume text, the job description and scoped facts. Inputs over 60,000 bytes are rejected, not truncated
Browser and workers
These are read from the shell environment, not .env. Set them before running migrations and the server.
| Variable | Default | Purpose |
|---|---|---|
JOB_AGENT_DATABASE_URL | sqlite:///./job_agent.db | Database for the server and migrations |
JOB_AGENT_APPLY_WORKERS | 3 | Application workers, 1–8 |
JOB_AGENT_MAX_OPEN_APPLICATIONS | 6 | Unfinished applications allowed at once |
JOB_AGENT_HIDDEN_BROWSER | offscreen | offscreen or headless Chrome |
JOB_AGENT_BROWSER_CHANNEL | chrome | Playwright channel; the default uses installed Chrome |
JOB_AGENT_ANALYSIS_WARMUP | 1 | Pre-analyse an uploaded resume; 0 turns it off |
JOB_AGENT_ALLOWED_HOSTS | Loopback only | Extra accepted Host names. Not authentication |
# macOS / Linux: headless Chrome, two workers
export JOB_AGENT_HIDDEN_BROWSER=headless
export JOB_AGENT_APPLY_WORKERS=2
python -m uvicorn eregion.api.main:app --host 127.0.0.1 --port 8000
Data and privacy
The local database holds your details, conversations, evidence, application state and model-usage records. Treat it as personal data, and stop the server before copying it as a backup.
- The server listens on 127.0.0.1 only. It is a single-user app with no sign-in
- Model requests contain the resume, job, answer or document content a task needs
- On Windows, site logins are kept with DPAPI encryption, scoped to you and the site
- Screenshots reach your model only when visual browser backup is on
Good to know
- Some sites need you
- Login walls, unusual widgets, MFA and CAPTCHA can pause the agent.
- Scores describe evidence
- A match score reflects your resume, not an employer's decision.
- Review before you send
- Materials are checked against sources; read them anyway.
- Text PDFs only
- Scanned resumes need text extraction first.
Evaluation
Eregion is tested with four synthetic applicants: a junior data analyst in New York, a senior backend engineer for remote US, an ML intern in California, and a junior UX designer in Austin. Live runs have fixed budgets and never apply or create schedules. A person reviewed one full set of results by hand.
- Shown jobs
- 0 of 23 were wrong in the human review. The latest runs showed 123 jobs with 0 structural errors.
- What to show
- 28 of 29 labelled postings were shown or hidden the way the reviewer wanted.
- Tiers
- About two in three match the reviewer; most misses are one tier apart.
- Known limits
- The agent often stops searching early and offers to continue. Scoring accuracy against human labels is not measured yet.
The evaluation report summarises everything that was tested, including what failed along the way.
Updating
Stop the server and back up your data, then from the project folder:
git pull --ff-only
python -m pip install -r requirements.txt
python -m alembic upgrade head
python -m uvicorn eregion.api.main:app --host 127.0.0.1 --port 8000
Reload the Eregion Lens extension after updating. Never delete the database to fix a migration error.
How it works inside
One shared agent loop runs every autonomous task: chat, scheduled searches and applications. It chooses tools and the order of work. Code checks what the model cannot be trusted to judge alone: quoted evidence must appear in the posting, budgets are enforced, and approvals and the final submit stay with you.
Read the architecture notes for the loop, context and persistence details.
Development
python -m pytest -q
node --test "tests/*.mjs"
| Full guide | Covers |
|---|---|
| Using Eregion | Daily workflow, approvals, saved answers, alerts and recovery |
| Configuration | Every setting, browser options, data and updates |
| Agent architecture | Loop, evidence, context, persistence and browser workers |
| Evaluation report | How Eregion was tested and what the results showed |
| Jev and performance | Measurements, caveats and how to reproduce them |
| Development | Repository layout, checks and contributing |