Skip to content

GSoC 2025 ‐ LSP

Philip edited this page Nov 10, 2025 · 12 revisions
Student Philip
Organization JabRef e.V.
Primary repositories JabRef/jabref & JabRef/lsp-vscode-extension
Project name JabRef for Visual Studio Code (JabRef4VSCode)
Project mentors @koppor, @InAnYan, @subhramit
Project page Google Summer of Code 2025 Project Page
Status Done

Project summary

JabRef is a popular open-source bibliography reference manager that helps researchers and academics organize and manage their references efficiently. The project contributed three new components for JabRef:

  • A Language Server Protocol (LSP) server that provides different features for editing .bib, .bibtex, .md and .tex files in editors, including VSCode. Which can run inside JabRef or as a standalone server.
  • A VSCode extension that integrates with the LSP server to provide a seamless experience for users working with bibliography files in VSCode. The VSCode extension connects to the running LSP server (or can start a standalone version if JabRef isn't running) and provides features such as integrity checks, hover information, jump to definition, select the key in JabRef (when running) or opening the CAYW endpoint.
  • A Cite As You Write (CAYW) endpoint that can be used as an alternative to Better-BibTeX's CAYW feature for Zotero which can run alongside JabRef or as a part of JabSrv (JabRefs' HTTP-server, which offers an API for working with the bibliographies opened in JabRef).

Core features summarized

  • Provide hover information for citation keys in .md and .tex files. demo
  • Provide jump to definition for citation keys in .md and .tex files. demo
  • When running along the GUI you can jump to the entry in the GUI. demo
  • Provide integrity checks for .bib, .bibtex files. demo
  • Provide consistency checks for .bib, .bibtex files. demo
  • Provide a CAYW endpoint that can be used as an alternative to Better-BibTeX's CAYW feature for Zotero. demo
  • Automatically connect to the LSP server when JabRef's GUI is running.
  • Automatically start and update the LSP server when JabRef's GUI is not running.

Screenshots

LSP integrity/consistency check

A .bib file is used to storea bibliography file consisting of different e.g. articles, those articles consist of different information such as title, author, year, journal, etc. When some of this information is missing, wrong or when the article entries are not consistent, the ingerity and consistency check will raise errors or warnings depending on the severity of the error.

Integrity check raising errors Integrity check raising severe errors

Integrity check raising warnings Integrity check raising warnings

LSP raising error when parsing went wrong LSP raising error when parsing went wrong

LSP lookup/jump to definition

Sometimes it is useful to see more information about a citation key. For that the LSP can provide hover information and jump to the corresponding entry in the bibliography file. And if JabRef is running, it can also jump to the entry in the GUI and you can see also more data for that entry.

Hover over citation keys in LaTeX files to see the definition in the bibliography Hover over citation keys in LaTeX files to see the definition in the bibliography

ctrl+click to jump to the entry in the bibliography ctrl+click to jump to the entry in the bibliography

open the attached pdf in the preview open the attached pdf in the preview

Hover over citation keys in markdown files to see the definition in the bibliography Hover over citation keys in markdown files to see the definition in the bibliography

Jump to the entry in the GUI Jump to the entry in the GUI

Cite As You Write

When writing a paper, it is often useful to cite the articles that you have read. But knowing all the citation keys can be a bit tedious. The CAYW endpoint can be triggered to open up a popup in which you can search and select the citation keys from the bibliography file and insert the citation command directly into the document.

Use the CAYW popup to insert the citation command Use the CAYW popup to insert the citation command

Future work

While the current features are already useful, there are still many things that could be improved and added.

For the extension many other files could be supported other than .tex and .md files while those two are the most commonly used. More unique features from JabRef GUI could be added:

  • having a grouping view
  • a preview of the entry
  • reformatting the entry or whole bib file
  • suggest quick fixes for errors
  • completion of citation keys

On a technical perspective tests for many classes should be added to make sure everything works as expected.

