New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

paperlint

Package Overview
Dependencies
Maintainers
1
Versions
38
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

paperlint

A linter for scientific papers written in LaTeX: catches mistakes before you submit to a conference or journal.

latest
Source
npmnpm
Version
11.1.3
Version published
Weekly downloads
0
Maintainers
1
Weekly downloads
 
Created
Source

paperlint

npm version Node version

Write a research paper in LaTeX from idea to camera-ready, and catch what gets it sent back before you submit. It comes in two parts:

  • ✅ A linter — a command-line tool, no AI needed. Its headline catches:

    • 📏 a paper over the page limit for its kind at your venue;
    • 🔤 the wrong font — LaTeX silently fell back to Computer Modern because a package was missing;
    • 🔗 a bad reference — a cited work that does not exist, or lists the preprint's authors.

    Smaller slips too: § for "Section", .05 for 0.05 — fixed for you.

  • 🧠 Skills for Claude Code — optional, covering the whole pipeline: the idea, the venue, the study, the draft, the reviews, submission.

⚠️ An aid, not a guarantee. A clean run does not mean your paper meets the venue's rules: presets are transcribed from calls for papers that change, and any check can miss something. Check against the venue's own call and template. Provided "as is", without warranty — see LICENSE.

Contents

🎯 Supported venues

A venue preset holds a venue's format and page limits. A paper's kind picks which limit applies: at AgenticDev a short paper gets 5 pages and a full one 10. You choose it once per paper.

presetvenueformatkinds and page limits
paperlint:acm-sigconfany ACM conferenceACM two-columnno kinds: the format only, no page limit
paperlint:agenticdevAgenticDev @ ASEACM two-columnshort 5, full 10, demo 5 pages, + 2 pages of references
paperlint:aisecAISec @ ACM CCSACM two-columnresearch, benchmark, position, sok: 10 pages + 2 pages of references
paperlint:realmREALM @ EMNLPACL two-column, A4long 8, short 4 — recorded, not checked (why)
paperlint:ieee-conferenceany IEEE conferenceIEEE two-columnno kinds: the format only, no page limit
paperlint:aidcAIDC @ IEEE ACSACIEEE two-column, compsocregular 12, short 6, counted before the references (why); requires the «LLM Usage Statement»; double-blind
paperlint:msrMSR (Technical)IEEE two-column, no compsoctechnical 10 pages, appendices included, + 2 pages of only references (why); double-blind

Not shipped yet: USENIX, NeurIPS, Springer, IEEE venues other than AIDC and MSR, and ACL venues other than REALM. Add yours in one small file.

🚀 Getting started

A new paper

  • Install (Node 22.13 or newer) and set up. init asks where your papers live (default papers/), whether to install TeX Live now, and whether to add a CI workflow; with Claude Code it also installs the skills and four hooks (what they do).

    npm i -D paperlint
    npx paperlint init
    
  • Create a paper. --venue names its venue preset from the table above, --kind which of its page limits applies. Name the folder after the work, not the venue: a rejected paper moves on and keeps its folder, so new refuses a name like aisec-2026.

    npx paperlint new my-paper --venue agenticdev --kind short
    

    It writes papers/my-paper/ with paper.tex, paperlint.json (venue and kind), PIPELINE-STATUS.md (the stage the paper is at) and the empty folders of the layout.

  • Build the PDF. This needs TeX Live, a ~270 MB download (~3 min, once); if you said no in init, run npx paperlint toolchain first. Then check it:

    npx paperlint build papers/my-paper
    npx paperlint lint
    

    On the stub from step 2 the first run already catches something (output shortened):

    papers/my-paper/paper.tex
      1:1   error    1 column(s), AgenticDev requires 2 — the wrong document class or class option   pdf/geometry
      1:1   error    no font starts with `LinLibertine` (body text of AgenticDev); the PDF has: CMR10, …   pdf/fonts
      8:4   warning  `§` instead of the word «Section» — `paperlint lint --fix` writes it              paper/section-word
    

    new writes a format-neutral stub in plain article, and AgenticDev wants ACM's class. Make the first line \documentclass[sigconf]{acmart}, build again, and the errors are gone.

A paper you already have

Put it at papers/my-paper/paper.tex (or set papersDir to where your papers live), then run the same new command: on a folder that holds anything it only adds the missing paperlint.json and PIPELINE-STATUS.md, and never touches paper.tex. Build and lint as above.

🧭 The pipeline

A paper goes through eight stages. The skills help at each one; lint checks the folder from the moment it exists.

stage           what you get                          where it goes
1 idea          a go / no-go, with the reason         siblings/
2 venue         venues ranked, deadlines planned      paperlint.json, the venue's corpus
3 study         a study design, honest statistics     repro/<study>/
4 draft         a first draft, then a tighter one     paper.tex, sections/, figures/
5 review        the objections, before the reviewers  reviews/, PIPELINE-STATUS.md
6 submit        a PDF within the limit, recorded      paper.pdf, versions/, submission/
7 camera-ready  the final, de-anonymised PDF          versions/, talk/
8 extend        a plan for the next paper             a new paper folder

skills: every stage; optional, with Claude Code
lint:   any stage once the paper folder exists (paperlint new) — when you run it, and in CI
build:  stages 6–7; compiles and measures the PDF, and lint then checks pages, fonts, references
hook:   with Claude Code, refuses a new file in the wrong place before it is written

