Shobr: Job seach CLI via browser automation, event-sourcing, LLM Developer Sebastian Carlos released Shobr, an open-source job-search automation CLI that drives a user's own authenticated daily-driver browser via the beachpatrol Playwright wrapper rather than a headless browser, keeping the final application submit human-in-the-loop. Shobr stores all discovered jobs, screenings and tracking data in append-only JSONL event logs projected into state files, uses the any-llm abstraction to stay LLM-provider-agnostic, and compiles Markdown resumes to ATS-readable PDFs through Groff and Pandoc. The project requires Python 3.14 or later with uv, plus groff and pandoc, and totals roughly 3,500 lines of code including comments. The stealthiest, UNIX-iest, Job Search Automator, with a Hacker-in-the-Loop approach. demo.mp4 In 2026's job market, there are many job application automation tools, some of them FOSS. This one's mine, and relies on: - beachpatrol https://github.com/sebastiancarlos/beachpatrol for browser automation of your own daily-driver browser , and - roffume https://github.com/sebastiancarlos/roffume for resume files management. - Daily-Driver Stealth: We don't use headless browsers. SHOBR uses beachpatrol https://github.com/sebastiancarlos/beachpatrol to drive your existing, authenticated browser. To LinkedIn, you are just a normal user clicking around. - Human-in-the-Loop: SHOBR prepares, proposes, and verifies. It writes the drafts and builds the PDFs, but the final application submit is always done by you. This is no "spray and pray" , but you can still pray to any API-compatible deities. - LLM-light By Design: Automated, high-quality tuning of resume to job requires some LLM, there's not much leeway around it. But this project uses as little LLM as possible , and doesn't demand an Agent driver like other projects in this space . If you want more, it should be trivial to ask an LLM to write a SKILL or an MCP server on top of SHOBR. - LLM-provider-Agnostic: Uses an LLM abstraction any-llm https://github.com/mozilla-ai/any-llm . So, you can run SHOBR's LLM steps on OpenAI, Anthropic, a local model, or hijack a local LLM agent subscription via faaah https://github.com/sebastiancarlos/faaah . - Event-Sourced Data: All data discovered jobs, screenings, tracking is saved in append-only JSONL event logs and projected into state files. You can interrupt the pipeline, or recompute lead approval with new rules, at any time without data loss. - Markdown-Based CV Toolchain: Resumes are tailored in Markdown and compiled to ATS-readable PDFs via Groff and Pandoc . All deliverables are put in per-application folders. - Full E2E Red-Green TDD: Built with the stdlib's unittest , no extra framework. - Not Vibecoded : 3500 LOC including comments at time of writing. Somewhat atypical in this space. The one hard requirement of this project is beachpatrol https://github.com/sebastiancarlos/beachpatrol . You can think of it as a browser that you're meant to use as your daily driver, but which is also fully automatable via a clever "Playwright wrapper" approach . Why beachpatrol ? Well, job search requires scraping. Ideally scraping done using your actual authenticated credentials . So, what better way to avoid detection than using your actual daily-driver browser to do the scraping ? It should be virtually identical to regular use, provided you don't break any ToS . Other "job search automation tools" either use unauthenticated requests or headless browsers, or ask you to extract / copy your authenticated credentials into their automated browsers. Our beachpatrol approach aims to do them all one better by using your actual daily-driver browser . If you're interested, see beachpatrol's README https://github.com/sebastiancarlos/beachpatrol . With beachpatrol already setup, shobr requires Python = 3.14 with uv https://docs.astral.sh/uv/ : git clone https://github.com/sebastiancarlos/shobr cd shobr uv sync install the single runtime dependency, any-llm-sdk openai uv tool install . Put the shobr CLI on PATH shobr --help Because SHOBR leverages roffume to compile Markdown resumes into PDFs, you will need some standard Unix text-processing tools on your system: groff and pandoc . Then, in order: 1. Run shobr setup to scaffold the SHOBR config file under $XDG CONFIG HOME/shobr/config.toml , the profile templates, and to make shobr 's own beachpatrol commands available to beachpatrol by symlinking them into the expected folder . Fill the config in. 2. Ensure you have one beachpatrol profile which is logged into LinkedIn. Put that beachpatrol profile name in config.toml on the beachpatrol profile key. 3. For the parts of SHOBR requiring LLMs, any-llm-sdk reads provider keys from env OPENAI API KEY , SHOBR AI MODEL , and OPENAI BASE URL . Naturally, you can use any LLM API provider you want through any-llm-sdk or even hijack a locally available LLM agent subscription by using faaah https://github.com/sebastiancarlos/faaah . 4. For the parts of SHOBR requiring to read your main CV , you can refer to it via the env SHOBR MAIN CV PATH or see next step . 5. For the parts of SHOBR requiring authoring CVs and application directories, you need to configure a CV toolchain. - The first time you reach the tailor step, shobr will offer to clone the latest roffume https://github.com/sebastiancarlos/roffume release into ~/shobr-resumes or point cv toolchain dir in config.toml at an existing checkout . This folder will keep track of all your resume variation inputs markdown and outputs PDFs . - Then, the main CV defaults to