7.0.0 (2026-06-13)
Doc
- Fix broken Doxygen output. See @markmandel in #1029.
- Use Doxygen awesome. Add our own theme.
- Break the documentation into several pages.
Build
- Feature: Support amalgamated version.
This provides a single-header (ftxui.hpp) and single-source (ftxui.cpp)
version of the library, as well as a truly single-file header-only version
(ftxui_all.hpp).
This is the easiest way to vendor FTXUI into your project.
See #1252. - Feature: Support umbrella header and target.
Usage:CMake:#include <ftxui/ftxui.hpp>
target_link_libraries(your_target PRIVATE ftxui::ftxui)
Bazel:deps = ["@ftxui//:ftxui"]
See #1252. - Feature: Support C++20 modules.
This requires:- Using the Ninja or MSVC generator
- A recent Clang/GCC/MSVC compiler.
- Cmake 3.28 or higher.
Usage:
Thanks @mikomikotaishi for PR #1015.import ftxui; import ftxui.component; import ftxui.dom; import ftxui.screen; import ftxui.util;
- Consolidate C++20 code into named modules to reduce compile times and improve flexibility. Thanks @mikomikotaishi in #1221.
- Feature: Support Meson build system. Thanks @Mintonmu in #1259.
- Remove dependency on 'pthread'.
- Bugfix: Bazel target @ftxui is now visible. Thanks @dskkato in #1157.
- ABI: Explicitly size all public enums to
uint8_tfor ABI layout stability. - ABI: Add reserved virtual methods to
ScreenandNodefor future
extensibility without breaking ABI.
General
-
Breaking (Renames):
Pixelis renamed toCell.Imageis renamed toSurface.ScreenInteractiveis renamed toApp.PixelAtmethod is renamed toCellAt.
Compatibility aliases and headers are provided to avoid breaking existing code.
-
Breaking. Move to
std::string_viewinstead ofconst std::string&where
applicable. This yields better interoperability with string literals and
avoids unnecessary copies. Thanks @mikomikotaishi for PR #1154
Component
- Feature: Improved signal handling. Upgrade signal interception to use POSIX
sigactionfor robust signal masking and cleanup handler preservation. Protect against double terminal restoration on exit using atomic raw-state tracking. Add support for additional POSIX signals (SIGBUS,SIGSYSas crash signals, andSIGQUIT,SIGHUPas deferred termination signals) and fix async-signal-safety issues in crash paths. - Bugfix: Fix
Inputcursor visibility when using a customRendereron nested containers. See #1220. Thanks @nmarks99. - Fix
Inputcursor positioning and scroll stability. See #1196. Thanks @739C1AE2. - Fix
Inputsupport for non-ASCII characters in password mode. See #1196. Thanks @739C1AE2. - Performance: Mitigate cursor flickering during redraw in
App. See #1196. Thanks @739C1AE2. - Feature: POSIX Piped Input Handling.
- Allows FTXUI applications to read data from stdin (when piped) while still receiving keyboard input from the terminal.
- Enabled by default.
- Can be disabled using
App::HandlePipedInput(false). - Only available on Linux and macOS.
Thanks @HarryPehkonen for PR #1094.
- Fix App::FixedSize screen stomps on the preceding terminal
output. Thanks @zozowell in #1064. - Fix vertical
ftxui::Slider. The "up" key was previously decreasing the
value. Thanks @its-pablo in #1093 for reporting the issue. - Fix Windows UTF-16 key input handling. Emoji and other code points outside the
Basic Multilingual Plane (BMP) are now correctly processed. Thanks @739C1AE2
in #1160 for fixing the issue. - Fix Input style is now colorschem agnostic. Thanks @Smail in #1170 for reporting
and fixing the issue. - Fix
App::Post(..)is now thread safe. Thanks @739C1AE2 in
~1183 for reporting the issue. This regressed in non released versions.
Dom
- Feature: Support newline
\nwithintext()andvtext(). Thanks
@mikomikotaishi in #1215. - Bugfix:
dboxnow propagates focus from top-most layers to bottom-most
layers, matching the visual representation. See #1213. Thanks @vtnerd. - Feature: Support for table border decorators. This allows for instance to
color the border of a table. Thanks @Sckab in #1186 for proposing it. - Fix integer overflow in
ComputeShrinkHard. Thanks @its-pablo in #1137 for
reporting and fixing the issue. - Add specialization for
vbox/hbox/dboxto allow a container of Element as
as input. Thanks @nbusser in #1117. - Bugfix: In the gridbox, add the children to the tree so that the default
behaviors inherited from Node are correctly implemented. Thanks KenReneris for
#1070. - Update: The
gaugein a flexible now takes the available space in the
opposite direction. Thanks @Ardet696 in #1203. - Feature: Add parameterized
_factorvariants of flex decorators. These allow
specifying custom grow/shrink factors:
flex_factor(grow, shrink),flex_grow_factor(grow),
flex_shrink_factor(shrink), withxandyaxis variants.
Usage:element | flex_grow_factor(3).
Screen
- Performance: Collapse the per-row cursor walk-up in the non-clear
Screen::ResetPositioninto a single parameterized CSI cursor-up
(\x1B[<n>A) instead of emitting one\x1B[1Aper row. This reduces the
per-frame escape bytes during steady-state redraw (e.g. ~197 -> 6 bytes for a
50-row screen, ~33x). On-screen output is unchanged. - Performance: Optimize
Screen::ToString(),Color::Print()and
string_width().
This was achieved by:- Skipping calling
string_widthfor cells with single-byte data (the
primary driver for performance gains). - Pre-allocating memory for the output string.
- Optimizing the ASCII path for string width calculation.
Benchmarks show a significant improvement:
- Basic rendering: ~27% faster.
- Text rendering: ~27% faster.
- Styled rendering: ~38% faster.
Thanks @killerdevildog for initiating (2) in #1188.
- Skipping calling
What's Changed
- Add documentation about Bazel by @ArthurSonzogni in #1045
- Add modules support by @mikomikotaishi in #1015
- Fix comment typos in Maybe component by @ArthurSonzogni in #1052
- Fix comment bug by @ArthurSonzogni in #1053
- Fix minor typo in terminal comment by @ArthurSonzogni in #1054
- Fix typos and grammar in docs and comments by @ArthurSonzogni in #1055
- Improve module documentation by @ArthurSonzogni in #1056
- Remove @InGroup from class member docs by @ArthurSonzogni in #1058
- Add docs for additional install methods by @ArthurSonzogni in #1059
- Bug: ScreenInteractive::FixedSize screen stomps on the history terminal output by @zozowell in #1064
- Stop using Sender/Receiver in TerminalInputParser. by @ArthurSonzogni in #1073
- Remove redundant member from ButtonBase by @mirion-dev in #1076
- Fix
Examples(fromREADME.md) section link by @deyna256 in #1079 - Add ftxui convenience/umbrella module to cmake rules to fix #1083 by @tattwamasi in #1085
- Remove threads 2 by @ArthurSonzogni in #1091
- Fix: Use of max() min() collides with predefined macros in Windows build by @solosTec in #1084
- Fix slider Up key press. by @ArthurSonzogni in #1099
- Improve example style. by @ArthurSonzogni in #1101
- Add new project to the list by @d06i in #1102
- Fixed bug in component/button example: by @m00se-3 in #1107
- Improved the installation method via Conan. by @xiaoditx in #1106
- fixed a typo by @nodeluna in #1110
- Add tic-tac-toe as an example project using FTXUI by @birland in #1109
- Fix use of uninitialized cursor variable by @bearzly in #1111
- Add comprehensive GitHub Copilot instructions for FTXUI development by @Copilot in #1121
- Add explicit include for std::max by @meekee7 in #1124
- Fix CMake 3.12 compatibility by adding required install destinations by @ArthurSonzogni in #1127
- Updated bazel build example section in README by @h-queiroz in #1128
- Add 'typing-speed-test' to README.md by @ymcx in #1126
- Add min_size and max_size options to ResizableSplit component by @Copilot in #1132
- Add versioned documentation by @ArthurSonzogni in #1123
- Mitigate integer overflow in ComputeShrinkHard by @its-pablo in #1138
- Add
Merge()specializations to support moreElementcontainers by @nbusser in #1117 - Adds opt-in support for applications that need to read piped data from stdin while still receiving interactive keyboard input by @HarryPehkonen in #1094
- Use module partitions instead of full modules by @mikomikotaishi in #1146
- Added the translation link by @xiaoditx in #1156
- Fix cmake command in manual installation by @fromcaio in #1159
- Fix UTF-16 surrogate pair handling on Windows input by @739C1AE2 in #1160
- fix(bazel): ensure FTXUI is publicly accessible and add external smoke test by @dskkato in #1157
- Add string view overloads by @mikomikotaishi in #1154
- Update nix lock and make nix package follow the current version by @Rucadi in #1164
- Fixed two potential issues by @xiaoditx in #1171
- Adding navigation-tree component by @Appisolato in #1168
- Closes #1150 by @techsupport-noah in #1176
- perf: replace stringstream with pre-allocated string append in Screen… by @killerdevildog in #1188
- Refactor Color::Interpolate by @Rucadi in #1189
- Add MarkdownFTXUI to external projects in README by @zvasilev in #1185
- Set focused entry in MenuBase constructor by @CoinFuMasterShifu in #1182
- Fix Use-After-Free in ConstStringListRef by @8fclss in #1201
- Fix some cursor issues by @739C1AE2 in #1198
- fix(flexbox): correct child index skipping when line has no selection by @739C1AE2 in #1195
- ScreenInteractive: buffer the output. by @ArthurSonzogni in #1206
- Big rename by @ArthurSonzogni in #1202
- Fix initial frame drawing. by @ArthurSonzogni in #1207
- fix: gaugeUp/gaugeDown fill full allocated width when decorated with flex by @Ardet696 in #1203
- Update color.cpp by @techsupport-noah in #1208
- Add CPM to project list by @nellahonusova in #1216
- docs: add/remove missing variable in container examples by @lukasstorck in #1223
- Throttled terminal requests for cursor position and shape. by @ArthurSonzogni in #1218
- Add newline support within
text()by @mikomikotaishi in #1215 - Consolidate code into a single module to reduce compile times by @mikomikotaishi in #1221
- Fix input cursor selection by @vtnerd in #1214
- Fix typos across the codebase by @ArthurSonzogni in #1229
- docs: indentation and typo in Renderer doc string by @lukasstorck in #1225
- Fix formatting and syntax in README.md by @mikomikotaishi in #1224
- fix: export Terminal quirks and fix MSVC build error by @ArthurSonzogni in #1238
- cmake: use FetchContent_MakeAvailable instead of deprecated Populate by @ArthurSonzogni in #1237
- ci: update actions to v4 (checkout and codecov) by @ArthurSonzogni in #1236
- fix: no trailing cursor on unfocused input by @lukasstorck in #1228
- fix(component): normalize Home/End escape variants by @anhydrous99 in #1227
- docs: update ResetCursorPosition() to ResetPosition() by @ArthurSonzogni in #1240
- ci: opt-in to Node.js 24 for GitHub Actions by @ArthurSonzogni in #1246
- bazel: remove deprecated compatibility_level and update rules_cc by @ArthurSonzogni in #1245
- test: fix MSVC C4267 warnings (size_t to int) by @ArthurSonzogni in #1243
- docs: fix Doxygen typo @params -> @param by @ArthurSonzogni in #1239
- docs: document Canvas::Style parameters by @ArthurSonzogni in #1241
- examples: fix MSVC conversion warnings (float/double) by @ArthurSonzogni in #1244
- refactor: use PIMPL idiom for App by @ArthurSonzogni in #1251
- Pimpl refactor by @ArthurSonzogni in #1253
- feat: improve terminal identification and color support detection by @ArthurSonzogni in #1254
- Fix build issues: Loop include and Event tag mismatch by @ArthurSonzogni in #1255
- Fix typos in comments by @Copilot in #1247
- Quirk: Make it future proof against ABI change. by @ArthurSonzogni in #1256
- Build: Create umbrella target and header (#1252) by @ArthurSonzogni in #1258
- Fix starts slow on Windows terminal (#1261) by @kghost in #1262
- Build: Add FTXUI_EXPORT to public symbols (#1252) by @ArthurSonzogni in #1260
- docs: fix broken #documentation links in introduction.md by @ArthurSonzogni in #1242
- Add Meson build system support and configuration by @Mintonmu in #1259
- Add official amalgamation support (single-header/source) by @ArthurSonzogni in #1264
- fix: remove DEB package from Windows CPack generators by @Mintonmu in #1265
- Support for ABI check. by @ArthurSonzogni in #1266
- PIMPL: Migrate to std::make_unique by @ArthurSonzogni in #1268
- Refactor: Use std::string_view where applicable by @ArthurSonzogni in #1269
- Docs: Improve Getting Started guide by @ArthurSonzogni in #1270
- WASM: Allow memory growth in examples by @ArthurSonzogni in #1267
- Update abi_fingerprint by @ArthurSonzogni in #1272
- Add conda-forge to package distribution list by @RiccardoGrieco in #1273
- Improve ABI stability for 7.0.0 and optimize rendering performance by @ArthurSonzogni in #1271
- feat(component/app): improve and fix terminal state restoration and s… by @ArthurSonzogni in #1277
- tools: Stabilize ABI fingerprinting across compiler environments (v2) by @ArthurSonzogni in #1280
- Fix compilation on OmniOS by @williamkibira in #1282
- Export internal symbols for shared library builds (#1283) by @ArthurSonzogni in #1284
- perf(screen): collapse non-clear ResetPosition cursor walk-up into one CSI by @zozowell in #1285
- Feat/automatic ccache by @ArthurSonzogni in #1286
- fuzz: introduce robust fuzzing suite and harden Surface and Canvas ag… by @ArthurSonzogni in #1287
- Add new project to README.md by @ziptt in #1289
- Finalization by @ArthurSonzogni in #1290
- Version bump to v7.0.0 by @ArthurSonzogni in #1291
- Fix macos workflow by @ArthurSonzogni in #1292
New Contributors
- @mikomikotaishi made their first contribution in #1015
- @zozowell made their first contribution in #1064
- @mirion-dev made their first contribution in #1076
- @deyna256 made their first contribution in #1079
- @tattwamasi made their first contribution in #1085
- @solosTec made their first contribution in #1084
- @d06i made their first contribution in #1102
- @m00se-3 made their first contribution in #1107
- @xiaoditx made their first contribution in #1106
- @nodeluna made their first contribution in #1110
- @birland made their first contribution in #1109
- @bearzly made their first contribution in #1111
- @meekee7 made their first contribution in #1124
- @h-queiroz made their first contribution in #1128
- @ymcx made their first contribution in #1126
- @its-pablo made their first contribution in #1138
- @nbusser made their first contribution in #1117
- @HarryPehkonen made their first contribution in #1094
- @fromcaio made their first contribution in #1159
- @739C1AE2 made their first contribution in #1160
- @dskkato made their first contribution in #1157
- @Rucadi made their first contribution in #1164
- @Appisolato made their first contribution in #1168
- @techsupport-noah made their first contribution in #1176
- @killerdevildog made their first contribution in #1188
- @zvasilev made their first contribution in #1185
- @CoinFuMasterShifu made their first contribution in #1182
- @8fclss made their first contribution in #1201
- @Ardet696 made their first contribution in #1203
- @nellahonusova made their first contribution in #1216
- @lukasstorck made their first contribution in #1223
- @vtnerd made their first contribution in #1214
- @anhydrous99 made their first contribution in #1227
- @kghost made their first contribution in #1262
- @Mintonmu made their first contribution in #1259
- @RiccardoGrieco made their first contribution in #1273
- @williamkibira made their first contribution in #1282
- @ziptt made their first contribution in #1289
Full Changelog: v6.1.9...v7.0.0