SPIA · VT | BibForge · Features Workflow APIs Changelog
v1.2 GitHub ↗ ⟶ Launch

Academic Reference Management

BibForge — A Single-File
BibTeX Library Manager

Browser-native reference management for large academic collections. Full-text search, metadata fetching, JEL classification, LOC subclassing, CSV import, six-panel library analytics, and virtual-scrolled rendering of 10,000+ entries — now with a dedicated @archival entry type, Internet Archive search, and Chicago NB citation export. No build step, no server, no dependencies.

author:year:keyword — e.g.  muth:1969:cities
12,000 entries · no lag 4 metadata APIs JEL auto-classification CSV import + mapping Insights · 6-panel analytics @archival entry type Chicago NB citation 0 dependencies
⟶ Launch BibForge View on GitHub ↗

Feature Set

Import · Export
BibTeX I/O
Drop a .bib file to import. Export the full library with all custom fields at any point. Handles nested braces, @string macros, and malformed entries without halting.
Import
CSV Import v1.0
Import any CSV with a header mapping dialog. Each column is auto-detected against BibTeX fields — author, title, year, etc. — with a sample value shown for each column. Duplicate keys auto-resolved. Entries stamped csv-import.
Search · Filter
Full-Text Search
Searches title, author, citation key, DOI, JEL codes, keywords, and datasource simultaneously. Results update in under 200 ms. Sidebar filters by type, year range, JEL, LOC, and provenance.
Metadata
DOI Quick-Add
Cmd/Ctrl+D — paste a DOI and BibForge fetches title, authors, year, journal, volume, pages, and abstract from CrossRef. Fastest path for any article with a DOI.
Metadata
ISBN Lookup
Open Library first, Google Books as automatic fallback. Retrieves publisher, city, edition, LC classification, subjects, and page count. WorldCat link-out for anything not found via API.
Classification
JEL Auto-Code
Fetches the full AEA EconLit classification tree and runs a keyword-scoring engine against the entry's title, abstract, and keywords. Returns the top 3 ranked chips with matched terms. Cached after first use.
Classification
LOC Subclass
Active for book-type entries. Suggests up to 3 Library of Congress subclasses weighted toward HB–HX, HT, NA, JC, JS — economics, social science, urban planning, and political theory.
Analytics
Library Insights v1.0
Six-panel analytics dashboard: Overview (datasource breakdown), Citation Age (decade histogram, median age), Authors (top 20 by frequency), Venues (journal concentration), JEL Coverage (heatmap + category roll-up), Quality (field fill rate per entry).
Performance
Virtual Scrolling
Only visible rows are rendered — scrolling through 12,000 entries costs the same as scrolling through 50. Row height is fixed at 76px; the virtual list recalculates on filter and search changes.
Deployment
Auto-Load
Configure BIBFORGE_CONFIG.autoLoad to a repo-relative path and the library fetches automatically on startup. Same-origin, no CORS, no auth. Works out of the box on GitHub Pages.
UX
Raw BibTeX Pane
Collapsible syntax-highlighted view of the exact output written to the exported file. Entry type and key in amber, field names in blue, values in green. Read-only; updates as you navigate entries.
Provenance
datasource Field
Every API-fetched entry is stamped: crossref, openlibrary, googlebooks, csv-import, archive-visit, or manual. Written to the .bib file. Filterable in sidebar.
Archival Research · v1.2
@archival Entry Type v1.2
First-class entry type for primary sources with a dedicated field set: repository, collection, box, folder, call_number, date_range, access, finding_aid_url, visit_date. Access badges in entry rows (open / digitized / restricted / by-appointment). Date-range-aware year filter and sort.
Archival Research · v1.2
Archival Search Tab v1.2
Fourth fetch tab in the edit form. Searches the Internet Archive API (free, no key) and returns up to 8 clickable result cards — click to apply fields directly. Link-outs to DPLA and Europeana for digitized US and European cultural heritage. ArchiveGrid and SNAC link-outs in the Archival Source section and detail view.
Archival Research · v1.2
Chicago NB Citation v1.2
Collapsible Chicago Notes-Bibliography citation pane in the detail view — mirrors the Raw BibTeX pane. Covers all entry types including the @archival format (item · date range · collection · box/folder · repository). Copy-to-clipboard in one click.

Citation Key Convention

BibForge uses the author:year:keyword convention — matching the Better BibTeX plugin pattern. Collision suffixes (smithb, smithc) appended automatically.

muth:1969:cities alonso:1964:location keynes:1936:employment harvey:1982:limits

Better BibTeX pattern:
[auth:lower]:[year]:[title:lower:clean:truncate=20]

@article{muth:1969:cities, author = {Muth, Richard F.}, title = {Cities and Housing}, year = {1969}, jel = {R11; R31; H72}, lcc = {HD}, datasource = {crossref}, }

Editing Cycle

