Real widgets, not a WebView
Your components render to a real TextView and a real UILabel. There is no browser, no JavaScript bridge, and no HTML anywhere in the process.
Compiled, not interpreted
Your UI and logic compile ahead-of-time into a platform-native library — a .NET NativeAOT binary per platform and ABI. No JIT, no IL interpreter, nothing to download at boot.
One layout engine, two platforms
Both shells delegate placement to the same C++ flexbox engine, so both compute the same frames. It is asserted by a cross-shell drift test, not promised in a README.
Typed structs on the wire
The renderer emits fixed-size struct patches through a C-ABI frame callback. Nothing on the frame path is serialized, parsed, or allocated per frame.
It is just Blazor
Components, @bind, EventCallback, cascading values, keyed lists, real disposal and DI. The render tree is the real one — only the thing at the end of it changed.
Analyzers that know the runtime
The BN rules catch what a native shell makes illegal — a blocking sleep on the dispatch lane, an exception escaping the C-ABI — at compile time, not at 3am.
You write this
<BnColumn Gap="16" Padding="16">
<BnRow Justify="FlexJustify.SpaceBetween">
<BnText Text="Left" />
<BnText Text="Right" />
</BnRow>
<BnButton Label="Tap me" OnClick="OnTap" />
</BnColumn>This runs
Android iOS ─────────────── ─────────────── FrameLayout UIView ├─ FrameLayout ├─ UIView │ ├─ TextView │ ├─ UILabel │ └─ TextView │ └─ UILabel └─ Button └─ UIButton Real controls — and every one of them placed at the frame Yoga computed, which is the SAME frame on both sides.
The packages
BlazorNative.Core
The IMobileBridge contract and the bridge implementations. A pure library.
BlazorNative.Renderer
The headless NativeRenderer and the RenderPatch model.
BlazorNative.Runtime
The NativeAOT composition root and the C-ABI export surface.
BlazorNative.Components
The Bn* component library — the flex surface, the controls, the list.
BlazorNative.Http
BridgeHttpHandler + DI — a plain HttpClient, over the shell's fetch.
BlazorNative.Analyzers
Compile-time guards for the native runtime and the C-ABI boundary.
This is a pre-release proof of concept. The API surface is unstable and changes without notice. iOS is simulator-only.
This site deliberately states no test counts, no version numbers and no milestone status — those facts are asserted by CI on every pull request, and a copy of them here would only be a copy that goes stale. For the current state of the project, read the repository and its CI.