One text file. A document, a website, an app, a deck.

Type a SurfDoc on the left. It renders on the right, in your browser, through the open parser itself.

Loading surf-parse 0.44.0 (2.5 MB) into your browser…

one-file.surfEdit it. The render follows.
Open in CloudSurf

What a SurfDoc is

A SurfDoc is one plain-text file: Markdown for the words, and typed :: blocks for everything with a shape, which the parser validates before anything draws. The same source renders as a document, a website, an app shell, a PDF, a terminal view and native views on iPhone, Mac and Android. The parser is surf-parse, written in Rust and published under the MIT license; this page runs its WebAssembly build, surf-parse 0.44.0, with 132 block types in its registry.

crates.io

surf-parse 0.44.0 on crates.io: parse, validate, lint and render .surf files from Rust.

GitHub

The source, the block registry and the tests, MIT: cloudsurf-software/surf-parse.

The spec

Every block, its attributes and what each renderer makes of it: doc.surf/spec.

Your editor

Syntax colouring and diagnostics in VS Code: surfdoc-vscode.

The command line

cargo install surf-parse --features cli gives you surf-lint: check and fix a file or a tree before it ships.

The app

CloudSurf is made of SurfDocs: every doc, task, site and app in a workspace is one, and Surfy writes them. Start building.

Nothing leaves your browser

The source you type stays on this page. A Copy link puts it in the URL after the #, where no server reads it. The one network request after the page is the parser itself.