PaperEngine
Pre-submission rejection-risk analysis for academic manuscripts — 65 engines · dual international / Indian standards · 100% local
What could cause this manuscript to be rejected at this venue, what evidence suggests that risk, how serious is it, and what should the researcher fix?
Why PaperEngine exists
Most tools answer one narrow question: "Is this text copied?" or "Does this look AI-written?". Rejection happens for dozens of other reasons — missing ethics statements, impossible statistics, unreferenced figures, template violations, predatory venue traps, retracted citations. PaperEngine runs 65 specialized engines against your manuscript and returns every finding as:
Severity | Finding | Evidence (quoted from your paper) | Confidence | How to fix it
The honesty principle (by design, not marketing): Similarity is not plagiarism. An AI-risk score is not proof of AI authorship. Every finding carries evidence + confidence, and the readiness score is informational — final judgment stays with humans, exactly how editors are trained to use iThenticate/Similarity Check.
How to use
Step 1 — Install (one time, under a minute)
Requirements: Python 3.10+. PDF support
needs pypdf, image forensics needs Pillow — both come with the [all] extra.
Option A — straight from PyPI (simplest):
pip install paperengine[all]
papercheck --list-venues # verify: prints all 19 venue presets
Option B — clone the source repo (development / latest changes):
git clone https://github.com/abnsr-sol/paperengine.git
cd paperengine
pip install -e .[all] # editable install — every git pull is picked up automatically
Windows tip: if
pipisn't on PATH, usepy -m pip install paperengine[all].No-install option: from the cloned folder, replace
papercheckwithpython -m papercheckin any command below.
Step 2 — Use the Desktop version (web GUI)
papercheck --gui # launches the server and opens your browser
papercheck --gui --port 9000 # custom port if 8765 is already taken
Then, in the browser:
- Drag your manuscript (.docx / .txt / .md / .tex / .pdf) onto the upload zone — or click to browse
- Choose the standard — International (IEEE/Elsevier/ACM…) or National (India: UGC/AICTE/NAAC)
- Pick the venue preset — e.g.
ieee_conference,ugc_care,mdpi(the list filters by standard) - Click Check my paper → the full report renders in the browser: readiness score + findings table (severity · finding · evidence · confidence · how to fix)
- (Optional) Drop the revised version into the second upload zone before checking → before/after comparison: fixed / still-open / new findings plus the score delta:
readiness score: 42 → 57 (+15)
fixed: 12 still open: 41 new: 3
Privacy: the GUI runs on your machine only (localhost). The file is parsed in memory, checked by the same 65 engines as the CLI, and never uploaded to the internet.
Step 3 — Use the CLI version
Basic pattern:
papercheck <file> [--standard international|national] [--venue <preset>] [--format <format>] [--out <file>]
Common tasks:
| You want to… | Command |
|---|---|
| Check a paper (international) | papercheck paper.docx --venue ieee_conference |
| Check a thesis (Indian national) | papercheck thesis.docx --standard national --venue ugc_care |
| Save a styled HTML report | papercheck paper.docx --venue mdpi --format html --out report.html |
| Get the prioritized fix plan | papercheck paper.docx --venue ieee_conference --format fixplan |
| Compare two revisions | papercheck v1.docx --compare v2.docx --venue elsevier --format html --out diff.html |
| Batch-scan a whole folder | papercheck --batch papers/ --venue ugc_care --format csv --out summary.csv |
| Crossref online lookups | papercheck paper.docx --venue springer --online --mailto you@university.edu |
| Compare vs your prior papers | papercheck paper.docx --corpus ./my_prior_papers/ |
| List all venue presets | papercheck --list-venues |
Without installing, run from the cloned folder with python -m papercheck … instead:
python -m papercheck sample_paper.txt --venue elsevier
# Full report to a file (console | markdown | html | fixplan | csv)
python -m papercheck paper.docx --venue mdpi --format html --out report.html
# Indian national standards (UGC/AICTE/NAAC)
python -m papercheck thesis.docx --standard national --venue ugc_care
# Prioritized fix plan (criticals first, effort-estimated)
python -m papercheck paper.docx --venue ieee_conference --format fixplan
# Batch-scan a folder, worst-first summary table or CSV
python -m papercheck --batch papers/ --venue ugc_care --format csv --out summary.csv
# Before/after revision comparison
python -m papercheck v1.docx --compare v2.docx --venue elsevier --format html --out diff.html
# With online lookups (Crossref): duplicate-publication + DOI validation
python -m papercheck paper.docx --venue springer --online --mailto you@university.edu
# Compare against your already-published papers (duplicate / "no new content")
python -m papercheck paper.docx --corpus ./my_prior_papers/
One-time retraction database (optional, recommended)
papercheck --update-rwdb
# caches 70k+ retraction records (CC-BY 4.0, Crossref) at
# %TEMP%/papercheck_rwdb.json (Linux/macOS: /tmp/papercheck_rwdb.json).
# From then on, retracted-reference screening runs against the full DB offline.
What the engines check
| Cluster | Engines | Sample findings |
|---|---|---|
| Statistics & methodology | statistics, stats_deep, stats_plan, fabrication |
p>0.05 called significant, missing effect sizes, impossible r/n/%, no power analysis, normality untested, p-hacking clusters, Benford's-law anomalies |
| Research design | methodology, repro_env, reproducibility |
no ethics/IRB approval, unregistered trials, missing benchmarks/ablation, no hyperparameters/seeds, no Docker/conda env |
| EQUATOR guidelines (all 15) | reporting_guidelines, domain_checklists, domain_checklists2 |
CONSORT, PRISMA, PRISMA-ScR, STROBE, ARRIVE, STARD, SPIRIT, CARE, TRIPOD, SRQR, COREQ, MOOSE, TREND, STREGA, CHEERS essentials |
| Writing quality | language, writing_depth, paragraph_structure, transitions, redundancy |
weasel words, nominalization, >200-word paragraphs, no topic sentences, missing roadmap, abstract/intro/conclusion overlap |
| Claims & novelty | claims, overclaiming, design_claims, novelty |
"novel/first" without justification, causal claims from observational data, abstract ≈ conclusion |
| Figures & tables | figures, figure_quality, image_forensics, image_manipulation |
uncited figures, low DPI, blots without markers, microscopy without scale bars, duplicated panels (perceptual hash), ELA splicing |
| Citations | citations, citation_integrity, reference_verify, reference_completeness, citation_age |
never-cited refs, numbering gaps, mixed styles, broken DOIs, missing volume/pages, "as cited in" secondary cites, stale lists |
| Integrity & fraud | integrity, self_plagiarism, paper_mill, citation_cartel, author_network, peer_review, reviewer_fraud, predatory_journal, retracted_refs |
self-citation rings, coerced citations, free-mail reviewers, same-domain reviewer conflicts, salami slicing, retracted work (70k-record DB) |
| AI-specific | ai_risk, llm_artifacts, ai_disclosure_deep, policy |
stylometric signals, template phrasing, tortured phrases, fake-ref signatures, per-tool disclosure gaps, EU AI Act, AI-as-author (critical) |
| Submission & editorial | submission, submission_package, editorial_format, author_info, venue_extras, abstract_quality, scope_match |
missing statements, no ORCID, keyword count, line numbers, running head, ACM CCS, Elsevier highlights, scope mismatch |
| Authorship & ethics | authorship, legal_ethics, safety_ethics |
CRediT roles, ghost/gift authorship signals, patient consent, HIPAA/GDPR, biosafety levels, DSMB, dual-use |
| Data & FAIR | data_license, funder_compliance |
no dataset DOI, proprietary formats, missing licenses, NIH/Plan S/Horizon obligations |
| Venue compliance | compliance, consistency, forensics |
word/page/figure limits, mixed fonts, hidden text, lookalike characters, conflicting numbers, acronym drift |
| Post-submission | rebuttal, cross_check |
response-letter tone/evidence/completeness, inconsistent n across tables, figure/table duplicate data |
The full 48-angle rejection map (with engine-by-engine status) is in
COVERAGE_MATRIX.md; every engine is listed with its
exact checks in the architecture section below.
Venue presets (dual standard)
papercheck --list-venues
| International | National (India) |
|---|---|
ieee_conference, ieee_journal, ieee_letters |
ugc_care (UGC-CARE / plagiarism levels) |
acm (CCS concepts required) |
aicte (AICTE norms) |
elsevier (highlights, CRediT, data availability) |
naac (NAAC research criteria) |
springer, nature, science, mdpi |
scopus_indian (Scopus-indexed Indian journals) |
wiley, tandf, plos, frontiers |
indian_1col (single-column university format) |
generic (no venue rules) |
ugc_thesis (Shodhganga, thesis rules) |
Every preset works in both the CLI and the web GUI; --venue-json rules.json
accepts exact limits for any venue not yet preset.
Output formats
| Format | Flag | What you get |
|---|---|---|
| Console | --format console |
color-graded terminal table (default) |
| Markdown | --format markdown |
for repos, PRs, and lab notebooks |
| HTML | --format html |
standalone styled report, shareable file |
| Fix plan | --format fixplan |
prioritized to-do list, criticals first, effort estimates ("~30 min", "~2 h"), near-duplicates deduplicated |
| Similarity detail | --format similarity (+-html) |
with --corpus: every matched passage quoted side-by-side with the source and editor-style reading guidance — what matched, not just how much |
| CSV | --format csv |
batch summaries for spreadsheets |
Every finding, in every format, carries: severity · finding · evidence · confidence · concrete action.
Architecture
papercheck/
├── __main__.py CLI entry point (single file, batch, compare, gui modes)
├── ingestion.py DOCX (stdlib zip+XML), TXT/MD/TeX, PDF (optional pypdf)
├── metrics.py text statistics (readability, burstiness, n-grams, …)
├── venues.py 19 venue rule presets + --venue-json override
├── risk.py Finding / Severity / RiskReport / readiness score
├── report.py console, Markdown, and HTML renderers
├── fixplan.py prioritized, effort-estimated fix-plan renderer
├── compare.py before/after revision diff (fixed / still open / new)
├── batch.py folder scanning, worst-first ranking, CSV writer
├── rwdb.py Retraction Watch DB download/cache/screening
├── webui.py local drag-and-drop GUI (stdlib http.server)
└── checks/ 65 engines — one per rejection angle
compliance · structure · language · citations · claims · ai_risk ·
integrity · novelty · consistency · figures · forensics · policy ·
statistics · overclaiming · self_plagiarism · citation_integrity ·
reproducibility · submission · ugc_plagiarism · reference_verify ·
fabrication · methodology · reporting_guidelines · writing_depth ·
legal_ethics · citation_cartel · paper_mill · predatory_journal ·
retracted_refs · submission_package · image_forensics · stats_deep ·
design_claims · redundancy · domain_checklists · literature_search ·
scope_match · rebuttal · crossref_verify · author_network ·
reviewer_fraud · image_manipulation · llm_artifacts · supplementary ·
data_license · abstract_quality · citation_age · sex_gender ·
stats_plan · editorial_format · author_info · figure_quality ·
venue_extras · ai_disclosure_deep · safety_ethics · authorship ·
repro_env · paragraph_structure · transitions ·
reference_completeness · funder_compliance · peer_review ·
domain_checklists2 · grammar_tool (optional LanguageTool) · cross_check
Extending: add checks/my_angle.py with run(doc, ctx) -> [Finding],
register it in checks/__init__.py, add tests. New venue: one dict in
venues.PRESETS. See CONTRIBUTING.md for the ground rules
(evidence + confidence + action on every finding, offline-first, dual standard).
Plug-in points already in the code: LanguageTool server (grammar_tool),
Crossref/OpenAlex (--online), Retraction Watch DB (rwdb.py), AI-detector
APIs (checks/ai_risk.py — documented hook, no verdicts).
Project layout
| File | Purpose |
|---|---|
README.md |
this overview |
USER_GUIDE.md |
5-minute researcher walkthrough (every flag explained) |
COVERAGE_MATRIX.md |
the full standards-coverage audit, angle by angle |
CHANGELOG.md |
release history (Keep a Changelog format) |
CONTRIBUTING.md |
engineering ground rules + PR checklist |
LICENSE |
MIT |
scripts/ |
sample-document generator, weekly maintenance script |
Development
python -m unittest discover -s tests # 150+ tests, offline, no services needed
python scripts/maintenance.py # tests + retraction-cache refresh
CI (.github/workflows/ci.yml) runs the full
suite on Python 3.10 – 3.13 on every push and PR. A weekly scheduled job
refreshes the retraction database and re-runs the suite. Tagging vX.Y.Z
triggers the PyPI publish workflow (tag/version match is verified first).
To enable PyPI uploads: already done — the package lives at pypi.org/project/paperengine. Every future
v*tag publishes automatically via the trusted publisher.
Honest limitations — and what we built to overcome them
Every tool has limits. Most hide them; we ship mitigations and measurement for ours:
| # | Limitation | Mitigation shipped in the tool |
|---|---|---|
| 1 | Similarity ≠ plagiarism. Overlap requires human interpretation (Crossref itself warns against automatic rejection thresholds). | Passage-level similarity detail (--format similarity): every matched passage quoted side-by-side with the source document and classified (own prior work / quotable / boilerplate) — the same three questions editors are trained to ask. Never a verdict, always evidence. |
| 2 | AI detection is probabilistic. Low burstiness and template transitions occur naturally in non-native and technical writing. | Calibrated in the open (scripts/benchmark.py): a shipped clean-vs-flawed corpus measures what the stylometric engines actually fire on; the AI-risk engine reports an uncertainty band, never a single verdict, and deliberately refuses typography myths ("em dash = AI") that have no scientific support. |
| 3 | Grammar heuristics ≠ a real grammar engine. | Discoverable upgrade path: when no LanguageTool server is found, the report says so (INFO) with the exact one-line docker command; start one and full grammar checking is picked up automatically next run. |
| 4 | Venue rules change without notice. | Freshness surfaced in every report: each run states when the preset's numbers were last verified against the publisher's guidelines, and --venue-json overrides any limit with exact current values. |
| 5 | The readiness score is informational — it is not a prediction of acceptance. | Monotonicity is enforced: the benchmark harness fails CI if the flawed corpus paper ever outscores the clean one — the score must discriminate, or the release doesn't ship. |
| 6 | What no software can check: whether the science is true, whether ideas match paywalled prior work, and the reviewer's subjective "so what?". | Nothing — and we won't pretend otherwise. Tools that claim to check these are selling overconfidence. |
Run the benchmark yourself: python scripts/benchmark.py (or --json for
machine-readable output). It exits non-zero if calibration regresses.
License
MIT — free for research, commercial products, and institutions.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file paperengine-1.2.0.tar.gz.
File metadata
- Download URL: paperengine-1.2.0.tar.gz
- Upload date:
- Size: 158.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc9ad752066beef8f450389704e5b229e3e47507c009027e2a1b3c16f756cbb4
|
|
| MD5 |
1c2a374957ca3a944a2b53b12fb0fdd8
|
|
| BLAKE2b-256 |
7035f8f3257ae9c035b5a61e94e70d5947f28132d59610c106570863b437950b
|
Provenance
The following attestation bundles were made for paperengine-1.2.0.tar.gz:
Publisher:
publish.yml on abnsr-sol/paperengine
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paperengine-1.2.0.tar.gz -
Subject digest:
dc9ad752066beef8f450389704e5b229e3e47507c009027e2a1b3c16f756cbb4 - Sigstore transparency entry: 2742807346
- Sigstore integration time:
-
Permalink:
abnsr-sol/paperengine@fb6a8662edc45aecf9eb6929041433ecc4039722 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/abnsr-sol
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fb6a8662edc45aecf9eb6929041433ecc4039722 -
Trigger Event:
push
-
Statement type:
File details
Details for the file paperengine-1.2.0-py3-none-any.whl.
File metadata
- Download URL: paperengine-1.2.0-py3-none-any.whl
- Upload date:
- Size: 173.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2d271172cecdee818cd642aad90aacf4070ffa923863365361fa4c8e1563dda
|
|
| MD5 |
08c27827c6037d8c4073c01109e3bf8a
|
|
| BLAKE2b-256 |
7599be5b246ee8332902948d0b6dcac48fb6d3bc660130fda3a1b935055b9522
|
Provenance
The following attestation bundles were made for paperengine-1.2.0-py3-none-any.whl:
Publisher:
publish.yml on abnsr-sol/paperengine
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paperengine-1.2.0-py3-none-any.whl -
Subject digest:
e2d271172cecdee818cd642aad90aacf4070ffa923863365361fa4c8e1563dda - Sigstore transparency entry: 2742807427
- Sigstore integration time:
-
Permalink:
abnsr-sol/paperengine@fb6a8662edc45aecf9eb6929041433ecc4039722 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/abnsr-sol
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fb6a8662edc45aecf9eb6929041433ecc4039722 -
Trigger Event:
push
-
Statement type: