Mobile
Native apps, phones and tablets.
Android today. iOS on the roadmap.
An entirely different foundation for interfaces.
A reactive C++ core. A direct line to the GPU.
And nothing running when nothing changes.
No Skia.No WebView.No bridge.No canvas on web.
Flash doesn’t keep a tree and figure out what changed. Your UI is a function. A signal changes, the function runs, and the GPU draws. When it settles, everything stops. The architecture is the optimization.
LESS BETWEEN.Flash began as the UI framework for my own work-in-progress C++ game engine. I extracted it into a standalone technology so the same GPU-native foundation could power interfaces far beyond the engine.
GAME-ENGINE ROOTS. CROSS-PLATFORM AMBITION.Native apps, phones and tablets.
Android today. iOS on the roadmap.
Tools, dashboards and creative applications.
Windows, macOS and Linux on the roadmap.
Direct JSX through my Flash JSX runtime.
Signals, SSR, streaming and SEO. No canvas.
HUDs, editors and interfaces inside a C++ engine.
The place Flash started.
Android TV and Apple TV / tvOS are potential targets.
Future shells, focus and remote navigation.
Dashboards, kiosks and custom device interfaces.
Target-specific hardware and host integration.
One platform-agnostic core. Platform coverage grows through dedicated shells, input support and testing. TV and automotive are exploratory targets; Android Auto / Automotive OS need their own integrations.
See what runs todayA small idea with a big consequence.
Interact with the interface. Follow the frame path. Leave it alone, and it goes idle.
count.get() → pixels on screen
No change. No scheduled work.
That’s the whole idea.
UI described as code. Layout computed in-process. Commands drawn by a pass-based GPU renderer. The way a game engine draws a frame, brought to the interface.
State changes. Work begins.
Register a pixel shader once. Use it on an element like a background color. Glass, distortion, custom SDFs — the same rendering path.
YOUR EFFECT.Instanced batching turns elements that share a material into a draw call. Rendering is native to the GPU.
Tweens, springs and layout transitions. Enter, exit, resurrect and share elements across screens. When motion settles, the frames stop.
Components, props, state, composition.
All functions. All plain values.
C++20, DiligentCore, a fork of Clay.
FreeType and MSDF text.
No worklets. No UI / logic thread split.
Multi-thread ready, without requiring it.
Glass, continuous corners and custom effects belong to the rendering system. Styles are values, so you can compose them, override them and animate them.
Continuous squircles on every rounded element. Switch to classic web / Material corners app-wide or per element. The radius means the same size in both.
Refraction, edge light, contact shadows and a press lift. Frosted glass and backdrop blur share the same native effects path.
LIQUID GLASS / EXPERIMENTALBackdrop blur · Frosted glass · Liquid glass · Custom SDF shapes · Subtree opacity · Animated noise
STYLE APITweens and springs animate values or whole styles. Retarget in flight; springs carry their velocity. Size, padding, radius, opacity and color move together. Gesture-driven springs carry motion out of a drag.
Add or remove items and the list makes room. Resize a component and layout animations carry it and its direct children into the new arrangement.
Resurrection by construction: bring an element back mid-exit and its animation turns around. The same identity continues from where it is.
A gallery card becomes a detail hero. Separate elements, a matching shared id: the old geometry becomes the start, the new layout sets the destination. Position, size, corners and opacity morph together.
Games, product viewers, AR and data in three dimensions. A shared device, command queue and color pipeline. A viewport, or 3D layered directly between UI elements. Your renderer, inside your interface.
Draw straight into the shared frame. Models over panels, particles across the interface, glass blurring the live scene behind it — without an offscreen composition step.
A still scene should schedule no frames.
Motion wakes only the frames it needs.
Your own rendering, materials and shader work on the same GPU foundation.
Content blur and glow effects, with high dynamic range and wider color output.
A rendering foundation that can grow with data-heavy interfaces and richer scenes.
Files, clipboard, haptics, sharing, audio and notifications under one platform API. Thin wrappers over what the OS already has. The features you don’t call cost nothing.
Platform::Clipboard::SetText(code.c_str());
Platform::Haptics::Impact();
Platform::Share::Text(link.c_str());Evaluated by my own runtime at build time.
Permission declarations flow into the native app.
Local files and protected app data.
Copy and share through the OS.
Feedback you can feel and hear.
The system’s native notification surface.
Device input, with permissions in app.config.ts.
Platform location access through the same API.
IsAvailable() where a platform differs. Asynchronous results return as signals.
Touch input, momentum scrolling, soft keyboard and IME insets. Safe areas and density-independent sizing.
Focus, caret and UTF-8-safe editing. Text selection, handles and magnifier; CJK composition and HarfBuzz shaping.
Accessibility integration belongs in the platform foundation, alongside text input and native capabilities.
A platform-agnostic C++ core, with native GPU backends underneath and an OpenGL ES fallback for older Android devices.
Not just a UI framework. Flash’s native TSX authoring is being built on my own TypeScript runtime, written from scratch in Odin and bridgeless by design. Real TypeScript compiles to typed bytecode. TSX describes. C++ renders.
Interpreter · JIT · AOT
Native structs stay in native memory. Typed handles reach fields, methods, callbacks and containers in place — no boxing, serialization or proxies. A field read is the same offset load as in C.
Execution modes over one intermediate representation, chosen per platform and build. The runtime embeds in anything with a C ABI — beyond Flash itself.
State-preserving hot reload, over-the-air bundles and AOT release builds. Scoped state and a real component lifecycle above an immediate-mode foundation.
The web path is Flash JSX, my own web runtime: signals, SSR, streaming, SEO, providers and layout animations. Shared TSX components, state and logic are the goal — native rendering on device, Flash JSX on the web. No canvas on web.
STATUSA signal. A function. A button.
C++ keeps the UI a function; the if is the click handler. The TSX layer adds scoped state, lifecycle hooks and cleanup — with immediate mode underneath.
#include "UI.h"
#include "Widgets.h"
using namespace Flash::UI;
Signal<int> count{0};
window([&] {
column({}, { .gap = 12, .padding = 24 }, [&] {
label({ .text = std::to_string(count.get()).c_str() },
{ .fontSize = 24 });
if (button({ .id = "inc" }, {}, [&] {
label({ .text = "Increment" });
})) count.set(count.peek() + 1);
});
});API excerpt from the latest Flash README.
Flash is an early, independent technology in active development.
Android runs today. Platform ports, builtins, 3D and native TSX integration continue to evolve. This page presents the full feature direction; the current implementation details live in the README.
Reactive core + GPU renderer
Metal
D3D12 / Metal / Vulkan
Signals / SSR / streaming / SEO
Native applications. Delivered over the internet.
Typed bytecode. Bridgeless execution. Flash rendering.
Flash is in early development and isn’t available to try yet. I’m sharing demos, engineering decisions and progress as I build it.