Skip to content

Setting Up Your Blog

This guide walks you through setting up a new blog with BlogMore. It assumes you are comfortable working in a terminal, but explains each part of the structure in detail.

Before you begin, make sure BlogMore is installed. If it isn't, head to the installation instructions first.

Your working directory

Start by creating a top-level directory where your blog will live. This is where your content, configuration, and generated output will all sit together:

mkdir my-blog
cd my-blog

You can name this directory anything you like.

The content directory

The content directory is where all of your Markdown files live. You can call it anything you like — posts, content, blog, writing — and point BlogMore at it when you run a command:

blogmore build posts/

Alternatively, you can set it once in a configuration file so you don't need to type it every time:

content_dir: posts

See the command line reference for the full list of ways to specify the content directory.

Organising your content

BlogMore scans the content directory recursively for .md files, so you can organise your posts however suits you best. None of these structures is better than another — choose whatever makes sense for you.

Flat structure — all posts in one directory:

posts/
├── hello-world.md
├── python-tips.md
└── web-development.md

Organised by date:

posts/
├── 2024/
│   ├── 01/
│   │   └── hello-world.md
│   └── 02/
│       └── python-tips.md
└── 2025/
    └── 01/
        └── web-development.md

Organised by topic:

posts/
├── python/
│   ├── decorators.md
│   └── type-hints.md
└── web/
    ├── css-grid.md
    └── javascript-tips.md

Whichever layout you choose, BlogMore determines post order using the date field in each post's frontmatter, not the directory structure.

Date-prefixed filenames

If you'd like your filenames to reflect publication dates, BlogMore supports date-prefixed filenames such as 2026-02-18-hello-world.md. The YYYY-MM-DD- prefix is automatically stripped from the generated URL slug, so the post will be accessible at a clean address. The post date still comes from the date field in frontmatter.

For more information on writing posts, see Writing a Post.

The extras directory

Inside your content directory, you can create an extras/ subdirectory for assets that should be copied straight into the output without any processing:

posts/
├── extras/
│   ├── icon.png
│   └── custom.css
└── hello-world.md

Common uses for extras/ include:

  • Site icon — a square, high-resolution PNG or JPEG image (ideally 1024×1024 or larger) that BlogMore uses to generate favicons and platform-specific icons automatically. See Metadata and Sidebar — Site icons for full details.
  • Custom stylesheets — any CSS files you'd like included alongside the default styles.
  • Other assets — fonts, images, or anything else that posts or pages link to directly.

Everything in extras/ is copied to the root of the output directory, preserving any subdirectory structure.

The pages directory

Inside your content directory you can also create a pages/ subdirectory. Files here are treated as static pages rather than blog posts — they appear in the site navigation and are not included in the post listing, the archive, or the feeds:

posts/
├── pages/
│   ├── about.md
│   └── projects.md
└── hello-world.md

See Writing a Page for details on what goes into a page and how pages differ from posts.

The output directory

When you run blogmore build, the generated site is written to an output/ directory by default:

my-blog/
├── posts/
│   └── hello-world.md
├── output/          ← generated site lives here
│   ├── index.html
│   └── ...
└── blogmore.yaml

You can change the output directory on the command line:

blogmore build posts/ --output public/

Or set it in your configuration file:

output: public

See the command line reference for all the options related to output.

A minimal configuration file

Once you have your directory structure in place, it's worth creating a blogmore.yaml in your working directory so you don't have to pass the same arguments every time:

content_dir: posts
output: public
site_title: "My Blog"
site_subtitle: "Thoughts on code and life"
site_url: "https://yourname.github.io/blog"
default_author: "Your Name"

With this in place, you can simply run:

blogmore build
blogmore serve
blogmore publish

For a full list of configuration options, see the Configuration Reference.

Next steps

Now that your blog is set up: