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.surfOne 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.- WebWebKit, Gecko and Chromium. Plain JavaScript and CSS.Available
- macOSMetal, and AppKit for the window.Available
- LinuxVulkan or the CPU renderer. Wayland, and X11 with --x11.Available
- WindowsDirect3D 11 on x86_64. surf package writes an MSIX package.Coming in v1
- iOSMobile comes after version 1.Planned
- AndroidMobile comes after version 1.Planned
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
js-framework-benchmark, each of 9 operations, time against plain JavaScript0.99 to 1.02
Budget:1.10 or less
2026-10-26macOS window, from the open to the first frame122 to 168 ms
Budget:150 ms or less, from the cold start
2026-10-29Against Svelte, SolidJS and Flutter
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
$ surf mcpor https://surface.solenovis.com/mcp
How to set up an agent- /llms.txtThe list of the documents
- /llms-full.txtAll documents in one file
- /llms-small.txtA short form for a small context
- /SKILLS.mdThe skills of the plugin
- PluginsClaude Code, Codex CLI and Cursor