Skip to main content
UploadAssist logo

UploadAssist

Submission-ready LaTeX project packaging.

UploadAssist packages the local files used by a LaTeX document into a clean submission directory and .tar.gz archive. It is designed for journal, conference, and repository submission systems, many of which require a flat source bundle.

Version 1.0 is a modern, dependency-free successor to arxiv-collector. It supports Python 3.9 and newer.

Highlights

  • Recursively discovers \input, \include, \subfile, import-family commands, graphics, bibliographies, and local classes/styles.
  • Flattens the bundle by default and rewrites source references accordingly.
  • Detects duplicate basenames before flattening instead of silently overwriting files.
  • Strips LaTeX comments by default while preserving escaped percent signs.
  • Replaces stale output atomically and creates a ready-to-upload archive.
  • Requires no Python dependencies and no TeX installation.

Installation

python -m pip install uploadassist

Usage

Run the command from the directory containing your main document:

uploadassist

If there is one .tex file, it is selected automatically. If there are several, main.tex or paper.tex is preferred when unambiguous. You can always specify the document:

uploadassist path/to/main.tex

The default output is output/ next to the main document, plus output.tar.gz.

Common options:

uploadassist --noflatten main.tex             # preserve directories
uploadassist --no-strip-comments main.tex     # retain comments
uploadassist --no-archive main.tex            # omit the tar.gz file
uploadassist -o submission main.tex            # choose the output directory
uploadassist --include journal-template.sty main.tex
uploadassist --include extra-files/ main.tex   # repeatable
uploadassist --version

To extract only cited BibTeX entries:

uploadassist --extract-bib references.bib main.tex > cited.bib

Run uploadassist --help for the complete command reference.

Python API

from uploadassist import collect, get_deps

dependencies = get_deps("main.tex")
files = collect("main.tex", "submission", flatten=True)

collect returns the generated file paths. Pass create_archive=False to omit the archive.

Discovery and limitations

UploadAssist uses static source discovery so it can run without compiling the document. This covers conventional literal paths in common LaTeX commands. Paths assembled through custom macros, generated during compilation, or selected only through TeX conditionals cannot be inferred; add those files with --include.

Flattening changes every dependency to its basename. If two used files have the same basename, UploadAssist stops with an actionable error; rename one file or use --noflatten. Always compile and inspect the generated bundle before submitting it.

Development

python -m pip install -e ".[dev]"
ruff check uploadassist tests examples
ruff format --check uploadassist tests examples
python -m pytest
python -m build
python -m twine check dist/*

Bug reports are welcome in the issue tracker. Maintainers can use the release checklist for PyPI publishing.

License

UploadAssist is distributed under the BSD 3-Clause License. See LICENSE.

Release files for uploadassist 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for uploadassist 1.0.0
File Size Uploaded
uploadassist-1.0.0.tar.gz 17.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for uploadassist 1.0.0
File Interpreter ABI Platform
uploadassist-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.4 kB

Release files / uploadassist-1.0.0.tar.gz

Download URL uploadassist-1.0.0.tar.gz
Size 17.2 kB
Tags Source
SHA-256 checksum
How to use checksums
c06899a05bb9d3721d31a6842ebca9cbb7edc39210865ed1a3523548332abda9
BLAKE2b-256 checksum
How to use checksums
a84bff42783caf8419b575dc2de64c2ce90c1e7fa7c1bbbafa626cc4cc54dee8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 16, 2026.

Transparency log

Release files / uploadassist-1.0.0-py3-none-any.whl

Download URL uploadassist-1.0.0-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0ac9901580618c463b6c1875e68451d1677615dd9ed43ae8f2ed94aa3493ac0a
BLAKE2b-256 checksum
How to use checksums
2dba7cda4d8cad99c3d18542a3d74857b1bbd2b38f82a893580fae2ac2005c02
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 16, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page