
\documentclass[12pt]{article}
\usepackage[T2A,OT1]{fontenc}
\usepackage[default]{cantarell}
\usepackage[a4paper, top=20mm, bottom=20mm, left=20mm, right=20mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[russian, english]{babel}
\usepackage{tabu}
\usepackage{hyperref}
\usepackage{parskip}
\usepackage{graphicx}
\usepackage{tabularx}
\usepackage[normalem]{ulem}
\usepackage{float}
\floatstyle{boxed}
\restylefloat{figure}
\usepackage{setspace}
\onehalfspacing
\author{Artyom Bologov \href{mailto:tripod@aartaka.me}{(email)}}
\date{\today}
\title{Tripod—the restrictively productive blog engine}
\makeatletter
\def\endenv{\expandafter\end\expandafter{\@currenvir}}
\makeatother
\begin{document}
\maketitle

Okay, so you want to have your blog backed by a good blog engine?
There is a set of things you're most probably interested in:

\begin{itemize}\item Ditching proprietary kitchen sinks, like Medium.
\item Making your blog posts accessible to a wide range of people and
\item Multitude of formats to write your posts in.
\item Increasing your productivity as a writer/blogger.
\item Starting it all with one command and not caring about it ever after (except maybe rebuilding for security updates).
\item Minimizing the carbon footprint of your website and being ethical towards your readers.
\end{itemize}

If this list of problems/requirements does resonate with you,
you might like
\href{https://github.com/aartaka/tripod}{Tripod,}
a minimalist blog engine I've made for this website
(and for your websites, if you decide to use it too!)

\section*{So, What Is Tripod?} \label{what-s-tripod}

Tripod is a blog engine, for one.
It's written in Common Lisp
(which I consider the best programming language out there,
but it also is the only language I know well and am paid for programming in),
and based on a wonderful Hunchentoot web server toolkit.
Hunchentoot is biased towards HTTP(S) servers,
but it has the infrastructure that allowed me to hack Gopher and Gemini support for Tripod.
So, the first two qualities of Tripod are:

\begin{itemize}\item Tripod is extensible: It's Lisp-based, thus you can write your own code on top of Tripod and load it at runtime.
\item Tripod is multi-protocol: is supports HTTP(S) and Gopher (Gemini backend is in the process), with more to come!
\end{itemize}

Now, blog engines are intended to show your texts in a nice way and support the markup format you love.
Tripod starts out with Gemtext and HTML support
(I also have Markdown and Org Mode parsing prototypes, but they are not yet ready :D),
which means support for most of the formats you use.

Tripod is the common denominator model for markup formats and network protocols it supports.
HTML and Gemtext are not much, but they are properly interchangeable with any other format to come,
because Tripod parses any markup it supports into format-independent common denominator AST
which is straightforward to translate into any format Tripod could potentially support.

But then, why bother making a common denominator ast for all the other markup languages,
removing their fancy features and nice styling?
Because Tripod aims to make your blog posting productive and content-focused!

Tripod focuses you with the limited tool set that it provides you with.
You only have headings, paragraphs, links, depth-one lists
(ouch! this one is painful even for me, a creator of Tripod),
verbatim text, and blockquotes. Which is, by a lucky coincidence, the same set of primitives as Gemtext.

It's an obvious thing in the Geminispace—simpler markup opens a space for a more focused thought,
both on the side of the writer and the reader.
The former doesn't tinker with styles and formatting ad nauseam,
the latter is not distracted by lots of media and styles.
Tripod is small, Tripod is restrictive, Tripod is productive.

\section*{So how do I use Tripod?} \label{how-do-i-use-tripod}

Given the set of features outlined above, only one initial initial requirement left:
ease of starting up.
You don't have to worry about that,
because Tripod, in addition to being usable as Lisp library,
compiles (with a mere \verb|make all|) to a standalone executable
that you can conveniently run to start a server.
As an example of how easy running Tripod is,
here's the command I use to start this website
(slightly redacted to not leak unnecessary information):
\begin{figure}[h!]\begin{verbatim}
./tripod -d ~/aartaka.me/ -a aartaka.me -l ~/.tripod/log.txt -p 70 -s 443 -c /path/to/cert.pem -k /path/to/privkey.pem \&
\end{verbatim}\caption{Shell command for aartaka.me Tripod server startup}\end{figure}

That's a lot to digest, so let me explain the flags I use:

\begin{description}\item[-d]
is the directory to host files in. Put your precious .gmi and .html files there!
\item[-a]
is the address your website is hosted at. Can be an IP or a hostname, required for security reasons.
\item[-l]
is the location of the log file. If you don't provide it, the logs will be printed straight to your stdout.
\item[-p]
is the port to start Gopher server at.
\item[-s]
is the port for HTTPS (the HTTP flag is -t).
\item[-c]
is the certificate for your website. Required if you use HTTPS or Gemini.
\item[-k]
is the path to the private key. Again, required for HTTPS and Gemini backends.
\end{description}

Getting thise together: start HTTPS and Gopher servers
with the content from \verb|~/aartaka.me/| and write logs to \verb|~/.tripod/log.txt|.
Which I consider just enough of capabilities for a simple blog engine
that you start and go on to forget it until your certificate expires.

You can always use \verb|./tripod -h| to look at what flags
(and environment variables backing those) there are.
But it all usually boils down to running one command,
copying it and running the copied one again
after you renew the certificate or recompile Tripod for new features.

\section*{Why not use X technology?} \label{why-not-use-x}

A friend of mine has been constantly asking me
about different blog engines and their suitability for my use-cases,
only to be rejected with yet another set of requirements I have for a blog engine.
The blog engines I was suggested, together with things I don't like about them:

\begin{description}\item[\href{https://jekyllrb.com/}{Jekyll]}
Cool, but it does not support Gopher and Gemini :P
\item[\href{https://gohugo.io/}{Hugo]}
Themable and static, which is a plus.
But then, themes SHOULD NOT be part of a blog engine,
they should be chosen by the user or their user agent for the maximum convenience and accessibility!
\item[\href{https://blot.im/}{Blot]}
Too much reliance on templates, implies Markdown or MS Word (what?!)
as the post format, no support for anything but HTTP(S).
\item[\href{https://reactjs.org/}{React.js]}
It implies that you load JavaScript.
Lots of JavaScript.
Your whole website is JavaScript.
Run away while you can, JavaScript's eating your sister!
And it's not a blog engine, actually.
\end{description}

\section*{What next?} \label{what-next}

If you're interested in the ideas behind Tripod
(supporting as much formats and protocols as possible),
you might be thinking to yourself:
"can I write posts in Y and make Tripod support it?"
Yes you can!
I'll be glad to accept your contributions
and include them into Tripod (given that the code is sane).
My personal wish-list is to support more formats:

\begin{itemize}\item Org Mode
\item Markdown
\item Plaintext
\end{itemize}

And more protocols/ways of delivery:

\begin{itemize}\item RSS
\item IPFS
\item JSON
\end{itemize}

These are what I myself would want to have in the blogs I'm reading, at least.
I hope that Tripod strikes your fancy and you use it for your website.
Otherwise, you can always come here and adore this newborn blog engine in action 😉

Update 2023: I no longer use Tripod, switching to a
\href{run:digital-bum}{Digital Bum}
stack instead.


\par\noindent\rule{\textwidth}{0.4pt}
\href{https://creativecommons.org/licenses/by/4.0}{CC-BY 4.0} 2022-2026 by Artyom Bologov (aartaka,)
\href{https://codeberg.org/aartaka/pages/commit/a91befa}{with one commit remixing Claude-generated code}.
Any and all opinions listed here are my own and not representative of my employers; future, past and present.
\end{document}
