~akarle/alexkarle.com

844441fce7ac5c0364b3fe1a217da6889cb937ba — Alex Karle 1 year, 21 days ago 76b82ea
www: Goodbye markdown, long live mdoc

Man (pun intended), I had a blast putting this together. I got the
idea the other day while playing around with a toy static site, and
it just clicked--what if I used mdoc as my markup language and mandoc
to generate the HTML for a static site?

This was obviously not the intended use case, but I think it gives off
a nerdy vibe in exactly the right way :)

Later versions of mandoc allow .Xr to link against a fallback if the
reference doesn't exist locally, which is perfect for using .Xr as both
my internal site links (between pages) and as a cheap reference to
OpenBSD man pages (which I plan to do more often as I write more
technical content).

The beauty of this setup is that it can now be built entirely from
base OpenBSD (relying only on make(1) and mandoc(1)).

Time for the final test -- the girlfriend approval!
26 files changed, 383 insertions(+), 343 deletions(-)

M .gitignore
A BLM.7
M Makefile
M README.md
A a-new-hope.7
D bin/build.sh
D bin/tm.pl
A blog.7
D content/03-24-20-domain-name.md
D content/07-13-20-blm.md
D content/07-19-20-self-hosted.md
D content/10-22-20-on-writing.md
D content/12-19-19-a-new-hope.md
D content/favicon.ico
D content/index.md
D content/style.css
D content/thoughts.md
A domain-names.7
A intro.7
A on-writing.7
A self-hosted.7
A style.css
A template.7
D templates/head.tmpl
D templates/post-tail.tmpl
D templates/tail.tmpl
M .gitignore => .gitignore +3 -0
@@ 1,1 1,4 @@
/build/

# generated html from man pages
*.[1-9].html

A BLM.7 => BLM.7 +18 -0
@@ 0,0 1,18 @@
.Dd July 13, 2020
.Dt BLM 7
.Os
.Sh NAME
.Nm BLM
.Nd Black Lives Matter
.Sh DESCRIPTION
I meant to post about this earlier, but it's better late than never.
.Pp
It's become abundantly clear to me that we need serious structural changes in our country.
I want to raise my voice in solidarity to say that Black Lives Matter.
.Sh SEE ALSO
.Bl -compact -bullet -format=indent
.It
.Lk https://blacklivesmatter.com
.It
.Xr blog 7
.El

M Makefile => Makefile +20 -12
@@ 1,16 1,24 @@
HOST = alexkarle.com
DEST = /var/www/htdocs
# sub-Makefile so that mandoc -Oman can find the Xr references
HIDE = @
HTML := \
    intro.7.html \
    blog.7.html \
    a-new-hope.7.html \
    domain-names.7.html \
    BLM.7.html \
    self-hosted.7.html \
    on-writing.7.html

.PHONY: build
build:
	./bin/build.sh
build: $(HTML)

