Spaces:
Running
A newer version of the Gradio SDK is available: 6.20.0
title: qalmsw
emoji: ✅
colorFrom: blue
colorTo: indigo
sdk: gradio
sdk_version: 5.27.0
python_version: '3.11'
app_file: app.py
pinned: false
license: mit
short_description: automated QA for scientific LaTeX writing
qalmsw
Local-first automated QA for scientific LaTeX writing, powered by a local LLM through a llama.cpp OpenAI-compatible server.
qalmsw catches high-risk artifacts before submission: LLM meta-comments, placeholder data, hallucinated references, missing figures, citation mistakes, and claim/reference mismatches. Deterministic checks run without an LLM, while grammar, math, reviewer, and claims checks are opt-in parts of a local review workflow.
Status
Pre-1.0 and actively maintained. The package has a Python CLI, focused tests, JSON output for CI integrations, and a local-first architecture. See ROADMAP.md for the maintainer plan and Codex/API credit use case.
What it catches
qalmsw checks for all three categories of "incontrovertible evidence" that arXiv's Code of Conduct penalises:
| What arXiv flags | How qalmsw catches it |
|---|---|
| LLM meta-comments ("here is a 200-word summary", "would you like me to make any changes?") | artifacts checker - deterministic regex scan, no LLM needed |
| Placeholder data ("fill in with the real numbers", "this table is illustrative") | Same artifacts checker |
| Hallucinated references (bib entries for papers that don't exist) | references checker - verifies arXiv IDs and DOIs against live APIs |
| Missing/placeholder captions ("\caption{Insert caption here}") | figures checker - flags missing captions, placeholder text, orphan labels |
| LLM self-awareness artifacts ("as an AI language model", "I cannot provide") | artifacts checker |
| LLM-generated LaTeX boilerplate (\lipsum, \blindtext, TODO/FIXME) | artifacts checker |
| Unreferenced figures/tables | figures checker - warns on labels never \ref'd |
| Missing image files (\includegraphics pointing to non-existent files) | images checker - verifies referenced images exist on disk |
| Grammar & style issues | grammar checker - per-paragraph LLM pass |
| Math formula consistency issues | math checker - per-paragraph LLM pass |
| Missing citations | citations checker - cross-references \cite vs .bib |
| Substantive reviewer concerns | reviewer checker - per-section LLM critique |
| Unsupported claims (opt-in) | claims checker - checks each \cite-backed claim against the cited paper's abstract |
The first three rows are the highest-risk categories. qalmsw catches all of them with deterministic checks, so they can run in CI without LLM cost.
Quick start
pip install -e ".[dev]"
# Start llama.cpp server separately, e.g.
# ./llama-server -m model.gguf -c 8192 --port 8080
qalmsw check path/to/paper.tex # run all checkers
qalmsw check --skip-grammar --skip-reviewer paper.tex # deterministic checks only (fast)
qalmsw check --skip-math --skip-grammar --skip-reviewer paper.tex
qalmsw check --skip-grammar path/to/paper.tex # reviewer + citations + artifacts + references
qalmsw check -j 4 path/to/paper.tex # fan out 4 parallel LLM calls
qalmsw check --bib refs.bib path/to/paper.tex # override .bib auto-discovery
qalmsw check --json paper.tex # parseable JSON output for CI
qalmsw check ch1.tex ch2.tex ch3.tex # batch mode: check multiple files
qalmsw check "src/**/*.tex" # glob expansion
qalmsw scholar "Attention Is All You Need" # Semantic Scholar lookup (default, free API)
qalmsw check --enable-claims --retrieval google-scholar paper.tex # claims check via Google Scholar
Environment variables:
QALMSW_BASE_URL- llama.cpp server URL (defaulthttp://localhost:8080/v1)QALMSW_MODEL- model name (defaultlocal-model; llama.cpp usually ignores this)QALMSW_API_KEY- optional API key for non-local OpenAI-compatible endpoints
Web frontend
The repository includes a Gradio frontend that can run as a Hugging Face Space. Install the Space extra and start it locally with:
pip install -e ".[space]"
python app.py
For a hosted Space, the deterministic checks work without secrets. LLM-backed checks can be configured from the web UI by entering:
- Base URL, such as
https://api.openai.com/v1 - Model, using an ID supported by the selected backend
- API key, when the backend requires one
If those fields are left blank, the app falls back to QALMSW_BASE_URL,
QALMSW_MODEL, and QALMSW_API_KEY from Hugging Face Space variables/secrets.
For a public Space, prefer a Space secret for a shared API key; the web field is
best for user-supplied per-run credentials.
Checkers
| Checker | LLM? | Speed | What it does |
|---|---|---|---|
artifacts |
No | Instant | Scans for LLM meta-comments, placeholders, self-awareness, boilerplate |
figures |
No | Instant | Checks captions, labels, refs, empty floats |
images |
No | Instant | Verifies \includegraphics files exist on disk |
citations |
No | Instant | .bib vs \cite cross-check: MISSING, UNUSED, DUPLICATE |
references |
Network | Slow | Verifies arXiv IDs and DOIs resolve to real papers |
grammar |
LLM | Per-paragraph | Grammar, spelling, punctuation |
math |
LLM | Per-paragraph | Formula notation and consistency |
reviewer |
LLM | Per-section | Motivation, clarity, argumentation, methodology |
claims (opt-in) |
LLM + Network | Very slow | For each \cite-backed claim, checks the abstract supports it |
Exit code is 1 only when an error-severity finding is present (missing citation,
LLM artifact, hallucinated reference), so unused-bib-entry infos or duplicate-key
warnings don't fail CI.
Retrieval backends
The claims checker needs to fetch paper abstracts. Two backends are available:
| Backend | Flag | Auth | Reliability | Speed |
|---|---|---|---|---|
| Semantic Scholar (default) | --retrieval semantic-scholar |
None | High (real API) | ~1 req/sec |
| Google Scholar | --retrieval google-scholar |
None | Low (scraping, CAPTCHAs) | ~1 req/sec |
Default is Semantic Scholar - no auth, no CAPTCHAs, works in CI.
arXiv Code of Conduct
arXiv's Code of Conduct (May 2026) states:
"By signing your name as an author of a paper, each author takes full responsibility for all its contents, irrespective of how the contents were generated."
Penalties for incontrovertible evidence that authors didn't check LLM output: 1-year ban, followed by mandatory peer-reviewed venue acceptance.
Examples of incontrovertible evidence:
- Hallucinated references
- Meta-comments from the LLM
- Placeholder data in tables/figures
All three are caught by qalmsw's artifacts, references, and figures checkers -
which run deterministically with zero LLM cost.
Architecture
The pipeline is load → checkers → report, and every checker produces a uniform
Finding so the report/CI layer never branches on checker type.
.tex file (+ .bib)
│
▼
Document.load
│ Document (path, source, paragraphs, line_map)
▼
checkers.* # each implements check(doc) -> list[Finding]
│
▼
report.render_findings # rich-formatted terminal output (or --json for CI)
Deterministic checkers (artifacts, figures, images, citations) run first and always. LLM checkers (grammar, math, reviewer, claims) run only when a server is available. Network checkers (references, claims) make live API calls.
Open Source
- License: MIT
- Contributing guide: CONTRIBUTING.md
- Security policy: SECURITY.md
- Code of conduct: CODE_OF_CONDUCT.md
- Roadmap and funding plan: ROADMAP.md
- Changelog: CHANGELOG.md