npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

applymate

v0.4.0

Published

Fills out online job applications from a spreadsheet, or finds matching jobs for you, in your own browser from one profile, with manual review or Brave-mode automatic submission. Works with Claude or free/open models.

Readme

Applymate

Fills out online job applications for you, in your own browser, from one profile. Review submissions yourself, or enable Brave mode for automatic submission.

  • Apply from a list. Upload any job spreadsheet (.xlsx or .csv). Applymate opens each application and fills it in: contact details, work history, education, work authorization, voluntary self-identification, uploads, and short written answers.
  • Or find the jobs first. Searches LinkedIn, Indeed, Glassdoor, Hacker News "Who is hiring", Y Combinator, company careers pages and more for jobs that match your resume, posted in a date range you choose. Duplicates are merged, and each job is scored against your resume.
  • You stay in control. Nothing is submitted, agreed to, or signed without your OK. Pause at any time, fix something yourself, and let it carry on.
  • Free AI works. Use Claude (with an API key, or your own Claude Code login with no key), or a free or open model (Gemini, Groq, OpenRouter, Ollama, any OpenAI-compatible server).

Requirements

  • Node.js 22 or newer (the current LTS)
  • Chrome, Edge, Brave, Chromium, Vivaldi or Opera
  • An AI: a free Gemini key is the easiest start (get one). If you already use Claude Code, you can use its login instead of a key (see below).

Get started

npx applymate

This opens the app at http://localhost:3000. Then follow the "Get set up" checklist:

  1. Settings → AI model: pick a provider and paste your key.
  2. Profile: drop in your resume. The fields fill in; check them and save.
  3. Jobs: upload a job spreadsheet in Settings, or use Find jobs to build one.
  4. Open the browser (button at the top) and log in to your email and job sites once. Applymate uses its own browser profile, separate from your everyday one.
  5. Tick jobs and click Apply. Answer its questions, review each application, and approve the submit. Brave mode can handle supported applications automatically.

To install the command instead of using npx:

npm install -g applymate
applymate

Use your Claude Code login (no API key)

If the claude command is installed and logged in on this computer, Applymate can use it for all of its AI work: filling applications, reading your resume, and scoring jobs. No API key is needed, and usage counts against your Claude plan's limits.

  1. Check it's ready: claude auth status should show "loggedIn": true. If not, run claude, type /login, and follow the steps.

  2. Settings → AI model → "Claude (local login, no key)", then Save & test. Or put this in your .env:

    LLM_PROVIDER=claude-cli
    # MODEL=sonnet           # optional: sonnet (default), opus, haiku, or a full model id
    # CLAUDE_PATH=/path/to/claude   # only if `claude` isn't on your PATH

Applymate runs your own claude program and removes any ANTHROPIC_API_KEY from its environment, so it always uses the login, never a key. If claude is missing or logged out, the settings check and every run stop with a message saying what to do.

Codex CLI and prioritized fallbacks

Install Codex CLI (npm install -g @openai/codex), run codex login, then choose Codex (local login, no key) in Settings. Set CODEX_PATH if the command isn't on the app's PATH. Leave Model blank for Codex's default, or enter a model your account supports. Codex uses the official app-server protocol for text planning; ApplyMate executes every browser action through its existing guard. Resume reading and form planning use Codex too.

Settings has one required primary AI and two optional fallback slots, each with its own model, endpoint and credentials. For example: Claude local login → Codex local login → Gemini. Rate limits, exhausted quota, authentication failures and unavailable providers move to the next configured choice; normal job failures, browser problems, user stops and per-job budgets do not. With a single choice, existing API retries remain enabled. The chosen order is saved; temporary switches do not change your primary setting.

Application fallback keeps the current tab, shared guard, account secrets and saved answers. The new provider checks the existing page before continuing. If a submit action may already have reached the site, the job stops as Needs check instead of falling back and risking a duplicate submission.

Codex runs with an isolated temporary configuration, read-only sandbox and ephemeral thread. It does not inherit your Codex MCP servers, hooks or skills. The app links your existing auth.json without copying or displaying tokens and removes injected OpenAI API-key variables. If your login is stored only in the system keyring, run codex -c cli_auth_credentials_store='"file"' login once so this isolated integration can access it. Codex usage consumes your existing plan or saved CLI credential limits. Live provider entitlement and quota availability are determined when a model request runs.

You can also set the order in .env (one primary plus at most two fallback objects; use single quotes around JSON):

LLM_PROVIDER=claude-cli
LLM_FALLBACKS='[{"provider":"codex-cli"},{"provider":"gemini","model":"gemini-2.5-flash"}]'

Fallback API keys can use the provider's usual environment variable. Settings also saves separate credentials per slot and never returns the keys to the browser. Keep .env private.

How it fills applications

Each form page is read in code. Fields that match your profile (name, email, address, links, work authorization, education, experience, self-identification…) are filled by code, without the AI. Only unusual questions go to the AI, in one request per page. Every filled value is then read back from the page to check it stuck; anything that didn't is reported, never counted as filled. On sites it has seen before, it remembers which field means what and gets faster.

Profile answer memory. Reusable manual answers are saved with a category and context. Compatible questions use them automatically; uncertain matches show a previous answer for you to review. Country, currency, employer, and role prevent answers being copied into unrelated applications. The Saved answers tab lets you correct, categorize, scope, or delete them. Recognized personal answers entered during an explicit browser takeover are learned too. Existing answers files migrate on save. See profile memory for supported matching and browser-capture details.

