The release profile optimizes for size, and one crate overrides it
Minimal, high-performance terminal UI kernel with diff-based rendering, inline mode, and RAII terminal cleanup
At a glance
- What is it?
- FrankenTUI is a terminal UI kernel in Rust, twenty workspace crates and roughly 1.1 million lines, whose distinguishing claims are determinism, a diff-based renderer and terminal cleanup intended to restore state after failures. The most instructive files are not the widget list but the release profile and the Makefile, where the author documents both a size-first build and the reason his own correctness gates were not running.
- Who is it for?
- FrankenTUI fits someone building a terminal interface that has to survive a panic, coexist with scrolling log output, or render identically every run, since those are the three problems the kernel is organised around. It does not fit someone who wants a small widget library, because the widget set is a component of a much larger system rather than the deliverable.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 5 days ago.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- Dicklesworthstone/frankentui299 ★ · +39
| Repository | 2026-08-23 | 2026-11-14 |
|---|---|---|
| Dicklesworthstone/frankentui | 260 | 299 |
39 Stars in the last 83 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The newest tag is 0.8.0 and the manifest already reads 0.9.0
Start with the version arithmetic, because it tells you what state the repository is in. The release history's newest entry is 0.8.0, and the workspace manifest declares the package version as 0.9.0. The last push was on 2026-09-22, and the release before that was 0.7.0. So the branch carries a version that has not been tagged, and a build from source is ahead of anything you can obtain as a release. For a project this size that is ordinary release hygiene rather than a red flag, but it changes what you can say about it. A reproducible claim has to name a tag, and the most recent tag is one version behind the checkout.
The distribution story matches. There is no installer yet, and the README describes fetching the source archive, then running the demo package directly:
curl -fsSL https://codeload.github.com/Dicklesworthstone/frankentui/tar.gz/main | tar -xz
cd frankentui-main
cargo run -p ftui-demo-showcaseSo the tag is the only stable artifact available, and it is not the tip of the branch.
The release profile optimizes for size, and one crate opts itself back out
The release profile is the most opinionated thing in the repository and it is worth reading line by line. Optimization is set for size, link-time optimization is on, codegen units are pinned to one, panics abort rather than unwind, and symbols are stripped. Panic mode is the choice with consequences: it means there is no unwinding, so any cleanup that relied on a destructor running during an unwind will not run. That is precisely why the cleanup guard is a resource-management object rather than a handler bolted on at the top level, and it is why the panic-safety claim in the feature table is a design constraint rather than a convenience. One crate then opts back out of the size preference with a per-package override that restores speed optimization for itself, which tells you the authors already found the size-first default too aggressive somewhere. There is a separate performance profile that inherits from release and then turns optimisation back up, keeps line tables, and disables stripping, so profile and benchmark binaries are not the same build as the shipped one.
The correctness gates run from the default check target, because prose did not run them
One comment in the build file explains a design decision better than any amount of documentation could, and it is worth quoting in spirit. The agent instructions had listed several gates as mandatory after any substantive change since they were written, but nothing invoked them: they existed only as prose and as make targets you had to remember. The fix was to make the obvious entry point run them, on the grounds that six seconds of pure-stdlib Python is cheap enough not to be skipped. So the check target depends on both the gates and the compiler, and the gates alone can be run without any of the Rust work. The gate set has five members, covering reachability, claims, environment-variable documentation, a close audit and baseline benchmarks, and all of them are pure standard library with no compilation and no network, which is what makes running them constantly realistic. The environment gate is the one with an obvious failure mode: it fails when the code reads a variable that nothing documents.
Inline mode is the feature the problem statement is actually about
Read the problem statement and the feature list is filtered. The complaint is not that terminal widget libraries are hard to draw, it is that they are hard to build correct, flicker-free, inline interfaces with strict terminal cleanup and deterministic rendering. Inline mode is the answer to the flicker and scrollback half of that, and it is described concretely: a runtime mode that takes a UI height, and keeps the interface pinned while log output scrolls above it. The reason that is hard is that a terminal has one cursor and one screen, so anything that wants stable chrome and a moving log region has to give up something. The deterministic half of the claim is a named pipeline, buffer to diff to presenter to ANSI, with the explicit promise of no hidden I/O, and a named function that computes the difference between two buffers. The one-writer rule supports both: a single object owns every write to standard output, so ordering is a property of the system rather than of call discipline.
Terminal cleanup and the abort-on-panic boundary
Terminal restoration on panic is usually implemented as a guard object, and this project does the same, placing it in the core crate. A guard can restore terminal state when it is dropped during normal execution or stack unwinding. With Rust's `panic = "abort"`, however, the stack does not unwind and destructors do not run; restoration on that path requires another mechanism, such as a panic hook, and should be tested for the actual build. Without cleanup, the terminal can remain in raw mode or with a hidden cursor. The validation story is the other half of the same claim, and it is unusual. Rather than asserting determinism, the project provides a shadow-run comparison in its harness crate, which runs the same work and compares results, so a claim about a runtime migration becomes something you can check rather than something you read. The demo screens include a determinism laboratory and an evidence-ledger cockpit, which is what a project that wants to be audited looks like.
The web build is a fallback chain, and one sibling bundle is not in the checkout
All forty-five demo screens run compiled to WebAssembly in a browser tab, with no install and no toolchain, and the rendering path is a chain rather than a single target: a modern graphics interface where it exists, falling back to a plain canvas otherwise, which is what makes the four major browsers work without a compatibility shim. Touch input is treated as a first-class case rather than an afterthought, with edge swipes to change screens and a bar along the bottom carrying a button for every key the current screen uses, so a phone user is not asked to find a keyboard. The one honest gap is in the embedding instructions, which state that a sibling terminal bundle is currently outside this checkout, with runtime initialization guidance waiting on it and explicit advice not to reach for a browser terminal emulator instead. Naming a missing dependency rather than working around it quietly is the same discipline as the panic guard: the failure is visible.
The lint exceptions are annotated with the reason each one exists
Two lint families are allowed across the workspace, and the comments above them are the interesting part rather than the settings. The stated purpose of the lint table is to absorb lint families that newer compiler nightlies fire against unchanged, correct code, while keeping correctness, suspicious-code and performance categories denied through a warnings-as-errors gate in continuous integration. That is a specific and defensible posture: a codebase large enough to have a million lines is going to be compiled by nightlies it did not choose, and the alternative is a wall of new warnings that trains people to ignore the gate. The two allowed lints each carry their own justification. The range-loop one is allowed because index walks over parallel slices under a single counter, and rewriting it as an iterator would obscure the arithmetic without changing behaviour. The type-complexity one is allowed because wide tuple types in internals would not read better if they were named. Both are exceptions with a reason attached, which is the difference between a suppression and a decision.
Editorial conclusion
FrankenTUI fits someone building a terminal interface that has to survive a panic, coexist with scrolling log output, or render identically every run, since those are the three problems the kernel is organised around. It does not fit someone who wants a small widget library, because the widget set is a component of a much larger system rather than the deliverable. Before you depend on it, check the version you are actually getting: the newest tagged release is 0.8.0 while the workspace manifest reads 0.9.0, so a build from the branch is ahead of anything you can install as a release.
Frequently asked questions
How do I run the FrankenTUI demos?
With `cargo run -p ftui-demo-showcase`, which the README calls the primary way to see what the system can do rather than the harness. Individual screens can be selected with a screen argument or an environment variable, and the command's own help output lists the screen numbers.
What is inline mode in FrankenTUI?
A runtime mode, configured with a UI height, that keeps the interface stable at the top or bottom of the terminal while log output scrolls above it. It exists because a terminal has one cursor and one screen, so stable chrome and a moving log region have to be negotiated rather than both drawn freely.
How does FrankenTUI restore the terminal after a panic?
Through a resource-management session object in the core crate, which restores terminal state on the way out. The release profile sets panics to abort, so there is no unwind to catch, which makes the guard's construction and destruction the only cleanup mechanism the design relies on.
Can I try FrankenTUI without installing a Rust toolchain?
Yes. All forty-five demo screens run compiled to WebAssembly in a browser tab at the project's site, with no install and no toolchain, rendering through a modern graphics interface where it exists and falling back to a canvas otherwise. Touch input is supported, with edge swipes for changing screens and an on-screen bar for the current screen's keys.
What correctness gates does FrankenTUI run without compiling anything?
Five, all pure standard library with no compilation and no network: reachability, claims, environment-variable documentation, a close audit and baseline benchmarks. They are wired into the check target because the agent instructions had listed them as mandatory but nothing invoked them, and the environment gate fails when the code reads a variable nothing documents.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/dicklesworthstone-frankentui)Star history chart for your README
[](https://hysenlabs.com/projects/dicklesworthstone-frankentui)Was this useful?