Commands¶
Snippets below use uv run so they stay short. The operator install is
clone plus docker compose build, then docker compose up for the
workbench (Walkthroughs, GUI). CLI one-shots:
docker compose run --rm paperful … (Docker). CI builds the
light image and expects doctor to exit 2 without Zotero. heavy
adds [llm] [rag] [browser-agent] (see
image mode). Build that image with
docker compose build. Headed session login runs on the host
(uv run paperful session login …). No campus access: --preset oa.
Campus EZProxy: --preset eoi. paperful jobs lists verbs by job.
Grow the library with snowball. People you follow (no hop) are
authorwatch.
# environment check (TTY guide for amber/red)
uv run paperful doctor
uv run paperful doctor --probe # live Scholar / EZProxy session_ok
uv run paperful config check # unknown TOML keys; secrets belong in env
uv run paperful collections
# fetch to disk only
uv run paperful run --collection interesting --no-attach
# several collections, or the whole library (resumable; Ctrl-C any time, rerun to continue)
uv run paperful run -C BBNJ -C AO
uv run paperful run --library
# attach previously downloaded PDFs
uv run paperful attach
uv run paperful attach --allow-short-pdf # attach denser one-pagers held by the density gate
uv run paperful attach --allow-pdf-doi-mismatch # attach files left by --strict-pdf-doi
uv run paperful attach --item ITEMKEY --file ~/Downloads/paper.pdf
# what happened
uv run paperful report
uv run paperful report --last-run # latest run summary only
uv run paperful report --json # agent-friendly (manifest + last run)
uv run paperful report --not-found
uv run paperful report --status error
# policy-sensitive runs (OA + campus EZProxy; no Scholar / Sci-Hub)
uv run paperful run -C BBNJ --preset eoi --dry-run
# items with only a linked PDF URL in Zotero are skipped by default
uv run paperful run --library --upgrade-linked
uv run paperful run -C BBNJ --upgrade-snapshot
uv run paperful run -C BBNJ --htmlpdf gated
uv run paperful urls -C BBNJ
# retry items marked not_found / no_identifier (e.g. after EZProxy login)
uv run paperful run --library --retry-failed
uv run paperful run --collection BBNJ --retry-failed
uv run paperful run --collection BBNJ --try-all # ignore source_routing when metadata is unreliable
uv run paperful ocr -C BBNJ # list image PDFs; does not write
uv run paperful ocr -C BBNJ --apply # text layer on the out/ PDF
uv run paperful ocr --item ITEMKEY --apply --attach # also upload beside the scan
# optional library index — off until [rag].enabled; setup in docs/rag.md
# reads the mirror only; never calls the reference manager
uv run paperful rag ingest -C ocean/BBNJ --dry-run # what would be indexed
uv run paperful rag ingest --library # index PDFs + abstracts; OCR for scans only
uv run paperful rag status # index vs mirror
uv run paperful rag search "impact assessment thresholds" -C ocean/BBNJ # passages, no chat model
uv run paperful stuff --file ./draft.docx -C ocean/BBNJ --k 3
uv run paperful stuff --file ./outline.docx --lane outline -C ocean/BBNJ
uv run paperful ask "What does the Agreement require for EIAs?" -C ocean/BBNJ
uv run paperful ask --from-file questions.txt -C ocean/BBNJ
uv run paperful rag questions -C ocean/BBNJ
uv run paperful rag answered --from-extract -C ocean/BBNJ
uv run paperful ask # prompt for several questions
# structured IMRaD fields — mirror only; rules always run; no [rag].enabled
uv run paperful extract-sections -C ocean/BBNJ --dry-run
uv run paperful extract-sections -C ocean/BBNJ # state/sections/<key>.json
uv run paperful extract-sections --library --grobid # TEI via sidecar; needs [grobid]
uv run paperful extract-sections --library --llm # optional LLM fill; needs [llm].enabled
# optional LLM verbs — off until [llm].enabled; setup in docs/llm.md
# recover also auto-fires at the end of `run` when Scholar / EZProxy / htmlpdf fail
uv run paperful recover --item ITEMKEY --dry-run # browser agent: show start URL only
uv run paperful recover --item ITEMKEY # needs Python 3.11+ and paperful[browser-agent]
uv run paperful recover --from-last-run --dry-run # batch keys from state/last-run.json
uv run paperful summarize --item ITEMKEY # disk HTML + tagged child note (default both)
uv run paperful summarize -C BBNJ --to disk # HTML only; Zotero tree stays clean
uv run paperful summarize --item ITEMKEY --prompt prompts/mine.md --force
uv run paperful synthesize -C BBNJ --dry-run # chunk plan from existing summary notes
uv run paperful synthesize -C BBNJ # report on disk and a note in the collection
# the on-disk mirror. Every command refreshes it first; sync does only that.
uv run paperful sync --dry-run # what changed in the library since last time
uv run paperful sync # refresh, and copy library PDFs in (pdfs = all)
uv run paperful sync --full # read the whole library again
uv run paperful cache clean # list absorbed/stale pdf-cache files
uv run paperful cache clean --apply # delete them
uv run paperful --offline gaps -C BBNJ # work from the mirror; do not contact Zotero
uv run paperful snapshot -C BBNJ --dry-run # re-read one collection in full
uv run paperful snapshot -C BBNJ --pdfs all
uv run paperful restore -C BBNJ # dry-run unless --apply
uv run paperful restore -C BBNJ --year-from 2021 --year-to 2026 -T journalArticle
uv run paperful restore -C BBNJ --apply # create missing items; never overwrite fields
# restrict / reorder sources for one run, or cap the number of items processed
uv run paperful run -C hoops --sources unpaywall,openalex,ezproxy
uv run paperful run --library --limit 50
# year range (inclusive; undated items excluded) — e.g. full run on BBNJ 2023–2026
uv run paperful run -C BBNJ --year-from 2023 --year-to 2026
uv run paperful run -C BBNJ --year-from 2023 --year-to 2026 --dry-run
uv run paperful gaps -C BBNJ --year-from 2023 --year-to 2026
uv run paperful gaps -C BBNJ --list-missing --to missing.tsv
uv run paperful gaps -C BBNJ --list-missing --handoff tabs
uv run paperful gaps -C BBNJ --list-missing --handoff watch
uv run paperful gaps -C BBNJ --list-missing --handoff walk
uv run paperful reachout -C BBNJ --to reachout.csv # contact only; never fetches
uv run paperful reachout -C BBNJ --non-oa-only --lookup --to reachout.csv
uv run paperful reachout -C BBNJ --request-rg --handoff tabs
uv run paperful inbox watch # poll [inbox].dir (whole library)
uv run paperful inbox drain # one-shot ingest
uv run paperful capture plan --doi 10.1000/example # mirror + Zotero read; writes nothing
uv run paperful capture install-host # Firefox native host, user level
uv run paperful inbox watch -C BBNJ # optional: narrow DOI index
uv run paperful refs gap -C BBNJ # cited in PDFs, missing from library
uv run paperful refs gap -C BBNJ --format json
uv run paperful precedent "ABMT in ABNJ" -C BBNJ # held passages + OpenAlex; always dry-run
uv run paperful precedent "ABMT in ABNJ" -C BBNJ --format json
uv run paperful coverage --from-file briefing.md -C BBNJ # named in briefing, not in -C
uv run paperful coverage --from-note NOTEKEY -C BBNJ
uv run paperful ingest-dois --from-file dois.txt -C BBNJ # dry-run
uv run paperful ingest-dois --from-file dois.txt -C BBNJ --format json
uv run paperful collections add --keys-file keys.txt -C BBNJ # dry-run
uv run paperful collections add --keys-file keys.txt -C BBNJ --apply
uv run paperful run -C BBNJ --dry-run --format json
uv run paperful inbox drain --format json
uv run paperful ask "What is BBNJ?" --format json
uv run paperful snowball search "BBNJ" --gate dry-run --format json
uv run paperful authorwatch save ocean-people
uv run paperful authorwatch add ocean-people --orcid 0000-0002-1825-0097
uv run paperful authorwatch suggest ocean-people -C ocean/BBNJ --method mix --limit 15
uv run paperful authorwatch accept ocean-people --id sug_abcd --seed-from 2025-01-01
uv run paperful authorwatch run ocean-people --backfill-from 2025-01-01
uv run paperful authorwatch apply ocean-people -C Watch/Ocean # dry-run
uv run paperful authorwatch delete ocean-people --yes
uv run paperful network orcid 0000-0001-9025-7632 --phases bbnj --partition region
uv run paperful mcp # optional stdio: gaps, snowball_search, snowball_trends, export, proposal_export, refs_gap, ask, precedent, stuff
uv run paperful export-proposals PACK out.bib # BibTeX/RIS from snowball or authorwatch inbox on disk
uv run paperful serve # localhost HTTP (needs uv sync --extra serve)
uv run paperful ingest-dois --from-pack state/refs-gaps/<stamp> -C BBNJ
uv run paperful ingest-dois --from-pack state/coverage/<stamp> -C BBNJ
uv run paperful ingest-dois --from-pack state/precedent/<stamp> -C BBNJ
uv run paperful ingest-dois --from-file dois.txt -C BBNJ --apply --tag bbnj
uv run paperful acronyms -C BBNJ # harvest ALL CAPS tokens (dry-run)
uv run paperful acronyms -C BBNJ --apply # write state/acronyms/<scope>.json
uv run paperful glossary validate # check state/glossary/*.json
uv run paperful glossary export-vale # Vale swap YAML from aliases (stdout)
uv run paperful glossary export-vale --out styles/Paperful/swap.yml
uv run paperful authors -C BBNJ # author/org frequency (dry-run)
uv run paperful authors -C BBNJ --apply # report + proposed field author pack
uv run paperful inbox proposals list
uv run paperful inbox proposals apply <id>
uv run paperful notes delete -C BBNJ --type summary --except-model qwen2.5:7b
uv run paperful notes delete -C BBNJ --all --apply --yes
# restrict to Zotero item types (repeatable / comma-separated; friendly names ok)
uv run paperful run -C BBNJ -T journalArticle --year-from 2023 --year-to 2026
uv run paperful run -C BBNJ -T "Journal Article" -T report
uv run paperful lint -C BBNJ --type journalArticle,preprint
# the same slice as one command, or saved beside config.toml
# gaps → run --try-all --retry-failed --upgrade-linked → lint → fix-metadata --apply → summarize --apply
uv run paperful all -C BBNJ -T journalArticle --year-from 2021 --year-to 2026
uv run paperful all -C BBNJ -T journalArticle --year-from 2021 --year-to 2026 --dry-run
uv run paperful profile save bbnj-journal -C BBNJ -T journalArticle --year-from 2021 --year-to 2026 --try-all --apply
uv run paperful all --profile bbnj-journal
uv run paperful profile list
uv run paperful profile show bbnj-journal
# dedupe + browser handoff + summarize template: docs/workflows.md § 4
# Sci-Hub is off by default; opt-in only, at your own risk — see scihub.md
# session (optional)
uv run paperful session login ezproxy # system Chrome/Edge when present; campus SSO
uv run paperful session login scholar # same; --engine playwright to force Playwright
uv run paperful session login mendeley # Elsevier OAuth (host-only localhost redirect)
uv run paperful session status
uv run paperful ezproxy --no-open # probe the EZProxy session
uv run paperful scholar --no-open # probe Scholar
# interchange (RIS / BibTeX / EndNote XML)
uv run paperful export library.ris --library
uv run paperful import other.bib # dry-run
uv run paperful import other.bib --apply
# identifiers vs PDFs (read-only); metadata writes are a separate step
uv run paperful lint --library --json # progress bar on stderr; stdout is JSON
uv run paperful lint -C BBNJ --strict # exit 1 if any finding
uv run paperful fix-metadata --library # dry-run → state/metadata-patches.jsonl
uv run paperful fix-metadata --library --apply # write DOI/title/date/venue into Zotero 10+
uv run paperful fix-metadata --library --apply --overwrite # replaces title/date/venue you may have edited; dry-run first
# duplicates, then remaining PDF gaps (review the pack before --apply)
uv run paperful dedupe -C BBNJ --dry-run
uv run paperful dedupe -C BBNJ --apply # high_doi only; add --apply-medium for title+year
uv run paperful gaps -C BBNJ
# one witness for a sequence (child reports still land in state/runs/)
uv run paperful pack open --label bbnj-journal-2021-2026
uv run paperful gaps -C BBNJ
uv run paperful pack close
uv run paperful pack show
Command |
Purpose |
|---|---|
|
Environment check (Zotero / Mendeley / EndNote, paths, email, sessions, pdftotext, ocrmypdf, vale, paperguard, Playwright, grey-lit packs, CORE key optional, opt-in Camofox when |
|
Validate |
|
Systematic review scaffold (local; no scheduler). |
|
Fill PDFs for items already in the library. Default attaches on Zotero 10+ ( |
|
Opt-in browser-agent PDF recovery ( |
|
Read-only identifier / PDF-DOI / title-hygiene findings ( |
|
Retraction / EoC / withdrawal (Crossref + OpenAlex), optional PubPeer ( |
|
Apply an existing critique pack to a draft ( |
|
Local manuscript pack ( |
|
Collection-scoped harvest of all-caps tokens from mixed-case titles, abstracts, and venues ( |
|
House-list expansions for |
|
Collection-scoped creator frequency ( |
|
Propose patches on disk; |
|
Text layer for scanned PDFs ( |
|
Skip list for |
|
Build the library index from the mirror ( |
|
What the index holds and how far it is behind the mirror (items indexed, scans waiting for OCR, failures, PDFs held only by the reference manager). |
|
Indexed passages closest to a query, with paper and pages. No chat model. |
|
Extract research questions from indexed papers (rules; optional |
|
IMRaD-style fields from mirror PDF text (rules; optional GROBID sidecar; optional |
|
Ask whether the corpus already answers operator or extracted questions ( |
|
Answer a question from the index, streamed, with cited sources and pages ( |
|
Grounded LLM summary from the PDF already on disk ( |
|
Literature review from existing summary notes ( |
|
Duplicate pack on disk. Phases ( |
|
Compare PDF attachments to |
|
Preprint and published paper as one work. Dry-run writes |
|
Counts: no stored PDF, linked PDF URL only, missing DOI. |
|
Contact mode for items with no stored PDF. Never fetches. Console table plus |
|
Opt-in Twenty People match for |
|
Create or enrich People from |
|
ORCID ego co-authorship graph ( |
|
People you follow → their papers ( |
|
Alert loop / what-cites ( |
|
PDF drop-folder sidecar ( |
|
Firefox add-on host. |
|
Trash Paperful-owned notes only ( |
|
Works cited inside collection PDFs that are not in the library fingerprint. Always dry-run. Writes |
|
DOIs (and optional titles) named in a briefing note or file that are not under |
|
Phrase → held RAG passages plus OpenAlex keyword/similar works not claiming novelty. Always dry-run. Stamps |
|
Extra library citations per sentence ( |
|
DOI list → metadata parents in |
|
|
|
Optional stdio MCP over the same JSON channel. Read-only tools: |
|
Discover grey PDFs and landings via SearXNG ( |
|
Probes metadata and linked-PDF URLs for a scope (HEAD/GET). Report only unless |
|
Academic page-snapshot proposals: |
|
Localhost workbench and JSON API ( |
|
|
|
|
|
Grow a library from one or more keywords, one or more DOIs, one or more ORCIDs, or a collection ( |
matches any; a trailing |
|
several positionals or |
|
|
|
|
Manifest summary + latest run report ( |
|
Attach already-downloaded PDFs into the configured manager, or ingest a hand download with |
|
Bring |
|
Re-read a collection (or |
|
Recreate missing library items from those folders. Dry-run unless |
|
|
|
Load RIS, BibTeX, or EndNote XML into the configured manager. Dry-run unless |
|
Write the scoped library to RIS, BibTeX, or EndNote XML ( |
|
BibTeX or RIS from a snowball run dir, watch inbox, authorwatch inbox, or a |
|
Local browser vault: |
|
|
|
Wrapper: headed login (or Netscape fallback) / |
|
Wrapper: headed login (or Netscape fallback) / |
|
Ping configured Sci-Hub mirrors |
|
Optional local OpenAlex parquet snapshot helpers ( |
|
One-line counts summary for a run report (utility; used by Nightshift index lines). |
|
Count new model summaries in a run report; skips do not count (utility). |
|
Print verbs grouped by job ( |
|
Print the package version |
Collections can be given as a path (BBNJ/not undermine), a unique name, or
a key. Subcollections are always included. Items in several selected
collections are written once and hard-linked into the other folders.
Scope filters¶
After collection / --library selection, these optional filters shrink the
item list further (applied before --limit). They appear in the Scope line
(e.g. BBNJ, years 2023–2026, types journalArticle).
Most verbs need -C or --library (or a profile that sets one). inbox watch / drain are the exception: with no scope they default to the whole
library so a shared drop folder is not tied to one collection.
--profile NAME loads that slice from a run config so you do not repeat
-C / years / -T on every verb. -f / --run-config FILE overlays it.
Flags you pass still win. See Workflows and
Configuration.
Flag |
Effect |
|---|---|
|
Keep items dated this year or later (inclusive). |
|
Keep items dated this year or earlier (inclusive). |
|
Keep only these Zotero item types (repeatable or comma-separated). |
Year. Open ends are fine (--year-from 2023 alone). Items with no
parsed publication year are excluded whenever either bound is set.
--year-from must be ≤ --year-to.
Type. Accepts Zotero camelCase ids (journalArticle), spaced labels
(Journal Article), and hyphen/underscore forms (journal-article). Case
insensitive. Unknown tokens exit 1. Common scholarly types:
journalArticle, preprint, conferencePaper, report, book,
bookSection, thesis, manuscript, document, webpage,
newspaperArticle, magazineArticle, blogPost, dataset, standard,
patent, presentation, …
Attachments, notes, and annotations are never in scope (Zotero skips them already). Full list: Zotero’s item-types reference; Paperful rejects anything not in that set.
uv run paperful run -C BBNJ --year-from 2023 --year-to 2026 -T journalArticle
uv run paperful gaps -C BBNJ -T "Journal Article" -T report
uv run paperful lint -C BBNJ --type journalArticle,preprint --strict
Same flags on run, lint, fix-metadata, dedupe, gaps, ocr, summarize,
synthesize, snapshot, and restore.
Doctor¶
paperful doctor prints one line per check. Default session rows are
file-presence only. Pass --probe to hit Scholar / EZProxy session_ok
(vault Chromium when available); cookie files that still bounce to CAS or a
captcha become amber.
Colour |
Meaning |
|---|---|
green |
Ready |
amber |
Degraded but you can continue (empty |
red |
Fatal if the check is |
Unpaywall needs a real email. Missing or expired sessions: paperful session login ezproxy or scholar (system Chrome/Edge when present). Missing pdftotext: Poppler; pypdf is the fallback. Missing ocrmypdf: brew install ocrmypdf tesseract-lang or apt install ocrmypdf tesseract-ocr-eng (the Compose image ships English). Missing vale is optional (critique house style; not in the Compose image). Playwright ships in the paperful[browser] extra (and in the Compose image); Chromium installs on first session login. doctor names the extra when it is missing. An amber Write API means Zotero 7–9: fetch still works, but attach, fix-metadata --apply, and dedupe --apply do not.
On a host TTY, amber/red checks open an interactive Guide: each step prints
what to do, waits for Enter, then re-runs that check. Inside Docker, doctor
prints the same fix steps once (no Enter wait — Compose owns Ctrl-C / stdin on
compose up). Opt in to the interactive walk with
docker compose run --rm paperful doctor --guide. Session logins still need a
headed browser on the host. Force or skip with --guide / --no-guide.
docker compose up starts the GUI; CLI checks use
docker compose run --rm paperful doctor.
Dry-run¶
paperful run … --dry-run talks to Zotero only (no PDF fetches). The table’s
Would-hit column is the source lane for that item, in policy order (Scholar
late unless [fetch].order = "list"). --try-all
(or source_routing = false) lists every configured source.
paperful dedupe is classify-only unless you pass --apply: it writes
state/dedupe-packs/ and does not merge or write the spare-copy line. Do not
pass --dry-run and --apply together.
Agent channel (--format json and mcp)¶
Batch verbs that support --format json emit one paperful.agent.json.v1
object on stdout (schema, command, exit, summary, items, paths,
flags). paperful mcp is optional stdio JSON-RPC: each tool returns the same
envelope in MCP text content. Read-only MCP tools today:
Tool |
CLI equivalent |
Notes |
|---|---|---|
|
|
Counts only (no |
|
|
Always dry-run; never creates parents |
|
|
Publication-year counts; read-only |
|
|
BibTeX/RIS in |
|
|
Pack under |
|
|
Always dry-run |
|
|
Needs |
|
|
Always dry-run. Held + public-metadata-only stamps; never a novelty claim |
|
|
Disk-only extra cites from the local index. |
collections add, snowball apply, and every other --apply path stay
CLI-only (not MCP tools). Prefer paperful … --format json from a shell
when you already have a subprocess wrapper.
Exits¶
--format json prints one paperful.agent.json.v1 object on stdout. Progress
bars and logs go to stderr. Early environment failures may print a human
ladder on stdout and skip the envelope — treat unparseable stdout plus the
process exit code as the result.
Code |
When |
|---|---|
0 |
Success (including empty dry-run). |
1 |
User error (unknown collection, bad preset, unknown |
2 |
Environment: library unreachable on |
3 |
Partial write batch: some rows succeeded and some failed. |
TTY-only (a GUI or agent must not claim these): session login, doctor --guide, mid-run EZProxy re-login, and notes delete --apply --all confirm unless --yes.
Run summary¶
After a real run, a Run summary table lists PDFs downloaded, attached,
why a PDF was not saved (captcha, cloudflare, not found, and the other blocks),
publisher prices the browser agent saw on those misses,
deferred/skipped, sources checked, and typed errors. paperful report reprints
it. JSON: paperful report --json — field list in architecture.
Output¶
out/<collection>/<Author - Year - Title -- KEY>/record.json— restore record (paperful.item.v1). Identity, full creators, abstract, tags, Extra, type-specific fields, collection membership, attachment rows, fetch provenance, and note filenames. Required keys frozen; extras may be added.runwrites this when it saves a PDF. A refresh writes one for every item, including items with no PDF, and rewrites it after each change in the library.out/<collection>/<Author - Year - Title -- KEY>/<file>.pdf— the PDF, when there is one.runalways writes downloads here. With[mirror].pdfs = "all"(the default)syncalso copies in a PDF already stored in Zotero.lazycopies one the first time a command needs it.nonekeeps them out and does not delete PDFs already on disk.out/<collection>/…/notes/— child-note HTML. Astate/summaries/<key>.htmlfile is copied aspaperful-summary.html.out/_index.jsonl— one line per item key (dirs,has_pdf,md5, child keys).out/_sync.json— library version the mirror was last refreshed to.out/_collections.json— collection tree.out/_history.json— pointers at the append-only ledgers understate/(manifest, patches, dedupe, runs). Sessions, cookies, and the local API key are not copied.state/manifest.jsonl— one line per item attempt; the latest line per item key wins. Statuses:ok(on disk),attached(on disk + in Zotero),not_found,no_identifier,captcha,error,attach_failed,retryable.ok/attachedare never retried;not_found/no_identifieronly with--retry-failed; the rest are retried on every run. Extra fields:library_doi(DOI as stored in the manager),doi(DOI used for this attempt),doi_verified(ok/suspect/swapped/unknown/missing),pdf_doi(extracted from the file on disk after a successful download),reason(for examplestrict_pdf_doiorshort_pdfwhen attach is held — batchattachskips those unless--allow-pdf-doi-mismatchor--allow-short-pdf).state/metadata-patches.jsonl— append-only audit log of proposed bibliographic patches fromfix-metadata(dry-run and--applyboth append here first). One patch per item key per invocation; inspect the file for review — it is not a selective re-apply queue.state/dedupe-packs/—dedupereview packs (.jsonand.md). Not applied until--apply.state/dedupe-applied.jsonl— one line per parent merged bydedupe --apply(children and better fields land on the keeper first).state/cites/— cached OpenAlex reference lists for the snowball “Cited by N papers in this collection.” line. Keyed by the set of DOIs already in the target collection.state/version-packs/—versionsreview packs (.jsonand.md,paperful.version_pack.v1).state/versions-applied.jsonl— one line per work updated byversions --apply.state/refs-gaps/<stamp>/—refs gappack (pack.json,pack.md,dois.txt). Always dry-run.state/coverage/<stamp>/—coveragepack (pack.json,pack.md,dois.txt). Always dry-run.state/precedent/<stamp>/—precedentpack (pack.json,pack.md,dois.txt). Always dry-run.state/stuff/<id>/<stamp>/—stuffpack (pack.json,pack.md). Extra library cites per claim. No manager writes.state/ingest/<stamp>/—ingest-doissummary JSON. Created only classifies unless--apply.state/collections-add/<stamp>/—collections addsummary JSON (paperful.collections_add.v1). Dry-run unless--apply.state/authorwatch/<name>/— people lists (paperful.authorwatch.v1),people.jsonl,suggestions.jsonl, inbox, seen, applied. Cursor baseline does not open the library;suggestdoes. See authorwatch.md.state/inbox/proposals/— gated inbox create/attach proposals (paperful.inbox.proposal.v1).state/pdf-cache/— PDFs exported from the manager so lint can read text on disk (pdftotext, thenpypdf) when[mirror].pdfs = "none".paperful syncmoves matching files into item folders;paperful cache cleanremoves absorbed or stale leftovers (dry-run unless--apply).state/last-run.json— latest auditablerunorrecoverreport (summary + per-item outcomes). Other commands do not replace it. Historical copies land instate/runs/<timestamp>-<command>.json(run,recover,gaps,reachout,lint,fix-metadatafor dry-run and--apply,summarize,synthesize,extract-sections,refs gap,coverage,precedent,stuff,snowball apply, …). Reports may include optionalwitness(paperful.witness.v1).state/packs/<id>.json— parent witness for onepack open…pack closesequence (paperful.pack.v1). Steps point at filenames understate/runs/and may includewitness_id(first 12 ofwitness.config_sha256).state/packs/currentis the open id;PAPERFUL_PACK=offskips appending.state/summaries/— HTML summaries fromsummarizewhen dest includes disk.state/sections/— structured IMRaD JSON fromextract-sections(paperful.sections.v1; optionalstate/section-headings.tomlsynonyms).state/reports/—synthesizeHTML report plus a JSON sidecar of source hashes;authors --applywrites<scope>-authors.json(paperful.authors_report.v1).state/author-packs/— field author packs (*.proposed.tomluntilsnowball packs promote). Seeded byauthors --apply, snowball--author-site-preflight, ortwenty lookup --apply.state/author-contacts/— Twenty People cache fromtwenty lookup --apply,twenty sync --apply, orreachout --lookup(websites / emails; no mail).state/author-requests.jsonl— ResearchGate handoff ledger (handoff_opened).--re-requestignores it.state/sessions/— Chromium profile (chromium/) plusmeta.json(no passwords). Gitignored;chmod 700. Netscape dumps also land here and asezproxy-cookies.txt/scholar-cookies.txtfor httpx.state/fetch-wins.jsonl— one line per vault or browser-agent PDF (host and path only; optionalstepstrace on agent successes). Gitignored with the rest ofstate/.state/playbooks-proposed.toml— draft frompaperful playbooks propose. Installed only byplaybooks promoteintogrey_playbooks_dir/learned.toml.state/zotero-local-api-key.json— the Zotero write key if you chose “Always Allow”.state/mendeley-oauth.json— Mendeley access/refresh tokens aftersession login mendeley(mode0600).state/endnote-import/<stamp>/— staged XML+PDF bundle for EndNote File → Import. Paperful never edits the.enldatabase.