Skip to main content

astrobib

A terminal-based literature manager for astrophysics research

PyPI License: MIT

astrobib connects to the NASA/Harvard ADS to search, fetch, and organize papers as plain BibTeX files, with a fast terminal UI. It ships as a single native binary: instant startup, instant quit, no runtime dependencies.

Your library is just a directory of .bib files, indistinguishable from hand-written BibTeX, and cite keys derive from each paper's stable identity (arXiv ID or bibcode) — so any two copies of a paper, fetched by anyone at any time, agree on the key forever. Libraries from all earlier astrobib versions work unchanged.


Installation

uv tool install astrobib     # or: pipx install astrobib

Binary wheels cover macOS (arm64, x86_64) and Linux (x86_64, aarch64). Building from source needs a Rust toolchain: cargo install --git https://github.com/clemson-cal/astrobib.


Quick start

# set your ADS token (https://ui.adsabs.harvard.edu/user/settings/token)
export ADS_API_TOKEN=...

astrobib                     # launch the TUI
astrobib list                # CLI: newest papers
astrobib search '^zrake OR kw:"compact objects"'
astrobib add 2020ApJ...123..456Z
astrobib import refs.bib     # resolve a foreign .bib against ADS

The two-tier library model

astrobib always works on up to two libraries: a local bib directory (tier 2) and your global personal library (tier 1, at ~/.local/share/astrobib/library/). astrobib [LIBRARY_DIR] points tier 2 at any directory holding bib/; with no argument, the nearest ancestor of the current directory with a bib/ is used. A .tex or .md manuscript alongside activates citation tracking, but any bib directory works. With the global tier enabled (the default), reads merge both tiers and imports write to both — the paper repo stands alone for coauthors while your collection accrues. Press t (or click the global badge) to hide the global tier: reads and writes become purely local. Removing a local paper never destroys a sole copy — it is rescued into the global library. Both stores are plain bib/*.bib files, one paper per file, indistinguishable from hand-written BibTeX. Nothing else is ever written into your repos.


TUI overview

Scope capsules at the top switch between your library, saved ADS query tabs, and the manuscript view. The pub card on the right shows the highlighted paper (hover the citekey column to preview others); an event log and clickable view badges sit at the bottom. Most things are clickable; every action has a key (? shows the cheat-sheet).

Keys

  • / — live filter (query language below); S — new ADS query (↑/↓ sets result count; pasting a DOI or ADS URL imports directly)
  • j k g G — move; [ ] — switch scope; ctrl+w — close query scope; r — refresh; + - — result count
  • Space — select row (iOS-style selection mode); a — select visible; A — select all; Esc — done
  • i — import ADS result(s); m — toggle manuscript/local membership; — remove (with confirmation)
  • p — download PDFs (ADS open-access, then arXiv); B — browser download (watches ~/Downloads); o — open PDF; X — clear PDF; double-click a row — open its PDF
  • y — copy chord: yy cite key, yY full key, yb bibcode, ya/yx/yd ADS/arXiv/DOI URL, yp PDF path, yt title, yA abstract; card title/abstract/key are click-to-copy
  • t — show/hide the global tier; T — pending-tasks overlay (also: click ⧗N); D — pub card; L — event log; ? — keys; q — quit

Filtering the library

Press / to filter as you type. Whitespace-separated terms AND together; each term is a case-insensitive partial match. Bare terms match author, title, abstract, key, keywords, and year; field prefixes narrow:

author:sironi          author anywhere in the list
^zrake                 first-author papers (= author:^zrake)
title:magnetar         word in title
abs:"fast radio burst" phrase in abstract
kw:"compact objects"   keyword
year:2015-2020         ranges; year:2020- open-ended
is:ms                  local/manuscript members;  is:pdf  cached PDFs
-abs:neutrino          leading - negates (NOT works too)
^zrake OR ^metzger     uppercase OR separates alternatives; AND binds tighter

A half-typed query never errors. With a filter active, S pre-fills the equivalent ADS query — filter locally, escalate in one keystroke.


ADS queries

S passes your query to the ADS API unmodified, so the full Solr language works (bibstem:ApJL, citations(...), boolean grouping, …). Each query becomes a scope capsule, persisted per library context in tabs.json. The pub card walks the citation graph directly: click "cited by N" (or the citations/references affordances) to open a citations(...) or references(...) scope for the shown paper.


Markdown manuscripts

Literature reviews and notes work as manuscripts too: any .md files beside bib/ are scanned for citations (main.md is the sole root when present; Obsidian ![[embeds]] pull in more files, like \input). Cite pandoc-style — bare @Zrake2019 or bracketed [@Zrake2019; @Metzger2017] — or with Obsidian wikilinks: [[Zrake2019]] counts as a citation when it resolves in the library, and stays an ordinary note link when it doesn't. An unresolved @cite shows as missing in the Manuscript view, same as LaTeX. astrobib refs renders the bibliography of everything cited into the manuscript — a sorted, linked reference list (authors, year, italic title, journal, ADS/arXiv/DOI links) kept between <!-- astrobib:references --> markers, appended as a ## References section the first time. Regenerate any time; your prose is never touched.


refs.bib and co-authors

For TeX manuscripts, refs.bib regenerates silently whenever the TUI rescans — and the TUI rescans itself when you edit sources externally (mtimes are polled, like the original app): every cited manuscript-db member, emitted under the string you actually cited (full key or unambiguous prefix), so hash suffixes never need to appear in your .tex. astrobib refs [--prune] does the same from the CLI, first copying cited-but-missing entries into the manuscript db (--prune also removes uncited ones, rescuing sole copies). Co-authors don't need astrobib. They add a reference by pasting BibTeX from the ADS website into bib/any-name.bib (and, if they like, appending it to refs.bib by hand so the paper still compiles). Next time you check out the repo, astrobib tidy canonicalizes those files — re-keys them through ADS when needed, renames them to {Key}.bib, dedupes, prints copy-pasteable cite-key replacements — and regenerates refs.bib for the commit.


CLI

list, search [--ads], add <bibcode|ADS URL>, show <key>, import <file.bib> [--global-only|--local-only], refs [FILE] [--prune] [--dry-run], tidy [--dry-run], update [--all] (arXiv → published refresh, same key forever), plus --library PATH (relocate the global tier) and --no-global. import resolves each entry against ADS (arXiv ID → DOI → exact title+author+year) unless its cite key is already reproducible from its own data — canonical astrobib entries import byte-identically — and prints copy-pasteable key replacements for your .tex files.


See docs/DESIGN.md for the data-format contract. Bugs and feature requests: github.com/clemson-cal/astrobib/issues.

© 2026 Jonathan Zrake · MIT license · Clemson University Physics and Astronomy · Supported by NSF award number 2408034 Development assisted by Claude (Fable 5).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

astrobib-0.6.0.tar.gz (200.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

astrobib-0.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

astrobib-0.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

astrobib-0.6.0-py3-none-macosx_11_0_arm64.whl (2.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

astrobib-0.6.0-py3-none-macosx_10_12_x86_64.whl (2.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file astrobib-0.6.0.tar.gz.

File metadata

  • Download URL: astrobib-0.6.0.tar.gz
  • Upload date:
  • Size: 200.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for astrobib-0.6.0.tar.gz
Algorithm Hash digest
SHA256 64508dcd68a16ffc7da66269acdd6896de3f33bc5e71df5b929358bb4d8f0d22
MD5 47295746c4ade2544cd61c55c89b0dc6
BLAKE2b-256 730808710a49cfb010ed4016d195a2cb0c9384d99ce15ad53113fa719fd18385

See more details on using hashes here.

File details

Details for the file astrobib-0.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for astrobib-0.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a692f1c1271e3c8635f896abb0e3f23d06b44f6528634272e5d2d4a25b66fda
MD5 e21f85963f6f19b6bbf2a4062f63b800
BLAKE2b-256 286c5fd69ffb9afaf7d031fa311450bf91570d6e429bdfab3b039b8be6af1d18

See more details on using hashes here.

File details

Details for the file astrobib-0.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for astrobib-0.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5eaeec65c1c88d44c8fc5abc0f531f66e08e1b9d40c1fed84ac82a94f3fcfc95
MD5 48b870b27576b2ec321f642ccbe00016
BLAKE2b-256 761654568de8e51aa3a04325e092810b5756b7882cd69e55c3652b1ace5d91ce

See more details on using hashes here.

File details

Details for the file astrobib-0.6.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for astrobib-0.6.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b443166a8f48609f1b690f549d7d9a1cf289e6375c6ed4320e17b4b002404a87
MD5 e5c09811cddba27e5d82c4d4fec2304b
BLAKE2b-256 a2f1ae509e514427c202013da7208d78a34e9292d8705032475c05a1c9a1e4c1

See more details on using hashes here.

File details

Details for the file astrobib-0.6.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for astrobib-0.6.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d120a91bd1dab9489d4f77a2f4a589e7856499fc3cb872b2dc38ba2f5f643e31
MD5 b69754498f206ae9d90af86edd2b2859
BLAKE2b-256 6e26a26c75bb5319ce83b50439cf07d5dc0c20b64412eff49e3b8934baba6a00

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page