glazingly fast markdown blog software written in rust memory safe
Find a file
2024-04-30 11:14:39 +03:00
posts initial slonkmit 2024-04-18 04:05:52 +03:00
src switch to scc's serde implementation 2024-04-30 09:38:50 +03:00
static always follow syntect theme 2024-04-30 11:14:39 +03:00
templates markdown_render.rs, post/mod.rs: remove unnecessary function and rename render_with_config 2024-04-19 22:41:14 +03:00
themes switch to yaml cuz forgejo 2024-04-18 04:12:03 +03:00
.gitignore initial slonkmit 2024-04-18 04:05:52 +03:00
Cargo.lock switch to scc's serde implementation 2024-04-30 09:38:50 +03:00
Cargo.toml switch to scc's serde implementation 2024-04-30 09:38:50 +03:00
LICENSE add LICENSE 2024-04-18 20:06:08 +03:00
README.md update todo 2024-04-30 09:34:51 +03:00

title description author created_at
README the README.md file of this project slonkazoid 2024-04-18T04:15:26+03:00

bingus-blog

blazingly fast markdown blog software written in rust memory safe

TODO

  • RSS
  • finish writing this document
  • document config
  • extend syntect options
  • general cleanup of code
  • better error reporting and error pages
  • better tracing
  • cache cleanup task
  • ^ replace HashMap with HashCache once i implement this
  • (de)compress cache with zstd on startup/shutdown
  • make date parsing less strict
  • make date formatting better
  • date formatting respects user timezone
  • clean up imports and require less features
  • improve home page
  • be blazingly fast
  • 100+ MiB binary size

Configuration

the default configuration with comments looks like this

# main settings
host = "0.0.0.0"       # ip to listen on
port = 3000            # port to listen on
title = "bingus-blog"  # title of the website
description = "blazingly fast markdown blog software written in rust memory safe" # description of the website
posts_dir = "posts"    # where posts are stored
markdown_access = true # allow users to see the raw markdown of a post

[cache] # cache settings
enable = true # save metadata and rendered posts into RAM
              # highly recommended, only turn off if absolutely necessary
persistence = false   # save the cache to on shutdown and load on startup
file = "cache"        # file to save the cache to
compress = true       # compress the cache file
compression_level = 3 # zstd compression level, 3 is recommended

[render] # post rendering settings
syntect.load_defaults = false      # include default syntect themes
syntect.themes_dir = "themes"      # directory to include themes from
syntect.theme = "Catppuccin Mocha" # theme file name (without `.tmTheme`)

you don't have to copy it from here, it's generated if it doesn't exist

Usage

build the application with cargo:

cargo build --release

the executable will be located at target/release/bingus-blog.

Building for another architecture

you can use the --target flag in cargo build for this purpose

building for aarch64-unknown-linux-musl (for example, a Redmi 5 Plus running postmarketOS):

# install the required packages to compile and link aarch64 binaries
sudo pacman -S aarch64-linux-gnu-gcc
export CC=aarch64-linux-gnu-gcc
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=$CC
cargo build --release --target=aarch64-unknown-linux-musl

your executable will be located at target/<target>/release/bingus-blog this time.

Writing Posts

posts are written in markdown. the requirements for a file to count as a post are:

  1. the file must be in the root of the posts directory you configured
  2. the file's name must end with the extension .md
  3. the file's contents must begin with a valid front matter

this file counts as a valid post, and will show up if you just git clone and cargo r. there is a symlink to this file from the default posts directory

Front Matter

every post must begin with a valid front matter. else it wont be listed in / & /posts, and when you navigate to it, you will be met with an error page. the error page will tell you what the problem is.

example:

---
title: "README"
description: "the README.md file of this project"
author: "slonkazoid"
created_at: 2024-04-18T04:15:26+03:00
#modified_at: ... # see above
---

only first 3 fields are required. if it can't find the other 2 fields, it will get them from filesystem metadata. if you are on musl and you omit the created_at field, it will just not show up

the dates must follow the RFC 3339 standard. examples of valid and invalid dates:

+ 2024-04-18T01:15:26Z      # valid
+ 2024-04-18T04:15:26+03:00 # valid (with timezone)
- 2024-04-18T04:15:26       # invalid (missing Z)
- 2024-04-18T04:15Z         # invalid (missing seconds)
-                           # everything else is also invalid

Routes

  • GET /: index page, lists posts
  • GET /posts: returns a list of all posts with metadata in JSON format
  • GET /posts/<name>: view a post
  • GET /posts/<name>.md: view the raw markdown of a post
  • GET /post/*: redirects to /posts/*

Cache

bingus-blog caches every post retrieved and keeps it permanently in cache. the only way a cache entry is removed is when it's requested and it does not exist in the filesystem. cache entries don't expire, but they get invalidated when the mtime of the markdown file changes.

if cache persistence is on, the cache is compressed & written on shutdown, and read & decompressed on startup. one may opt to set the cache location to point to a tmpfs so it saves and loads really fast, but it doesn't persist across boots, also at the cost of even more RAM usage.

the compression reduced a 3.21 MB file cache into 0.18 MB with almost instantly. there is basically no good reason to not have compression on.