Docs

Playground

Interactive demo with live editing, benchmarks, and three SSR engines side by side

Open Markdown

The Proa Playground is an interactive environment for exploring Proa's SSR engine. Edit JSON props, see renders update instantly, compare performance against React on Node.js and Bun, and run load tests, all from your browser.

Getting started

Download and run

Download the package for your platform from the Ecosystem Apps page, extract it, and run:

tar xzf proa-playground-*.tar.gz
cd proa-playground-*
./run.sh

The server starts at http://localhost:3001.

Docker

Use the Linux x86_64 download, even when building on macOS or Windows. Add the Dockerfile from Packaging to the extracted Linux package; that archive currently omits it. Then run:

docker build --platform linux/amd64 -t proa/playground .
docker run --rm --platform linux/amd64 -p 127.0.0.1:3001:3001 proa/playground

Open http://localhost:3001. The image includes Node and Bun for the comparison engines. A native macOS or Windows executable cannot run in this Linux image.

Pages

Playground (/playground)

The main interactive UI. It has three panels:

Use the breadcrumb at the top to switch between travel and footwear showcases and pages (Home, Search, Listing, Catalog, Product).

Reference showcases (/ecosystem/apps#reference-showcases)

The Apps page includes reference showcase links for every combination of showcase and engine:

ShowcasePagesEngines
AirbnbHome, Search, ListingProa, Node, Bun
NikeCatalog, ProductProa, Node, Bun

Each showcase page lives under /showcase/... and is a reference implementation rendered with the selected SSR engine. Links within each page stay within the same engine, clicking the Airbnb logo on a Bun page navigates to the Bun home page, not the Proa one.

API Docs (/api/docs)

Interactive API documentation powered by Scalar. Covers all endpoints with full request/response schemas and per-page JSON examples you can send directly from the browser.

Engines

The playground runs three SSR engines for comparison:

EngineHow it works
Proa (Rust)Templates compiled to byte sequences at build time. Static markup is consolidated; dynamic values are written directly to the output buffer.
React (Node)renderToString() served by Hono on Node.js 20+.
React (Bun)The packaged React/Hono server running on Bun.

The native Proa engine runs without Node or Bun. Those runtimes are optional comparison engines.

Requirements

DependencyRequiredMinimum version
Proa binaryYesIncluded in package
Node.jsOptional20+
BunOptional1.3+
pnpmOptional9.15.2 (for JS dependency installs)

The run.sh script checks versions and attempts to install JavaScript dependencies on first launch. Current archives contain an obsolete build-machine path in the comparison-engine launcher. The Docker example starts those engines explicitly; installing Node or Bun alone does not repair that archived launcher. The native Proa engine remains available.

Rendering

Single render

Click Render or press Ctrl/Cmd+Enter to render the current page with the JSON props in the editor. The stats bar updates with timing:

Engine switching

Use the engine toggle buttons (Proa, React Node, React Bun) to switch which engine renders the page. The preview updates on the next render. The Open full page link opens the showcase page in a new tab for the selected engine.

curl

Click Copy curl to copy a ready-to-use curl command for the current page and engine. Run it from your terminal for cleaner timing without browser overhead.

Load testing

Click Load Test to run a benchmark across all three engines. Choose a preset:

PresetRequestsConcurrency
Light50010
Medium2,00050
Heavy5,000100
Stress10,000200

The test runs each engine sequentially and reports:

Accuracy note

Treat playground timings as exploratory measurements. The engines share CPU and compete with the server and browser, so scheduling, warm-up, and instrumentation affect both absolute times and ratios. For performance comparisons, pin versions and inputs, verify equivalent output, and run isolated repeated trials as described in Performance.

API endpoints

MethodPathDescription
POST/api/renderRender a page. Body: {"page": "listing", "props": {...}}
POST/api/loadtestRun load test. Body: {"page": "listing", "iterations": 2000, "concurrency": 50}
GET/api/propsDefault JSON props for all pages
GET/api/openapi.jsonOpenAPI 3.1 spec
GET/api/docsScalar API reference UI
GET/healthHealth check: {"status": "ok", "engine": "proa"}

Full schemas and examples are available at /api/docs.

Package contents

proa-playground-{target}/
proa-playground
run.sh
Dockerfile
README.md
LICENSE
showcase-props.json
ffi/
libproa_demo.dylib
proa.h
public/
images/
fonts/
assets/
hono-ssr/
server.ts
package.json
react-ssr-shared/
src/
package.json
FileDescription
proa-playgroundAxum HTTP server with embedded playground UI
run.sh / run.batLaunch script with version checks and dep install
DockerfileNot in every archive; use the Packaging example
ffi/Shared library + C header for calling renders from any language
public/Images, fonts, CSS, JS for the showcase pages
hono-ssr/Hono server for React SSR comparison engines
react-ssr-shared/React components (same pages rendered by Node/Bun)
showcase-props.jsonDefault props for all showcase pages

Search

Type at least 2 characters