Synchronize BibTeX files from citation keys in LaTeX sources
Project description
bibsync
bibsync synchronizes BibTeX files from citation keys in LaTeX sources. It is
inspired by adstex, with provider support for both NASA ADS and InspireHEP.
The primary workflow is to cite papers by identifier, especially arXiv ID:
\citep{2404.14498}
\citet{arXiv:2312.00752}
Then check the bibliography:
bibsync main.tex -o references.bib
To update the file, add --fix:
bibsync --fix main.tex -o references.bib
bibsync scans the TeX file, resolves missing identifier-like citekeys through
NASA ADS and/or InspireHEP, rewrites provider BibTeX entries so the citekey stays
the key used in TeX, and reports whether the output .bib file is current. With
--fix, it writes the merged bibliography.
When a citekey cannot be resolved, the command prints the key together with a reason and the likely fix. For example, an unsupported citekey is reported as an identifier-format problem, while an arXiv ID or DOI that the provider cannot find is reported as a provider miss.
Installation
Install the Rust CLI from crates.io:
cargo install bibsync
Install the Python package from PyPI:
pip install bibsync
The PyPI package includes Python bindings and installs the bibsync command.
Python 3.12 or newer is required.
You can also download a pre-built binary from the
GitHub releases page. Pick
the archive for your platform, extract it, and place the bibsync executable
somewhere on your PATH.
To compile from source:
git clone https://github.com/isaac-cf-wong/bibsync.git
cd bibsync
cargo build --release
The compiled binary is written to target/release/bibsync on Unix-like systems
or target\release\bibsync.exe on Windows.
Citing
If bibsync contributes to a scientific publication, please cite it using the
Zenodo record:
https://doi.org/10.5281/zenodo.20422622
Citation formats including BibTeX can be exported directly from the Zenodo page. For convenience, you can also use:
@software{wong2026bibsync,
author = {Wong, Isaac C. F.},
title = {bibsync: A Rust package to automatically resolve, synchronize, and validate LaTeX citations across BibTeX databases},
version = {v0.3.3},
year = {2026},
month = jun,
doi = {10.5281/zenodo.20422622},
url = {https://doi.org/10.5281/zenodo.20422622}
}
Providers
By default bibsync tries NASA ADS first and InspireHEP second:
bibsync --fix main.tex -o references.bib --provider auto
NASA ADS requires an API token:
export ADS_API_TOKEN="..."
You can choose a single provider:
bibsync --fix main.tex -o references.bib --provider ads
bibsync --fix main.tex -o references.bib --provider inspire
InspireHEP supports arXiv IDs and DOIs. NASA ADS supports arXiv IDs, DOIs, and ADS bibcodes.
Python API
bibsync can also be installed from PyPI:
pip install bibsync
The PyPI package provides Python bindings backed by the Rust implementation:
import bibsync
report = bibsync.sync_files(
["main.tex"],
output="references.bib",
provider="inspire",
check=True,
)
It also installs the bibsync command. The command delegates to the same Rust
CLI implementation as the Cargo-installed binary, so command-line behavior is
kept in one place.
Existing Bibliographies
If the TeX source contains \bibliography{references}, bibsync can discover
references.bib automatically:
bibsync --fix main.tex
Additional read-only bibliographies can be used to avoid duplicating entries:
bibsync --fix main.tex -o references.bib -r shared.bib software.bib
Use --merge-other to copy matching entries from those read-only files into the
main output file.
To update a bibliography in place, pass a single .bib file:
bibsync --fix references.bib --force-regenerate
Existing input files are validated before resolution. A missing single .bib
input, --other bibliography, or --ignore-file is reported as an error with
the path that could not be read. Existing bibliography files are also parsed
strictly, so malformed BibTeX reports the file and the approximate failing
entry instead of being treated as an empty or partial bibliography.
Update Behavior
By default bibsync leaves published entries untouched. Only entries that look
like unpublished preprints — those with an archivePrefix or eprinttype field
but no journal field — are re-queried to check whether they have been
published. If so, the entry is updated; otherwise it is preserved.
| Flag | Behavior |
|---|---|
| (default) | Re-check preprints; skip published entries |
--no-update |
Skip all existing entries |
--update-all |
Re-resolve all existing entries |
--force-regenerate |
Re-resolve and overwrite all existing entries |
Ignoring Entries
To exclude specific entries from all resolution — for example, books or theses
you have curated by hand — list their citekeys in a .bibsyncignore file:
# .bibsyncignore
knuth1997art
smith2024thesis
Pass the file with --ignore-file:
bibsync --fix main.tex -o references.bib --ignore-file .bibsyncignore
Cache
Use --cache to avoid repeated provider API calls:
bibsync --cache main.tex -o references.bib
bibsync --fix --cache main.tex -o references.bib
The cache stores provider records and mappings from arXiv IDs or DOIs to the
provider's canonical record ID. Preprint entries that are re-checked for
publication always bypass the cache and fetch a fresh result, then write it back.
Use --refresh-cache to force a fresh fetch for all entries:
bibsync --fix --refresh-cache main.tex -o references.bib
Override the cache location with --cache-dir DIR.
If a cache file is corrupt, bibsync reports the exact cache path and asks you
to refresh or remove the bad cache entry. Provider request failures include the
provider and citekey or batch being resolved.
Pre-commit
The repository includes .pre-commit-hooks.yaml, so other projects can use
bibsync as a pre-commit hook.
Use the pre-built binary hook for faster installs:
repos:
- repo: https://github.com/isaac-cf-wong/bibsync
rev: v0.3.3
hooks:
- id: bibsync-bin
args: [--cache, --provider, inspire, --output, references.bib]
The binary hook downloads a platform-specific archive from the GitHub release
matching rev and caches it under pre-commit's cache directory. The source hook
is available for Linux x86_64/aarch64, macOS x86_64/aarch64, and Windows x86_64.
The source hook is still available, but it compiles the Rust crate during hook
installation:
repos:
- repo: https://github.com/isaac-cf-wong/bibsync
rev: v0.3.3
hooks:
- id: bibsync
args: [--provider, inspire, --output, references.bib]
By default, the hook checks whether the bibliography is current and fails without
writing changes. To let the hook update files, add --fix to the hook args:
repos:
- repo: https://github.com/isaac-cf-wong/bibsync
rev: v0.3.3
hooks:
- id: bibsync-bin
args: [--fix, --cache, --provider, inspire, --output, references.bib]
To skip manually curated entries, add --ignore-file:
repos:
- repo: https://github.com/isaac-cf-wong/bibsync
rev: v0.3.3
hooks:
- id: bibsync-bin
args:
[
--fix,
--cache,
--provider,
inspire,
--output,
references.bib,
--ignore-file,
.bibsyncignore,
]
For a project-local hook while developing bibsync itself:
repos:
- repo: local
hooks:
- id: bibsync
name: bibsync
entry: cargo run -- --fix --provider inspire --output references.bib
language: system
files: \.tex$
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 bibsync-0.3.3.tar.gz.
File metadata
- Download URL: bibsync-0.3.3.tar.gz
- Upload date:
- Size: 71.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46fc2a04af6a64924c02b19146d2894874f9ee2cf71ce22179dd3ae1606ed7df
|
|
| MD5 |
d173ae39cdbd3345eb089db702714d56
|
|
| BLAKE2b-256 |
7f19f3c696054373f090b2c02d1cf3447d2b33d05c9d47da85ea7bccea014513
|
File details
Details for the file bibsync-0.3.3-cp312-abi3-win_amd64.whl.
File metadata
- Download URL: bibsync-0.3.3-cp312-abi3-win_amd64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.12+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8862aa1660e78a2cebc7468564687b1b5c25970cbf1032c722b2156247eb9d1a
|
|
| MD5 |
5de7584500ee1e41353cf62ef4eb039c
|
|
| BLAKE2b-256 |
5d9ebf5f962d745f4c059b19498362f128182ddc2f1a0c4cb04d2ea2a4e4a2d3
|
File details
Details for the file bibsync-0.3.3-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: bibsync-0.3.3-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.4 MB
- Tags: CPython 3.12+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9255728344cb795fd63d08e29d37d7f9d9cd8ad579819d2d3668b77983cd1f72
|
|
| MD5 |
852983b5c2fd4833e559aa12f2f31faf
|
|
| BLAKE2b-256 |
d379885ee72ebc4b6128765790bab09f78cc1c08ee7702ebace870f874e829bb
|
File details
Details for the file bibsync-0.3.3-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: bibsync-0.3.3-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.1 MB
- Tags: CPython 3.12+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b311e4e798996870c999b0a7da83a0233acb2289205e9b25c1a98083e0667e72
|
|
| MD5 |
20bc0ae9e75568bc0cc51d0a8ce83c8e
|
|
| BLAKE2b-256 |
cc7391b20e9fb26f2be4ff96833ae84e33e03bd7bdc00bedebf75a949c5184c8
|
File details
Details for the file bibsync-0.3.3-cp312-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: bibsync-0.3.3-cp312-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.1 MB
- Tags: CPython 3.12+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55921c2e3bc689174e17c5969b686bd70ac5314df40f63f30e32ee5672df0c1b
|
|
| MD5 |
4c8b21048f89fda6af3ee5f272546fb0
|
|
| BLAKE2b-256 |
3169402b2a6735f57c6b150faed91ea3a418c5b0c62ee538212dfa8511297242
|
File details
Details for the file bibsync-0.3.3-cp312-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: bibsync-0.3.3-cp312-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.3 MB
- Tags: CPython 3.12+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a55ccc7954b88685d1e4d651d8f1c2a660c3dc8feabd91c9d9874dfcebec38b
|
|
| MD5 |
2da8db739b349d1ddcbb813c13debe91
|
|
| BLAKE2b-256 |
e9b3fbfe779d659c7d9fb10dbd309f2c9bdc8f2cf7a9a9bea0e097e61016797e
|