pupila AGENTS.md

Project instructions for Pupila, a configurable job-listing aggregator. It collects listings from public job boards and feeds, filters and scores them, removes duplicates, and writes files such as a job table and RSS feed.

In plain words
What is it for?
Use them when running the project, adding or changing job sources, adjusting candidate-fit scoring and filters, or working with the generated jobs, RSS, and Markdown files.
Why use it?
They explain how the repository is organised and how its daily job-collection process works. This helps an AI assistant change the project without breaking its fetchers, filters, scoring, or generated output.

Instructions file for CodexOpenCode

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add instructions/franrom/pupila/agents-md
Clone the repo
git clone --depth 1 https://github.com/FranRom/pupila

Made for: Codex, OpenCode.

Per session 9,832 This file is loaded in full into every session.
When invoked 9,832 The same file — it is already loaded in full.
Security scan A 1 finding. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.09832 $0.09832
Opus 5 $0.04916 $0.04916
Sonnet 5 $0.01966 $0.01966
Haiku 4.5 $0.00983 $0.00983

Measured 3d ago against content hash 90ad46ce1b81, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

pupila AGENTS.md scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

curl -sI "https://api.ashbyhq.com/posting-api/job-board/<slug>?includeCompensation=true"
AGENTS.md · 403 lines

How it starts

The opening of the file, as written. The whole thing — 403 lines — stays where its author put it; the contents beside it link to each section on GitHub.

AGENTS.md

Guidance for future Codex sessions working in this repo.

Overview

pupila is a config-driven, forkable daily job aggregator. It fetches listings from 13 public sources (3 ATS APIs — Ashby, Greenhouse, Lever — plus RSS feeds, JSON job boards, Hacker News, HTML scrapers, an Aave Next.js scraper, and ashby-private — a config-driven fetcher for orgs hosted on Ashby with the public posting-API disabled), normalizes them, applies hard exclusion filters, computes a per-job fitScore, deduplicates, and writes data/jobs.json, an RSS feed at data/feed.xml, and an auto-regenerated JOBS.md table. The hand-written README.md is the project doc and is not rewritten by the pipeline. No external services. No DB. Output lives in this repo.

The repo ships a neutral template in config/profile.json. After onboarding (CV upload → brief generation), /api/profile-generate shells out to the local LLM CLI to fill in the personal keyword lists + weights based on the brief. Re-runnable from Settings → Scoring profile → Regenerate. config/slugs.json ships with the full ~50-company tier-S list (all public ATS URLs — non-personal data, edit by hand to add/remove companies).

First-run UX: a forker generates their config/candidate-brief.md by running pnpm run setup-brief --file ~/cv.pdf (or via the UI's Profile tab → drop a PDF/DOCX/MD CV). That CLI shells out to whichever local LLM CLI is installed (Codex, codex, gemini, opencode — auto-detected, override via PUPILA_LLM=<provider>).

Stack

  • Node 22 LTS, ESM, TypeScript 5.9 (NodeNext)
  • Biome 2.4 (lint + format, single config in biome.json)
  • pnpm 10
  • Vitest 3 (tests in tests/, run via pnpm test — 120 cases)
  • simple-git-hooks (pre-commit lint && typecheck)
  • Single runtime dep: fast-xml-parser. Native fetch only.

Run locally

pnpm install                # also installs the pre-commit hook
pnpm run dev                # tsx, no build step (this is what the launchd/cron aggregate agent runs)
pnpm start                  # built output: requires pnpm run build first
pnpm run typecheck          # tsc --noEmit on src/, then on src/+tests/ via tsconfig.test.json
pnpm run lint               # biome check
pnpm run lint:fix            # biome check --write
pnpm test                   # vitest run (120 unit tests)
pnpm run test:watch         # vitest watch mode
pnpm run ui                 # local-only UI: Vite dev server on http://127.0.0.1:5173, reads data/jobs.json
pnpm run ai-review          # local-only: shells out to `Codex -p` to write data/ai-reviews.json
pnpm run ai-review --top=50 # raise the per-run cap (default 20 highest-fitScore unreviewed)
pnpm run ai-review --force  # re-review entries that already exist
pnpm run ai-review --ids=a,b # review specific job ids only
pnpm run setup-brief --file ~/cv.pdf  # generate config/candidate-brief.md from a CV (PDF/DOCX/MD/TXT)
pnpm run daily              # convenience: pnpm run dev && pnpm run ai-review (morning routine)

Read the full file on GitHub · 403 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 3d ago First seen · 403 lines · 9,832 tokens per session scan A 90ad46ce1b81

Subscribe to this mod's changes

pupila AGENTS.md is an instructions file published in the GitHub repository FranRom/pupila (35 stars, last pushed 2mo ago), licensed MIT. It adds 9,832 tokens to every session, about $0.0492 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.