Teaches coding agents how to build TUIs with TamboUI correctly: API-level selection, render-thread discipline, display-width safety, CSS-aware element authoring, and JFR conventions.
94
93%
Does it follow best practices?
Impact
97%
2.77xAverage score across 3 eval scenarios
Passed
No known issues
TamboUI uses a dedicated render thread (the thread running TuiRunner.run() / ToolkitRunner.run()), similar to JavaFX/Swing. Why: single-threaded UI mutation removes the need for locks, makes update ordering predictable, and surfaces wrong-thread access as a clean IllegalStateException instead of a flaky race.
Element.render all run on the render thread — you can mutate UI state freely from inside themToolkitRunner.schedule(), scheduleRepeating(), scheduleWithFixedDelay() run on the scheduler thread, not the render thread — they must hop back before touching UIrunner.runOnRenderThread(Runnable) — it executes immediately if already on the render thread, otherwise it queues for the next loop iterationrunner.runLater(Runnable) only when you want unconditional deferral (always queued, even from the render thread) — for example, to break a recursive update cycleRenderThread.checkRenderThread() at entry of methods that mutate shared UI state — it throws with a diagnostic message if violatedRenderThread.isRenderThread() for non-asserting checks (e.g., to choose between immediate execution and queueing)ListState directly will appear to work in tests and corrupt rendering under load — wrap the mutation in runOnRenderThread