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

@alokraj68/ats-resume

v1.0.4

Published

Check that an applicant tracking system can actually parse your resume, and match it against a job description. Zero dependencies, built on the JSON Resume schema.

Readme

ats-resume

Check that an applicant tracking system can actually read your résumé, and whether it matches the posting you are about to apply to.

CI npm version install size tests runtime deps License: MIT Node >=18 JSON Resume Claude Code

Zero dependencies. Built on the JSON Resume schema, so you bring a resume.json you may already have rather than learning another format.

npx @alokraj68/ats-resume lint resume.json
npx @alokraj68/ats-resume tailor resume.json posting.txt

This is not a writing checker

plainspoken asks whether prose reads as machine-written. This asks whether a machine can parse the file at all. The two are deliberately separate tools.

What it checks

Source (resume.json)

  • Contact fields a parser needs, and a location field holding five cities.
  • A promotion chain in the position field — Junior Dev → Developer → Lead parses as one garbled job title.
  • Em and en dashes anywhere in a parsed field.
  • Non-ISO dates. Date extraction is the most fragile part of parsing.
  • Decorative glyphs, invented headings, missing sections.
  • Acronyms appearing without their expansion, and the reverse.
  • How many bullets carry a number.
  • Eight executive signals, reported as questions, not defects — team size, hiring, retention, budget, revenue, scale, delivery speed, strategy.

Extracted text — what an ATS actually receives

pdftotext -layout Sam-Rivera-Resume.pdf out.txt
npx @alokraj68/ats-resume lint out.txt
  • Is there a text layer at all? An image-only PDF scores zero everywhere.
  • Did the standard headings survive?
  • Did the contact block keep its separators? Flexbox gaps do not exist in extracted text, and standalone separator elements can be dropped from a PDF's text layer entirely — leaving one unsplittable string where a parser expected four fields. This looks perfect in the DOM and on screen. Only reading the extraction finds it.
  • Em-dash date ranges, decorative glyphs, keyword stuffing.

Stuffing is measured as density, not as a statistical outlier. On a 700-word document almost any word appearing ten times clears three sigma, which made an earlier version fire on ordinary subject words. Real stuffing sits at 2.5%+ for a single term.

Tailoring

$ npx @alokraj68/ats-resume tailor resume.json posting.txt

match rate  60%  (marginal)

fatal gaps - repeated in the posting, absent from your résumé:
  terraform  (3x in the JD)
  datadog    (3x in the JD)

lead with:
    4 matching terms  Lead Platform Engineer, Northwind

Terms are filtered to things the posting names — a word capitalised mid-sentence is nearly always a technology or a company, while "heavily" and "expected" never are. Without that filter the gap list fills with job-ad boilerplate, and a gap list nobody reads is worth nothing.

The gap list matters more than the score. Each missing term has three honest outcomes: true and unwritten (add it where the work happened), true but weak (mention it once), or not true (leave it out — that is your interview prep list). Only the first is a wording fix.

Exit codes

1 on any error, 0 otherwise. --json for machine-readable output.

Testing

37 tests. Every check is asserted twice: it must fire on a résumé built to break parsing and stay silent on one that is simply well formed.

node test/run.mjs

🧰 Part of craftkit

One of four tools in craftkit. Set all of them up at once, picking only what you need:

npx @alokraj68/craftkit

| | | | |---|---|---| | ✍️ plainspoken | docs | prose that does not read as machine-written | | 📱 pagecheck | docs | pages that survive a phone: overflow, tiny text, tap targets, WCAG AA | | 📄 ats-resume | you are here | a résumé an applicant tracking system can parse, and JD gap analysis | | 🧭 craft-setup | skill only | verify before claiming done; never commit unasked |

The skill ships with this package

skills/tailor-resume/SKILL.md is the judgement half: the calls a linter cannot make. It installs as a Claude Code skill via the marketplace, and it is also in the npm tarball at node_modules/@alokraj68/ats-resume/skills/tailor-resume/SKILL.md, so an agent can read it without the marketplace.

/plugin marketplace add alokraj68/craftkit
/plugin install ats-resume@craftkit

Elsewhere

  • 🛡️ eslint-plugin-typeorm-enterprise — the same principle pointed at TypeORM: block raw SQL, require transactions, guard multi-tenant queries. Not part of craftkit; it fails a build the same way. docs
  • 🌐 alokraj68.in — who writes these, and what they were built for.

Licence

MIT