Model connection

Eregion reads .env in the project folder. Variables set in your shell override it. Restart the server after changing settings.

VariableDefaultPurpose
LLM_MODEL_IDRequiredMain model for chat, planning, writing and verification
LLM_API_KEYProvider defaultAPI credential for your provider
LLM_BASE_URLClient defaultCustom OpenAI-compatible endpoint
LLM_TIMEOUT45 sTimeout for one provider request
LLM_MAX_RETRIES0Client retry setting
LLM_FAST_MODEL_IDMain modelOptional model for routine actions
LLM_EXTRACTION_MODEL_IDMain modelOptional model for extraction and matching
LLM_AGENT_REASONINGUnsetnone to high, if your provider supports it
LLM_EXTRACTION_REASONINGUnsetSame, 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.

SourceSetupNotes
Company boardsNone118 Greenhouse, Lever, Ashby and Workday boards, each verified through its public API
LinkedIn (local MCP server)One-time sign-inRead-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 textNonePaste it in chat, or use Eregion Lens on any job page

Set up LinkedIn

  1. Install the pinned mcp-server-linkedin==4.27.0 in its own environment
  2. Copy docs/examples/linkedin-mcp.json, adjust the paths, and point MCP_CONFIG_PATH at it in .env
  3. Sign in once with the server's --login mode in a separate browser profile, never your everyday one
Indeed is not available. Indeed's MCP server only accepts allow-listed clients. Full steps and every setting are in the configuration guide.

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.

Time to score fitSeconds per job · same scale

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
VariableDefaultPurpose
TYPESAFE_ENABLEDfalseJev fit scoring for chat, quick analysis and saved jobs, plus option mapping and job screening
TYPESAFE_CAREER_ENABLEDfalseAlso memory, question and evidence helpers. Needs the switch above
TYPESAFE_FIT_MODELjev-1.13.0Exact Jev release for fit scoring
TYPESAFE_FIT_TIMEOUT12 sPer fit request, 0.1–60 s, no automatic paid retries
TYPESAFE_FIT_CACHE_PATHNext to the databaseLocal 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.

VariableDefaultPurpose
JOB_AGENT_DATABASE_URLsqlite:///./job_agent.dbDatabase for the server and migrations
JOB_AGENT_APPLY_WORKERS3Application workers, 1–8
JOB_AGENT_MAX_OPEN_APPLICATIONS6Unfinished applications allowed at once
JOB_AGENT_HIDDEN_BROWSERoffscreenoffscreen or headless Chrome
JOB_AGENT_BROWSER_CHANNELchromePlaywright channel; the default uses installed Chrome
JOB_AGENT_ANALYSIS_WARMUP1Pre-analyse an uploaded resume; 0 turns it off
JOB_AGENT_ALLOWED_HOSTSLoopback onlyExtra 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 guideCovers
Using EregionDaily workflow, approvals, saved answers, alerts and recovery
ConfigurationEvery setting, browser options, data and updates
Agent architectureLoop, evidence, context, persistence and browser workers
Evaluation reportHow Eregion was tested and what the results showed
Jev and performanceMeasurements, caveats and how to reproduce them
DevelopmentRepository layout, checks and contributing