Install and Run

git clone https://github.com/1ay1/loom.git
cd loom
make
./loom content/

Open http://localhost:8080. You're running a blog. The whole setup is four commands.

No Node.js. No Ruby. No Python. No Docker. No config files to debug. Just a C++ compiler and make.

What You Get

Out of the box, with zero configuration:

  • Hot reload — edit a file, refresh the browser, see the change. No build step, no restart.
  • 21 themes — switch with one line in site.conf. Dark mode included.
  • Full SEO — Open Graph, Twitter Cards, JSON-LD, sitemap, RSS feed. All automatic.
  • Sub-millisecond responses — every page is pre-rendered, compressed, and cached in memory.
  • Series, tags, archives — organize content however you want.
  • Single binary, ~846KB — no runtime dependencies, no frameworks, no node_modules.

How It Works

You give Loom a directory of markdown files and a site.conf. It reads everything at startup, renders every page to HTML, compresses it, and holds it all in memory. Serving a page is a hash table lookup — no disk I/O, no template rendering.

When you edit a file, inotify detects the change and Loom rebuilds the cache in the background. The new cache is swapped in atomically — active requests finish on the old cache, new requests get the new one. Zero downtime.

Your Content Directory

myblog/
  site.conf           # Title, theme, nav, sidebar
  posts/
    hello.md          # Blog posts
    my-series/        # Subdirectory = series
      part-one.md
      part-two.md
  pages/
    about.md          # Static pages (served at /about)
  images/
    photo.png         # Static assets (served as-is)

That's the whole structure. No layouts, no partials, no frontmatter templates.

Minimal Configuration

title = My Blog
description = What I'm working on
author = Your Name
base_url = https://yourdomain.com
theme = nord

nav = Home:/, About:/about
sidebar_widgets = recent_posts, tag_cloud

That's a complete site.conf. Everything else has sensible defaults.

Why Not Hugo / Jekyll / Ghost?

No build step. Static site generators require a separate build phase. Edit, build, wait, check. Loom's hot reload makes it: edit, refresh, done.

No database. CMSes need a database, cache layer, and plugins to stay fast. Loom's "database" is an in-memory hash map.

No dependencies. One make command. No package manager, no virtualenv, no node_modules. The binary links against libc, libstdc++, libpthread, and zlib — that's it.

Real performance. Pre-compressed cached responses served through an epoll event loop. Sub-millisecond response times even under load.

Deploy

Loom is the server. Put it behind nginx/caddy for TLS, or run it directly:

./loom /var/www/myblog

Or serve straight from git — push to publish, no CI needed:

./loom --git /path/to/repo.git main content/

Get Started

git clone https://github.com/1ay1/loom.git
cd loom
make
./loom content/

Read the Getting Started guide to build your own site, or explore the full documentation for everything Loom can do.

The Stack

LayerTechnology
HTTP serverLinux epoll, edge-triggered, single-threaded
RouterHand-written trie, O(path segments) matching
Cachestd::unordered_map + shared_ptr atomic swap
MarkdownHand-written two-pass parser, ~1200 lines
Compressionzlib deflate, level 9, pre-computed
Hot reloadLinux inotify or git poll
LanguageC++20 — concepts, structured bindings, ranges
Dependencieszlib only
Binary size~846KB stripped