Verso #
Verso is a fullstack Gleam exploration. The first working slice is a reusable static-site core plus wlls_blog, a dogfood site that will become Devon Wells' real blog.
The immediate goal is to keep the core primitives agnostic of any specific blog while using them to build a real site with real content, routes, styles, and publishing needs.
Current Status #
Implemented:
- Reusable
verso/*modules for Markdown documents, frontmatter, Markdown rendering, and output helpers - Concrete
wlls_blog/*site using those primitives - Markdown posts with YAML frontmatter in
content/posts/ - Frontmatter parsing with
taffy - Markdown rendering with
mork - HTML page rendering with
nakai - Static site generation into
dist/ - Wisp/Mist development server on
http://localhost:4000 - RSS feed generation at
/feed.xml - Sitemap generation at
/sitemap.xml - Shared content/render pipeline for static build and dev server
- Parsed post dates with newest-first ordering
- Typed site metadata and route helpers
- Seed content migrated from the prior blog into plain Markdown
Generated output directories are intentionally ignored:
build/dist/
Usage #
Install dependencies and compile:
gleam build
Run the static site generator:
gleam run -m wlls_blog build
This writes:
dist/index.htmldist/blog/<slug>/index.htmldist/feed.xmldist/sitemap.xmldist/static/*
Run the development server:
gleam run -m wlls_blog serve
The server listens on http://localhost:4000 and reloads posts from content/posts/ on each request.
Run tests:
gleam test
Format, build, generate, and test:
gleam format && gleam build && gleam run -m wlls_blog build && gleam test
Content #
Posts live in content/posts/*.md and use YAML frontmatter:
---
title: "Example Post"
topic: "Engineering"
date: "Apr 13 2026"
description: "A short description for indexes and feeds."
archive: true
---
Post body in Markdown.
Required fields:
titletopicdate, formatted asMon D YYYYdescription
Optional fields:
archive, defaults tofalse
Architecture #
Reusable core modules:
src/verso/content.gleam: generic Markdown document loadingsrc/verso/frontmatter.gleam: YAML frontmatter parsing and typed field helperssrc/verso/markdown.gleam: Markdown/frontmatter splitting and Markdown-to-HTML renderingsrc/verso/output.gleam: generic output directory, file writing, and static asset helpers
Dogfood site modules:
src/wlls_blog.gleam: command entrypoint forbuildandservesrc/wlls_blog/build.gleam: concrete static output plansrc/wlls_blog/server.gleam: concrete Wisp/Mist development serversrc/wlls_blog/content.gleam: maps generic documents into typed blog postssrc/wlls_blog/render.gleam: page, post, feed, and sitemap templatessrc/wlls_blog/site.gleam: wlls.dev site metadatasrc/wlls_blog/routes.gleam: wlls.dev path and absolute URL helperssrc/wlls_blog/date.gleam: current blog date parsing and sort helpers
Static build and development server both use wlls_blog/content and wlls_blog/render, so generated output and served output stay aligned. The reusable verso/* layer has no dependency on wlls_blog.
Routes #
The development server supports:
//blog/:slug/feed.xml/sitemap.xml/static/*
Dependencies #
Primary libraries:
taffyfor YAML frontmattermorkfor Markdown parsing/renderingnakaifor HTML generationwispandmistfor the development serverfiofor filesystem accessstrfor HTML/XML escapinggleeunitfor tests
License #
AGPL-3.0-or-later