Things I learned during the project

Always keep in mind that the codebase is not just a few files and classes. It's a complex system that has to be maintained and extended. For that it is important to take the time to deeply think about how everything should/could be implemented and write maintainable clean code, not just for myself but also for others. Could be really frustrating to work on code contributed a long time ago which is not thought through completely and makes extending challenging.

Testing the implemented code (manually) is important and should be done as much as possible, but sometimes moving fast can lead to bugs or testing not being done that well. But this is also okay as long as you fix it as soon as you stumble upon it.

Pull requests

Pull requests for the LSP Server

  • #14275 - Feat: Add the ability to open linked pdf files in bib files

  • #14260 - Feat: Add definition links for TeX Files

  • #14162 - Fix: update group and version for JabRef language server

  • #14096 - Fix: condition to check if jumpToKey is not blank

  • #14032 - Feat: Add definition links for Markdown Files

  • #13968 - Chore: Rework json ADR for consistency check options

  • #13910 - Feat: Add more consistency check options

  • #13880 - Feat: Add 'unknown' field check to consistency check

  • #13862 - Fix: Refactor BibtexParser to use ranges of articles and work with them in the LSP instead of string matching

  • #13697 - Feat: Add Language Server to the UI and add the core integrity/consistency check functionality

  • #13612 - Feat: Initial implementation of an LSP for integrity checks

Pull requests for the VSCode extension

  • #70 - Feat: Add the ability to call the LSP for tex language files

  • #69 - Feat: Add keybinding for calling the CAYW endpoint

  • #68 - Feat: Add messages for the user and states to the ui

  • #63 - Feat: Add logic for connecting to the LSP server or downloading and starting it if it's not running

  • #61 - Feat: Add the ability to call the LSP for markdown files

  • #40 - Feat: Add more consistency check options

  • #31 - Feat: first initial release

  • #25 - Feat: enhance connection handling and configuration options

  • #11 - Chore: Port the js current version to typescript

  • #10 - Feat: Added settings support for enabling/disabling features

Outside core scope (because it was a new repository)

  • #71 - Chore: Add Dependabot auto merge

  • #30 - Fix: Adapt workflow to test a successful build

  • #29 - Fix: Adapt pipeline to test a successful build

  • #28 - Chore: Rename scripts and adapt pipeline for successful builds

  • #26 - Chore: Add build ci to test for a successful build

  • #13 - Chore: Add dependabot configuration

  • #12 - Chore: Add MIT License

Pull requests for the CAYW Endpoint

  • #13554 - Feat: Add select entries CAYW feature and command endpoint

  • #13514 - Fix: Refactor PushToApplications and split into logic and GUI

  • #13478 - Fix: Errors in CAYW endpoint

  • #13466 - Fix: jbang run failing

  • #13459 - Fix: jbang jabsrvlauncher build failing

  • #13447 - Feat: Refine and add more options to the CAYW endpoint

  • #13185 - Feat: Implement a basic Zotero picker compatible CAYW endpoint

  • #13183 - Fix: Refactor DatabaseSearcher

Outside core scope

  • #13848 - Feat: Add integrity check to CLI

  • #13593 - Chore: add fallback and re-enable defaultcomeslast for openrewrite

Before GSoC

  • #12783 - Chore: workflow added for detecting changelog modification

  • #12739 - Fix: changed preferences and keybind search

  • #12668 - Fix: search and groups in sidebar get disabled when no library is opened

References

Statistics

jabref lsp-vscode-extension
insertions 6214 1886
deletions 1880 483
files 306 78
commits 31 28
lines changed 8094 2369

Thanks

I sincerely thank @koppor, @InAnYan, @subhramit, @calixtus and @Siedlerchr and the whole team behind JabRef for their great support and guidance throughout the project. It was a pleasure working with them, and I'm thrilled to have been a part of JabRef's GSoC 2025 and looking forward to be part of JabRef after GSoC.

Clone this wiki locally