01
Open BibForge
Library auto-loads from data/library.bib via same-origin fetch
02
Add / Edit
Quick-add via DOI (⌘D), ISBN, title search, CSV import, or Internet Archive lookup for primary sources
03
Classify
Fetch JEL codes and LOC subclass — one click each; accept suggested chips
04
Insights
Check Library Insights for citation age, author frequency, quality score
05
Export → Commit
Export .bib, commit to repo — every push is a dated snapshot

Outbound Requests

All processing is client-side. No library data is ever transmitted. Outbound requests are limited to the following endpoints:

EndpointTriggered whenWhat is sent
api.crossref.orgDOI lookup (Tab 1 or Quick-Add)The DOI only
openlibrary.orgISBN or title lookup (Tab 2 / 3)ISBN or search query
googleapis.com/booksGoogle Books lookup or fallbackISBN or search query
archive.org/advancedsearchArchival Search tab — Internet ArchiveSearch query only
aeaweb.org/econlit/…xmlFirst Fetch JEL click (cached)Nothing (GET request)
gc.zgo.at/count.jsPage load (analytics)Page URL, referrer (no cookies)
fonts.googleapis.comApp startupNothing (GET request)
same-repo .bib pathAuto-load on startupNothing (same-origin GET)

WorldCat, ArchiveGrid, SNAC, DPLA, and Europeana open in a new browser tab — no data passes through the app. GoatCounter collects no personal data and sets no cookies.


Changelog

v1.2 · April 2026
  • Archival Search fetch tab — Internet Archive API with clickable result cards and field-apply; DPLA and Europeana link-outs
  • Chicago Notes-Bibliography citation pane in detail view — all entry types including @archival, copy-to-clipboard
  • Auto-switch to Archival Search tab when editing @archival entries
v1.1 · April 2026
  • @archival entry type with 11 dedicated fields: repository, collection, box, folder, item, call_number, date_range, access, finding_aid_url, visit_date, access_note
  • Archive Access sidebar filter (open / digitized / restricted / by-appointment) — auto-appears when archival entries are loaded
  • Access status badge in entry rows; date range displayed in place of year
  • ArchiveGrid and SNAC link-out buttons in edit form and detail view
  • archive-visit added as a valid datasource value; auto-set when type is @archival
  • Date-range-aware year filter (overlap logic) and sort (uses range start year)
  • Quality Insights panel scores archival entries against their own field set
v1.0 · March 2026
  • CSV import with auto-detecting header mapping dialog (supports any column names, sample value preview, duplicate key resolution)
  • Library Insights: six-panel analytics modal — Overview, Citation Age, Authors, Venues, JEL Coverage, Quality
  • GoatCounter analytics integration — privacy-friendly, no cookies, single script tag
  • Full SEO metadata: Open Graph, Twitter Card, schema keywords targeting JabRef, Zotero, Mendeley, and related ecosystems
  • Version display in header logo subtitle
  • Updated keyboard shortcuts modal to include CSV + Insights
  • csv-import added as a valid datasource value
v0.9 · initial release candidate
  • BibTeX parser (nested braces, @string macros, malformed entry handling)
  • Virtual scrolling — fixed 76px row height, DOM proportional to viewport
  • Full-text search across all fields, sidebar filters (type, year, JEL, LOC, datasource)
  • DOI Quick-Add via CrossRef (Cmd+D)
  • ISBN lookup via Open Library with Google Books fallback; WorldCat link-out
  • JEL auto-classification via AEA EconLit XML tree with keyword-scoring engine
  • LOC subclass suggestion for book-type entries
  • datasource provenance field (crossref, openlibrary, googlebooks, manual)
  • Find & Replace across all entries and fields
  • Raw BibTeX pane with syntax highlighting (amber/blue/green)
  • File System Access API save (Chrome/Edge); export to .bib
  • Dark / light theme with localStorage persistence
  • Auto-load from repo path via BIBFORGE_CONFIG
  • Responsive layout: desktop 3-panel, tablet drawer, mobile single-panel with bottom nav

Technical Notes

Parser

Written from scratch — no external dependencies. Handles nested braces, @string and @preamble blocks, # concatenation, multi-byte characters, and malformed entries without halting the parse.

Virtual Scrolling

Fixed row height of 76px. Only visible rows are in the DOM at any time. Switching filters or running a search recalculates the virtual list instantly — rendering cost is proportional to viewport size, not library size.

JEL Engine

Keyword-scoring against the full AEA EconLit tree fetched on first use and cached for the session. Specificity bonus for 3-character leaf codes. Falls back to an embedded table of 200+ codes if CORS-blocked.

Archival Research

The @archival type writes standard BibTeX — custom fields like repository and date_range are preserved in round-trips through Zotero and JabRef. Internet Archive fetch uses the public advancedsearch.php endpoint — no API key required.

Deployment

Rename to bibforge.html, push to GitHub, enable Pages. No _config.yml, no Jekyll, no build pipeline. File size stays under GitHub Pages' 100 MB limit at any realistic library size.