Menu
AkurAI-Build
publicLatest change 5ecb45c5915e3bb122d43dbaf90b4eba39484c7d - organize native templates and reserve runtime routes by Olafur Bui
{% extends "layouts/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 & 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 & 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 & 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 %}