<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>mini-static</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>mini-static</h1>
<p>A secure, async static file server with streaming, traversal protection, and connection limits.</p>
</header>
<main>
<section>
<h2>Features</h2>
<ul>
<li>Real streaming: 64 KB chunks, bounded memory</li>
<li>Path traversal protection via segment-based checking</li>
<li>Concurrent connection limits with graceful backoff</li>
<li>Conditional requests: If-None-Match / If-Modified-Since → 304</li>
<li>Non-ASCII filename support</li>
<li>Header-read timeout to prevent slowloris attacks</li>
<li>CSS/JS minification — view-source on <code>style.css</code> or
<code>app.js</code> and compare against the repo to see it in effect</li>
<li>Immutable caching for fingerprinted assets — check the
<code>Cache-Control</code> response header on
<a href="vendor.a1b2c3.js">vendor.a1b2c3.js</a> versus a plain file</li>
<li>Precompressed sidecars — request
<a href="bundle.js">bundle.js</a> with and without
<code>Accept-Encoding: gzip</code> and compare the
<code>Content-Encoding</code> header and response size</li>
</ul>
</section>
<section>
<h2>Resources</h2>
<ul>
<li><a href="docs/api.md">API Reference</a></li>
</ul>
</section>
</main>
<footer>
<p>Served by <code>mini-static</code></p>
</footer>
<script src="app.js"></script>
</body>
</html>