<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AllFrame - The Composable Rust API Framework</title>
<meta name="description" content="AllFrame is a complete Rust web framework with built-in HTTP/2 server. REST, GraphQL, and gRPC from one codebase. Compile-time DI, CQRS, TDD from day zero.">
<meta name="keywords" content="rust, web framework, http server, tdd, cqrs, event sourcing, api, graphql, grpc, rest, hyper, mcp">
<link rel="canonical" href="https://all-source-os.github.io/all-frame">
<!-- Open Graph -->
<meta property="og:title" content="AllFrame - The Composable Rust API Framework">
<meta property="og:description" content="Complete Rust web framework with built-in HTTP/2 server. REST, GraphQL, gRPC from one codebase. TDD from day zero.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://all-source-os.github.io/all-frame">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="AllFrame - The Composable Rust API Framework">
<meta name="twitter:description" content="Complete Rust web framework with built-in HTTP/2 server. REST, GraphQL, gRPC from one codebase. TDD from day zero.">
<link rel="stylesheet" href="style.css">
<style>
/* ---- Hero ---- */
.hero { padding: 80px 0; text-align: center; }
.hero h1 {
font-size: 3.5rem;
font-weight: 800;
margin-bottom: 16px;
background: linear-gradient(135deg, var(--text) 0%, var(--primary) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero .tagline { font-size: 1.5rem; color: var(--text-muted); margin-bottom: 12px; }
.hero .subtitle {
font-size: 1.1rem;
color: var(--text-muted);
margin-bottom: 32px;
max-width: 700px;
margin-left: auto;
margin-right: auto;
}
.hero-buttons { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; }
/* ---- Live badges ---- */
.badges {
display: flex;
gap: 8px;
justify-content: center;
flex-wrap: wrap;
margin-top: 32px;
}
.badges img { height: 20px; }
/* ---- Code Block ---- */
.code-block {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 8px;
padding: 24px;
margin: 40px auto;
max-width: 600px;
text-align: left;
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 0.9rem;
overflow-x: auto;
}
.code-block .comment { color: var(--text-muted); }
.code-block .command { color: var(--green); }
/* ---- Crates ---- */
.crates { padding: 60px 0; border-top: 1px solid var(--border); }
.crates h2 { text-align: center; font-size: 2rem; margin-bottom: 32px; }
.crates-table {
width: 100%;
border-collapse: collapse;
font-size: 0.95rem;
}
.crates-table th, .crates-table td {
padding: 14px 16px;
text-align: left;
border-bottom: 1px solid var(--border);
}
.crates-table th { color: var(--text-muted); font-weight: 500; }
.crates-table td:first-child a { font-weight: 600; }
.crates-table td img { height: 18px; vertical-align: middle; }
/* ---- Features ---- */
.features { padding: 80px 0; border-top: 1px solid var(--border); }
.features h2 { text-align: center; font-size: 2rem; margin-bottom: 48px; }
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
}
.feature-card {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
padding: 24px;
transition: border-color 0.2s;
}
.feature-card:hover { border-color: var(--primary); }
.feature-card h3 { font-size: 1.1rem; margin-bottom: 8px; }
.feature-card p { color: var(--text-muted); font-size: 0.95rem; }
/* ---- Stats ---- */
.stats { padding: 60px 0; border-top: 1px solid var(--border); background: var(--bg-secondary); }
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 32px;
text-align: center;
}
.stat h3 { font-size: 2.5rem; font-weight: 700; color: var(--primary); }
.stat p { color: var(--text-muted); font-size: 0.9rem; margin-top: 4px; }
/* ---- Comparison ---- */
.comparison { padding: 80px 0; border-top: 1px solid var(--border); }
.comparison h2 { text-align: center; font-size: 2rem; margin-bottom: 48px; }
/* ---- CTA ---- */
.cta { padding: 80px 0; text-align: center; border-top: 1px solid var(--border); }
.cta h2 { font-size: 2rem; margin-bottom: 16px; }
.cta p { color: var(--text-muted); margin-bottom: 32px; max-width: 600px; margin-left: auto; margin-right: auto; }
/* ---- Responsive ---- */
@media (max-width: 768px) {
.hero h1 { font-size: 2.5rem; }
.hero .tagline { font-size: 1.2rem; }
}
</style>
</head>
<body>
<header>
<nav class="container">
<div class="logo"><span>All</span>Frame</div>
<div class="nav-links">
<a href="https://docs.rs/allframe">API Docs</a>
<a href="changelog.html">Changelog</a>
<a href="https://github.com/all-source-os/all-frame/blob/main/docs/current/ROADMAP.md">Roadmap</a>
<a href="https://github.com/all-source-os/all-frame">GitHub</a>
<a href="https://crates.io/crates/allframe" class="btn btn-primary btn-sm">
crates.io
</a>
</div>
</nav>
</header>
<main>
<section class="hero">
<div class="container">
<h1>AllFrame</h1>
<p class="tagline">The Composable Rust API Framework</p>
<p class="subtitle">
Write your handler once, expose it via REST, GraphQL, and gRPC.
Built-in HTTP/2 server, compile-time DI, CQRS, and MCP -- all TDD from day zero.
</p>
<div class="hero-buttons">
<a href="https://github.com/all-source-os/all-frame" class="btn btn-primary">
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
View on GitHub
</a>
<a href="https://docs.rs/allframe" class="btn btn-secondary">
Read the Docs
</a>
</div>
<div class="code-block">
<div class="comment"># Install AllFrame CLI</div>
<div class="command">cargo install allframe</div>
<br>
<div class="comment"># Create a new project</div>
<div class="command">allframe ignite my-api</div>
<br>
<div class="comment"># Run your API</div>
<div class="command">cd my-api && cargo run</div>
</div>
<div class="badges">
<a href="https://crates.io/crates/allframe"><img src="https://img.shields.io/crates/v/allframe.svg" alt="crates.io version"></a>
<a href="https://crates.io/crates/allframe"><img src="https://img.shields.io/crates/d/allframe.svg" alt="downloads"></a>
<a href="https://docs.rs/allframe"><img src="https://img.shields.io/docsrs/allframe" alt="docs.rs"></a>
<a href="https://github.com/all-source-os/all-frame/actions"><img src="https://img.shields.io/github/actions/workflow/status/all-source-os/all-frame/offline-quality-gates.yml?branch=main&label=CI" alt="CI"></a>
<a href="https://github.com/all-source-os/all-frame"><img src="https://img.shields.io/crates/l/allframe.svg" alt="license"></a>
<a href="https://www.rust-lang.org"><img src="https://img.shields.io/badge/MSRV-1.89-orange.svg" alt="MSRV"></a>
</div>
</div>
</section>
<section class="crates">
<div class="container">
<h2>Composable Crates</h2>
<table class="crates-table">
<thead>
<tr>
<th>Crate</th>
<th>Description</th>
<th>Version</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://crates.io/crates/allframe">allframe</a></td>
<td>Re-exports core + CLI (<code>allframe ignite</code>)</td>
<td><img src="https://img.shields.io/crates/v/allframe.svg?label=" alt="version"></td>
</tr>
<tr>
<td><a href="https://crates.io/crates/allframe-core">allframe-core</a></td>
<td>Router, CQRS, DI, resilience, auth, security</td>
<td><img src="https://img.shields.io/crates/v/allframe-core.svg?label=" alt="version"></td>
</tr>
<tr>
<td><a href="https://crates.io/crates/allframe-macros">allframe-macros</a></td>
<td>Proc macros: <code>#[handler]</code>, <code>#[di_container]</code>, <code>#[retry]</code>, ...</td>
<td><img src="https://img.shields.io/crates/v/allframe-macros.svg?label=" alt="version"></td>
</tr>
<tr>
<td><a href="https://crates.io/crates/allframe-forge">allframe-forge</a></td>
<td>Project scaffolding and code generation</td>
<td><img src="https://img.shields.io/crates/v/allframe-forge.svg?label=" alt="version"></td>
</tr>
<tr>
<td><a href="https://crates.io/crates/allframe-mcp">allframe-mcp</a></td>
<td>MCP server -- expose handlers as LLM tools</td>
<td><img src="https://img.shields.io/crates/v/allframe-mcp.svg?label=" alt="version"></td>
</tr>
<tr>
<td><a href="https://crates.io/crates/allframe-tauri">allframe-tauri</a></td>
<td>Tauri 2.x plugin for offline-first desktop apps</td>
<td><img src="https://img.shields.io/crates/v/allframe-tauri.svg?label=" alt="version"></td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="features">
<div class="container">
<h2>Features</h2>
<div class="feature-grid">
<div class="feature-card">
<h3>Protocol-Agnostic Routing</h3>
<p>Write once, expose via REST, GraphQL, and gRPC. Automatic schema generation for OpenAPI 3.1, GraphQL SDL, and .proto files.</p>
</div>
<div class="feature-card">
<h3>CQRS + Event Sourcing</h3>
<p>CommandBus, QueryBus, ProjectionRegistry, event versioning, and saga orchestration. <code>#[command]</code>, <code>#[query]</code>, <code>#[event]</code> generate real trait impls. 85% boilerplate reduction.</p>
</div>
<div class="feature-card">
<h3>Compile-Time DI</h3>
<p>Dependency injection resolved entirely at compile time. Zero runtime overhead, zero reflection.</p>
</div>
<div class="feature-card">
<h3>Streaming Handlers</h3>
<p>StreamSender with bounded backpressure and cooperative cancellation. Tauri IPC bridge, TypeScript codegen, and RxJS adapter.</p>
</div>
<div class="feature-card">
<h3>MCP Server</h3>
<p>Expose handlers as LLM-callable tools via Model Context Protocol. Separate crate for 100% zero overhead when not used.</p>
</div>
<div class="feature-card">
<h3>Resilience Patterns</h3>
<p>Retry with exponential backoff, circuit breakers (keyed per-resource), rate limiting (Redis-backed for distributed). Attribute macros included.</p>
</div>
<div class="feature-card">
<h3>Layered Authentication</h3>
<p>Protocol-agnostic auth: JWT validation (HS256, RS256, EdDSA), Axum extractors, gRPC interceptors, type-safe claims.</p>
</div>
<div class="feature-card">
<h3>API Documentation</h3>
<p>Auto-generated interactive docs: Scalar UI for REST (10x smaller than Swagger), GraphiQL 3.0 for GraphQL, gRPC Explorer.</p>
</div>
<div class="feature-card">
<h3>Offline-First</h3>
<p>SQLite event store, offline circuit breaker, store-and-forward, bidirectional sync. Zero network deps enforced by CI.</p>
</div>
<div class="feature-card">
<h3>Tauri Desktop</h3>
<p><code>#[tauri_compat]</code> for mechanical migration. Async boot lifecycle with progress events. Typed returns, TypeScript codegen, in-process dispatch.</p>
</div>
<div class="feature-card">
<h3>Contract Testing</h3>
<p>Automatic test generation from router, schema validation, breaking change detection, and coverage reporting.</p>
</div>
<div class="feature-card">
<h3>Security Utilities</h3>
<p>URL/credential obfuscation, <code>Sensitive<T></code> wrapper, <code>#[derive(Obfuscate)]</code> with <code>#[sensitive]</code> fields on structs and enums, header redaction.</p>
</div>
<div class="feature-card">
<h3>Architecture Enforcement</h3>
<p>Compile-time Clean Architecture layer checks. <code>#[domain]</code>, <code>#[repository]</code>, <code>#[use_case]</code>, <code>#[handler]</code> macros reject invalid cross-layer dependencies.</p>
</div>
<div class="feature-card">
<h3>Graceful Shutdown</h3>
<p>Named task spawning with automatic cancellation, cleanup orchestration with error handling, cancellable futures.</p>
</div>
<div class="feature-card">
<h3>CLI Scaffolding</h3>
<p><code>allframe ignite my-api</code> creates Clean Architecture projects with zero warnings. Handlers, commands, and queries generators.</p>
</div>
</div>
</div>
</section>
<section class="stats">
<div class="container">
<div class="stats-grid">
<div class="stat">
<h3>100%</h3>
<p>TDD Coverage</p>
</div>
<div class="stat">
<h3>500+</h3>
<p>Tests Passing</p>
</div>
<div class="stat">
<h3>85%</h3>
<p>Less Boilerplate</p>
</div>
<div class="stat">
<h3><2MB</h3>
<p>Binary Size</p>
</div>
<div class="stat">
<h3>6</h3>
<p>Composable Crates</p>
</div>
</div>
</div>
</section>
<section class="comparison">
<div class="container">
<h2>Framework Comparison</h2>
<table class="comparison-table">
<thead>
<tr>
<th></th>
<th>AllFrame</th>
<th>Actix</th>
<th>Axum</th>
<th>Rocket</th>
</tr>
</thead>
<tbody>
<tr>
<td>Protocol-agnostic handlers</td>
<td class="check">Yes</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Built-in CQRS + Event Sourcing</td>
<td class="check">Yes</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Compile-time DI</td>
<td class="check">Yes</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Auto OpenAPI 3.1</td>
<td class="check">Yes</td>
<td class="partial">Manual</td>
<td class="partial">Manual</td>
<td class="partial">Manual</td>
</tr>
<tr>
<td>Resilience patterns</td>
<td class="check">Built-in</td>
<td class="partial">External</td>
<td class="partial">External</td>
<td class="cross">-</td>
</tr>
<tr>
<td>MCP server (LLM tools)</td>
<td class="check">Zero bloat</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Streaming handlers</td>
<td class="check">Yes</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Offline-first / Tauri</td>
<td class="check">Yes</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Contract testing</td>
<td class="check">Yes</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>Architecture enforcement</td>
<td class="check">Compile-time</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
<tr>
<td>TDD from day zero</td>
<td class="check">100%</td>
<td class="cross">-</td>
<td class="cross">-</td>
<td class="cross">-</td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="cta">
<div class="container">
<h2>Ready to build?</h2>
<p>
AllFrame is open source under MIT and Apache 2.0 licenses.
</p>
<div class="hero-buttons">
<a href="https://github.com/all-source-os/all-frame" class="btn btn-primary">
Get Started
</a>
<a href="https://github.com/all-source-os/all-frame/discussions" class="btn btn-secondary">
Join the Discussion
</a>
</div>
</div>
</section>
</main>
<footer>
<div class="container">
<div class="links">
<a href="https://github.com/all-source-os/all-frame">GitHub</a>
<a href="https://docs.rs/allframe">API Docs</a>
<a href="changelog.html">Changelog</a>
<a href="https://crates.io/crates/allframe">crates.io</a>
<a href="https://github.com/all-source-os/all-frame/discussions">Discussions</a>
</div>
<p>AllFrame -- One frame. Infinite transformations. Built with TDD, from day zero.</p>
</div>
</footer>
</body>
</html>