Skip to content

Add: HTTP Server and LSP server toggles to quick settings#14972

Merged
Siedlerchr merged 10 commits intoJabRef:mainfrom
Jalina2007:feature-for-issue-14902
Feb 5, 2026
Merged

Add: HTTP Server and LSP server toggles to quick settings#14972
Siedlerchr merged 10 commits intoJabRef:mainfrom
Jalina2007:feature-for-issue-14902

Conversation

@Jalina2007
Copy link
Copy Markdown
Contributor

@Jalina2007 Jalina2007 commented Jan 31, 2026

User description

Closes #14902

Steps to test

Simply run the program and the changes will be visible under quick settings as requested in the issue.

Mandatory checks

Screenshot 2026-02-03 125145

PR Type

Enhancement


Description

  • Add HTTP Server and LSP server toggle switches to quick settings

  • Integrate HttpServerManager and LanguageServerController with UI toggles

  • Enable users to start/stop servers directly from welcome tab

  • Bind toggle states to remote preferences for persistence


Diagram Walkthrough

flowchart LR
  WelcomeTab["WelcomeTab"] -- "instantiates" --> QuickSettings["QuickSettings"]
  QuickSettings -- "creates toggles for" --> HttpServerToggle["HTTP Server Toggle"]
  QuickSettings -- "creates toggles for" --> LSPToggle["LSP Server Toggle"]
  HttpServerToggle -- "controls" --> HttpServerManager["HttpServerManager"]
  LSPToggle -- "controls" --> LanguageServerController["LanguageServerController"]
  HttpServerToggle -- "binds to" --> RemotePreferences["RemotePreferences"]
  LSPToggle -- "binds to" --> RemotePreferences
Loading

File Walkthrough

Relevant files
Enhancement
JabRefFrame.java
Inject server managers into WelcomeTab                                     

jabgui/src/main/java/org/jabref/gui/frame/JabRefFrame.java

  • Added imports for HttpServerManager and LanguageServerController
  • Updated WelcomeTab instantiation to pass HttpServerManager,
    LanguageServerController, and UiMessageHandler as constructor
    arguments
+6/-1     
WelcomeTab.java
Add server manager dependencies to WelcomeTab                       

jabgui/src/main/java/org/jabref/gui/welcome/WelcomeTab.java

  • Added three new fields for HttpServerManager,
    LanguageServerController, and UiMessageHandler
  • Updated constructor to accept and initialize these new dependencies
  • Modified createRightColumn method to pass server managers to
    QuickSettings component
+14/-2   
QuickSettings.java
Add HTTP and LSP server toggle switches with control logic

jabgui/src/main/java/org/jabref/gui/welcome/components/QuickSettings.java

  • Added imports for ToggleSwitch, HttpServerManager,
    LanguageServerController, and related classes
  • Added five new fields for server managers and preferences
  • Updated constructor to accept and initialize server manager
    dependencies
  • Created two ToggleSwitch controls for HTTP server and LSP server with
    bidirectional binding to remote preferences
  • Added listener logic to start/stop servers when toggles are changed
  • Implemented startHttpServer, stopHttpServer, startLanguageServer, and
    stopLanguageServer methods
  • Positioned server toggles at the top of the quick settings content
+62/-2   

@github-actions
Copy link
Copy Markdown
Contributor

Hey @Jalina2007! 👋

Thank you for contributing to JabRef!

We have automated checks in place, based on which you will soon get feedback if any of them are failing. We also use Qodo for review assistance. It will update your pull request description with a review help and offer suggestions to improve the pull request.

After all automated checks pass, a maintainer will also review your contribution. Once that happens, you can go through their comments in the "Files changed" tab and act on them, or reply to the conversation if you have further inputs. You can read about the whole pull request process in our contribution guide.

Please ensure that your pull request is in line with our AI Usage Policy and make necessary disclosures.

@github-actions github-actions Bot added first contrib good first issue An issue intended for project-newcomers. Varies in difficulty. labels Jan 31, 2026
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects Bot commented Jan 31, 2026

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
Unvalidated server initialization

Description: The HTTP server and language server are started without proper error handling or
validation, potentially exposing the application to network-based attacks if server
initialization fails silently or if invalid URIs/ports are provided.
QuickSettings.java [186-202]

Referred Code
private void startHttpServer() {
    URI uri = remotePreferences.getHttpServerUri();
    httpServerManager.start(preferences, stateManager, uri);
}

