TUI library built from scratch with TypeScript and a Rust core, featuring a component-based API, signal-based state management, CSS-like styling API, a Rust-powered layout and rendering engine, and cell-based diffing.
measured on
full-screen animation, 176×52 terminal, m4 pro
typical frame
1.9 ms (median)
slow frames
4.3 ms at p95, 5.6 ms at p99, 8.7 ms max
frame rate
453 fps average, 115 fps worst
avg frame
typescript 0.6 ms → rust 1.2 ms → sync 0.1 ms → flush 0.3 ms
In-browser MKV video streamer and player built from scratch, featuring real-time 4K anime upscaling powered by WGSL (WebGPU) shaders ported from Anime4K.
measured on
1080p → 4k upscaling, m4 pro
per 4k frame
32.3 ms
frame rate
31 fps max (film is 24)
gpu work
38 passes from 3 shaders, run in sequence
frame budget
41.7 ms at 24 fps: cpu 0.5 ms → upload 4.5 ms → shader passes 27.3 ms, 9.4 ms spare
Paid music collaborations and song-cover campaigns for artists worldwide. Led frontend and backend development across both products, built the Next.js frontend from scratch, and owned payments, payouts, and mobile audio features. Cut data processing for 1M+ artists from nine days to seven hours and roughly halved Soundcharts costs.
AI mapping platform for satellite and aerial imagery. Built high-performance React interfaces for large imagery datasets, simplified component state and data flow, and helped move users to centralized sign-in with zero downtime.
Social content and analytics platform with shoppable feeds for brands. Led React adoption within an Angular application and improved embedded app performance for e-commerce sites across Europe. Built a custom state manager that cut the JavaScript bundle by 20% and automated package publishing.
hitide
dec 2020 - feb 2021
Online clothing brand. Fully automated stock updates with a tested pipeline that transformed Airtable inventory data and stored it in the website's database.
Online sports insurance company for individuals, tournaments, etc. Built payment and subscription workflows and internal support tools, redesigned the PostgreSQL schema, and consolidated two backends into one codebase.
TUI library with a Rust rendering core and TypeScript wrapper API. Written from scratch.
Demos
Snake
Typing Speed
Letty Agent (lty)
Letty Agent is a small, local coding agent built entirely with LeTUI. It uses Codex app-server for
ChatGPT subscription authentication, agent execution, and durable local thread history. Letty keeps
only its current UI projection and model preferences. There are no API keys, cloud threads, credits,
or remote infrastructure.
bash
# Requires Codex CLI 0.157.0+ on PATH.
bun run lty
Press Ctrl+O for commands, Ctrl+S to cycle reasoning effort, Alt+T to expand tool details,
@ to mention files, or @@ to reference a previous local thread. The footer reports the Codex
connection and five-hour subscription window instead of API cost or credit data. See the
Letty Agent guide for architecture, setup, scope, and verification.
Text wrapping, clipping, and overflow are resolved in the Rust renderer. Explicit newlines are treated as hard row boundaries after text normalization.
ScrollView always scrolls vertically. scrollY is a row offset; Rust clamps oversized values, floors fractional values to whole rows, and owns the final hit-testing for the visible scrolled region.
Debug metrics split the frame into js, render, sync, and flush, plus a worst-frame breakdown. Enable with run(root, { debug: true }) to print the summary on quit. If you also want a file, pass run(root, { debug: true, metricsPath: "dump/metrics.txt" }).
Appearance detection requests the current terminal color scheme at startup and listens for live theme updates on terminals that support DEC 2031. Startup detection asks for DEC color-scheme status first and also sends an OSC 11 background-color query as a fallback. appearance() returns "light", "dark", or "unknown".
Pass appearance: "light", "dark", or "unknown" to run() to override detection.
Benchmarks
Generally speaking it's on par if not faster than OpenTUI, Ink and probably any other popular TUI library at its current state.
It loses to Ratatui though, as it is pure Rust.