---
title: This Site's Tech Stack
date: 2015-02-14
---

This Site's Tech Stack
======================

> Note: this is out of date as this site now uses [PureScript](http://www.purescript.org/) and [Go](https://golang.org).

As some of my close friends can vouch, I am known for sometimes setting up and
using seemingly bizarre tech stacks for my personal sites. As such I thought it
would be interesting to go in and explain the stack I made for this one.

The Major Players
-----------------

### Markdown

This is a markdown file that gets rendered to HTML and sent to you via the lua
discount library. As I couldn't get the vanilla version from LuaRocks to work,
I use Debian's version.

I like Markdown for thigns like this as it is not only simple, but easy for
people to read, even if they don't know markdown or haven't worked with any
other document system than Office or other wisywig document processors.

### Lapis

Lapis is the middleware between Lua and Nginx that allows me to write pages
simply. Here is some of the code that powers this page:

```
-- controllers/blog.moon
class Blog extends lapis.Application
  ["blog.post": "/blog/:name"]: =>
    @name = util.slugify @params.name
    @doc = oleg.cache "blogposts", @name, ->
      local data
      with io.open "blog/#{@name}.markdown", "r"
        data = \read "*a"

      discount data, "toc", "nopants", "autolink"

    with io.open "blog/#{@name}.markdown", "r"
      @title = \read "*l"

  render: true
```

And the view behind this page:

```
-- views/blog/post.moon
import Widget from require "lapis.html"
class Post extends Widget
  content: =>
    raw @doc
```

That's it. That even includes the extra overhead of caching the markdown as
HTML in a key->value store called OlegDB (I will get into more detail about it
below). With Lapis I can code faster and be much more expressive with a lot
less code. I get the syntactic beauty that is Moonscript with the speed and raw
power of luajit on top of nginx.

### OlegDB

OlegDB is a joke about mayonnaise that has gone too far. It has turned into
a full fledged key->value store and I think it is lovely.

### Container Abuse

I have OlegDB running as an in-container service. This means that OlegDB does
hold some state, but only for things that are worth maintaining the stats of
(in my eyes). Having a cache server right there that you can use to speed
things up with is a brilliant abuse of the fact that I run a container that
allows me to do that. I have Oleg hold the very HTML you are reading right now!
When it renders a markdown file for the first time it caches it into Oleg, and
then reuses that cached version when anyone after the first person reads the
page. I do the same thing in a lot of places in the codebase for this site.

---

I hope this look into my blog's tech stack was interesting!