.PHONY: install
install: build
	mkdir -p $(DEST)
	cp build/* $(DEST)
.PHONY: clean
clean:
	rm -f $(HTML)

.PHONY: release
release:
	rsync --delete --exclude=.git -av ./ $(HOST):karleco/ && \
	    ssh -t $(HOST) doas make -C karleco install
.SUFFIXES: .7 .7.html
.7.7.html:
	@echo "mandoc $<"
	$(HIDE)mandoc -Thtml -O 'man=%N.%S.html;https://man.openbsd.org/%N.%S,style=style.css' $< \
	    | sed 's#</head>#<meta name="viewport" content="width=device-width,initial-scale=1">&# ' \
	    > $@

M README.md => README.md +7 -11
@@ 1,13 1,13 @@
alexkarle.com
=============

My small corner of the internet.

www.
----
A static site with a small templating system, build with `make`.
A static site comprised of `mdoc(7)` flavored man pages, built to HTML via
`mandoc(1)`.

Currently hosted with OpenBSD's `httpd`, but any web server should be able to
Currently hosted with OpenBSD's `httpd(8)`, but any web server should be able to
serve it up.

git.


@@ 19,14 19,10 @@ views into the diffs and files of each repo.
I like the stagit approach in that it is simple, modular, and emphasizes the use
of regular git for larger operations (i.e. diff between refs, etc).

In the stagit/ directory, find:

  * style.css    -- CSS for all pages
  * post-receive -- the git-hook to update the pages
  * logo.png     -- AK logo
  * setup.sh     -- small script to setup all exported repos with proper hooks, etc
                    also used to bulk update style.css/post-receive/logo.png
I use the default post-receive and create scripts that ship with the tool (with
small modifications for the installation). The logo is in this repo as
`logo.png`.

The content, being static, is served up with `httpd` as well.
The content, being static, is served up with `httpd(8)` as well.

[1]: https://git.codemadness.org/stagit

A a-new-hope.7 => a-new-hope.7 +22 -0
@@ 0,0 1,22 @@
.Dd December 19, 2019
.Dt A-NEW-HOPE 7
.Os
.Sh NAME
.Nm a-new-hope
.Nd cliche first blog post?
.Sh DESCRIPTION
Toying with the thought of starting a website/blog.
.Pp
Exploring my hosting options and pleasantly surprised that
.Lk https://fastmail.com FastMail
has free static site hosting!
.Pp
Inspired by Jeff Huang's article on websites Designed to Last
a general desire for a simpler web.
.Sh SEE ALSO
.Bl -compact -bullet -format=indent
.It
.Lk https://jeffhuang.com/designed_to_last
.It
.Xr blog 7
.El

D bin/build.sh => bin/build.sh +0 -6
@@ 1,6 0,0 @@
#!/bin/sh
mkdir -p build
cp content/*.css build
for f in content/*.md; do
    Markdown.pl $f | ./bin/tm.pl > build/`basename $f md`html
done

D bin/tm.pl => bin/tm.pl +0 -35
@@ 1,35 0,0 @@
#!/usr/bin/env perl
# tm.pl -- minimal templating script
#                  ^ ^^^ 
use strict;
use warnings;

use File::Basename qw(dirname);
use FindBin;

my $TOP = dirname($FindBin::Bin);

while (my $l = <>) {
    process_line($l);
}

sub process_line {
    my $l = shift;
    if ($l =~ /{% include=(.*) %}/) {
        process_file($1);
    } else {
        print $l;
    }
}

sub process_file {
    my $f = shift;

    my $tmpl = "$TOP/templates/$f.tmpl";
    die "bad template: $tmpl" unless -e $tmpl;
    open(my $tfh, '<', $tmpl) or die "open: $!";
    while (my $l = <$tfh>) {
        process_line($l);
    }
    close($tfh) or die "close: $!";
}

A blog.7 => blog.7 +28 -0
@@ 0,0 1,28 @@
.Dd
.Dt BLOG 7
.Os
.Sh NAME
.Nm blog
.Nd yet another weblog
.Sh DESCRIPTION
I don't write frequently, but when I do, it's usually about tech.
.Sh SEE ALSO
.Bl -bullet -compact -offset=indent
.It
.Xr intro 7
.It
.Xr on-writing 7
- On Writing Without an Audience (10/22/2020)
.It
.Xr self-hosted 7
- Migrating to a Self-Hosted Site (7/19/2020)
.It
.Xr BLM 7
- Black Lives Matter (7/13/2020)
.It
.Xr domain-names 7
- What's in a (domain) name? (3/24/2020)
.It
.Xr a-new-hope 7
- A New Hope (12/19/2019)
.El

D content/03-24-20-domain-name.md => content/03-24-20-domain-name.md +0 -25
@@ 1,25 0,0 @@
<!-- {% include=head %} -->

### Mar. 24, 2020: What's in a (domain) name?

I went through a phase this week of really wanting `karle.[original-tld]`.
Not for a business. Not for boosting my own webpage (it doesn't really
have much). Just for me.

The results were... disheartening.

* **`karle.org:`**<br> Registered since 2004, no website, just an email
DNS record.  WHOIS guard ensures I can't even reach out to who owns it.

* **`karle.com:`**<br> For sale by owner on Uniregistry. Ok. Inquired.
Owner wants a "serious 5 figure offer". Next!

* **`karle.net:`**<br> Owned by [RealNames](https://realnames.com),
a business seemingly centered around buying lastname.net domains and
charging people like me to set up an email. Almost brilliant enough of a
business to make me forgive their scumminess.  _Almost_. Nary an
option to buy it.

So here we are. Looks like `karle.co` for at least a little longer.

<!-- {% include=post-tail %} -->

D content/07-13-20-blm.md => content/07-13-20-blm.md +0 -11
@@ 1,11 0,0 @@
<!-- {% include=head %} -->

### July 13, 2020: Black Lives Matter

I meant to post about this earlier, but it's better late than never.

It's become abundantly clear to me that we need serious structural changes in
our country. I want to raise my voice in solidarity to say that
[Black Lives Matter](https://blacklivesmatter.com).

<!-- {% include=post-tail %} -->

D content/07-19-20-self-hosted.md => content/07-19-20-self-hosted.md +0 -54
@@ 1,54 0,0 @@
<!-- {% include=head %} -->

### July 19, 2020: Migrating to a Self-Hosted Site

If you look at the [first post][1] on this site, you'll see that this site
started as a series of static HTML files that I was, by hand, uploading to
Fastmail via their "files" GUI.

Being a total nerd for automation, I was always on the lookout for an excuse to
migrate to my own server, where I could (over)engineer a pipeline to build my
static content and deploy it without ever leaving the terminal.

That excuse presented itself in the form of needing to get a VPS to stand up my
hobby-project, [`euchre.live`][el]. If I was going to pay for a tiny VM, it was
a no-brainer to move my personal site to it too.

This turned out to be a great learning experience -- getting hands on experience
with reverse proxies, DNS, and a variety of operating systems and webservers
(first hosted on Alpine Linux and migrated to OpenBSD). Additionally, I could
self-host git repos, which has long been a nerd-goal of mine :)

I plan to write a lengthier post about the joys of self-hosting in the future,
but for now, I really just wanted to give a brief update on where I landed and
what the current stack is.

I'm currently running (in no particular order):

* **OS:** OpenBSD
* **Web server:** OpenBSD's `httpd(8)`
  - Serves the `www.` static content
  - Also serves [`git.alexkarle.com`][git]
* **Reverse proxy:** OpenBSD's `relayd(8)`
  - Used to send traffic between [`euchre.live`][el] (which uses a [Mojolicious][mojo]
    web server as the backend) and `alexkarle.com` based on URL
* **`www` content:**
  - 100% static content
  - No metrics, ads, or tracking
  - Posts and pages written in markdown
  - HTML generated with a pipeline of the original `Markdown.pl` into a small
    templating Perl script that I home-rolled
* **Git:**
  - Public repos served with `git-daemon(1)` over the `git://` protocol
  - Push access via the `ssh://` protocol
  - static HTML of content generated via post-receive hook with [`stagit(1)`][stagit]

That's all for now!

[1]: 12-19-19-a-new-hope.html
[el]: http://euchre.live
[git]: https://git.alexkarle.com
[stagit]: https://git.codemadness.org/stagit/
[mojo]: https://mojolicious.org

<!-- {% include=post-tail %} -->

D content/10-22-20-on-writing.md => content/10-22-20-on-writing.md +0 -46
@@ 1,46 0,0 @@
<!-- {% include=head %} -->

### October 22, 2020: On Writing Without an Audience

I wrote a blog post 3 weeks ago but never published it. I spent a couple
hours writing, proof-reading, and rewriting, and settled to re-read
once more in the morning and publish if I still liked it after a good
nights sleep.

I got caught up with other things, and a day or two later re-read it and
still didn't end up publishing it. I didn't think it was quite right.
I liked it well enough, but I was worried other people would judge it.

But here's the irony--as far as I know, I have no readers.  Publishing it
is almost equivalent to shouting into the void.

So why did I care so much?

As I found myself thinking about how I'd revise the original post
tonight, I realized that maybe this fear of judgment from non-existent
(but potential future) internet strangers was a much more interesting
topic to explore than my original musings. So here I am hashing it out.

I think the fear of judgment comes from a mixture of seeing public figures
have their pasts (preserved in the digital era) come back to haunt them
combined with observing how readers can react strongly and negatively to
posts. I don't plan to ever become so famous as to have a blog haunt me,
nor do I ever expect enough readers to have overwhelmingly unpleasant
reactions, but the fear still got to me.

But I want to persevere, and that's ultimately what writing this is about.
I'm not writing for fame or attention. I'm not writing to further my
career or put it on my resume.
 I'm writing for me. For the clarity
I get from expressing my thoughts, and for the joy I get looking back
at where I was months or years ago.

Why host them publicly? Well, I really enjoy a good tech blog, and
admire a blogger or two out there. I want to be the change I want to
see in the internet and migrate from centralized social networks back
to a decentralized network of personal and self-hosted sites.

And who knows, maybe one day someone will read this and have felt the
same. I guess I'm writing for that person too.

<!-- {% include=post-tail %} -->

D content/12-19-19-a-new-hope.md => content/12-19-19-a-new-hope.md +0 -14
@@ 1,14 0,0 @@
<!-- {% include=head %} -->

### Dec. 19, 2019: A New Hope

Toying with the thought of starting a website/blog.

Exploring my hosting options and pleasantly surprised that
[Fastmail](https://fastmail.com) has free static site hosting!

Inspired by Jeff Huang's article on websites
[Designed to Last](https://jeffhuang.com/designed_to_last) and
a general desire for a simpler web.

<!-- {% include=post-tail %} -->

D content/favicon.ico => content/favicon.ico +0 -0
D content/index.md => content/index.md +0 -17
@@ 1,17 0,0 @@
<!-- {% include=head %} -->

### About me:

Hi, I'm Alex! I'm a software engineer living in the Boston area.

I'm currently interested in free Operating Systems (particularly Linux
and OpenBSD), SCM systems (mostly git), and developer tooling.

<br>

### Find me online:

* GitHub: [`@akarle`](https://github.com/akarle)
* Email: `alex AT this-domain`

<!-- {% include=tail %} -->

D content/style.css => content/style.css +0 -66
@@ 1,66 0,0 @@
body {
  background-color: #F5F5F5;
  font-family: sans-serif;
  margin-left: 20px;
  margin-right: 20px;
  font-size: 1em;
  line-height: 1.3;
}

h1, h2, #nav {
  font-family: "Courier New", monospace;
}

ul {
    padding-left: 30px;
}

code {
    font-size: 1.3em;
}

@media only screen and (min-width: 992px) {
  #content {
    width: 60%;
    margin: 0 auto;
  }
} 

@media only screen and (min-width: 600px) and (max-width: 991px) {
  #content {
    width: 80%;
    margin: 0 auto;
  }
}

@media only screen and (min-width: 600px) {
  header {
      display: flex;
      flex-direction: row;
      justify-content: space-between;
      align-items: center;
  }
}

a:link {
    color: #0a7899;
}

a:visited {
    color: #033a4a;
}

header {
    text-align: center;
    margin-bottom: 3em;
}

#nav > a {
    color: dimgray;
    text-decoration: none;
}

#nav > a:hover {
    color: #3f3f3f;
    text-decoration: underline;
}

D content/thoughts.md => content/thoughts.md +0 -13
@@ 1,13 0,0 @@
<!-- {% include=head %} -->

### A collection of thoughts.

<p style="color:grey">(Because I couldn't commit to calling it a blog)</p>

* [Oct. 22, 2020: On Writing Without an Audience](10-22-20-on-writing.html)
* [Jul. 19, 2020: Migrating to a Self-Hosted Site](07-19-20-self-hosted.html)
* [Jul. 13, 2020: Black Lives Matter](07-13-20-blm.html)
* [Mar. 24, 2020: What's in a (domain) name?](03-24-20-domain-name.html)
* [Dec. 19, 2019: A New Hope](12-19-19-a-new-hope.html)

<!-- {% include=tail %} -->

A domain-names.7 => domain-names.7 +44 -0
@@ 0,0 1,44 @@
.Dd March 24, 2020
.Dt DOMAIN-NAMES 7
.Os
.Sh NAME
.Nm domain-names
.Nd what's in a (domain) name?
.Sh DESCRIPTION
I went through a phase this week of really wanting `karle.[original-tld]`.
Not for a business.
Not for boosting my own webpage (it doesn't really have much).
Just for me.
.Pp
The results were... disheartening.
.Bl -bullet -compact -format=indent
.It
.Sy karle.org :
.Pp
Registered since 2004, no website, just an email DNS record.
WHOIS guard ensures I can't even reach out to who owns it.
.It
.Sy karle.com :
.Pp
For sale by owner on Uniregistry.
Ok.
Inquired.
Owner wants a "serious 5 figure offer".
Next!
.It
.Sy karle.net :
.Pp
Owned by
.Lk https://realnames.com RealNames ,
a business seemingly centered around buying lastname.net domains and
charging people like me to set up an email.
Almost brilliant enough of a business to make me forgive their scumminess.
.Em Almost .
Nary an option to buy it.
.El
So here we are. Looks like `karle.co` for at least a little longer.
.Sh SEE ALSO
.Bl -compact -bullet -format=indent
.It
.Xr blog 7
.El

A intro.7 => intro.7 +28 -0
@@ 0,0 1,28 @@
.Dd
.Dt INTRO 7
.Os
.Sh NAME
.Nm intro
.Nd welcome to my personal homepage
.Sh ABOUT ME
Hi!
I'm Alex.
I'm a software engineer living in the Boston area.
I'm currently interested in free Operating Systems (particularly Linux
and OpenBSD), SCM systems (mostly git), and developer tooling.
.Pp
If you can't tell from the layout of this site, I'm a
.Xr man 1
page enthusiast.
.Sh SEE ALSO
.Bl -bullet -compact
.It
.Lk https://euchre.live euchre(6)
.It
.Xr blog 7
.It
.Lk /git projects(7)
.El
.Sh CONTACT
Email:
.Mt alex@alexkarle.com

A on-writing.7 => on-writing.7 +55 -0
@@ 0,0 1,55 @@
.Dd October 22, 2020
.Dt ON-WRITING 7
.Os
.Sh NAME
.Nm on-writing
.Nd thoughts on writing without an audience
.Sh DESCRIPTION
I wrote a blog post 3 weeks ago but never published it.
I spent a couple hours writing, proof-reading, and rewriting, and settled to
re-read once more in the morning and publish if I still liked it after a good
nights sleep.
.Pp
I got caught up with other things, and a day or two later re-read it and
still didn't end up publishing it.
I didn't think it was quite right.
I liked it well enough, but I was worried other people would judge it.
.Pp
But here's the irony--as far as I know, I have no readers.
Publishing it is almost equivalent to shouting into the void.
.Pp
So why did I care so much?
.Pp
As I found myself thinking about how I'd revise the original post
tonight, I realized that maybe this fear of judgment from non-existent
(but potential future) internet strangers was a much more interesting
topic to explore than my original musings.
So here I am hashing it out.
.Pp
I think the fear of judgment comes from a mixture of seeing public figures
have their pasts (preserved in the digital era) come back to haunt them
combined with observing how readers can react strongly and negatively to
posts.
I don't plan to ever become so famous as to have a blog haunt me,
nor do I ever expect enough readers to have overwhelmingly unpleasant
reactions, but the fear still got to me.
.Pp
But I want to persevere, and that's ultimately what writing this is about.
I'm not writing for fame or attention.
I'm not writing to further my career or put it on my resume.
I'm writing for me. For the clarity I get from expressing my thoughts, and for
the joy I get looking back at where I was months or years ago.
.Pp
Why host them publicly?
Well, I really enjoy a good tech blog, and admire a blogger or two out there.
I want to be the change I want to see in the internet and migrate from
centralized social networks back to a decentralized network of personal and
self-hosted sites.
.Pp
And who knows, maybe one day someone will read this and have felt the same. I guess I'm writing for that person too.
.Pp
.Sh SEE ALSO
.Bl -compact -bullet -format=indent
.It
.Xr blog 7
.El

A self-hosted.7 => self-hosted.7 +96 -0
@@ 0,0 1,96 @@
.Dd July 19, 2020
.Dt SELF-HOSTED 7
.Os
.Sh NAME
.Nm self-hosted
.Nd a tale of migrating to my own server
.Sh DESCRIPTION
If you look at the first post
.Xr ( a-new-hope 7 )
on this site, you'll see that this site started as a series of static HTML
files that I was, by hand, uploading to Fastmail via their "files" GUI.
.Pp
Being a total nerd for automation, I was always on the lookout for an excuse to
migrate to my own server, where I could (over)engineer a pipeline to build my
static content and deploy it without ever leaving the terminal.
.Pp
That excuse presented itself in the form of needing to get a VPS to stand up my
hobby-project, `euchre.live`.
If I was going to pay for a tiny VM, it was a no-brainer to move my personal
site to it too.
.Pp
This turned out to be a great learning experience -- getting hands on experience
with reverse proxies, DNS, and a variety of operating systems and webservers
(first hosted on Alpine Linux and migrated to OpenBSD).
Additionally, I could self-host git repos, which has long been a nerd-goal of mine :)
.Pp
I plan to write a lengthier post about the joys of self-hosting in the future,
but for now, I really just wanted to give a brief update on where I landed and
what the current stack is.
.Pp
I'm currently running (in no particular order):
.Bl -compact -bullet -format=indent
.It
.Sy OS :
OpenBSD
.It
.Sy Web server :
OpenBSD's
.Xr httpd 8
.Bl -compact -dash -format=indent
.It
Serves the `www.` static content
.It
Also serves
.Lk https://git.alexkarle.com
.El
.It
.Sy Reverse proxy :
OpenBSD's
.Xr relayd 8
.Bl -compact -dash -format=indent
.It
Used to send traffic between `euchre.live` (which uses a Mojolicious
web server as the backend) and `alexkarle.com` based on URL
.El
.It
.Sy `www` content :
.Bl -compact -dash -format=indent
.It
100% static content
.It
No metrics, ads, or tracking
.It
Posts and pages written in markdown
.It
HTML generated with a pipeline of the original `Markdown.pl` into a small
templating Perl script that I home-rolled
.El
.It
.Sy Git :
.Bl -compact -dash -format=indent
.It
Public repos served with
.Sy git-daemon(1)
over the `git://` protocol
.It
Push access via the `ssh://` protocol
.It
static HTML of content generated via post-receive hook with
.Sy stagit(1)
.El
.El
That's all for now!
.Sh SEE ALSO
.Bl -compact -bullet -format=indent
.It
.Xr blog 7
.It
.Xr a-new-hope 7
.It
.Lk https://euchre.live
.It
.Lk https://mojolicious.org Mojolicious
.It
.Lk https://git.codemadness.org/stagit/ stagit(1)
.El

A style.css => style.css +49 -0
@@ 0,0 1,49 @@
/* general defaults */
body {
  background-color: #F5F5F5;
  margin-left: 20px;
  margin-right: 20px;
  font-size: 1.3em;
  line-height: 1.3;
  font-family: monospace;
}

