AkurAI Build
Menu

AkurAI-Build

public

Latest change 4171234d191bcc14205c776b4b86bda4452c80be - server: harden the listener against slow and stuck requests by Olafur Bui

{% extends "base.html" %}
{% block description %}Bunfork is one Rust CLI for verified Svelte, SvelteKit, Next.js, Vue, Nuxt, and Vite exports, native MiniJinja pages, encrypted SQLite, vectors, tests, backups, and deploys.{% endblock %}
{% block body_class %}home-page{% endblock %}
{% block body %}
<main id="main-content">
  <section class="shell home-hero" aria-labelledby="hero-title">
    <div class="hero-copy">
      <p class="hero-kicker">A small Rust runtime, deliberately.</p>
      <h1 id="hero-title">One CLI from build to backup.</h1>
      <p class="hero-lede">Serve native MiniJinja pages or verified exports from Svelte, SvelteKit, Next.js, Vue, Nuxt, and Vite—then keep migrations, vectors, tests, backups, and deploys behind the same CLI.</p>
      <div class="hero-actions">
        <a class="button" href="/docs/getting-started">Get started <span aria-hidden="true">→</span></a>
        <a class="text-link" href="/docs/security">Read the security model</a>
      </div>
      <ul class="hero-facts" aria-label="Runtime facts">
        <li>Linux-first</li>
        <li>MIT licensed</li>
        <li>No server-side JavaScript runtime</li>
      </ul>
    </div>

    <figure class="command-window">
      <div class="command-window-bar">
        <span>release check</span>
        <span class="live-indicator"><span aria-hidden="true"></span> ready</span>
      </div>
      <pre><code><span class="prompt">$</span> bunfork doctor \
  --static frontend/out \
  --manifest bunfork-static.json
<span class="success">ok: artifact matches manifest</span>

<span class="prompt">$</span> bunfork serve \
  --static frontend/out \
  --manifest bunfork-static.json
<span class="muted-code">listening on 0.0.0.0:3100</span></code></pre>
      <figcaption>Browser code is served byte-for-byte. Node, Deno, Bun, RSC, and Nitro stay out of the production process.</figcaption>
    </figure>
  </section>

  <section class="signal-band" aria-label="Core capabilities">
    <div class="shell signal-list">
      <span>Verified artifacts</span>
      <span>SQLCipher at rest</span>
      <span>Bounded vector search</span>
      <span>Digest-owned deploys</span>
    </div>
  </section>

  <section class="shell home-section framework-section" aria-labelledby="framework-title">
    <div class="section-heading">
      <h2 id="framework-title">Your frontend stays yours.</h2>
      <p>Bunfork accepts completed browser output. It does not pretend to be the framework compiler or its server runtime.</p>
    </div>
    <div class="framework-rail" role="list" aria-label="Verified framework exports">
      <span role="listitem">Svelte</span>
      <span role="listitem">SvelteKit</span>
      <span role="listitem">Next.js</span>
      <span role="listitem">Vue</span>
      <span role="listitem">Nuxt</span>
      <span role="listitem">Vite</span>
    </div>
    <div class="runtime-map" aria-label="Static artifact workflow">
      <div>
        <span class="map-command">build</span>
        <strong>Run an explicit command</strong>
        <p>Bunfork invokes exactly the program and arguments you provide with a reduced environment.</p>
      </div>
      <div>
        <span class="map-command">admit</span>
        <strong>Freeze the artifact</strong>
        <p>Every regular file receives a byte count and SHA-256 digest in a strict manifest.</p>
      </div>
      <div>
        <span class="map-command">serve</span>
        <strong>Verify before bind</strong>
        <p>Files are re-hashed, preloaded, and served with framework-aware routes and caching.</p>
      </div>
    </div>
    <a class="section-link" href="/docs/frameworks">See framework-specific export settings <span aria-hidden="true">→</span></a>
  </section>

  <section class="home-split-section">
    <div class="shell home-split">
      <div class="split-copy">
        <h2>Native pages when JavaScript is unnecessary.</h2>
        <p>File routes and MiniJinja inheritance cover static, dynamic, grouped, catch-all, error, and server-rendered pages. Development rescans on each request; production compiles routes before listening.</p>
        <a class="text-link" href="/notes/hello-rust">Open the live dynamic route demo <span aria-hidden="true">→</span></a>
      </div>
      <div class="file-tree" aria-label="Example native page tree">
        <p><span>app/</span></p>
        <p><span aria-hidden="true">├─ </span>templates/base.html</p>
        <p><span aria-hidden="true">└─ </span>pages/</p>
        <p class="tree-indent"><span aria-hidden="true">├─ </span>index.html <em>/</em></p>
        <p class="tree-indent"><span aria-hidden="true">├─ </span>notes/[slug].html <em>/notes/:slug</em></p>
        <p class="tree-indent"><span aria-hidden="true">└─ </span>docs/index.html <em>/docs</em></p>
      </div>
    </div>
  </section>

  <section class="shell home-section" aria-labelledby="operations-title">
    <div class="section-heading wide-heading">
      <h2 id="operations-title">Operations are product features.</h2>
      <p>The same binary that serves the app also owns the checks that make a release recoverable.</p>
    </div>
    <div class="capability-list">
      <article>
        <h3>Encrypted data</h3>
        <p>Bundled SQLCipher, exact embedded migrations, tenant/model-scoped vectors, and no loadable SQLite extensions.</p>
        <a href="/docs/data">SQLite &amp; vectors</a>
      </article>
      <article>
        <h3>Tests that cross boundaries</h3>
        <p><code>bunfork test</code> runs locked Rust tests plus route, migration, vector, backup, and restore smoke checks.</p>
        <a href="/docs/cli">CLI &amp; operations</a>
      </article>
      <article>
        <h3>Verified recovery</h3>
        <p>Backups are encrypted, no-overwrite, and validated. Restore preserves the previous live database.</p>
        <a href="/docs/deployment">Deploy &amp; recover</a>
      </article>
      <article>
        <h3>Owned deployments</h3>
        <p>Release bundles carry a complete digest inventory, hardened user units, and a preserved prior release.</p>
        <a href="/docs/deployment">Deployment workflow</a>
      </article>
    </div>
  </section>

  <section class="shell boundary-section" aria-labelledby="boundary-title">
    <div>
      <h2 id="boundary-title">Security starts with an honest boundary.</h2>
      <p>Bunfork encrypts data at rest, validates inputs and artifacts, and fails closed on suspicious files. It does not provide TLS, user accounts, remote backup transport, host provisioning, or protection from a compromised live process.</p>
    </div>
    <a class="button secondary" href="/docs/security">Understand the boundary</a>
    <img class="boundary-forkbird" src="/assets/forkbird.png" width="1254" height="1254" alt="" aria-hidden="true" loading="lazy">
  </section>

  <section class="shell final-cta" aria-labelledby="cta-title">
    <p>Keep the browser expressive. Keep production explainable.</p>
    <h2 id="cta-title">Start with one release build.</h2>
    <a class="button" href="/docs/getting-started">Read the five-minute setup <span aria-hidden="true">→</span></a>
  </section>
</main>
{% endblock %}