Always on the company's own site. If a job's link is a job board (LinkedIn, Indeed, Glassdoor…), Applymate first finds the original posting on the company's careers page or application system (Greenhouse, Lever, Ashby, Workday…) and applies there, never through the board and never with "Easy Apply". It never logs in to job boards: it uses only what's public (the board's "Apply on company site" link, the company and title, the company's careers page and job board, a web search) and accepts a match only when the title and company agree. The Jobs tab keeps the matched application link and the discovered company career-page link. Missing sites/pages/jobs, ambiguous matches, and closed postings have clear reasons; you can paste the correct posting link. Saved matches are tied to the job identity and checked for closure before applying.

Career sites, found early and checked on demand. While finding jobs, Applymate works out where to apply for each match using only cheap steps (the listing's own link, the company's job board, its website and careers page, Taleo's public search): the exact application page when it can, else the careers site or website. The Jobs tab shows it in the Career site column. Find career sites is the manual check: it asks before re-checking jobs that already have one, and falls back to web search and AI browsing (a logged-out browser; the AI can't apply or sign in, and its answer is verified on the page). When only the careers site is known, Apply starts there and looks for the job; it says "Job not on site" only after looking. Turn the AI step off with POSTING_AI=0.

Submitted jobs are tracked and never applied to twice. When the AI submits an application (or you mark one submitted), it is recorded in data/applied.json, outside any spreadsheet, and the spreadsheet's Status becomes "Applied". That record follows the job, not the row: the same job on another row, from another job board, in a new or replaced spreadsheet, or re-found by Find jobs is treated as already submitted (it is not offered, not added, and not run). The Jobs tab filters show every state with counts: Not applied yet, Needs you, Submitted, Skipped, Removed. If you set a job's status to something other than Applied, it is forgotten and can be applied to again. "Start fresh → job spreadsheets" also clears this history.

Nothing starts by itself. Brave mode and automatic submission only change what happens inside a run you started with Apply Selected, Apply All Remaining or Re-run Selected; selecting a job never applies to it. Skip All can be undone with Undo Skip, which restores each job to how it was before.

Verification codes and CAPTCHAs come to you. When a site emails or texts a code (or a sign-in link), the job pauses and the Jobs tab asks you for it, naming the site; type it in and the AI carries on. CAPTCHAs and "are you human" checks are never solved by the AI; you're asked to do them in the browser. Each wait times out after 10 minutes (CODE_TIMEOUT_MIN, HANDOFF_TIMEOUT_MIN), or you click Skip this job for now: the job is set aside as "needs me" and the queue moves on.

"Why do you want to work here?" answers are researched on the employer's own site and shown to you, with sources, before anything is submitted.

Safety

  • Every commit needs you. Submit, Apply, Agree, Certify and accepting dialogs ask first. The final submit is always your decision.
  • Secrets are off-limits. The AI can't type into password, SSN, bank or card, or ID-number fields.
  • Uploads only from your documents folder. A government ID copy is uploaded only when a site requires one, and only after you say yes.
  • Brave mode (optional, off by default) enables automatic application submission and account handling on the company's own application site (Workday, Taleo, iCIMS…), never on job boards. It uses your profile email and an app-generated password saved in your Mac's Keychain (on Linux/Windows in data/accounts.secret.json, readable only by you). The AI never sees the password. Existing saved accounts are reused. Brave mode never starts an application by itself: nothing is applied to until you click Apply Selected (or Apply All Remaining / Re-run Selected). Inside a run you started, supported applications are submitted without a review prompt, up to the daily cap (default 5). CAPTCHAs and verification codes still reach you; missing information is flagged rather than guessed. Stop autopilot persists across restarts. You can turn automatic submission off while keeping account handling on.
  • Dry run fills and checks everything but never submits or asks you anything: a safe way to try it on real jobs.

Your data

Everything stays on your computer, in ~/.applymate: settings and API keys, profile, documents, spreadsheets, history, browser logins. Set APPLYMATE_HOME to use another folder. Nothing is sent anywhere except:

  • to the AI provider you choose (the form questions and the parts of your profile needed to answer them), and
  • to the websites you apply on.

Settings → Start fresh deletes any of it, as if the app were just installed.

Command line

applymate                          # the web app
applymate apply --ids 3,5          # apply to specific jobs (--dry-run: never submit)
applymate find --suggest --days 30 # find matching jobs posted in the last 30 days
applymate jobs                     # list jobs and their status
applymate check                    # check your setup
applymate browser                  # open the automation browser

Add --file <path> to any of them to use a specific spreadsheet.

Options

The app sets these for you. Set them yourself only for special cases.

| Variable | Meaning | |---|---| | APPLYMATE_HOME | Where your data is kept (default ~/.applymate) | | UI_PORT | Port of the web app (default 3000) | | BROWSER / BROWSER_PATH | Which browser to use, or the path to any Chromium-based browser | | LLM_PROVIDER, MODEL, LLM_BASE_URL | AI provider, model, and server URL (e.g. your own router). LLM_PROVIDER=claude-cli uses your Claude Code login | | CLAUDE_PATH, CODEX_PATH | Path to the local CLI program, if it isn't on your PATH |

Limits

  • Built and tested on macOS. Windows and Linux should work, but haven't been tested yet.
  • Human checks go to you. CAPTCHAs, text-message codes and "are you human?" checks always need you.
  • Model size matters. Small local models handle simple forms but struggle on complex sites like Workday. Use a large model for real applications.
  • Only readable resumes. A resume that's a scanned image can't be read. Upload a Word or text version instead.

License

MIT. See the LICENSE file included with the package.