/* style tweaks */
a:link { color: #0a7899; }
a:visited { color: #033a4a; }
code { font-size: 1em; }
h1 { font-size: 1em; }
h1 > a { text-decoration: none; }

/* Responsive screen sizes */
@media only screen and (min-width: 992px) {
  body {
    width: 60%;
    margin: 0 auto;
  }
} 
@media only screen and (min-width: 600px) and (max-width: 991px) {
  body {
    width: 80%;
    margin: 0 auto;
  }
}

/* margins around head/foot */
table.foot { margin-top: 3em; }
table.head { margin-bottom: 3em; }

/* hide the "miscellaneous" section bit -- too big on mobile */
td.head-vol { visibility: hidden; }

/* defaults from mandoc(1)'s inlined CSS */
table.head, table.foot { width: 100%; }
td.head-rtitle, td.foot-os { text-align: right; }
td.head-vol { text-align: center; }
.Nd, .Bf, .Op { display: inline; }
.Pa, .Ad { font-style: italic; }
.Ms { font-weight: bold; }
.Bl-diag > dt { font-weight: bold; }
code.Nm, .Fl, .Cm, .Ic, code.In, .Fd, .Fn, .Cd {
    font-weight: bold;
}

A template.7 => template.7 +13 -0
@@ 0,0 1,13 @@
.Dd Month Day, Year
.Dt TITLE 7
.Os
.Sh NAME
.Nm <title>
.Nd <desc>
.Sh DESCRIPTION
entry
.Sh SEE ALSO
.Bl -compact -bullet -format=indent
.It
.Xr blog 7
.El

D templates/head.tmpl => templates/head.tmpl +0 -24
@@ 1,24 0,0 @@
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Alex Karle</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>

  <body>
    <!-- Put content in centered column -->
    <div id="content">
      <header>
        <h2 id="top-name">Alex Karle</h2>
        <div id="nav">
          <a href="/">Home</a>
          |
          <a href="/thoughts.html">Thoughts</a>
          |
          <a href="http://euchre.live">Euchre</a>
          |
          <a href="https://alexkarle.com/git/">Git</a>
        </div>
      </header>

D templates/post-tail.tmpl => templates/post-tail.tmpl +0 -6
@@ 1,6 0,0 @@
<br> <br> <br>
<div style="text-align: right">
  <a style="color:gray; text-decoration:none" href="thoughts.html">Back</a>
</div>
<br> <br> <br>
<!-- {% include=tail %} -->

D templates/tail.tmpl => templates/tail.tmpl +0 -3
@@ 1,3 0,0 @@
    </div> <!-- content -->
  </body>
</html>