{"_id":"@alokraj68/ats-resume","_rev":"8-f89ce00c87c0d3b9208149aed74e5fbc","name":"@alokraj68/ats-resume","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@alokraj68/ats-resume","version":"1.0.0","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.0.0","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"9a501a1fd0d87e2b67704d7edaeb6c4480ab39d9","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.0.0.tgz","fileCount":8,"integrity":"sha512-vHl8ONRZdCnPKs8zOcKxbomt6tplfOjcUv3xr0bURRkKtjQ39d8V7C+n8nciVs74ZeD7IT3xT9p3w67oSCBPPg==","signatures":[{"sig":"MEYCIQC0EdEv3z5DaoSauv+1lW4NpydDOyG6mKNZuKnag9pGagIhAMfieBNCCbDw3j1mDCqalnHi95C+5CGZ6bQ5p8CsQ/IG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40501},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"gitHead":"05c9fa12e71b85f896cdc473dcbc391104ad9fbe","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"alokraj68","email":"alokraj68@gmail.com"},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"11.13.0","description":"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.","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.0.0_1787120589549_0.6201566060458412","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@alokraj68/ats-resume","version":"1.0.1","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.0.1","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"9a78eb3002c313cba4b6510bf118cc702caa492d","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.0.1.tgz","fileCount":8,"integrity":"sha512-c6Au9ZZUyi4tUlypotW72tgI1C1TQq2kaohbmt0KEckyCCRwNQoA1/R64IDCf2CfdsO7ibjDkOklVykrsexe9A==","signatures":[{"sig":"MEUCIQCPIcr3OdQHVxiJZwvxdUuk5V33omAUaISwgiJ7jqUuwgIgdhiWfv7DGOZEl8+A5uWAPx4lF5ru+tLWI/bDAq1MSb8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":40501},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"gitHead":"600f7b29b2ee878679b6f46db6e1e15c7d1606a4","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.0.2","description":"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.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.0.1_1787122725064_0.5486973918341793","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@alokraj68/ats-resume","version":"1.0.2","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.0.2","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"776f59e03750d03f1b65ad4d21c6c67a856372ae","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.0.2.tgz","fileCount":8,"integrity":"sha512-Hm8RyB0ru+p/xDtMoxlnMtBatnm4PrGRAYC7ySGRbiw8fhLfpnW4WRGy5Sq18HpuDBj+q+/25kjGyW6XM6B55g==","signatures":[{"sig":"MEYCIQDzOnBc/7RI37pbXng5GpkhuEXj/5PzG/cMs8roHQ4CYAIhAKmZ94Es35MHUq5fYIvEPSbfm+2J9kwGcaHrd0sM5JG8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":41503},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"gitHead":"8daf28449d234ea33b996e4d9c1ce08eac72402e","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.0.2","description":"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.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.0.2_1787143272496_0.7284253635551399","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@alokraj68/ats-resume","version":"1.0.3","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.0.3","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"445ed3752b6b596fe7968fe8b8aa444b15cb994d","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.0.3.tgz","fileCount":8,"integrity":"sha512-l0+LUwB4f7BRuEyZYBpVie0wRQ710dxDTfZkx/mDZvCt5HDiUhBT0ww7QlKCccDrcK3XUHkjJmAjc4e+HO1+GA==","signatures":[{"sig":"MEUCIQCRfvTEN83qLPj1wHXcVLsG5cY6jnBm7ShlfbYp/pdBfgIgOMvQr4ORDdVgugF1zyw+ASyCO3DqEs/kgxp5v/08uD4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":41503},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"gitHead":"6a104567001eecde56da879ba1c2b957654dc8b1","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.0.2","description":"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.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.0.3_1787147474837_0.9962707472894032","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@alokraj68/ats-resume","version":"1.0.4","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.0.4","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"a1879b1f8ff851e50c7c76857a1db8e156530ad9","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.0.4.tgz","fileCount":8,"integrity":"sha512-t/wi4d/L+zxfMPzu33jDoZx/Qtl7aNtF8GA/x6SNtaaQb09nrCqPtinmF01I6XU70cKku0ZxJxchfzI5fKwAsw==","signatures":[{"sig":"MEYCIQC6HhErIehypKZ87nyHoa1GOV7H/m3rWkPC9pgi4FAPOQIhAPfj3QpWCLItx8Y/DwvhmKryYgNOJ3PzEKxdLFHNt7n1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42165},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"funding":[{"url":"https://github.com/sponsors/alokraj68","type":"github"},{"url":"https://buymeacoffee.com/alokraj68","type":"buymeacoffee"}],"gitHead":"3441a627b3328561f493710d37efd93a23066626","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.0.2","description":"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.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.0.4_1787150854407_0.6401849720732102","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@alokraj68/ats-resume","version":"1.0.5","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.0.5","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"d18ff464dcc318f7862c2d71559817cca634f340","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.0.5.tgz","fileCount":8,"integrity":"sha512-Yj7G8luBsrKBohYqSa2acxQRHdjtftAR3MsKbx0UEr8k1Vbqjxp+ZAC9B9oeSmM+vrtlbk7U4bd0H3xpHZglnA==","signatures":[{"sig":"MEQCIG4zpyoOaTneYIA5wmTm81E9pVJItWVK/aYlI4SWuL0uAiAn0lxms84T49oU97HIRXrDR0TLw17Xr6FKPlQomlQYcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDxIFcHPHUeOiOWcVbT4lWdN/5r1FnIn66i/Tjb8WbkXwIhANCwdbmGdpNOG8qkzpd7XEkO/cU7dT0RHWj2/s5eb6l6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":42165},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"funding":[{"url":"https://github.com/sponsors/alokraj68","type":"github"},{"url":"https://buymeacoffee.com/alokraj68","type":"buymeacoffee"}],"gitHead":"95411314b7c02304acf9fb88813ef1a082a2d07c","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.0.2","description":"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.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.0.5_1789916488038_0.7339150714562908","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alokraj68/ats-resume","version":"1.1.0","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code"],"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","_id":"@alokraj68/ats-resume@1.1.0","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"homepage":"https://github.com/alokraj68/craftkit#readme","bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"bin":{"ats-resume":"bin/ats-resume.mjs"},"dist":{"shasum":"b893acfb294b88781652458728657d4cb269a29e","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.1.0.tgz","fileCount":9,"integrity":"sha512-SzmSyUrdyN6hCClCI4Q7SiAQDvBz93MiQgSAF8wFIK/zw93OCkzbgPGgb+AM+P/PGunOL5OHFvrv5wdUjXdqlw==","signatures":[{"sig":"MEQCIGoc7xvTBvgBibQaGSxfJcRojXJRziPPaSfwCoAdvitZAiAD/53HUqYhNkiS8sdUjHPs27S1/iqcQGMd9GJRjvf+5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDt4z/kzJihbaqkTFQ0pgfE4pRcVSZOmNq7NY+wJCGPeAiAc7nH5frA6q1aIFyYNmZWVkU1y6oI2X2iftYpptazQJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":52111},"type":"module","engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"funding":[{"url":"https://github.com/sponsors/alokraj68","type":"github"},{"url":"https://buymeacoffee.com/alokraj68","type":"buymeacoffee"}],"gitHead":"badfe0f536ce7f34416e0175537def1a6db8f767","scripts":{"test":"node test/run.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.1.0","description":"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.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ats-resume_1.1.0_1790269152704_0.08848734758764953","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"_id":"@alokraj68/ats-resume@1.1.1","bin":{"ats-resume":"bin/ats-resume.mjs"},"bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"dist":{"shasum":"ead70f69d03ea8c9cceb8977a8ee60ed3a8050cf","tarball":"https://registry.npmjs.org/@alokraj68/ats-resume/-/ats-resume-1.1.1.tgz","fileCount":9,"integrity":"sha512-WeBqvyH6ia73OfBoxo+ws3iCObYenbZ4VxvQCv596dVqcMuECC5ylfdTnzOmc6dKsafovSDeIUVC6SA4vt1Vgw==","signatures":[{"sig":"MEYCIQCXAVM7fnrgzbQWbMpW/Cy9diuBTj6QVEbB0q83tF0nfQIhALaL9TSpkOhVfjO8zSJldkOieucyGsquNjLbalcb/Fci","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD/ote7UkHCOyDBjun+50Vs2Jj0XGrjHM7ROZafXVZyFwIgdUrzKpgPdkSScEwFlK+zVJIcVOfS7jptlBz4XNwv9Xs="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@alokraj68%2fats-resume@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":53065},"name":"@alokraj68/ats-resume","type":"module","author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"engines":{"node":">=18"},"exports":{".":"./src/lint.mjs","./rules":"./src/rules.mjs","./normalize":"./src/normalize.mjs"},"funding":[{"url":"https://github.com/sponsors/alokraj68","type":"github"},{"url":"https://buymeacoffee.com/alokraj68","type":"buymeacoffee"}],"gitHead":"edcfb6387391328577f152c0b2ca84735fc19ac0","license":"MIT","scripts":{"test":"node test/run.mjs"},"version":"1.1.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cf439641-f4b7-484d-a970-c32e99fbeaae"}},"homepage":"https://alokraj68.in/ats-resume","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code","resume-parser","resume-checker","cv-checker","job-application","recruiting","ats-friendly","resume-optimization"],"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"_npmVersion":"12.1.0","description":"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.","directories":{},"maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ats-resume_1.1.1_1790298872601_0.6440406519165551"}}},"time":{"created":"2026-08-19T06:23:09.411Z","modified":"2026-09-25T01:14:33.037Z","1.0.0":"2026-08-19T06:23:09.697Z","1.0.1":"2026-08-19T06:58:45.237Z","1.0.2":"2026-08-19T12:41:12.669Z","1.0.3":"2026-08-19T13:51:15.016Z","1.0.4":"2026-08-19T14:47:34.552Z","1.0.5":"2026-09-20T15:01:28.135Z","1.1.0":"2026-09-24T16:59:12.788Z","1.1.1":"2026-09-25T01:14:32.693Z"},"bugs":{"url":"https://github.com/alokraj68/craftkit/issues"},"author":{"url":"https://alokraj68.in","name":"Alok Rajasukumaran"},"license":"MIT","homepage":"https://alokraj68.in/ats-resume","keywords":["resume","cv","ats","applicant-tracking","json-resume","job-search","linter","claude-code","resume-parser","resume-checker","cv-checker","job-application","recruiting","ats-friendly","resume-optimization"],"repository":{"url":"git+https://github.com/alokraj68/craftkit.git","type":"git","directory":"plugins/ats-resume"},"description":"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.","maintainers":[{"name":"alokraj68","email":"alokraj68@gmail.com"}],"readme":"# ats-resume\n\nCheck that an applicant tracking system can actually read your résumé, and\nwhether it matches the posting you are about to apply to.\n\n[![CI](https://github.com/alokraj68/craftkit/actions/workflows/ci.yml/badge.svg)](https://github.com/alokraj68/craftkit/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/%40alokraj68%2Fats-resume.svg?logo=npm&color=0b7285)](https://www.npmjs.com/package/@alokraj68/ats-resume)\n[![install size](https://packagephobia.com/badge?p=@alokraj68/ats-resume)](https://packagephobia.com/result?p=@alokraj68/ats-resume)\n[![tests](https://img.shields.io/badge/tests-49-2EA043.svg)](#testing)\n[![runtime deps](https://img.shields.io/badge/runtime%20deps-0-2EA043.svg)](#)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![Node >=18](https://img.shields.io/badge/Node-%3E%3D18-339933.svg?logo=node.js&logoColor=white)](https://nodejs.org)\n[![JSON Resume](https://img.shields.io/badge/schema-JSON%20Resume-blue.svg)](https://jsonresume.org)\n[![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-D97757.svg)](https://github.com/alokraj68/craftkit)\n\nZero dependencies. Built on the [JSON Resume](https://jsonresume.org) schema, so\nyou bring a `resume.json` you may already have rather than learning another\nformat.\n\n```\nnpx @alokraj68/ats-resume lint resume.json\nnpx @alokraj68/ats-resume tailor resume.json posting.txt\nnpx @alokraj68/ats-resume diff before.txt after.txt\n```\n\n## This is not a writing checker\n\n`plainspoken` asks whether prose reads as machine-written. This asks whether a\nmachine can parse the file at all. The two are deliberately separate tools.\n\n## What it checks\n\n**Source (`resume.json`)**\n\n- Contact fields a parser needs, and a location field holding five cities.\n- A promotion chain in the position field — `Junior Dev → Developer → Lead`\n  parses as one garbled job title.\n- Em and en dashes anywhere in a parsed field.\n- Non-ISO dates. Date extraction is the most fragile part of parsing.\n- Decorative glyphs, invented headings, missing sections.\n- Acronyms appearing without their expansion, and the reverse.\n- How many bullets carry a number.\n- Eight executive signals, reported as **questions, not defects** — team size,\n  hiring, retention, budget, revenue, scale, delivery speed, strategy.\n\n**Extracted text — what an ATS actually receives**\n\n```\npdftotext -layout Sam-Rivera-Resume.pdf out.txt\nnpx @alokraj68/ats-resume lint out.txt\n```\n\n- Is there a text layer at all? An image-only PDF scores zero everywhere.\n- Did the standard headings survive?\n- **Did the contact block keep its separators?** Flexbox gaps do not exist in\n  extracted text, and standalone separator elements can be dropped from a PDF's\n  text layer entirely — leaving one unsplittable string where a parser expected\n  four fields. This looks perfect in the DOM and on screen. Only reading the\n  extraction finds it.\n- Em-dash date ranges, decorative glyphs, keyword stuffing.\n\nStuffing is measured as **density**, not as a statistical outlier. On a\n700-word document almost any word appearing ten times clears three sigma, which\nmade an earlier version fire on ordinary subject words. Real stuffing sits at\n2.5%+ for a single term.\n\n## Tailoring\n\n```\n$ npx @alokraj68/ats-resume tailor resume.json posting.txt\n\nmatch rate  60%  (marginal)\n\nfatal gaps - repeated in the posting, absent from your résumé:\n  terraform  (3x in the JD)\n  datadog    (3x in the JD)\n\nlead with:\n    4 matching terms  Lead Platform Engineer, Northwind\n```\n\nTerms are filtered to things the posting **names** — a word capitalised\nmid-sentence is nearly always a technology or a company, while \"heavily\" and\n\"expected\" never are. Without that filter the gap list fills with job-ad\nboilerplate, and a gap list nobody reads is worth nothing.\n\nThe gap list matters more than the score. Each missing term has three honest\noutcomes: true and unwritten (add it where the work happened), true but weak\n(mention it once), or not true (leave it out — that is your interview prep\nlist). Only the first is a wording fix.\n\n## Did the rewrite drop a fact?\n\nRewriting bullets is the most dangerous editing a résumé gets, and not because\nthe prose degrades — a linter catches that. It is because a figure can vanish in\na reflow while **both versions stay individually valid**:\n\n> Owned EDR, the flagship platform carrying over **$50M** in annual revenue, held\n> at over **99.95%** uptime.\n\n> Owned EDR, the flagship platform, held at high availability.\n\nBoth are well-formed English. Only one is the résumé you spent a year earning.\nNo linter compares them, because neither is wrong on its own.\n\n```\n$ npx @alokraj68/ats-resume diff before.txt after.txt\n\nbefore.txt -> after.txt\n1675 words -> 1639\n  error lost-figure          \"$50M\" was in the previous version and is in this one nowhere\n  warn  lost-name            \"Pickles\" was in the previous version and is in this one nowhere\n```\n\nReordering is invisible to it on purpose. Reordering is the safe half of a\nrewrite, and flagging it would bury the unsafe half.\n\nTwo rules keep the output worth reading, both of which cost a round of false\npositives before they were right:\n\n- **A comma counts only between digits.** Otherwise the pattern eats trailing\n  punctuation, and `acquired in 2026.` reads as missing when the new text says\n  `its 2026 acquisition` — a false alarm on the most common edit there is.\n- **A name is lost only when the phrase and every word in it is gone.** So\n  `the Google Apigee API layer in front` becoming\n  `an API layer in front (Google Apigee, Azure Service Bus)` reports nothing,\n  because nothing went.\n\nWorks on anything textual: two exports of a PDF, a tailored copy against the\nmaster, or `git show HEAD~1:resume.txt` against the file on disk.\n\n## Exit codes\n\n`1` on any error, `0` otherwise. `--json` for machine-readable output.\n\n## Testing\n\n49 tests. Every check is asserted twice: it must fire on a résumé built to break\nparsing **and** stay silent on one that is simply well formed.\n\n```\nnode test/run.mjs\n```\n\n## 🧰 Part of craftkit\n\nOne of four tools in [craftkit](https://alokraj68.in/craftkit). Set all of\nthem up at once, picking only what you need:\n\n```bash\nnpx @alokraj68/craftkit\n```\n\n| | | |\n|---|---|---|\n| ✍️ [`plainspoken`](https://www.npmjs.com/package/@alokraj68/plainspoken) | [docs](https://alokraj68.in/plainspoken) | prose that does not read as machine-written |\n| 📱 [`pagecheck`](https://www.npmjs.com/package/@alokraj68/pagecheck) | [docs](https://alokraj68.in/pagecheck) | pages that survive a phone: overflow, tiny text, tap targets, WCAG AA |\n| 📄 **`ats-resume`** | you are here | a résumé an applicant tracking system can parse, and JD gap analysis |\n| 🧭 [`craft-setup`](https://github.com/alokraj68/craftkit/tree/main/plugins/craft-setup) | skill only | verify before claiming done; never commit unasked |\n\n### The skill ships with this package\n\n`skills/tailor-resume/SKILL.md` is the judgement half: the calls a linter cannot make. It installs\nas a Claude Code skill via the marketplace, and it is also in the npm tarball at\n`node_modules/@alokraj68/ats-resume/skills/tailor-resume/SKILL.md`, so an agent can read it without the marketplace.\n\n```\n/plugin marketplace add alokraj68/craftkit\n/plugin install ats-resume@craftkit\n```\n\n### Elsewhere\n\n- 🛡️ [`eslint-plugin-typeorm-enterprise`](https://alokraj68.in/eslint-plugin-typeorm-enterprise) — the same\n  principle pointed at TypeORM: block raw SQL, require transactions, guard multi-tenant\n  queries. Not part of craftkit; it fails a build the same way.\n  [docs](https://alokraj68.in/eslint-plugin-typeorm-enterprise)\n- 🌐 [alokraj68.in](https://alokraj68.in) — who writes these, and what they were built for.\n\n## Licence\n\nMIT\n","readmeFilename":"README.md"}