Download Latest Version v1.4.0 source code.zip (4.1 MB)
Email in envelope

Get an email when there's a new version of Kotter

Home / v1.4.0
Name Modified Size InfoDownloads / 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)

Code sample in action

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 either width or height will be repainted automatically as the size changes
  • Added a new onTerminalSizeChanged event that you can listen to in run blocks.
  • 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 italic font decoration method (alongside bold, 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 section is something like textLine("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 LiveList mutable 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 showExitPrompt to false, so that the terminal simply exits when done, instead of showing a Press any key to continue prompt.
  • 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 LiveList or other reactive collection classes.
  • We also increased test coverage as part of the refactoring.

  • Added an awaitActiveRender method which you can call in the run block 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

Source: README.md, updated 2026-07-29