private void stopHttpServer() {
    httpServerManager.stop();
}

private void startLanguageServer() {
    CLIMessageHandler messageHandler = new CLIMessageHandler(uiMessageHandler, preferences);
    languageServerController.start(messageHandler, remotePreferences.getLanguageServerPort());
}

private void stopLanguageServer() {
    languageServerController.stop();
}
Ticket Compliance
🟡
🎫 #13109
🔴 Make the Pseudonymization class available on the CLI
Provide a similar CLI experience to the consistency check
Follow the implementation pattern of the CheckConsistency class
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

🔴
Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status:
Missing audit logging: Server start/stop actions (HTTP and LSP servers) are not logged with user context,
timestamp, or outcome for audit trail purposes.

Referred Code
private void startHttpServer() {
    URI uri = remotePreferences.getHttpServerUri();
    httpServerManager.start(preferences, stateManager, uri);
}

private void stopHttpServer() {
    httpServerManager.stop();
}

private void startLanguageServer() {
    CLIMessageHandler messageHandler = new CLIMessageHandler(uiMessageHandler, preferences);
    languageServerController.start(messageHandler, remotePreferences.getLanguageServerPort());
}

private void stopLanguageServer() {
    languageServerController.stop();
}

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status:
No error handling: Server start/stop methods lack error handling for potential failures during server
initialization or shutdown operations.

Referred Code
private void startHttpServer() {
    URI uri = remotePreferences.getHttpServerUri();
    httpServerManager.start(preferences, stateManager, uri);
}

private void stopHttpServer() {
    httpServerManager.stop();
}

private void startLanguageServer() {
    CLIMessageHandler messageHandler = new CLIMessageHandler(uiMessageHandler, preferences);
    languageServerController.start(messageHandler, remotePreferences.getLanguageServerPort());
}

private void stopLanguageServer() {
    languageServerController.stop();
}

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status:
Missing URI validation: The URI obtained from remotePreferences.getHttpServerUri() is passed directly to server
start without validation, which may pose security risks if preferences are compromised.

Referred Code
URI uri = remotePreferences.getHttpServerUri();
httpServerManager.start(preferences, stateManager, uri);

Learn more about managing compliance generic rules or creating your own custom rules

  • Update
Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects Bot commented Jan 31, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
Refactor dependency injection for QuickSettings
Suggestion Impact:The commit simplified the QuickSettings constructor by removing HttpServerManager, StateManager, LanguageServerController, and UiMessageHandler dependencies. The WelcomeTab constructor was also simplified by removing these same dependencies. However, instead of using Injector.instantiateModelOrService() as suggested, the commit removed the functionality that required these dependencies (HTTP server and language server start/stop methods).

code diff:

# File: jabgui/src/main/java/org/jabref/gui/welcome/components/QuickSettings.java
@@ -1,7 +1,6 @@
 package org.jabref.gui.welcome.components;
 
-import java.net.URI;
-
+import javafx.geometry.Insets;
 import javafx.scene.control.Button;
 import javafx.scene.control.Label;
 import javafx.scene.control.ScrollPane;
@@ -9,46 +8,31 @@
 import javafx.scene.layout.VBox;
 
 import org.jabref.gui.DialogService;
-import org.jabref.gui.StateManager;
 import org.jabref.gui.icon.IconTheme;
 import org.jabref.gui.preferences.GuiPreferences;
-import org.jabref.gui.remote.CLIMessageHandler;
 import org.jabref.gui.welcome.quicksettings.EntryTableConfigurationDialog;
 import org.jabref.gui.welcome.quicksettings.LargeLibraryOptimizationDialog;
 import org.jabref.gui.welcome.quicksettings.MainFileDirectoryDialog;
 import org.jabref.gui.welcome.quicksettings.OnlineServicesDialog;
 import org.jabref.gui.welcome.quicksettings.PushApplicationDialog;
 import org.jabref.gui.welcome.quicksettings.ThemeDialog;
-import org.jabref.http.manager.HttpServerManager;
-import org.jabref.languageserver.controller.LanguageServerController;
 import org.jabref.logic.l10n.Localization;
-import org.jabref.logic.remote.RemotePreferences;
 import org.jabref.logic.util.TaskExecutor;
-import org.jabref.logic.UiMessageHandler;
+
 import org.controlsfx.control.ToggleSwitch;
 
 public class QuickSettings extends VBox {
     private final GuiPreferences preferences;
     private final DialogService dialogService;
     private final TaskExecutor taskExecutor;
-    private final HttpServerManager httpServerManager;
-    private final StateManager stateManager;
-    private final RemotePreferences remotePreferences;
-    private final LanguageServerController languageServerController;
-    private final UiMessageHandler uiMessageHandler;
 
     private final Label header;
     private boolean isScrollEnabled = true;
 
-    public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor, HttpServerManager httpServerManager, StateManager stateManager, LanguageServerController languageServerController, UiMessageHandler uiMessageHandler) {
+    public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor) {
         this.preferences = preferences;
         this.dialogService = dialogService;
         this.taskExecutor = taskExecutor;
-        this.httpServerManager = httpServerManager;
-        this.stateManager = stateManager;
-        this.languageServerController = languageServerController;
-        this.remotePreferences = preferences.getRemotePreferences();
-        this.uiMessageHandler = uiMessageHandler;
 
         getStyleClass().add("welcome-section");
 
@@ -77,24 +61,14 @@
 
     private VBox createContent() {
         ToggleSwitch httpServerToggle = new ToggleSwitch(Localization.lang("Enable HTTP server"));
-        httpServerToggle.selectedProperty().bindBidirectional(remotePreferences.enableHttpServerProperty());
-        httpServerToggle.selectedProperty().addListener((observableValue, oldValue, newValue) -> {
-            if (newValue) {
-                startHttpServer();
-            } else {
-                stopHttpServer();
-            }
-        });
+        httpServerToggle.selectedProperty().bindBidirectional(preferences.getRemotePreferences().enableHttpServerProperty());
+        httpServerToggle.setMaxWidth(Double.MAX_VALUE);
+        httpServerToggle.setPadding(new Insets(5));
 
         ToggleSwitch languageServerToggle = new ToggleSwitch(Localization.lang("Enable LSP server"));
-        languageServerToggle.selectedProperty().bindBidirectional(remotePreferences.enableLanguageServerProperty());
-        languageServerToggle.selectedProperty().addListener((observableValue, oldValue, newValue) -> {
-            if (newValue) {
-                startLanguageServer();
-            } else {
-                stopLanguageServer();
-            }
-        });
+        languageServerToggle.selectedProperty().bindBidirectional(preferences.getRemotePreferences().enableLanguageServerProperty());
+        languageServerToggle.setMaxWidth(Double.MAX_VALUE);
+        languageServerToggle.setPadding(new Insets(5));
 
         Button mainFileDirButton = createButton(
                 Localization.lang("Set main file directory"),
@@ -182,23 +156,5 @@
     private void showEntryTableConfigurationDialog() {
         dialogService.showCustomDialogAndWait(new EntryTableConfigurationDialog(preferences));
     }
-
-    private void startHttpServer() {
-        URI uri = remotePreferences.getHttpServerUri();
-        httpServerManager.start(preferences, stateManager, uri);
-    }
-
-    private void stopHttpServer() {
-        httpServerManager.stop();
-    }
-
-    private void startLanguageServer() {
-        CLIMessageHandler messageHandler = new CLIMessageHandler(uiMessageHandler, preferences);
-        languageServerController.start(messageHandler, remotePreferences.getLanguageServerPort());
-    }
-
-    private void stopLanguageServer() {
-        languageServerController.stop();
-    }
 }

# File: jabgui/src/main/java/org/jabref/gui/welcome/WelcomeTab.java
@@ -41,9 +41,6 @@
 import org.jabref.gui.welcome.components.DonationProvider;
 import org.jabref.gui.welcome.components.QuickSettings;
 import org.jabref.gui.welcome.components.Walkthroughs;
-import org.jabref.http.manager.HttpServerManager;
-import org.jabref.languageserver.controller.LanguageServerController;
-import org.jabref.logic.UiMessageHandler;
 import org.jabref.logic.ai.AiService;
 import org.jabref.logic.importer.Importer;
 import org.jabref.logic.importer.ParserResult;
@@ -77,9 +74,6 @@
     private final BuildInfo buildInfo;
     private final Stage stage;
     private final WorkspacePreferences workspacePreferences;
-    private final HttpServerManager httpServerManager;
-    private final UiMessageHandler uiMessageHandler;
-    private final LanguageServerController languageServerController;
 
     private final VBox main;
     private Walkthroughs walkthroughs;
@@ -99,10 +93,7 @@
                       TaskExecutor taskExecutor,
                       FileHistoryMenu fileHistoryMenu,
                       BuildInfo buildInfo,
-                      WorkspacePreferences workspacePreferences,
-                      HttpServerManager httpServerManager,
-                      LanguageServerController languageServerController,
-                      UiMessageHandler uiMessageHandler) {
+                      WorkspacePreferences workspacePreferences) {
         super(Localization.lang("Welcome"));
         setClosable(true);
         this.tabContainer = tabContainer;
@@ -119,9 +110,6 @@
         this.buildInfo = buildInfo;
         this.stage = stage;
         this.workspacePreferences = workspacePreferences;
-        this.httpServerManager = httpServerManager;
-        this.uiMessageHandler = uiMessageHandler;
-        this.languageServerController = languageServerController;
         this.recentLibrariesBox = new VBox();
         recentLibrariesBox.getStyleClass().add("welcome-recent-libraries");
 
@@ -191,7 +179,7 @@
     }
 
     private VBox createRightColumn() {
-        this.quickSettings = new QuickSettings(preferences, dialogService, taskExecutor, httpServerManager, stateManager, languageServerController, uiMessageHandler);
+        this.quickSettings = new QuickSettings(preferences, dialogService, taskExecutor);
         this.walkthroughs = new Walkthroughs(stage, tabContainer, stateManager, preferences);
         VBox rightColumn = new VBox(quickSettings, walkthroughs);
         rightColumn.getStyleClass().add("welcome-content-column");

Refactor QuickSettings to use the Injector for its dependencies, removing the
need to pass them through the JabRefFrame and WelcomeTab constructors. This will
reduce coupling and simplify parent components.

Examples:

jabgui/src/main/java/org/jabref/gui/welcome/components/QuickSettings.java [43-51]
    public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor, HttpServerManager httpServerManager, StateManager stateManager, LanguageServerController languageServerController, UiMessageHandler uiMessageHandler) {
        this.preferences = preferences;
        this.dialogService = dialogService;
        this.taskExecutor = taskExecutor;
        this.httpServerManager = httpServerManager;
        this.stateManager = stateManager;
        this.languageServerController = languageServerController;
        this.remotePreferences = preferences.getRemotePreferences();
        this.uiMessageHandler = uiMessageHandler;
jabgui/src/main/java/org/jabref/gui/welcome/WelcomeTab.java [102-105]
                      WorkspacePreferences workspacePreferences,
                      HttpServerManager httpServerManager,
                      LanguageServerController languageServerController,
                      UiMessageHandler uiMessageHandler) {

Solution Walkthrough:

Before:

// In JabRefFrame.java
class JabRefFrame {
    showWelcomeTab() {
        WelcomeTab welcomeTab = new WelcomeTab(
            ...,
            Injector.instantiateModelOrService(HttpServerManager.class),
            Injector.instantiateModelOrService(LanguageServerController.class),
            Injector.instantiateModelOrService(UiMessageHandler.class)
        );
    }
}

// In WelcomeTab.java
class WelcomeTab {
    public WelcomeTab(..., HttpServerManager httpServerManager, LanguageServerController languageServerController, UiMessageHandler uiMessageHandler) { ... }

    private VBox createRightColumn() {
        this.quickSettings = new QuickSettings(..., httpServerManager, ..., languageServerController, uiMessageHandler);
        return new VBox(quickSettings, ...);
    }
}

After:

// In JabRefFrame.java
class JabRefFrame {
    showWelcomeTab() {
        // Dependencies are no longer passed down from here
        WelcomeTab welcomeTab = new WelcomeTab(...);
    }
}

// In WelcomeTab.java
class WelcomeTab {
    public WelcomeTab(...) { ... } // Simplified constructor

    private VBox createRightColumn() {
        // QuickSettings constructor is simplified
        this.quickSettings = new QuickSettings(preferences, dialogService, taskExecutor);
        return new VBox(quickSettings, ...);
    }
}

// In QuickSettings.java
class QuickSettings {
    public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor) {
        // Dependencies are obtained directly via the Injector
        this.httpServerManager = Injector.instantiateModelOrService(HttpServerManager.class);
        this.languageServerController = Injector.instantiateModelOrService(LanguageServerController.class);
        this.stateManager = Injector.instantiateModelOrService(StateManager.class);
        this.uiMessageHandler = Injector.instantiateModelOrService(UiMessageHandler.class);
        ...
    }
}
Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies unnecessary dependency passing ("prop drilling") and proposes a valid refactoring that improves modularity and maintainability, which is an important but not critical design issue.

Low
Learned
best practice
Add null validation for dependencies
Suggestion Impact:Instead of adding null checks, the commit removed the constructor dependency parameters (httpServerManager, stateManager, languageServerController, uiMessageHandler) and the related fields/methods, making the suggested null validation unnecessary.

code diff:

 public class QuickSettings extends VBox {
     private final GuiPreferences preferences;
     private final DialogService dialogService;
     private final TaskExecutor taskExecutor;
-    private final HttpServerManager httpServerManager;
-    private final StateManager stateManager;
-    private final RemotePreferences remotePreferences;
-    private final LanguageServerController languageServerController;
-    private final UiMessageHandler uiMessageHandler;
 
     private final Label header;
     private boolean isScrollEnabled = true;
 
-    public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor, HttpServerManager httpServerManager, StateManager stateManager, LanguageServerController languageServerController, UiMessageHandler uiMessageHandler) {
+    public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor) {
         this.preferences = preferences;
         this.dialogService = dialogService;
         this.taskExecutor = taskExecutor;
-        this.httpServerManager = httpServerManager;
-        this.stateManager = stateManager;
-        this.languageServerController = languageServerController;
-        this.remotePreferences = preferences.getRemotePreferences();
-        this.uiMessageHandler = uiMessageHandler;
 

Add null checks for the new constructor parameters (httpServerManager,
stateManager, languageServerController, uiMessageHandler) to prevent potential
NullPointerExceptions when these dependencies are used later in the class
methods.

jabgui/src/main/java/org/jabref/gui/welcome/components/QuickSettings.java [43-58]

 public QuickSettings(GuiPreferences preferences, DialogService dialogService, TaskExecutor taskExecutor, HttpServerManager httpServerManager, StateManager stateManager, LanguageServerController languageServerController, UiMessageHandler uiMessageHandler) {
+    if (httpServerManager == null || stateManager == null || languageServerController == null || uiMessageHandler == null) {
+        throw new IllegalArgumentException("Server manager dependencies must not be null");
+    }
     this.preferences = preferences;
     this.dialogService = dialogService;
     this.taskExecutor = taskExecutor;
     this.httpServerManager = httpServerManager;
     this.stateManager = stateManager;
     this.languageServerController = languageServerController;
     this.remotePreferences = preferences.getRemotePreferences();
     this.uiMessageHandler = uiMessageHandler;
     ...
 }

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 6

__

Why:
Relevant best practice - Add input validation checks to methods that accept external data to ensure parameters are not null before processing, throwing appropriate exceptions when validation fails.

Low
  • Update

Copy link
Copy Markdown
Member

@koppor koppor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please align the toggle buttons vertically.

@github-actions github-actions Bot added the status: changes-required Pull requests that are not yet complete label Jan 31, 2026
Copy link
Copy Markdown
Member

@koppor koppor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think,wrong approach. Now at preferences and quick settings http server restart.

Add a listener at the http+lsp preferences.

@Jalina2007
Copy link
Copy Markdown
Contributor Author

Hi, I made the changes by adding a listener instead of manually starting the servers at the toggles. Please let me know if any further changes are needed.

@koppor
Copy link
Copy Markdown
Member

koppor commented Feb 2, 2026

@Jalina2007 Can you explain to me why you write me a message instead of fixing the "Unit tests -jablib"? Is it really hard to understand the message #14972?

Please explain me. Please, please, please, ... Many contributors don't understand. Are you just NOT READING or ist it really too hard to understand? And if yes, which part of the message is too hard to understand?

@koppor
Copy link
Copy Markdown
Member

koppor commented Feb 2, 2026

@Jalina2007 Either you did not adress my comment or not update the screenshot. If you did not update the screenshot - how can we guide contributors in general to UPDATE SCREENSHOT if the screen changed? Do we need an AI telling contributors to do so?

@github-actions github-actions Bot removed the status: changes-required Pull requests that are not yet complete label Feb 3, 2026
Copy link
Copy Markdown
Member

@koppor koppor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the back and forth; your PR fostered internal discussions 😅

Comment thread jabgui/src/main/java/org/jabref/gui/welcome/components/QuickSettings.java Outdated
Comment thread jabgui/src/main/java/org/jabref/gui/JabRefGUI.java Outdated
Comment thread jablib/src/main/resources/l10n/JabRef_en.properties Outdated
@github-actions github-actions Bot added the status: changes-required Pull requests that are not yet complete label Feb 3, 2026
@github-actions github-actions Bot removed the status: changes-required Pull requests that are not yet complete label Feb 5, 2026
koppor
koppor previously approved these changes Feb 5, 2026
Copy link
Copy Markdown
Member

@koppor koppor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changelog now or later?

@github-actions github-actions Bot added the status: changes-required Pull requests that are not yet complete label Feb 5, 2026
…4902

* upstream/main: (23 commits)
  Some more recipes from OpenRewrite (JabRef#15030)
  feat: Add PDF Upload endpoint to EntryResource (JabRef#14963)
  Heuristics also used at batch (JabRef#15025)
  Fix cleanup-pr.yml
  New Crowdin updates (JabRef#15035)
  Use patched Gradle version (JabRef#15034)
  Add OpenAlex-based Citation Fetcher (JabRef#15023)
  Update null annotaitons at EntryBasedFetcher (JabRef#15024)
  Fix CHANGELOG.md test
  Use _ for unused variables (JabRef#15028)
  Use ubuntu-latest for checkstyle and javadoc
  Update Gradle Wrapper from 9.3.0-jabref-2 to 9.3.1 (JabRef#15021)
  Use "ubuntu-slim" for most workflows (JabRef#15019)
  Refine GroupsTree (JabRef#15013)
  New Crowdin updates (JabRef#15018)
  Added Clear group option (JabRef#15017)
  Chore(deps): Bump com.uber.nullaway:nullaway from 0.12.15 to 0.13.1 in /versions (JabRef#15006)
  Chore(deps): Bump tools.jackson:jackson-bom in /versions (JabRef#15007)
  No rush in Docker building
  Yaml issue workaround
  ...
@Siedlerchr Siedlerchr enabled auto-merge February 5, 2026 21:24
@Siedlerchr Siedlerchr added this pull request to the merge queue Feb 5, 2026
@github-actions github-actions Bot added the status: to-be-merged PRs which are accepted and should go into the merge-queue. label Feb 5, 2026
Merged via the queue into JabRef:main with commit 5f67064 Feb 5, 2026
58 of 59 checks passed
@Jalina2007
Copy link
Copy Markdown
Contributor Author

Sorry I couldn’t follow up on the remaining review comments in time. I was unavailable for a couple of days. Thanks for taking care of the merge.

Siedlerchr added a commit that referenced this pull request Feb 8, 2026
…es/jablib/src/main/resources/csl-styles-6c79ffe

* upstream/main: (68 commits)
  Chore(deps): Bump org.apache.httpcomponents.client5:httpclient5 (#15060)
  Chore(deps): Bump com.google.errorprone:error_prone_core in /versions (#15059)
  Chore(deps): Bump de.undercouch.download:de.undercouch.download.gradle.plugin (#15057)
  Chore(deps): Bump org.postgresql:postgresql in /versions (#15058)
  Chore(deps): Bump de.undercouch.download:de.undercouch.download.gradle.plugin (#15056)
  Updates on Wednesday, not on Sunday
  Add screenshot requirement (#15050)
  Switch image for javadoc
  Better docker layer caching during build (#15042)
  New Crowdin updates (#15045)
  Chore: reuse shared 'setup-gradle' in all places in test-code.yml (#15043)
  Chore: add 'testlens-app/setup-testlens' GH action (#15044)
  Add: HTTP Server and LSP server toggles to quick settings (#14972)
  Some more recipes from OpenRewrite (#15030)
  feat: Add PDF Upload endpoint to EntryResource (#14963)
  Heuristics also used at batch (#15025)
  Fix cleanup-pr.yml
  New Crowdin updates (#15035)
  Use patched Gradle version (#15034)
  Add OpenAlex-based Citation Fetcher (#15023)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

first contrib good first issue An issue intended for project-newcomers. Varies in difficulty. Review effort 2/5 status: changes-required Pull requests that are not yet complete status: to-be-merged PRs which are accepted and should go into the merge-queue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add HTTP Server and LSP server to quick settings

3 participants