Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
741abf4
Fix localization to use UTF-8 (fixes non-latin script)
DaRealTurtyWurty Oct 24, 2025
e0a010e
Add CODEOWNERS file for repository ownership
DaRealTurtyWurty Oct 24, 2025
e21933a
Add more auto-closing pairs in editor
DaRealTurtyWurty Oct 24, 2025
47fd5f5
Added new language localization: Russian (ru-ru) (#64)
fredtheking Oct 25, 2025
4a3b79b
Create SECURITY.md for project security guidelines
DaRealTurtyWurty Oct 25, 2025
966a23b
Reformat templates
DaRealTurtyWurty Oct 25, 2025
ad22d72
Merge branch 'dev' of https://github.com/Railroad-Team/Railroad into dev
DaRealTurtyWurty Oct 25, 2025
eb39600
Make the welcome header pane look better
DaRealTurtyWurty Oct 26, 2025
1ee2cba
Fix some CSS errors
DaRealTurtyWurty Oct 26, 2025
d8a4c4e
Redesign plugins pane UI
DaRealTurtyWurty Oct 26, 2025
ad5bd64
Redesign keybinds UI with improved UX and styling
DaRealTurtyWurty Oct 26, 2025
ec1d0fb
Add dynamic language file register loader (#89)
joonseolee Oct 27, 2025
4a84773
Merge branch 'dev' of https://github.com/Railroad-Team/Railroad into dev
DaRealTurtyWurty Oct 27, 2025
0b7442d
Fix keybinds add shortcut button background
DaRealTurtyWurty Oct 27, 2025
098021b
feat(welcome): Display project facets as tags in the project list (#83)
subha0319 Oct 28, 2025
c1ca7a7
Refactor JavaCodeEditorPane and TextEditorPane
DaRealTurtyWurty Oct 28, 2025
c0f0688
Add signature help popup to Java code editor
DaRealTurtyWurty Oct 28, 2025
76c0d70
Refactor signature help logic into dedicated classes
DaRealTurtyWurty Oct 28, 2025
a6a695e
Refactor code completion logic into dedicated package
DaRealTurtyWurty Oct 28, 2025
75c3551
Fix signature popup not showing (no results)
DaRealTurtyWurty Oct 28, 2025
6ed83a4
Refactor diagnostics to use EditorDiagnostic interface
DaRealTurtyWurty Oct 28, 2025
6727639
Update Discord link and minor code cleanup in RRMenuBar
DaRealTurtyWurty Oct 28, 2025
04e8eb9
Add OS utility methods and refactor Mac checks
DaRealTurtyWurty Oct 28, 2025
5a40a13
Re-add menu bar in IDE now that it is fixed.
DaRealTurtyWurty Oct 28, 2025
5596395
Fix LanguageRegistryLoader not work with jar files
DaRealTurtyWurty Oct 28, 2025
8b41201
Updated Russian (ru-ru) localization (#96)
fredtheking Oct 28, 2025
0af5533
Fix issue where text editors are sometimes scrolled by default
DaRealTurtyWurty Nov 3, 2025
f303e94
Add square shape option to RRButton
DaRealTurtyWurty Nov 3, 2025
3d2578e
Ensure RRButton style class is added only once
DaRealTurtyWurty Nov 3, 2025
16924d3
Prevent duplicate style classes in UI components
DaRealTurtyWurty Nov 3, 2025
b28e229
Add Nix flake (#59)
not-a-cowfr Nov 4, 2025
6b93732
Implemented a markdown viewer (#100)
FrostyFlippper Nov 5, 2025
1c90080
Discover JDKs during initialisation (#88)
Cy4Shot Nov 7, 2025
0e67ba1
Adds fullscreen toggle functionality (#104)
FrostyFlippper Nov 7, 2025
4e779b7
Per project data (#105)
DaRealTurtyWurty Nov 7, 2025
8c9d84c
Run configurations (#107)
DaRealTurtyWurty Nov 17, 2025
8d25913
Java process builder (#109)
DaRealTurtyWurty Nov 18, 2025
0ae6aff
Updated Russian (ru-ru) localization (2nd) (#110)
fredtheking Nov 23, 2025
bd22b94
Gradle manager (#111)
DaRealTurtyWurty Nov 23, 2025
8bcca14
Fix: Theme preview window + New UI components (#112)
Exanc Dec 20, 2025
2327993
Fix duplicate control key on Windows (#113)
Exanc Dec 20, 2025
1360d6b
Gradle tab (tasks, dependencies, sync gradle project, download source…
DaRealTurtyWurty Dec 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
* @Railroad-Team/railroad-maintainers

# File Specific
/.github/CODEOWNERS @DaRealTurtyWurty
71 changes: 71 additions & 0 deletions .github/SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Security Policy

## Supported Versions

The following table outlines which versions of Railroad currently receive security updates.

| Version | Supported |
|----------|------------|
| Main branch (`main`) | ✅ |
| Latest stable release (`vX.Y.Z`) | ✅ |
| Older releases | ❌ |

We only provide security fixes for the **most recent stable release** and the `main` development branch.
If you're using an older version, please update to the latest release.

---

## Reporting a Vulnerability

If you discover a vulnerability in Railroad or any related project (such as Switchboard, RailroadLogger, or the Plugin API), **please report it responsibly**.
Do **not** disclose it publicly until it has been patched.

### 🔒 How to Report
- **Preferred:** [Create a private vulnerability report](https://github.com/Railroad-Team/Railroad/security/advisories/new)
- **Alternative:** Email the maintainers at **[email protected]**

Please include the following details:
- A clear description of the issue and its potential impact.
- Steps to reproduce (if applicable).
- Any relevant logs, crash reports, or proof of concept.
- A suggested fix or mitigation (optional but appreciated).

You can expect a response **within 48 hours**, and we'll work with you to confirm and fix the issue as quickly as possible.

---

## Disclosure Policy

- Once a fix is ready, we’ll release an updated version of Railroad.
- You’ll be credited for the discovery if you wish.
- We generally aim to disclose details publicly **after the patch release**, unless there’s a reason to delay for ecosystem safety.

---

## Security Best Practices for Plugin Developers

If you're developing plugins for Railroad:
- **Never** execute remote code or download arbitrary files without explicit user consent.
- **Always** verify signatures or hashes for remote content.
- **Avoid** storing credentials in plain text — use Railroad’s secure storage API if available.
- **Do not** request unnecessary permissions.
- **Respect user privacy** — plugins must not track or collect personal data without consent.

Plugins found violating these policies may be removed from the official plugin registry.

---

## Scope

This policy covers:
- Railroad IDE (core application)
- Railroad Plugin API
- Railroad Logger
- Switchboard service
- Official Railroad plugins

If the vulnerability affects a dependency or external service, we’ll coordinate disclosure with the relevant maintainers.

---

*Thank you for helping keep the Railroad ecosystem secure.*
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### Railroad ###
.railroad/

### NetBeans ###
/nbproject/private/
/nbbuild/
Expand All @@ -47,4 +50,4 @@ bin/
*.class

### Logs ###
hs_err_pid*.log
hs_err_pid*.log
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
implementation-class=dev.railroadide.railroadplugin.RailroadProjectPlugin
24 changes: 19 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,18 @@ tasks.withType(JavaCompile).configureEach {
application {
mainClass = 'dev.railroadide.railroad.RailroadLauncher'
applicationDefaultJvmArgs = [
'-Djavafx.preloader=dev.railroadide.railroad.RailroadPreloader'
'-Djavafx.preloader=dev.railroadide.railroad.RailroadPreloader',
'--add-exports=javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED',
'--add-exports=javafx.graphics/com.sun.javafx.iio.common=ALL-UNNAMED'
]
}

tasks.named("run") {
jvmArgs '-Djavafx.preloader=dev.railroadide.railroad.RailroadPreloader',
'--add-exports=javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED',
'--add-exports=javafx.graphics/com.sun.javafx.iio.common=ALL-UNNAMED'
}

javafx {
version = '21'
modules = ['javafx.controls', 'javafx.swing', 'javafx.web', 'javafx.fxml', 'javafx.graphics', 'javafx.media']
Expand All @@ -45,6 +53,9 @@ javafx {
dependencies {
implementation 'org.kordamp.ikonli:ikonli-javafx:12.4.0'
implementation 'org.kordamp.ikonli:ikonli-fontawesome6-pack:12.4.0'
implementation 'org.kordamp.ikonli:ikonli-devicons-pack:12.4.0'
implementation 'org.kordamp.jipsy:jipsy-processor:1.2.0'
annotationProcessor 'org.kordamp.jipsy:jipsy-annotations:1.2.0'
implementation 'org.jetbrains:annotations:26.0.2-1'
implementation 'com.google.code.gson:gson:2.13.2'
implementation 'com.squareup.okhttp3:okhttp:5.2.1'
Expand All @@ -68,16 +79,17 @@ dependencies {
implementation 'org.apache.commons:commons-text:1.14.0'
implementation 'net.java.dev.jna:jna:5.18.1'
implementation 'org.xerial:sqlite-jdbc:3.50.3.0'

implementation 'com.github.numind-tech:javafxsvg:ce188ef95d'
implementation 'io.github.raghul-tech:javafx-markdown-preview-all:1.0.3'
implementation 'org.joml:joml:1.10.8'
implementation 'com.google.guava:guava:33.5.0-jre'
implementation 'org.apache.maven:maven-core:4.0.0-rc-4'
implementation 'org.apache.maven:maven-settings:4.0.0-rc-4'
implementation 'org.apache.maven:maven-settings-builder:4.0.0-rc-4' // TODO: deprecated - look into this
implementation 'org.apache.maven:maven-repository-metadata:4.0.0-rc-4'
implementation 'org.codehaus.plexus:plexus-container-default:2.1.1'

implementation 'dev.railroadide:java-version-extractor-plugin:1.0.0'
implementation 'dev.railroadide:fabric-extractor-plugin:1.0.0'
implementation 'dev.railroadide:RailroadGradlePlugin:1.0.0'

implementation 'io.get-coursier:interface:1.0.29-M1'
implementation 'org.eclipse.jgit:org.eclipse.jgit:7.4.0.202509020913-r'
Expand Down Expand Up @@ -130,7 +142,9 @@ runtime {

launcher {
jvmArgs = [
'-Djavafx.preloader=dev.railroadide.railroad.RailroadPreloader'
'-Djavafx.preloader=dev.railroadide.railroad.RailroadPreloader',
'--add-exports=javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED',
'--add-exports=javafx.graphics/com.sun.javafx.iio.common=ALL-UNNAMED'
]
}

Expand Down
27 changes: 27 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

80 changes: 80 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
};

outputs = inputs:
let
javaVersion = 21;

systems = [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];

forEachSystem = f:
inputs.nixpkgs.lib.genAttrs systems (
system:
f {
pkgs = import inputs.nixpkgs {
inherit system;
overlays = [ inputs.self.overlays.default ];
};
}
);
in
{
overlays.default = final: prev:
let
jdk = prev."jdk${toString javaVersion}";
javafx = prev.openjfx;
in
{
inherit jdk javafx;
gradle = prev.gradle.override { java = jdk; };
lombok = prev.lombok.override { inherit jdk; };
};

devShells = forEachSystem (
{ pkgs }:
{
default = pkgs.mkShell {
packages = with pkgs; [
gradle
jdk
javafx

libGL
alsa-lib

gtk3
glib
gsettings-desktop-schemas

xorg.libX11
xorg.libXtst
xorg.libXi
xorg.libXxf86vm
];

shellHook =
let
loadLombok = "-javaagent:${pkgs.lombok}/share/java/lombok.jar";
prev = "\${JAVA_TOOL_OPTIONS:+ $JAVA_TOOL_OPTIONS}";
in
''
export JAVAFX_MODULE_PATH=${pkgs.javafx}/lib
export LD_LIBRARY_PATH="${pkgs.libGL}/lib:${pkgs.gtk3}/lib:${pkgs.glib.out}/lib:${pkgs.xorg.libX11}/lib:${pkgs.xorg.libXtst}/lib:${pkgs.xorg.libXi}/lib:${pkgs.xorg.libXxf86vm}/lib:${pkgs.alsa-lib}/lib:$LD_LIBRARY_PATH"
export JAVA_TOOL_OPTIONS="${loadLombok}${prev}"
export GSETTINGS_SCHEMA_DIR="${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}/glib-2.0/schemas"

mkdir ~/.config/Railroad
touch ~/.config/Railroad/logger_config.json
'';
};
}
);
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import lombok.Getter;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -30,6 +31,7 @@ public class Form {
private final @Nullable Button resetButton;
private final Pos buttonAlignment;

@Getter
private final FormData formData = new FormData();

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,29 @@ public static TextAreaComponent.Builder textArea(@NotNull String dataKey, @NotNu
return new TextAreaComponent.Builder(dataKey, label);
}

/**
* Creates a new file chooser component.
*
* @param dataKey The key of the data.
* @param label The label of the component.
* @return The builder for the file chooser component.
*/
public static FileChooserComponent.Builder fileChooser(@NotNull String dataKey, @NotNull String label) {
return new FileChooserComponent.Builder(dataKey, label);
}

/**
* Creates a new radio button group component backed by an enum.
*
* @param dataKey The key of the data.
* @param label The label of the component.
* @param enumClass The enum class providing the options.
* @return The builder for the radio button group component.
*/
public static <E extends Enum<E>> RadioButtonGroupComponent.Builder<E> radioButtonGroup(@NotNull String dataKey, @NotNull String label, @NotNull Class<E> enumClass) {
return new RadioButtonGroupComponent.Builder<>(dataKey, label, enumClass);
}

/**
* Returns a property that represents the default data of the component.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public class ComboBoxComponent<T> extends FormComponent<FormComboBox<T>, ComboBo
*/
public ComboBoxComponent(String dataKey, Data<T> data, FormComponentValidator<ComboBox<T>> validator, FormComponentChangeListener<ComboBox<T>, T> listener, Property<ComboBox<T>> bindComboBoxTo, List<FormTransformer<ComboBox<T>, T, ?>> transformers, EventHandler<? super KeyEvent> keyTypedHandler, @Nullable BooleanBinding visible, Callback<ListView<T>, ListCell<T>> cellFactory, ListCell<T> buttonCell, Supplier<T> defaultValue) {
super(dataKey, data, currentData -> {
var formComboBox = new FormComboBox<>(currentData.label, currentData.required, currentData.editable, currentData.translate, currentData.keyFunction, currentData.valueOfFunction);
var formComboBox = new FormComboBox<>(currentData.label, currentData.required, currentData.editable, currentData.translate, (T v) -> currentData.keyFunction.toString(v));
if (!currentData.translate) {
formComboBox.getPrimaryComponent().setConverter(new ComboBoxConverter<>(currentData.keyFunction, currentData.valueOfFunction));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
Expand Down Expand Up @@ -153,6 +154,17 @@ public Builder defaultPath(@Nullable String defaultPath) {
return this;
}

/**
* Sets the default path for the directory chooser.
*
* @param defaultPath the default path for the directory chooser
* @return this builder
*/
public Builder defaultPath(@Nullable Path defaultPath) {
this.data.defaultPath(defaultPath != null ? defaultPath.toString() : null);
return this;
}

/**
* Sets whether the directory chooser is required.
*
Expand Down
Loading
Loading