the little static site engine that could
Booklit is a tool for building static websites from semantic documents.
Booklit enforces a tidy separation between content, logic, and presentation that makes it easy to write and refactor websites for anything from technical documentation to slide decks to blogs.
For live examples, check out Bass, Concourse CI, and the site you're currently viewing (src).
You're probably wondering "why does the world need another static site generator?" The truth is I built this for myself; I had a lot of technical content to maintain, and I didn't like the state of the art. I wanted something more like Scribble so I could write code to minimize toil.
Booklit has been serving me well across multiple projects for years with little modification needed, so I think it's good enough to share.
*.lit
Booklit documents are text files which evaluate \functions
to generate content, ultimately resulting in a tree of sections.
Sections are easy to move around, allowing you to continuously refactor and restructure your content without having to tweak header sizes and update internal links.
\title{Hello}{index}
Hello, world! I'm a Booklit document.
Check out my favorite \reference{quotes}!
\include-section{quotes.lit}
\title{Quotes}
\use-plugin{example}
\quote{
It's lit!
}{Travis Scott}
*.go
Sections use plugins to invoke \functions
written Go. Go is a simple and fast language with plenty of packages around if you need them.
Plugins allow your content to be semantic - saying what it means, decoupled from how it should be computed or displayed.
func (Example) Quote(
quote, source booklit.Content,
) booklit.Content {
return booklit.Styled{
Style: "quote",
Content: quote,
Partials: booklit.Partials{
"Source": source,
},
}
}
*.tmpl
Booklit separates presentation into a final rendering phase which determines the output format.
The HTML Renderer is powered by Go's standard html/template
package. More renderers may be implemented in the future.
All base templates can be overridden, sections can be individually \styled
, and plugins can return booklit.Styled
content, giving the author full control over what comes out.
<!DOCTYPE html>
<html>
<head>
<title>{{.Title.String}}</title>
</head>
<body>
{{. | render}}
</body>
</html>
<blockquote class="quote">
{{.Content | render}}
<footer>
{{.Partial "Source" | render}}
</footer>
</blockquote>
booklit
The booklit
CLI is a single command which loads Booklit documents and renders them.
When an error occurs, Booklit will show the location of the error and try to suggest a fix.
$ booklit -i ./index.lit -o ./public/
INFO[0000] rendering
$ booklit -i ./to-err-is-human.lit
to-err-is-human.lit:5: unknown tag 'helo'
5| Say \reference{helo}!
^^^^^^^^^^
These tags seem similar:
- hello
Did you mean one of these?
booklit -s $PORT
In server mode, Booklit renders content on each request with only plugin changes requiring a server restart.
The feedback loop is wicked fast.
$ booklit -i ./index.lit -s 3000
INFO[0000] listening
This website is written with Booklit. Want to write your own? Let's get started!