How I Built This Blog with Lume

by 逆瀬川ちゃん

3 min read

Hi there! This is Sakasegawa-chan!

Today I want to talk about Lume, the SSG I used to build this blog. It's also my first post here, so I'll throw in a short self-introduction along the way.

About this blog

This is Sakasegawa-chan's tech blog. Most of the posts are written with the help of coding agents. I plan to write up whatever I've been learning or any tech topics that catch my eye.

So, to start a blog, you first need a blog foundation. There are a ton of SSGs (Static Site Generators) out there, and this time I went with Lume.

Why Lume?

There are a lot of SSG options. Here's a rough comparison.

SSG Language Notes
Hugo Go Blazing fast builds. Template syntax is a bit quirky
Eleventy Node.js Very flexible. Config is in JS
Astro Node.js Islands Architecture. Great for rich UIs
Lume Deno Simple. No node_modules. Flexible

Hugo and Eleventy are also great SSGs, but here's why I picked Lume this time:

  • No node_modules. Deno's HTTPS imports fetch only what you actually need
  • Setup finishes in a single command
  • Themes are provided, so you can spin up a blog immediately
  • Plenty of template engine choices (Markdown, Vento, Nunjucks, JSX, Pug, etc.)
  • It doesn't emit any client-side JS. The output is just plain static HTML

The "no node_modules" part is especially nice. Since it's Deno-based, you just run deno run and it works. Freedom from dependency management pain.

Setting up Lume

Setup is genuinely simple. If you already have Deno installed, one command spins up a project.

# Install Deno (if you haven't yet)
curl -fsSL https://deno.land/install.sh | sh

# Initialize a Lume project (with the Simple Blog theme)
deno run -A https://lume.land/init.ts --theme=simple-blog

That gives you this file layout:

project/
├── _config.ts     # Lume config file
├── _data.yml      # Site-wide metadata
├── deno.json      # Deno config (includes task definitions)
├── posts/         # Directory for blog posts
├── 404.md         # 404 page
└── favicon.png    # Favicon

And here's the entire contents of _config.ts:

import lume from "lume/mod.ts";
import blog from "blog/mod.ts";

const site = lume();
site.use(blog());

export default site;

Just four lines. This kind of simplicity is what makes Lume great. The theme sets up all the plugins you need behind the scenes (Markdown processing, date formatting, feed generation, on-site search, and so on).

Once the project is ready, let's start the dev server.

deno task serve

Open http://localhost:3000 and the blog shows up. Hot reload is on by default, so edits are reflected instantly.

How to write posts

Posts are Markdown files placed in the posts directory. You describe metadata via frontmatter.

---
title: "Post title"
description: "Post description"
date: 2026-02-12
tags: [Lume, Deno]
author: 逆瀬川ちゃん
---

And then the body goes here.

If you insert a <!--more--> tag in the body, everything above it becomes the excerpt shown on the top page. It gives you the classic "read more" behavior in the post list, which is handy.

Deploying to GitHub Pages

This blog is hosted on GitHub Pages. The entire build and deploy pipeline runs on GitHub Actions, so publishing is just a matter of pushing a post.

The workflow file looks like this:

name: Build and deploy
on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: denoland/setup-deno@v2
      - run: deno task build
      - uses: actions/upload-pages-artifact@v3
        with:
          path: _site
  deploy:
    needs: build
    runs-on: ubuntu-latest
    environment:
      name: github-pages
    steps:
      - uses: actions/deploy-pages@v4

Deno has an official GitHub Action, so setup is painless. deno task build emits the static files into _site, and all this workflow does is upload that directory to GitHub Pages.

Wrap-up

  • Lume is a Deno-based SSG with a satisfying set of tradeoffs: no node_modules, one-command setup, and zero client JS
  • With the Simple Blog theme, you can go from setup to deployment in under 30 minutes
  • I'll be writing about various tech topics on this blog going forward, so thanks for stopping by

References