astrobib
A terminal-based literature manager for astrophysics research
astrobib connects to the NASA/Harvard ADS to search, fetch, and organize papers as plain BibTeX files, with a fast terminal UI. It is written in Rust and ships as a single binary — installs via pip-style tools involve no Python runtime.
The earlier Python implementation is preserved at tag v0.4.0. Libraries and cite keys are fully compatible between the two: keys derive from each paper's stable identity (arXiv ID or bibcode), so any two copies of a paper agree on its key forever.
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 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 countSpace— select row (iOS-style selection mode);a— select visible;A— select all; Esc — donei— 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 PDFy— copy chord:yycite key,yYfull key,ybbibcode,ya/yx/ydADS/arXiv/DOI URL,ypPDF path,yttitle,yAabstract; card title/abstract/key are click-to-copyt— show/hide the global tier;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 manuscript context and shared with the Python implementation via tabs.json.
CLI
list, search [--ads], add <bibcode|ADS URL>, show <key>, import <file.bib> [--global-only|--local-only], 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 and docs/STATUS.md for implementation status.
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 astrobib-0.5.0.tar.gz.
File metadata
- Download URL: astrobib-0.5.0.tar.gz
- Upload date:
- Size: 165.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01385d693f809967bd25f818fb331d31564d3d118e0e7df2fa70bfbeebec75e8
|
|
| MD5 |
337ab0aefebe2db08a6772393917de61
|
|
| BLAKE2b-256 |
7feeaf64dd0674c8f44188fd926186ad17e60f219dcd72168b93bbcc6921550c
|
File details
Details for the file astrobib-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: astrobib-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 2.5 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f11bbe918a849601f9d5afc8fa8c22fc1be7ccdc25fec2b9a14a4f3aeefcf82
|
|
| MD5 |
d35e1d45c302854f0d943a0a8e1b2517
|
|
| BLAKE2b-256 |
8c5cd362160288f9a05c11d79ab36214b25bfc0a47262c57dccedf3ab2718f79
|
File details
Details for the file astrobib-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: astrobib-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dbb753f10444552c3a21f4071178dfdb142793a06e0e3dd41a3f3bdc9b72174e
|
|
| MD5 |
5484de2819e299782cb5b86f7c2cce66
|
|
| BLAKE2b-256 |
cc0ea912bd2f2dda394264593513d921c23fee5f3197b0725bae61539d0a4a56
|
File details
Details for the file astrobib-0.5.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: astrobib-0.5.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
918c8db5ff06204d1027ea147f75a885551e1e80d5d34b44caf352bc2cef1492
|
|
| MD5 |
af213cdf8c8dea0ee36ad14340e283cd
|
|
| BLAKE2b-256 |
a2374b9c389c619b2b91852262d873ea3aaed0bf3cbc4548d9e184d558c335b3
|
File details
Details for the file astrobib-0.5.0-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: astrobib-0.5.0-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 2.4 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43842385e660eae610e18cd08379ef3b53a55cd5a2bdce670ec4600167f217c9
|
|
| MD5 |
1da9ced35eae09e765334ce7a9872708
|
|
| BLAKE2b-256 |
cb2bbe9339d10364c290cc81e0fd354c9a81d6497846bb0320b41d639cb76297
|