I built this to answer one question that no manager I tried would answer: when a large .bib takes ten seconds to appear, where did the ten seconds go — the parse, the index, or the table?
citerack answers it by reporting each step. The file is parsed on a worker thread, the index is built before the first row is drawn, and --open-time prints how long each took. That is the whole design, and everything below is a consequence of taking it seriously: an index that is built once instead of per keystroke, a save that writes back only the bytes that changed, a window that stays responsive because nothing blocking runs on the thread that draws it.
It is called citerack, it is licensed under MIT, and it is at GitHub - emfox/citerack: A BibTeX editor for large libraries: it opens a hundred thousand entries in a few seconds and writes back only the bytes you changed. · GitHub

What it does
-
Opens 100 000 entries in about 2.6 s on a single shared core, at a flat 25–26 µs per entry as the library grows.
docs/Performance.mdhas the figures, the machine and the command that re-derives each one — compare per-entry cost, not total seconds. -
Saves byte for byte. Editing one title in the 45 974-entry library mentioned below changed 44 of 4 936 765 bytes — the rest of the file, including comments and fields it does not model, is untouched.
-
Searches every field at once, ignoring case and accents, in about 1 ms on 100 000 entries. Greek, Cyrillic, Arabic and CJK split on their own word boundaries.
-
Filters by author, journal, year and type, with a count that is what the filter would actually leave.
-
Finds duplicates by DOI, or by title and year with case, accents, braces and punctuation folded away.
-
Generates citation keys from a pattern, previewed in a column before anything is written.
-
Marks the fields an entry’s type requires but the file lacks, and adds them when you write in the empty box.
-
Writes one field across a picked range of entries as a single undo step.
-
Takes a DOI or an arXiv id, asks Crossref or arXiv, and files what comes back under a key the library does not hold yet.
-
Opens the paper from an entry’s
filefield, reading the paths JabRef, Zotero and Mendeley write, and saysmissingbeside a path that is not there. -
Follows the desktop’s light or dark preference, unless told otherwise.
-
Works without a mouse.
Where it might not suit you
It edits one library at a time and keeps no database — the .bib file is the only copy, which is the point. Attachments are opened, not managed. The interface is English. Risks it would rather not take, it does not take: a file it does not fully understand is read conservatively rather than rewritten.
And the obvious one: it has been built against generated libraries and two donated fixtures, not against years of your habits. If your library is the kind that has accumulated a decade of exceptions, expect to be the one who finds the exceptions.
Why I am posting here
Not to argue that anyone should switch. I am posting because this forum is where people who care about BibTeX as a format, rather than as an export option, actually are, and two things would be worth more than stars:
-
If you have a library that is slow to open in anything, I would like to measure it.
citerack --open-time your.bibprints the parse, the index and the memory, and a number with a size attached is something I can act on. -
If it reads a file wrong, that is a bug I want. The parser is deliberately conservative about what it does not understand, and I would rather hear about the case it gets wrong than find out later.
The figures above come from scripts/genlib.py and from two libraries a user attached to a bug report about scrolling elsewhere — 45 974 and 134 352 entries, committed as fixtures. Those two are the inputs I did not generate myself, and they are the ones that disagreed with my assumptions. A third would be welcome.
The binary is a Linux and a Windows build per tagged release, with checksums. There is no installer and no telemetry.
One last thing. I am a programmer, but not a Rust one, and English is not my first language — this text included. What is in the repository got there with translation tools, AI assistance, and a lot of reading of what the compiler said. If a sentence here reads oddly, or a comment in the code does, that is why, and a correction is welcome rather than embarrassing.