2025-11-27 14:16:10 +02:00
2025-11-27 14:15:01 +02:00
2025-11-27 14:16:10 +02:00
2025-11-26 17:24:20 +02:00
2025-11-27 00:57:34 +02:00
2025-11-26 17:24:20 +02:00
2025-11-27 14:15:01 +02:00
2025-11-27 14:16:10 +02:00
2025-11-27 14:15:12 +02:00
2025-11-27 00:57:34 +02:00

My website platform

I use this custom lua HTTP server for my personal web page. It works with lua-written pages, as well as markdown pages. It is completely customizable.

How to use?

Compile with the provided Makefile (you will need mklua). Then, just use the bin/website binary. It accepts one argument - the config. The config is a lua file that must return an object with these fields:

  • port: what port to bind to
  • luapages: a package.path-like string for resolving lua pages
  • pages: a package.path-like string for resolving markdown pages
  • static: a package.path-like string for resolving static resources
  • path: a package.path-like string for resolving custom plugins and lua libraries
  • pages_base: a lua package name to be used as the base page template

Anything else is up to the user's implementation. However, the built-in plugins work with these additional fields:

  • title: the default title of the website
  • routes: any additional routes that should be added to the navbar, if any
  • ignores: a lua pattern, that ignores a certain page from listing when its top-most segment matches

You can read any other config values from the config object.

Plugins and templating

Templating is done via the tools, given in the template package. It has two fundamental APIs: elements and slot. Any field from elements is a function that accepts an object that contains a map of attributes and a list of children and returns a valid HTML. Then, slot is a function that may be used in place of elements. It calls a single callback with the current page being templated and a callback to emit more elements, results of elements. This is used when you want to generate HTML procedurally.

Example:

local e = require "template".elements;
local slot = require "template".slot;

...

return e.div {
	class = "my-class",

	e.span { "This is some text" },
	e.span "This is a short form of the above",

	slot(function (self, emit)
		emit(e.span { "The current page is " .. self.path });
		for i = 1, 10 do
			emit(e.span { tostring(i) });
		end
	end),
}

The above will emit HTML like this:

<div class="my-class">
	<span>This is some text</span>
	<span>This is a short form of the above</span>
	<span>The current page is [page path]</span>
	<span>1</span>
	<span>2</span>
	<span>3</span>
	...
</div>

Three plugins are available by default - breadcrumbs, list and navbar. They can be used to build out a page.

Description
I use this custom layer on top of PUG for my personal web page.
Readme 140 KiB
Languages
Lua 98.4%
C 0.9%
Makefile 0.5%
Dockerfile 0.2%