A Rust Site Engine https://crates.io/crates/arse
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Go to file
Anthony J. Martinez 9a13fcc554
Refactor route handlers to call async Engine functions
2 months ago
src Refactor route handlers to call async Engine functions 2 months ago
test_files Rename configuration key to mime_types 3 months ago
.gitignore Bump deps and rev to 0.11.3, update .gitignore 2 years ago
Cargo.lock Update Cargo files for v0.17.0 - async refactor 2 months ago
Cargo.toml Update Cargo files for v0.17.0 - async refactor 2 months ago
LICENSE-APACHE Name the project. Add a README, and license headers. 2 years ago
LICENSE-MIT Name the project. Add a README, and license headers. 2 years ago
README.md Add section on MIME types to README 3 months ago


A Rust Site Engine

A Rust Site Engine, or arse, is static site generator written in Rust. It seeks to provide a simple and flexible base for serving sites using:


  • Run an existing site given the path to its config TOML: arse run config.toml
  • Logging verbosity can be increased with -v or -vv, the default level is INFO.
  • Create and run a new site from user input: arse new
$ arse new
2021-05-01T17:34:11.155427589+00:00 [INFO] Logging started
2021-05-01T17:34:11.155543182+00:00 [INFO] Generating new site configuration
Please enter a name for the site:
Example Site
Please enter the site author's name:
Arthur Writeson
Please enter the base URL for your site:
Please enter comma-separated site topics:
one, two, three
2021-05-01T17:34:26.501980660+00:00 [INFO] Creating site filesystem tree
2021-05-01T17:34:26.504816188+00:00 [INFO] Writing site configuration to disk


An example config, as generated, is shown below:

name = 'Example Site'
author = 'Arthur Writeson'
url = 'https://www.example.com'
template = 'default.tmpl'
topics = [

bind = ''
port = 9090

templates = '/home/user/site/templates'
webroot = '/home/user/site/webroot'

css = "text/css"
gif = "image/gif"
jpg = "image/jpeg"

Rendering and Styling

A default template, default.tmpl, is provided statically within the binary. To change the Tera template, add your custom template to the templates directory referenced in the [docpaths] configuration section of config.toml. Once the template is in the templates directory, change the templates parameter in the [site] configuration section to reference the template's file name. This template will now be loaded at runtime.

The following elements are available within the Tera context for rendering:

  • site, mapping directly to the fields available in the site configuration section
  • post, available when serving single-posts from from site/:topic/posts/:post.md
    • Used when serving GET /:topic/posts/:post where :post is the markdown filename minus its extension
  • posts, a lexically reverse-sorted list of HTML rendered from markdown in site/:topic/posts/*.md
    • Used when serving GET /:topic

Further Customizations

  • bind and port may be set in the [server] section.
  • New topics are added as array elements
    • For each new topic, create the necessary paths site/:topic/posts and site/:topic/ext
  • Items in [docpaths] are generated as full paths for completeness, however relative paths will work if desired
    • From the example above the user is free to simply use site/templates and site/webroot and move the directory out of /home/user
    • Note that arse new creates the site tree, and all other output files, in the current working directory.
  • If gallery is one of the topics requested
    • A simple image slideshow will be generated for /gallery/ext/*.jpg
    • Display will follow the same lexical reverse order as posts.

MIME types

Version 0.16.0 added a mime_types section to the config.toml file. This is created with a minimal set of mappings from a file extension to the desired MIME type. These mappings are used when serving files from:

  • static/
  • :topic/ext/

If there is no match for the extension, or the file lacks an extension entirely, the default is text/plain. As such, if you wish for maximimum compatibility with different reverse proxies, browsers, or other applications it is crticial that you set an appropriate MIME type for each possible extension you intend to serve directly.

Path to 1.0

  • Dynamic route handling
  • Provide meaningful logging of binary activites at appropriate levels
  • Context-specific Errors and handling
  • Support custom Tera templates
  • Support custom bind address and port
  • Support favicons
  • Support a special gallery topic
  • Support RSS feeds
  • Support for adding/removing topics


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


To discuss features, offer assistance, or get help please join the project's Matrix room.