Skip to the content
A UI framework for everything

One universal best option

Surface is a UI framework. You write a component in Surf once, and one source builds everything.
$ curl -fsSL https://surface.solenovis.com/install.sh | sh
Demo.surf
One file, one component
above the line: what the app knows
state count = 0;motion phase(ms: 1400, ease: "ease-spring") = count.toFloat() * 3.0;fn bar(i: Int) -> Float = 56.0 + 44.0 * (i.toFloat() * 0.35 + phase).sin();
below the line: what people see
<Column style="gap-6"> <Row decorative style="h-28 gap-1 items-end"> #for i in 0..32 key i { <Column style="grow h-{bar(i)}px rounded-full bg-$rule opacity-{bar(i) / 110.0}" /> } </Row> <Row style="gap-4 items-center"> <Button testid="demo-press" style="@button" on:press={count += 1}>Make a wave</Button> <Text testid="demo-label" style="text-$muted">Waves: {count}</Text> </Row></Column>
the result
Waves: 0

One way for each thing

Each task has one tool, one form and one model. A second way needs a decision record with its reason.
01

One install

The command surf is the only tool. A web build needs nothing else. The first native build downloads a pinned Rust toolchain and the runtime.
02

One source

The same files build the app for each target. The compiler stops a feature that a target cannot give in the same way.
03

One syntax

Each concept has one form. The compiler knows each name of the language, so a wrong utility or a wrong attribute is an error, not a silent mistake.
04

One layout model

A subset of flexbox and grid. The browser lays it out on the web, and Taffy lays it out on the desktop. A test compares the boxes in each engine.

Where it runs

One source builds everything. Version 1 starts with the web and the desktop, and mobile comes next.
  • Web
    Available
    WebKit, Gecko and Chromium. Plain JavaScript and CSS.
  • macOS
    Available
    Metal, and AppKit for the window.
  • Linux
    Available
    Vulkan or the CPU renderer. Wayland, and X11 with --x11.
  • Windows
    Coming in v1
    Direct3D 11 on x86_64. surf package writes an MSIX package.
  • iOS
    Planned
    Mobile comes after version 1.
  • Android
    Planned
    Mobile comes after version 1.

Measured, with the date of each measure

Each number links to the file of the framework that records it. A number from CI wins over a number of a local build.
MeasureValueBudgetDate and source
Hello world for the web, JavaScript and CSS after gzip3,642 bytes
Budget:4,096 bytes
2026-11-03
Hello world for macOS, release binary1,557,952 bytes
Budget:2,000,000 bytes
2026-11-03
Hello world for Linux, release binary1,954,560 bytes
Budget:2,000,000 bytes
2026-11-03
The compiler in the browser, after gzip620,474 bytes
Budget:none
2026-11-03
This home page, a first visit after gzip: 4 files with the font100,262 bytes
Budget:none
2026-11-03
js-framework-benchmark, each of 9 operations, time against plain JavaScript0.99 to 1.02
Budget:1.10 or less
2026-10-26
macOS window, from the open to the first frame122 to 168 ms
Budget:150 ms or less, from the cold start
2026-10-29
A counter, compiled in the browser on an Apple M42 ms
Budget:none
2026-11-03

Against Svelte, SolidJS and Flutter

The same apps, with the same DOM, in headless Chromium on an Apple M4. The framework comparison has the method. No Flutter copy of these apps exists, so Flutter has no number here.
MeasureSurfSvelteSolidJSFlutterDate
Benchmark app, JavaScript after gzip5.6 KB15.3 KB6.6 KBnot measured2026-10-26
Select a row, time against plain JavaScript0.994.371.24not measured2026-10-26
JavaScript heap with 1,000 rows425 KB1,459 KB1,068 KBnot measured2026-10-26
Ticket system, all files after gzip (SvelteKit, SolidStart)67,496 bytes91,298 bytes78,358 bytesno port2026-10-31
Ticket system, 2,000 rows on the screen80 ms336 ms145 msno port2026-10-31

For coding agents

An agent does not know Surf from its training. The website and the MCP server give it the documents of this version.

The MCP server

The MCP server gives an agent the documents and the checks of the compiler. The agent repeats its code until check_code reports no error.
$ surf mcpor https://surface.solenovis.com/mcp
How to set up an agent

Build your first component

The tutorial runs the compiler in your browser. You need no install for it.
Start the tutorial