SkillAgentSearch skills...

Binserve

A fast production-ready static web server with TLS (HTTPS), routing, hot reloading, caching, templating, and security in a single-binary you can set up with zero code.

Install / Use

/learn @mufeedvh/Binserve

README

<img src="https://raw.githubusercontent.com/mufeedvh/binserve/master/assets/binserve-logo.png" alt="binserve logo" width="250" align="right">

binserve :rocket::crab:

A fast static web server with TLS (HTTPS), Routing, Hot Reloading, Caching, Templating, and Security in a single-binary you can set up with zero code.

Built from the ground up for self-hosters with performance, ease of use, and portability in mind. ❤️

<p align="left"> <img src="https://img.shields.io/badge/version-0.2.0-blue.svg" title="version" alt="version"> <a href="https://github.com/mufeedvh/binserve/blob/master/LICENSE"><img alt="gitHub license" src="https://img.shields.io/github/license/mufeedvh/binserve.svg"></a> <a href="https://twitter.com/intent/tweet?text=Check%20this%20out!%20A%20fast%20static%20web%20server%20in%20a%20single%20binary%20you%20can%20set%20up%20with%20zero%20code.:&url=https%3A%2F%2Fgithub.com%2Fmufeedvh%2Fbinserve"><img alt="twitter share" src="https://img.shields.io/twitter/url/https/github.com/mufeedvh/binserve.svg?style=social"></a> </p>

Table of Contents

Example: Hosting a website produced by a Static Site Generators like Hugo, Zola, Jekyll, Hexo, etc.

Features

  • Fast: Binserve is designed to be performant, this is thanks to Actix-Web - one of the fastest web frameworks out there and DashMap for handling routes and the cache storage. (See Benchmarks)
  • Portability: Binserve is cross-platform and portable to any major operating system, like it can run on your Android phone!
  • Routing: Routing is simply matching a URI path to a file or a directory in a JSON file. (See Configuration)
  • Templating: You can write templates and partials using Handlebars. (See Templating)
  • Hot Reload: You can reload your configuration (routes) and static files with no downtime.
  • Caching: Binserve's performance is achieved due to minimization of Disk I/O operations at runtime (with fast_mem_cache enabled) and serving static files from memory. On the client-side, Cache-Control, Etag, and Last-Modified are utilized.
  • Security: Prevents common attack vectors like Directory Traversal and Symlink Attacks.

👋 Enterprise?

If you're deplyoing to production or expecting high traffic to your server, get binserve+ which has DDoS Protection, Rate Limiting, and Prometheus Metrics for monitoring along with all the above features built-in.

Checkout <a href="https://mufeedvh.gumroad.com/l/binserveplus">Binserve Plus</a>!

Read FAQ for more details.

Hello World!

Download the executable for your OS from Releases, then just run it:

mkdir mywebsite/
binserve

On the first run, it will create the configuration file and a starter boilerplate for you to get started.

 _   _
| |_|_|___ ___ ___ ___ _ _ ___
| . | |   |_ -| -_|  _| | | -_|
|___|_|_|_|___|___|_|  \_/|___| 0.2.0

[INFO] Build finished in 295 μs ⚡
[SUCCESS] Your server is up and running at 127.0.0.1:1337 🚀

Go to http://127.0.0.0:1337/ and you will be greeted with the index page of Binserve.

Now all you need to do is to edit the binserve.json file. (See Configuration).

Installation

Download the executable from Releases OR Install with cargo:

cargo install --git https://github.com/mufeedvh/binserve.git

Install Rust/Cargo

Build From Source

Prerequisites:

  • Git
  • Rust
  • Cargo (Automatically installed when installing Rust)
  • A C linker (Only for Linux, generally comes pre-installed)
git clone https://github.com/mufeedvh/binserve.git
cd binserve/
RUSTFLAGS="-C target-cpu=native" cargo build --release

The first command clones this repository into your local machine and the last two commands enters the directory and builds the source in release mode.

Configuration

The configuration file is a JSON file called binserve.json that's generated automatically by the executable. Configuring binserve is pretty straight-forward because the configuration fields are self-explanatory:

And all of the values here have secure defaults so you don't have to specify the ones you don't need.

