| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-07-29 | 4.0 kB | |
| v1.4.0 source code.tar.gz | 2026-07-29 | 3.9 MB | |
| v1.4.0 source code.zip | 2026-07-29 | 4.1 MB | |
| Totals: 3 Items | 8.1 MB | 0 | |
The killer feature in this release is that Kotter sections are now dynamically aware of their parent window size.
:::kotlin
section {
text("$width x $height")
}.runUntilKeyPressed(Keys.Q)

But 1.4.0 also brings big performance improvements on top of 1.3.0, thanks to FFM support and a reworking of core concurrency algorithms.
Changes
- Support for responsive terminals (that is, rendering which responds to window size changing)
sections that reference eitherwidthorheightwill be repainted automatically as the size changes- Added a new
onTerminalSizeChangedevent that you can listen to inrunblocks. -
The grid example has been updated to showcase an example of responsive design.
-
Expected performance improvements for system terminals in JVM projects
-
Previous versions of Kotter already used a JNI solution before, but now FFM, a newer standard, will be chosen if possible (requires JDK22+ installed on the user's machine). If you're not familiar, these technologies are approaches to making native OS calls from the JVM (pretty important for the CLI!)
-
Support for italics
- We introduce the new
italicfont decoration method (alongsidebold,underline, etc.) -
May not work on every terminal but it is a fairly widespread feature.
-
Sections now strip their final newline while actively rendering
-
For example, if the last line in your
sectionis something liketextLine("Hello World"), Kotter now won't shove an extra blank line between you and the bottom of the screen -- that is probably never the user's intention. However, once the section is finished rendering for the final time, that newline will be added (to ensure that any followup section will always start on a new line). -
Fixed
LiveListmutable iterators not working -
Before, we lazily sidestepped a thread-safety issue with iterating live lists by returning an iterator on top of a copy our underlying live list. However, iterators are mutable, so anyone who tried to update state would find that the original list would not update as expected. Worse, the Kotlin stdlib provides extension methods which do this under the hood (e.g.
removeIf), so the experience was those methods just silently failed. At this point, we did a full reimplementation of live list mutable iterators, so this is no longer an issue. -
The virtual terminal's internals were overhauled
- This was done to better support the new responsive experience.
- The virtual terminal should also look better and, hopefully, feel a bit snappier.
- Added an option where you could set
showExitPromptto false, so that the terminal simply exits when done, instead of showing aPress any key to continueprompt. -
Occasionally, the virtual terminal can reach out to external fonts as a fallback if certain glyphs weren't found in the system monospace font. The problem was, those could subtly break the clean, monospace alignment users expect with a terminal. These non-monospace fonts are now handled better and, if necessary, shrunk to fit into the expected cell size.
-
Core internal concurrency algorithms reworked, which as a side effect improved performance significantly
- Especially if you are using
LiveListor other reactive collection classes. -
We also increased test coverage as part of the refactoring.
-
Added an
awaitActiveRendermethod which you can call in therunblock which can be particularly useful for tests.
Thanks!
- As with v1.3.0, @239 provided a ton of feedback, support, and validation, which made this release so much better than it would have been without their help.
Full Changelog: https://github.com/varabyte/kotter/compare/v1.3.0...v1.4.0