Configuration

Blogatto uses a builder pattern for configuration. Start with config.new(site_url) and pipe through setter functions to configure each feature.

Config type

The Config(msg) type holds all settings for a build. The msg type parameter threads through the Lustre message type for type-safe views and components.

import blogatto/config

let cfg =
  config.new("https://example.com")
  |> config.output_dir("./dist")
  |> config.static_dir("./static")
  |> config.markdown(md_config)
  |> config.route("/", home_view)
  |> config.feed(rss_config)
  |> config.sitemap(sitemap_config)
  |> config.robots(robots_config)

Reference

config.new(site_url)

Creates a new Config with the given base URL. The site_url is required because it is used to build absolute URLs for sitemaps, RSS feeds, and blog post URLs.

Default values:

Field Default
output_dir "./dist"
static_dir None (no static asset copying)
markdown_config None (no blog posts)
routes Empty (no static pages)
feeds Empty (no RSS feeds)
sitemap None (no sitemap)
robots None (no robots.txt)

config.output_dir(config, directory)

Set the output directory path. The directory is deleted and recreated on each build.

config.new("https://example.com")
|> config.output_dir("./public")

config.static_dir(config, directory)

Set a static assets directory. During the build, its contents are copied into the root of the output directory.

config.new("https://example.com")
|> config.static_dir("./static")

For example, ./static/css/style.css becomes ./dist/css/style.css.

config.markdown(config, markdown_config)

Set the markdown configuration for blog post rendering. See Markdown components for details on MarkdownConfig.

import blogatto/config/markdown

let md = markdown.default()
  |> markdown.markdown_path("./blog")

config.new("https://example.com")
|> config.markdown(md)

config.route(config, path, view)

Add a static route mapping a URL path to a view function. The view function receives the full list of blog posts parsed during the build.

Routes map to {output_dir}/{route}/index.html in the output.

config.new("https://example.com")
|> config.route("/", home_view)
|> config.route("/about", about_view)

See Static pages for more on writing view functions.

config.feed(config, feed_config)

Add an RSS feed configuration. Can be called multiple times to generate multiple feeds. See RSS feeds.

config.sitemap(config, sitemap_config)

Set the sitemap configuration. See Sitemap and robots.txt.

config.robots(config, robots_config)

Set the robots.txt configuration. See Sitemap and robots.txt.

Common configurations

Blog-only site

A minimal blog with no static pages:

let md =
  markdown.default()
  |> markdown.markdown_path("./blog")

let cfg =
  config.new("https://example.com")
  |> config.markdown(md)

Blog with homepage

A blog with a homepage listing recent posts:

let md =
  markdown.default()
  |> markdown.markdown_path("./blog")
  |> markdown.route_prefix("blog")

let cfg =
  config.new("https://example.com")
  |> config.static_dir("./static")
  |> config.markdown(md)
  |> config.route("/", home_view)

Blog, multiple pages, RSS, sitemap, and robots.txt:

let md =
  markdown.default()
  |> markdown.markdown_path("./blog")
  |> markdown.route_prefix("blog")
  |> markdown.template(post_template)

let cfg =
  config.new("https://example.com")
  |> config.output_dir("./dist")
  |> config.static_dir("./static")
  |> config.markdown(md)
  |> config.route("/", home_view)
  |> config.route("/about", about_view)
  |> config.feed(rss_config)
  |> config.sitemap(sitemap_config)
  |> config.robots(robots_config)

See the simple_blog example for a complete working version of this configuration.