
LeTUI
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.


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.
original
anime4kIn-browser MKV video streamer and player built from scratch, featuring real-time 4K anime upscaling powered by WGSL (WebGPU) shaders ported from Anime4K.

Web app and CLI for exporting X threads, articles, posts, and replies as Markdown or JSON, built around resumable jobs.
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.
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.
Watch anime in real time, upscaled to 4K, in your browser.
Senmei is an MKV player built from scratch: a hand-written Matroska parser, WebCodecs decoding, and Anime4K's CNN upscaling shaders ported to WGSL and run on WebGPU every frame.
The same frame, as decoded (1080p) and after Senmei's Anime4K pipeline (4K). Open each image at full size to compare line work.
Original, 1080p

Senmei + Anime4K, 4K

Measured on 2026-10-11 on an Apple M4 Pro (Helium, WebGPU on Metal), streaming a 1.44 GB MKV over HTTP Range, 1080p → 4K, 819 frames:
Matroska parser (mkv.ts): written by hand, with an API tuned for a video player.
Decoding: WebCodecs VideoDecoder and AudioDecoder.
Upscaling: the WebGPU setup and the Anime4K pipeline are maintained by hand. These Anime4K shaders are ported to WGSL (High-End HQ Mode A preset), in pass order:
Anime4K_Clamp_HighlightsAnime4K_Restore_CNN_VLAnime4K_Upscale_CNN_x2_VLAnime4K_AutoDownscalePre_x2Anime4K_AutoDownscalePre_x4Anime4K_Upscale_CNN_x2_MWhich passes run depends on the source and output size, following the GLSL !WHEN conditions.
Precision: FP32 shader arithmetic to match GLSL; rgba16float intermediates throughout.
Color: the existing sRGB preview canvas is uploaded, so the original and upscaled views share the same video color conversion. Direct hardware VideoFrame uploads can take a different browser color path. More on handling color space conversion explicitly: https://x.com/wrennly_dev/status/2039326806260748757
Canvas sizing: the real source frame dimensions and the display box are kept separate. A ResizeObserver watches the canvas container, CSS pixels are multiplied by devicePixelRatio for the canvas backing size, CSS aspect-ratio comes from the current video frame or image dimensions, and sizing reruns on resize, fullscreen and DPR changes.
bun install
bun run dev # http://localhost:3000
bun run build
bun run preview//!COMPONENTS 1/2 passes to narrower texture formats instead of rgba16float everywhere.AudioWorklet instead of scheduling one AudioBufferSourceNode per decoded chunk: the worklet pulls PCM from a reusable buffer on the audio thread, so there are no per-chunk allocations or seams between chunks, pause/seek don't need to tear down a queue, and the played sample position gives a precise clock to sync video to.SharedArrayBuffer ring buffer between the network and decoder workers (and the audio worklet), synchronized with Atomics, so nothing is allocated after startup and the GC never runs.VideoDecoder fetches (via HTTP Range) and decodes only the keyframe for the hovered timestamp, then scales it down with createImageBitmap.VideoFrame.timestamp, instead of drawing whenever a frame is ready.