Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.17.0] - 2026-07-14¶
Added¶
- Customizable table columns — you can now choose which columns the entry table shows and in what order, from a new Table: Configure columns panel in the command palette (Ctrl+P). The available columns are discovered by analyzing the whole
.bibfile, so any BibTeX field present in your library (e.g.doi,keywords,volume,publisher) can be added as a column, alongside the built-in columns and a new optional cite key column. In the panel, Space toggles a column on or off and Shift+↑/↓ (or the ▲/▼ buttons) reorder the highlighted one; shown columns are marked with a filled ● in the theme's accent colour and hidden ones are dimmed, and Reset restores the default layout. Your choice is saved to~/.config/bibtui/config.toml([ui].table_columns) and applied live, so it persists across restarts. The default layout is unchanged, and the Title column still flexes to fill the available width — widest in the maximized "Max table" view (m).
Changed¶
- Command palette ordering — bibtui's own commands (Settings, Table: Configure columns, Theme reset, Check for updates, and the Library actions) now appear in alphabetical order in the command palette instead of an arbitrary order.
- Table column visibility is now user-controlled — the table no longer auto-hides the Journal and Added columns when the pane is narrow. Which columns appear is determined entirely by your saved column layout (configure it via Ctrl+P → Table: Configure columns).
[0.16.0] - 2026-07-08¶
Added¶
- Entry validation on write — when you write a new or edited entry, bibtui validates it against the required-field rules for its type (from
ENTRY_TYPES) before touching the.bibfile, in three tiers: auto-fixed (a12-23page range →12--23, ahttps://doi.org/…DOI → bare identifier, bare& % #→ escaped — shown in the form for you to confirm with a second Write; intentional LaTeX/maths and Unicode are left alone), flagged (e.g. an implausible year — surfaced but never blocking), and blocked (missing required field, a non-numeric/missing year where the type requires one, or an empty/space-containing/unparseable cite key — the offending fields are outlined and the write is refused). Editing runs the same checks and feels identical to adding, with one deliberate difference: a required field that was already empty — or a year that was already non-numeric — when you opened the entry is only flagged, never blocked, so you're never trapped fixing an unrelated field. Opening a.bibfile never validates or rejects anything. - Create a new entry from scratch (
n) — press n to open a new-entry form. Choose the BibTeX entry type (article, book, inproceedings, …) and the form shows that type's fields under their real BibTeX names, with required fields marked*and listed in a hint, driven by the built-inENTRY_TYPEStable.doi,urlandnoteare surfaced near the top;keywordsis intentionally omitted because it is managed by the Keywords modal (k). Switching type re-shapes the form while preserving values you already typed. The cursor starts in the first content field (the cite key is auto-suggested from author + year inAuthorYearform and shown dimmed/italic while auto-generated, until you type your own). A custom fields section lets you add any additional field — pick one from a common-field shortlist or type any field name — so you can captureisbn,urldate, or anything else. Every newly added entry — from the form or from pasted BibTeX — is stamped with adate-addedtimestamp automatically if it doesn't carry one (DOI imports already do), and the entry is validated with bibtexparser before it can be written. New entries reuse the existing import pipeline, so duplicate cite keys are resolved the same way as DOI/paste imports.
Changed¶
- Edit form now uses real BibTeX field names — the field-form editor (e) shares the new-entry form, so it shows the entry's fields under their actual BibTeX names for the entry type (and lets you change the type or add custom fields) instead of a fixed handful of relabelled inputs. Keywords, rating, read state and priority are managed by their own shortcuts and are left untouched by the edit form.
[0.15.2] - 2026-06-23¶
Fixed¶
- Config could reset to defaults after an upgrade — the settings file (
~/.config/bibtui/config.toml) is now written with a proper TOML serializer instead of hand-built strings, so values containing quotes, backslashes, or newlines can no longer produce an unparseable file. If a config still fails to parse, it is preserved asconfig.toml.corruptbefore defaults load, so a subsequent save can never silently overwrite recoverable settings. (uv tool upgradeitself never touched the config; the reset was a parse-failure-then-overwrite.)
[0.15.2] - 2026-06-23¶
error, never published
[0.15.0] - 2026-06-23¶
Added¶
- Manual "Check for updates" command — added a Check for updates entry to the command palette (
Ctrl+P) that queries PyPI immediately for a newer bibtui release, bypassing the once-per-day automatic throttle, and reports the result. - Documentation site — added a Material for MkDocs documentation site (user guide, PDF fetching, search, a dedicated team-collaboration guide for sharing a library via Git, configuration, and development), published to GitHub Pages by a new
docsworkflow. Screenshots are generated from the running app byscripts/generate_screenshots.pyand regenerated on every deploy so they never go stale. The README is now a concise overview that links to the site.
Fixed¶
- Chicago citation preview — the Chicago (author-date) style no longer shows (unavailable) for entries with a page range. The bundled CSL declares
page-range-format="chicago-16", which citeproc-py mishandled and raised an error on; unsupported page-range formats now fall back to an expanded range instead of failing the whole citation. - Help menu alignment — keybinding descriptions now line up in a consistent column across every section (the Other and Library actions sections were previously misaligned).
- Help menu out-of-date entries — the help now reflects current commands, including the Check for updates library action that was missing.
Changed¶
- Help menu internals — removed a duplicated, hand-maintained copy of the keybindings reference; the help screen is now rendered from a single source of truth, preventing the two copies from drifting apart.
- Modal styling — all dialogs now share a common
_BaseModalbase class for their centered layout, border, background, and padding instead of each repeating the same CSS; individual modals only declare what differs (size, border color). No visual change.
[0.14.0] - 2026-05-29¶
Added¶
- Citation preview in entry detail — added citeproc-py based formatted citation preview with a CSL style selector (currently bundled with
copernicus-publications.csl). - Copy citation shortcut — added
Shift+Cto copy the currently rendered citation preview while keepingCtrl+Cas citekey/default copy behavior. - Config-based CSL styles directory — citation styles now live in
~/.config/bibtui/csl; on first run bibtui seeds common defaults: Copernicus, APA, IEEE, Vancouver, Chicago (author-date), and Harvard (Cite Them Right). - Import citekey conflict handling — DOI/paste imports now handle existing keys by rejecting same-title duplicates and otherwise assigning the next free lowercase suffix (
a…z, e.g.Goelles2025a).
[0.13.0] - 2026-05-29¶
Added¶
- PDF actions UI added - moved PDF operations into a dedicated collapsible
PDFsection with state-aware disabled actions. - Copy PDF action behavior — copy uses OS file clipboard formats (Linux
wl-copy/xclipURI list, macOSosascript, WindowsSet-Clipboard -Path).
Fixed¶
- Safer OpenAlex DOI fetching — when a DOI is present but OpenAlex finds no DOI match, PDF fetching no longer falls back to title search, preventing false-positive downloads of wrong PDFs (regression covered with an
inproceedingsDOI case).
[0.12.4] - 2026-05-04¶
Fixed¶
- bibtexparser import crash on startup — removed a runtime type annotation reference to
bibtexparser.model.Libraryin the BibTeX parser, preventingAttributeError: module 'bibtexparser.model' has no attribute 'Library'on environments where that symbol is absent.
[0.12.3] - 2026-05-04¶
Error, release yanked
[0.12.2] - 2026-05-04¶
Changed¶
- BibTeX save strategy — saving now preserves untouched source text and applies minimal diffs instead of rewriting the whole file.
- Entry update granularity — changed entries are now patched at field level so unchanged fields in the same entry stay byte-identical whenever possible.
- Change detection — entry change detection now uses bibtexparser-derived field maps instead of a hard-coded field tuple; custom / unknown fields in
raw_fieldsare handled uniformly without any special-casing.
[0.12.1] - 2026-05-04¶
- From DOI import compatibility — pinned
httpxto<1.0to avoid runtime breakage withhabanerowhen pre-releasehttpx 1.0variants are installed (get() got an unexpected keyword argument 'params').
[0.12.0] - 2026-05-02¶
Added¶
- File browser startup mode — start bibtui without an initial file, using Textual's native file tree to browse and open library files. Includes quick access to recently opened files
- Icon -- I made a simple pixel based icon. So you can install it as a TUI with an icon.
- Optional OpenAlex PDF lookup — add an OpenAlex API key in Settings to enable an additional PDF fetch source (used before Unpaywall).
- OpenAlex fetch strategy — OpenAlex now prefers DOI lookup first and falls back to title search when DOI is missing or unresolved.
- BibTeX copy shortcut — added
Ctrl+Shift+Cto copy the currently selected full BibTeX entry, plusCtrl+Yas a terminal-safe fallback.
Changed¶
- PDF fetch success feedback — success messages now show which provider supplied the PDF (for example OpenAlex, arXiv, Copernicus, Unpaywall, or Direct URL).
Fixed¶
- Theme synching with omarchy -- now it can sync with any omarchy theme and does it automatically.
[0.11.6] - 2026-04-01¶
Added¶
- Copernicus PDF fetching — PDFs for all
10.5194publications (preprints and articles) are now fetched directly from copernicus.org using the DOI structure.
Fixed¶
- From DOI — preprint journal — journal name is now resolved for preprints via Crossref lookup; EGUsphere returns
"EGUsphere"as a special case. - From DOI — preprint year — year extraction now falls back to the
posteddate field.
[0.11.0] — 2026-02-27¶
Added¶
- Table-pane maximize toggle — press
mto maximize/restore the entry table pane for focused browsing. - Date-added table column — entry list now includes an
Addedcolumn with normalized date display and sorting support. - Library PDF fetch preflight modal — library-wide fetch now opens a dedicated confirmation modal with an
Overwrite broken linkstoggle. - Release helper for minor bumps — added
just minorto bump, tag, and push minor versions.
Changed¶
- Library fetch workflow — existing local PDFs are auto-linked before batch fetching missing files.
- PDF linking behavior — fetching now re-links an entry to an already existing destination PDF when the stored link is broken.
- Entry refresh UX — entry selection is preserved after list refresh operations.
- Layout behavior — entry list pane now uses flexible width (
1fr) for better split behavior. - Release task naming —
just release-patchwas renamed tojust patch.
Fixed¶
- Date handling consistency — DOI imports now use centralized date-added timestamp utilities.
- Regression coverage for dates — added tests for extracting, parsing, and formatting bibliography date fields.
[0.10.0] — 2026-02-26¶
Added¶
- Library-wide PDF fetching — new command-palette workflow to fetch PDFs for all entries missing local files.
- Library-wide citekey unification — new command to normalize citekeys to canonical
AuthorYearform across the whole library. - OpenAlex quick lookup —
Shift+Bopens OpenAlex for the selected entry from the footer action; search uses title first and falls back to DOI.
Changed¶
- Citekey generation and normalization — improved canonicalization and collision handling for more consistent keys.
- Clipboard behavior in context —
Ctrl+Cnow prefers focused text widgets (e.g., raw BibTeX view) and falls back to citekey copy when no text widget is focused. - Documentation updates — README installation/upgrade guidance and help text were updated for the new library and OpenAlex workflows.
Fixed¶
- Raw-view copy usability — copying selected text now works reliably in non-edit raw BibTeX contexts.
- Regression coverage expansion — added tests for library fetch and citekey normalization/unification paths.
[0.9.9] — 2026-02-26¶
Added¶
- Background update check — checks PyPI once per day on startup in a non-blocking background thread and notifies when a newer stable release is available.
- Update-check setting — new Settings toggle to enable/disable startup update checks (enabled by default).
- Update metadata persistence — stores last check time, last notification time, and latest seen version in config under
[updates].
Changed¶
- PDF module consolidation — PDF path helpers and fetch logic are now grouped under
bibtui.pdf. - Settings layout readability — helper text is shown before each control with clearer spacing between setting groups.
Fixed¶
- Theme consistency in modals — removed hard-coded Rich color tags from Add PDF / Fetch PDF related messaging so colors follow theme tokens.
- Safer PDF downloads — downloads now use atomic temp-file writes and cleanup to avoid leaving partial files.
- Direct URL fetch robustness — falls back to GET when HEAD is blocked and validates PDF via content type or PDF magic bytes.
- Config resilience — invalid or unreadable config files now fall back to defaults instead of crashing startup.
[0.9.8] — 2026-02-24¶
Added¶
- Auto-fetch PDF on import — when the setting is enabled and a PDF base directory is configured, a PDF is automatically fetched after adding an entry via DOI or BibTeX paste.
- Jump to newly added entry — after importing via DOI or pasting a BibTeX entry, the table cursor now scrolls to and selects the new entry.
- Add PDF modal preview — the Add PDF dialog now shows a file preview before linking.
- Citekey search filter — search supports
c:/citekey:/key:prefix to filter by citation key. - Journal search filter — search supports
j:/journal:prefix to filter by journal or booktitle. freshdev command —just freshdeletes config files to reproduce the first-run experience.- Improved onboarding — better first-run modal and config initialisation flow.
Fixed¶
Backspacenow also triggers entry deletion (unified withDelete).- Config-related test fixed.