💡 TIP: Most probably you wouldn't be needing all of the configuration fields, checkout the Static Site Generator example on how to serve a single directory.

{
    "server": {
        "host": "127.0.0.1:1337",
        "tls": {
            "host": "127.0.0.1:443",
            "enable": false,
            "key": "key.pem",
            "cert": "cert.pem"
        }
    },

    "routes": {
        "/": "public/index.html",
        "/usage": "public/usage.hbs",
        "/blog": "public/blog/"
    },

    "static": {
        "directory": "public/assets",
        "served_from": "/assets",
        "error_pages": {
            "404": "public/404.html"
        }
    },

    "template": {
        "partials": {
            "header": "public/header.hbs"
        },
        "variables": {
            "app_name": "Binserve"
        }
    },

    "config": {
        "enable_hot_reload": true,
        "fast_mem_cache": true,
        "enable_cache_control": true,
        "enable_directory_listing": true,
        "minify_html": false,
        "follow_symlinks": false,
        "enable_logging": false
    },

    "insert_headers": {
        "x-greetings": "hellooo!"
    }
}

You can override the configuration with command-line arguments as well:

<ul> <li><code>-c/--cert</code> - The path to the TLS certificate for your domain.</li> <br> <li><code>-k/--key</code> - The path to the TLS key for your domain.</li> <br> <li><code>-h/--host</code> - The host/domain with the specified port for your webserver to run on.</li> <br> <ul> <li>Example: <code>--host 127.0.0.1:1337</code> OR <code>--host zombo.com</code></li> </ul> </ul>

TLS

There is built-in support for TLS:

{
    "server": {
        "host": "127.0.0.1:1337",
        "tls": {
            "host": "127.0.0.1:443",
            "enable": true,
            "key": "key.pem",
            "cert": "cert.pem"
        }
    }
}

The key and certificate can be generated with openssl:

# generate pkcs#10 key+cert (PEM):
$ openssl req -x509 -newkey rsa:4096 -keyout key_pkcs10.pem -out cert.pem -sha256 -days 36

# convert the private key to PKCS#8 (PEM):
$ openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in key_pkcs10.pem -out key.pem

Templating

Binserve uses Handlebars for templating as it's simple and the most commonly known templating engine.

You can register partial templates and template variables like this in the configuration file:

"template": {
    "partials": {
        "header": "public/header.hbs"
    },
    "variables": {
        "app_name": "Binserve"
    }
}

public/header.hbs:

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ app_name }} v0.2.0 Usage</title>
    <link rel="stylesheet" href="assets/css/styles.css">
</head>

And use it like this:

<html>
    {{> header}}
    <body>Hello World!</body>
</html>

Which would render down to:

<html>
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Binserve v0.2.0 Usage</title>
        <link rel="stylesheet" href="assets/css/styles.css">
    </head>
    <body>Hello World!</body>
</html>

Static Site Generators

Every static generator builds your Markdown/Template files into a directory, usually named public/, all you have to do is point that directory as the index route:

{
    "server": {
        "host": "127.0.0.1:1337",
        "tls": {
            "host": "127.0.0.1:443",
            "enable": false,
            "key": "key.pem",
            "cert": "cert.pem"
        }
    },
    "routes": {
        "/": "public/"
    }
}

That's it!

As mentioned previously, you don't have to specify all the fields, secure defaults will be applied! 🙌

Pointing directories as routes is an intentional design so that you can host multiple Static Site Generator outputs easily. Let's say you have a portfolio as the homepage and your blog is made with a different template. You can just do:

"routes": {
    "/": "my_zola_portfolio/public/",
    "/blog": "my_hugo_blog/public/"
}

Portability

Binserve is cross-platform which means you can run it on any major operating system / devices. It is low on CPU usage and memory footprint so you can run it on your Raspberry Pi or even your Android Phone:

<div align="center"> <table> <tr><td><img src="https://raw.githubusercontent.com/mufeedvh/binserve/master/assets/binserve-android.g
View on GitHub
GitHub Stars1.1k
CategoryDevelopment
Updated3d ago
Forks75

Languages

Rust

Security Score

100/100

Audited on Mar 27, 2026

No findings