The web framework for people and agents.

An extremely performant, batteries included Rust web framework built for people and agents, with composable, multiformat components, lean JavaScript, and fast server rendering.

One object. Every render target.

HTML, Markdown, or another target, from one typed component.

ProductCard::new(product)
impl<L: DataLoader> MdRenderSync<L> for ProductCard {
    fn render_md(self, cx: &mut WebContext<L>) -> Result<(), WriteError> {
        md_sync! { r###"
            # {self.product.name}

            {Link::new("Buy now", self.product.url)}
            "###
        }
        .render_md(cx)
    }
}
md_sync! { r###"
    [{self.label}]({self.href})
    "###
}
impl<L: DataLoader> WebRenderSync<L> for ProductCard {
    fn render(self, cx: &mut WebContext<L>) -> Result<(), WriteError> {
        html_sync! {
            <article data-product-card>
                <h2>{self.product.name}</h2>
                {Link::new("Buy now", self.product.url)}
            </article>
        }
        .render(cx)
    }
}
html_sync! {
    <a href={self.href} data-link>
        {self.label}
    </a>
}

Build fast, information-dense apps.

Explore re-creations of GitHub, Sentry, and Airbnb, built in Proa with fast server rendering and selective interactivity.

oven-sh/bun
CodeIssues5k+Pull requests1.9k

[tracking] Zig/C++ fork: Rust->Zig port progress #31136

ClosedMaurerAntonwants to merge 8 commits intooven-sh:main

Conversation9Commits8Files changed16
src/install/PackageManager/PackageJSONEditor.zig+3-1
@@ -459,7 +459,9 @@ pub fn edit(
459459 }
460460 break;
462- if (request.version.tag == .github or request.version.tag == .git) {
462+ if (request.e_string == null and !request.is_aliased and
463+ (request.version.tag == .github or request.version.tag == .git or request.version.tag == .tarball))
463465 for (query.expr.data.e_object.properties.slice()) |item| {

23.5 us

Proa render p50

5.56 ms

React renderToString p50

237x

faster

Warm production p50s measured on an 8-vCPU AMD EPYC-Milan VPS.

Independent demos. Not affiliated with or endorsed by GitHub, Sentry, or Airbnb.

The numbers behind the speed.

Server-render latency across 17 renderers and three workloads. Proa leads the component frameworks; React takes 13.2 to 35.4 times as long.

Apple M4 Max · September 2026Scroll horizontally to explore each chart.

Build your design system.

Proa UI offers Shadcn style Proa components. Source in your repo, in typed Rust. Theme it, compose it, ship it.

  1. No. This build opens and closes with radio inputs and CSS alone.
    Yes. It follows the WAI-ARIA disclosure pattern.
    The source lives in your repo, so yes.

    Single or multiple open panels, with a CSS-only build that ships no JavaScript at all.

  2. InvoiceStatusAmount
    INV-2041Paid$1,499.00
    INV-2042Pending$399.00
    INV-2043Paid$399.00
    INV-2044Refunded$399.00

    Table

    Free

    Header, body, footer, and caption parts that compose into dense record views.

  3. Button

    Free

    Solid, outline, ghost, and link variants across three sizes and three intents.

  4. Used in your deploy URL.

    Server render by default
    Ship islands only when needed

    Field

    Free

    Labels, descriptions, and error text wired to any control, in either orientation.

  5. Deploy preview

    Pushed 2 minutes ago to main.

    Render
    41µs
    Client JS
    0kB
    Built from source in your repo.

    Card

    Free

    Header, content, and footer slots for the surface most product screens are built from.

  6. March 2026
    MoTuWeThFrSaSu

    Single and range selection, month paging, and keyboard navigation, rendered as plain HTML.

  7. Weekly requests36.2k01.8k3.6k5.5k7.3k3.2kMon4.1kTue3.8kWed5.2kThu6.4kFri5.9kSat7.3kSun

    Area, bar, line, donut, and stacked series drawn as pure SVG on the server.

  8. Enter the code we sent to [email protected]
    Resend available in 0:28

    Grouped one-time-code slots with separators, size variants, and a caret you can style.

  9. ME
    You
    Can an agent add a settings page to this app?
    9:41
    AI
    Proa
    Yes. Every component is typed Rust in your repo, so the compiler checks the edit before it ever reaches a browser.
    9:41
    ME
    You
    How much JavaScript does that ship?
    9:42

    Chat

    Pro

    Message bubbles, avatars, timestamps, and typing indicators for assistant surfaces.

  10. html_sync! {
      {Card {
        class: None,
        children: Some(html_sync! {
          {CardTitle { class: None,
            children: Some(row.id) }}
          {CardFooter { class: None,
            children: Some(row.due) }}
        }),
      }}
    }

    Syntax highlighting done on the server, so no highlighter ships to the browser.

  11. 58components, every one with a live example, a props table, and Rust you can copy.

    See more in the docs

    The full catalog, from primitives to paid product surfaces.

Scroll sideways or use the arrow keys to move through the component demos.

Everything people want from a modern web app, without the render tax underneath it.

A component system and a framework surface, not a templating engine.

Framework

Framework primitives beyond template glue.

Proa keeps streaming, request data, routing, metadata, and response control inside the same typed WebContext as your components.

Streaming SSR, in order or out of order

Flush HTML in document order when sequence matters, or let Suspense boundaries stream ready chunks out of order when slow data should not block the page.

DataLoader-backed WebContext

Every render has typed access to request-scoped data, response metadata, route state, and loader caching through the same WebContext components already receive.

Typed SSR framework semantics

Layouts, routing, metadata, static assets, forms, mutations, and progressive navigation compose through the same Rust component model instead of template glue.

Interactivity

Add interactivity without giving up native SSR.

Keep the page as server-rendered HTML, then opt specific controls into client behavior with typed signals and event handlers. Proa compiles only the moving pieces into JavaScript.

RSJS islands

Use signal(...), bind_value, typed events, and named handlers in Rust. The compiler lowers the client behavior.

Tiny per-island JavaScript

Each hydrated RSJS island emits a small vanilla-JS module plus seed state, served with a shared runtime around 1.3 KB gzipped.

Adoption

Keep the stack you already have. Move one route first.

Go Axum-native for Proa routing and responses, or call Proa over FFI from Node, Go, Python, Ruby, or Java.

Run alongside your existing app

Proxy one route to Proa, leave the rest on Next.js or Rails, then compare latency and cost in production.

Security by default

Auto-escaped output, cross-origin request protection, security headers, and fixed-upstream proxying are part of the framework surface.

Accessibility at compile time

WCAG and WAI-ARIA checks run during cargo build so common markup defects fail before deploy.

Start building with Proa.

Search

Type at least 2 characters