
Security News
PHP Foundation Says Chainguard Broke Security Embargo Ahead of Emergency Patches
The PHP Foundation says Chainguard broke a security embargo ahead of critical RCE patches, as leaks disrupted the coordinated release.
A linter for scientific papers written in LaTeX: catches mistakes before you submit to a conference or journal.
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:
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.
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.
| preset | venue | format | kinds and page limits |
|---|---|---|---|
paperlint:acm-sigconf | any ACM conference | ACM two-column | no kinds: the format only, no page limit |
paperlint:agenticdev | AgenticDev @ ASE | ACM two-column | short 5, full 10, demo 5 pages, + 2 pages of references |
paperlint:aisec | AISec @ ACM CCS | ACM two-column | research, benchmark, position, sok: 10 pages + 2 pages of references |
paperlint:realm | REALM @ EMNLP | ACL two-column, A4 | long 8, short 4 — recorded, not checked (why) |
paperlint:ieee-conference | any IEEE conference | IEEE two-column | no kinds: the format only, no page limit |
paperlint:aidc | AIDC @ IEEE ACSAC | IEEE two-column, compsoc | regular 12, short 6, counted before the references (why); requires the «LLM Usage Statement»; double-blind |
paperlint:msr | MSR (Technical) | IEEE two-column, no compsoc | technical 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.
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.
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.
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.
| command | what it does |
|---|---|
npx paperlint init | sets 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 lint | runs every check over your papers; --fix fixes what can be fixed |
npx paperlint toolchain | installs TeX Live with the packages your venues need (~270 MB, ~3 min, once) |
npx paperlint doctor | checks 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 --help | every command and flag |
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.
research-ideatefind-venuebuild-label-pagedraft-paperpaper-adversarial-reviewharden-paperpaper-statussubmission-portalEvery skill, by stage: docs/skills.md.
paperlint build | paperlint lint | |
|---|---|---|
| needs | Node, TeX Live, the network | Node |
| does | compiles 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 |
| writes | paper.pdf, _build/, repro/data/references-cache.json (commit it) | nothing (--fix: the three fixable slips) |
paper.pdf or the bibliography changed since the last build, lint fails and tells you to rebuild.PIPELINE-STATUS.md, reviews, notes on related
papers) and the paper folder's layout.% eslint-disable-next-line paper/leading-zero -- quoted from the reviewer.Every check: docs/rules.md. How build compiles:
docs/configuration.md.
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.
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.
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.
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/skills.md — every skill, by stagedocs/layout.md — the pipeline's flow, where each stage writes, and what checks it whendocs/venues.md — a venue's corpus of accepted papers, presets and cards: three places, three jobsdocs/ci.md — the two CI workflows, in fulldocs/install.md — what init does, the hooks, package managers, troubleshootingdocs/configuration.md — every setting, how build compiles, using your own ESLintdocs/rules.md — every check, venue presets, recording a submitted PDFdocs/references.md — the reference check, and the cache file to commitdocs/submission.md — creating, reading and updating a submission on the venue's portal (HotCRP); one token variable per sitedocs/optional-rules.md — checks only some venues needdocs/toolchain.md — TeX Live, and Banal (HotCRP's page-geometry checker, GPL)CONTRIBUTING.md — how the package is tested and released, and adding a venue to itMIT. Banal, used for page geometry, is GPL and not part of this package:
docs/toolchain.md.
FAQs
A linter for scientific papers written in LaTeX: catches mistakes before you submit to a conference or journal.
The npm package paperlint receives a total of 0 weekly downloads. As such, paperlint popularity was classified as not popular.
We found that paperlint demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
The PHP Foundation says Chainguard broke a security embargo ahead of critical RCE patches, as leaks disrupted the coordinated release.

Security News
PHP releases emergency patches for two critical RCE vulnerabilities as agencies urge organizations to take unpatched sites offline.

Threat Research
/Security News
A supply chain attack compromised LiteLLM 1.107.0 on PyPI and Docker, spreading malware that steals cloud credentials, developer secrets, and AI provider keys.