JLine 4.4.0
JLine 4.4.0 is a feature-rich release bringing modern terminal protocol support, broader platform compatibility, and continued security hardening.
Highlights:
- Kitty Keyboard Protocol — full support for the Kitty keyboard protocol, enabling unambiguous key event reporting (#2007)
- In-band window resize — support for mode 2048 resize notifications across the terminal, reader, and builtins (Nano, Less, Tmux) (#2021, #2198)
- Synchronized output — full mode 2026 support to eliminate flicker during rapid screen updates (#2022)
- musl libc support — native libraries now load on Alpine and other musl-based distributions (#2197)
- JdkConsoleProvider — drop-in JLine console that can replace
System.console()(#2031) - Reproducible builds — source archives can now be built without a git checkout, thanks to nisse property fallbacks (#2151, #2153)
- Security hardening — path traversal guards, ReDoS protection, cross-origin rejection, control character stripping, and SSH agent forwarding tightened across multiple modules
- FFM signal handling rewrite — replaced shared Arena with self-pipe trick for reliable signal delivery (#2141)
-A flag (#2106).
💥 Breaking changes
- fix: reduce ambiguous binding timeout from 1000ms to 100ms (#2186) @gnodet
- fix: only forward the ssh agent when -A is given (#2106) @uchiha-bug-hunter
🚀 New features and improvements
- feat: support in-band resize (mode 2048) in Nano, Less, and Tmux builtins (#2198) @gnodet
- feat: add musl libc support for native libraries (#2197) @gnodet
- feat: add Kitty Keyboard Protocol support (#2007) @gnodet
- feat: add configurable behavior for too many completion candidates (fixes #2154) (#2196) @gnodet
- feat: support in-band window resize notifications (mode 2048) (#2021) @gnodet
- feat: add JdkConsoleProvider for drop-in JLine console (#2031) @gnodet
- feat: verify macOS native library signatures in CI (#2173) @gnodet
- feat: allow customizing the help source in Less pager (fixes #2056) (#2065) @gnodet
- feat: full synchronized output (mode 2026) support (#2022) @gnodet
- refactor: batch DEC mode probing into single DECRQM round-trip (#2023) @gnodet
- feat: allow customizing the default prompt in Less pager (#2036) @gnodet
- feat: add factory to simplify LineDisciplineTerminal + ScreenTerminal wiring (#2035) @gnodet
- feat: add AttributedStringBuilder.appendCodePoint(int) (#2163) @gnodet
- Enable reproducible builds from source archives (#2151) @gnodet
- Add Terminal.getenv() for remote terminal environment support (#2030) @gnodet
🐛 Bug Fixes
- fix: remove eval from MVX demo launchers (fixes #2191) (#2193) @gnodet
- fix: DefaultHistory.read() records per-file entry count instead of total (fixes #2179) (#2194) @gnodet
- fix: handle IOError in BindingReader gracefully instead of crashing (fixes #2155) (#2195) @gnodet
- fix: lower native library candidate log level from WARNING to DEBUG (fixes #2185) (#2192) @gnodet
- fix: reimplement FFM signal handling with self-pipe trick (fixes #2139) (#2141) @gnodet
- fix: add software signal interception to Windows terminals (fixes #2127) (#2148) @gnodet
- fix: escape control chars in oversized line-buffer display (#2175) @uchiha-bug-hunter
- fix: escape IAC byte in the telnet data output stream (#2164) @uchiha-bug-hunter
- fix: strip control characters from Less status messages (#2156) @uchiha-bug-hunter
- fix: preserve termios baud rate when setting attributes (#2170) (#2172) @arimu1
- fix: mask password value in DefaultPrompter result display (#2167) @uchiha-bug-hunter
- fix: keep image options inside the kitty and iterm2 sequences (#2138) @uchiha-bug-hunter
- fix: reject cross-origin keystroke POSTs in WebTerminal (#2118) @uchiha-bug-hunter
- fix: stop answering DSR 7/8 with plain text in ScreenTerminal (#2128) @uchiha-bug-hunter
- fix: reject theme path traversal in highlighter command (#2112) @uchiha-bug-hunter
- fix: strip control characters from ssh banner and prompts (#2129) @uchiha-bug-hunter
- fix: improve provider discovery for custom classloader environments (#2119) @gnodet
- fix: use Arena.ofAuto instead of Arena.ofShared in FfmSignalHandler (fixes #2117) (#2120) @gnodet
- fix: clamp out-of-range truecolor SGR components in ScreenTerminal (#2107) @uchiha-bug-hunter
- fix: reject overlong hex components in OSC color responses (#2105) @uchiha-bug-hunter
- fix: search multiple lib paths for versioned libutil.so (#2100) @gnodet
- fix: strip OSC and other escape sequences in ansiAppend (#2099) @uchiha-bug-hunter
- fix: confine ConfigurationPath lookups to the config directory (#2045) @uchiha-bug-hunter
- fix: disable Read File command in nano restricted mode (#2055) @uchiha-bug-hunter
- fix: drain buffered data before signaling EOF in NonBlockingPumpInputStream (#2063) @gnodet
- fix: look up openpty in libc.so.6 for glibc 2.34+ (#2071) @gnodet
- fix: guard styleMatches and highlighter rules against ReDoS (#2053) @uchiha-bug-hunter
- fix: check NewObject() return in JNI newFileDescriptor/newRedirectPipe (fixes #2046) (#2047) @gnodet
- fix: only read local jar: archives in PosixCommands getSources (#2052) @uchiha-bug-hunter
- fix: clear thread interrupt flag after UserInterruptException (fixes #2039) (#2049) @gnodet
- fix: guard against null lines and null rules in syntax highlighting (fixes #2040) (#2048) @gnodet
- fix: validate terminal type before passing to infocmp (#2041) @uchiha-bug-hunter
- fix: use ConcurrentHashMap for InfoCmp capability caches (#2038) @uchiha-bug-hunter
📝 Documentation updates
📦 Dependency updates
- chore: bump org.easymock:easymock from 5.6.0 to 5.7.0 (#2189) @dependabot[bot]
- chore: bump eu.maveniverse.maven.nisse:extension from 0.9.5 to 0.9.7 (#2183) @dependabot[bot]
- chore: bump com.google.jimfs:jimfs from 1.3.1 to 1.3.2 (#2181) @dependabot[bot]
- chore: bump org.graalvm.buildtools:native-maven-plugin from 1.1.5 to 1.1.10 (#2168) @dependabot[bot]
- chore: bump junit.version from 6.1.2 to 6.1.3 (#2162) @dependabot[bot]
- chore: bump com.palantir.javaformat:palantir-java-format from 2.96.0 to 2.97.0 (#2160) @dependabot[bot]
- chore: bump release-drafter/release-drafter from 7.6.0 to 7.7.0 (#2145) @dependabot[bot]
- chore: bump actions/setup-java from 5.6.0 to 5.7.0 (#2142) @dependabot[bot]
- chore: bump com.diffplug.spotless:spotless-maven-plugin from 3.9.0 to 3.10.0 (#2171) @dependabot[bot]
- chore: bump groovy.version from 5.0.7 to 5.1.0 (#2169) @dependabot[bot]
- chore: bump actions/setup-java from 5 to 5.6.0 (#2135) @dependabot[bot]
- chore: bump release-drafter/release-drafter from 7 to 7.6.0 (#2130) @dependabot[bot]
- chore: bump org.apache.felix:maven-bundle-plugin from 6.0.2 to 6.1.0 (#2131) @dependabot[bot]
- chore: bump com.diffplug.spotless:spotless-maven-plugin from 3.8.0 to 3.9.0 (#2122) @dependabot[bot]
- chore: bump org.graalvm.sdk:graal-sdk from 25.1.3 to 25.2.4 (#2124) @dependabot[bot]
- chore: bump org.apache.maven.plugins:maven-jar-plugin from 3.5.0 to 3.5.1 (#2114) @dependabot[bot]
- chore: bump org.graalvm.buildtools:native-maven-plugin from 1.1.4 to 1.1.5 (#2104) @dependabot[bot]
- chore: bump org.apache.ivy:ivy from 2.5.3 to 2.6.0 (#2097) @dependabot[bot]
- chore: bump junit.version from 6.1.1 to 6.1.2 (#2084) @dependabot[bot]
- chore: bump actions/setup-node from 6 to 7 (#2092) @dependabot[bot]
- chore: bump org.graalvm.buildtools:native-maven-plugin from 1.1.3 to 1.1.4 (#2066) @dependabot[bot]
- chore: bump sshd.version from 2.18.0 to 2.19.0 (#2057) @dependabot[bot]
- chore: bump com.palantir.javaformat:palantir-java-format from 2.94.0 to 2.96.0 (#2059) @dependabot[bot]
- chore: bump org.codehaus.gmavenplus:gmavenplus-plugin from 5.0.0 to 5.1.0 (#2043) @dependabot[bot]
- chore: bump groovy.version from 5.0.6 to 5.0.7 (#2050) @dependabot[bot]
- chore: bump org.graalvm.sdk:graal-sdk from 25.0.3 to 25.1.3 (#2027) @dependabot[bot]
- chore: bump com.diffplug.spotless:spotless-maven-plugin from 3.7.0 to 3.8.0 (#2026) @dependabot[bot]
👻 Maintenance
- chore: use nisse 0.9.5 with .mvn/nisse.properties for source-archive builds (#2153) @gnodet
- chore: use committer timestamp for archive date fallback (#2152) @gnodet
- chore: migrate Release Drafter configs to new when syntax (#2177) @gnodet
- chore: set correct target branch on GitHub releases (#2174) @gnodet
- chore: clarify merge policy to require label, milestone, and assignee (#2121) @gnodet
- chore: extract shared truecolor RGB clamping helper in csi_SGR (#2111) @gnodet
- chore: remove 4.0.x from Dependabot configuration (#2094) @gnodet