Each stage's skills, what it writes and what checks it, drawn as one flow, with the folder layout: docs/layout.md.

🧰 Commands

commandwhat it does
npx paperlint initsets the project up
npx paperlint new my-paper --venue <preset> --kind <kind>creates a paper folder for that venue, or completes an existing one
npx paperlint build <paper>compiles paper.tex to paper.pdf, measures it, checks the references online
npx paperlint lintruns every check over your papers; --fix fixes what can be fixed
npx paperlint toolchaininstalls TeX Live with the packages your venues need (~270 MB, ~3 min, once)
npx paperlint doctorchecks the setup and exits non-zero if something is miswired
npx paperlint submission new <paper>creates the submission on the portal (title, abstract, authors, PDF); --save for real
npx paperlint submission show <paper>the paper's submission on the venue's portal, and whether it holds your build
npx paperlint submission update <paper>checks a new PDF/abstract against the portal; --save sends it for real
npx paperlint studies new <paper> "<title>"registers a study: the next id in repro/studies.json, its folder, the index
npx paperlint studies index <paper>regenerates the index of the studies in repro/README.md
npx paperlint studies gate <paper> <id>exits 0 only once the study's decision is committed: run it before the study
npx paperlint --helpevery command and flag

🧠 Skills

You do not need to learn the skills' names: you ask Claude Code, and the matching skill starts. paper-pipeline walks you through the stages; any skill also starts on its own when you ask for what it does — "is this idea worth a paper?", "find me a venue for this". init installs them.

  • A go / no-go on your idea, with the reason. research-ideate
  • A ranked list of venues that fit — deadline, page limit, indexing. find-venue
  • A page to label the study's items on your phone, blind, with the answers exported into the paper's folder. build-label-page
  • A first draft from your results. draft-paper
  • A hostile review before the real one. paper-adversarial-review
  • A ready / not ready verdict before you submit, worst problem first. harden-paper
  • Where your paper stands, measured from the real build. paper-status
  • The PDF and abstract replaced on HotCRP, dry run first, and proof the portal holds your build. submission-portal

Every skill, by stage: docs/skills.md.

🔍 Lint and build

paperlint buildpaperlint lint
needsNode, TeX Live, the networkNode
doescompiles paper.tex, measures the PDF, checks each reference online (exists, right authors)checks the source, and judges what build recorded: page limit, fonts, references; offline
writespaper.pdf, _build/, repro/data/references-cache.json (commit it)nothing (--fix: the three fixable slips)
  • If paper.pdf or the bibliography changed since the last build, lint fails and tells you to rebuild.
  • Lint also checks the pipeline's own records (PIPELINE-STATUS.md, reviews, notes on related papers) and the paper folder's layout.
  • A deliberate exception is a comment on the line above: % eslint-disable-next-line paper/leading-zero -- quoted from the reviewer.

Every check: docs/rules.md. How build compiles: docs/configuration.md.

🧩 Configuration

Two levels, one file name, both optional; a paper's file overrides the project's key by key, and an unknown key is an error, so a typo cannot silently turn a setting off.

paperlint.json                   the project: papersDir (default papers), rules, defaults for every paper
papers/my-paper/paperlint.json   one paper: its venue preset ("extends"), its kind, its own rules

Shipped venue presets keep their deadlines current: a date that moves is released as a patch, so your normal dependency update brings it. Every key, a paper that moves between venues (cycles), and using the rules from your own ESLint config: docs/configuration.md.

➕ Add a venue that isn't listed

A venue preset is a small JSONC file: the preset it builds on, and the page limit of each kind of paper. For an ACM workshop with a 4-page limit for short papers, venues/my-workshop.jsonc:

{
  // page size, columns and fonts of the ACM two-column format
  "extends": "paperlint:acm-sigconf",
  "format": {
    // one entry per kind of paper the call for papers names
    "kinds": {
      // the limit from the call for papers, in pages, references not counted
      "short": { "body_pages_max": 4 },
    },
  },
}
npx paperlint new my-paper --venue ./venues/my-workshop.jsonc --kind short

Give the path from where you run the command; new rewrites it relative to the paper's own paperlint.json. A venue in another format: docs/rules.md.

🤖 Run it in CI

init offers a lint-only workflow (seconds; skips pages, fonts and references). The full job builds first (~3 min, then cached) and checks everything:

- run: npm ci
- run: npx paperlint toolchain
- run: npx paperlint build --all
- run: npx paperlint lint

Both workflows in full, with the TeX Live cache: docs/ci.md.

❓ FAQ

Does it install anything without asking? No. TeX Live comes only from paperlint toolchain, or when you say yes in init or build. On Windows, install TeX Live yourself.

Several papers for different venues in one repo? Yes. Each paper names its own venue preset in its own paperlint.json.

Does it change my paper? Only paperlint lint --fix, and only three rules: paper/section-word (§ → Section), paper/leading-zero (.05 → 0.05) and paper/figure-ref-style (one figure-reference style).

📚 Docs

License

MIT. Banal, used for page geometry, is GPL and not part of this package: docs/toolchain.md.

Keywords

eslint

FAQs

Package last updated on 22 Oct 2026

Related posts