Menu
AkurAI-Build
publicLatest change 0cf28150faedd8c150474a4f16be4c9922c04f56 - feat: add Ponytail UI design system 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" tabindex="-1">
<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 %}