Compare commits

...

27 Commits

Author SHA1 Message Date
Silke 5c517df3d6 fixup! Redesign website 1 month ago
Silke 827d514cff fixup! Add a blog post about NAT64 performance 1 month ago
Silke 0b187be7f0 fixup! Update 404 page 1 month ago
Silke 42bc827e4b fixup! fixup! Redesign website 1 month ago
Silke f1f5ad7899 Fix section levels 1 month ago
Silke 4a6f398132 fixup! Redesign website 1 month ago
Silke c000ccb0b9 fixup! Update main index 1 month ago
Silke dceb8388ad fixup! Redesign website 1 month ago
Silke d1d110d251 fixup! Redesign website 1 month ago
Silke 91fba86c7d Add tags to blog posts 1 month ago
Silke 019c2c72a9 Update 404 page 1 month ago
Silke 83ae062093 amend! Redesign website 1 month ago
Silke d7b01f8cc3 Update CI/deploy config 1 month ago
Silke 9f9bb00881 Add missing summary breaks to blog posts 1 month ago
Silke 3a7b91314a fixup! Archive various pages 1 month ago
Silke f2dc68f547 amend! Archive various pages 1 month ago
Silke 57d29418cd fixup! Archive various pages 1 month ago
Silke 6831732729 Update main index 1 month ago
Silke 3e45181925 Add index pages for blog/archive 1 month ago
Silke ca97b90444 Update config with github/gitlab/keybase 1 month ago
Silke 2e57819750 Redesign website 1 month ago
Silke 14849b2b8a Remove unpublished posts 1 month ago
Silke dcadc557fc Archive various pages 1 month ago
Silke 54d9cfb0e7 Convert less to sass 7 months ago
Silke 05be8e3abf Fix w3c validation errors 7 months ago
Silke 3d8dc37a45 Fix Hugo warnings 7 months ago
Silke d02c40e91b Add a blog post about NAT64 performance 7 months ago
  1. 2
      .gitignore
  2. 19
      .gitlab-ci.yml
  3. 4
      assets/icons/README.md
  4. 1
      assets/icons/brands/github.svg
  5. 1
      assets/icons/brands/gitlab.svg
  6. 1
      assets/icons/brands/keybase.svg
  7. 1
      assets/icons/brands/matrix.svg
  8. 1
      assets/icons/brands/rss.svg
  9. 1
      assets/icons/calendar.svg
  10. 1
      assets/icons/clock.svg
  11. 1
      assets/icons/mail.svg
  12. 1
      assets/icons/rss.svg
  13. 347
      assets/styles.scss
  14. 13
      config.yaml
  15. 12
      content/404.md
  16. 7
      content/_404.md
  17. 17
      content/_index.md
  18. 8
      content/archive/_index.md
  19. 2
      content/archive/gamejam.md
  20. 20
      content/archive/latex.md
  21. 102
      content/blog/How this site almost broke the internet.md
  22. 7
      content/blog/NAT64 for servers.md
  23. 237
      content/blog/NAT64 performance.md
  24. 6
      content/blog/PGP and DNS.md
  25. 4
      content/blog/X.509 IPsec on EdgeOS.md
  26. 7
      content/blog/_index.md
  27. 12
      content/blog/covid.md
  28. 19
      content/certs.md
  29. 24
      content/dname-bugs.md
  30. 4
      content/footer.md
  31. 17
      content/kerberos.md
  32. 20
      content/steamoverlay.md
  33. 28
      deploy.sh
  34. 19
      layouts/404.html
  35. 15
      layouts/_default/list.html
  36. 50
      layouts/_default/rss.xml
  37. 3
      layouts/_default/single.html
  38. 14
      layouts/blog/single.html
  39. 15
      layouts/index.html
  40. 1
      layouts/partials/bottom.html
  41. 6
      layouts/partials/brand.html
  42. 22
      layouts/partials/footer.html
  43. 12
      layouts/partials/head.html
  44. 6
      layouts/partials/icon.html
  45. 6
      layouts/partials/list-entry.html
  46. 10
      layouts/partials/nav.html
  47. 9
      layouts/partials/pagination.html
  48. 5
      layouts/partials/summary.html
  49. 10
      layouts/partials/top.html
  50. 2
      layouts/shortcodes/brand.html
  51. 2
      layouts/shortcodes/icon.html
  52. 307
      static/css/styles.less
  53. BIN
      static/images/404.png
  54. BIN
      static/images/favicon.png
  55. 50
      static/images/favicon.svg
  56. 69
      static/images/favicon_src.svg

2
.gitignore

@ -1,2 +1,2 @@
static/css/styles.css
public
resources

19
.gitlab-ci.yml

@ -1,35 +1,38 @@
variables:
HUGO_ARGS: --cleanDestinationDir --minify
WWW_DIR: /var/www/slxh/
build:
type: build
stage: build
script:
- ./deploy.sh less hugo minify
- hugo ${HUGO_ARGS}
artifacts:
paths:
- public
deploy-production:
type: deploy
stage: deploy
script:
- ./deploy.sh less hugo minify
- hugo ${HUGO_ARGS}
- rsync -a public/ $WWW_DIR --delete
environment:
name: production
url: https://slxh.nl
variables:
HUGO_CANONIFYURLS: true
HUGO_CANONIFYURLS: 'true'
only:
- master
deploy-ipfs:
type: deploy
stage: deploy
script:
- ./deploy.sh less hugo minify ipfs
- hugo ${HUGO_ARGS}
- ipfs add -qr public/ | tee ipfs.log
- ipfs name publish /ipfs/$(tail -n1 ipfs.log)
environment:
name: ipfs
url: https://ipfs.slxh.nl
variables:
HUGO_RELATIVEURLS: true
HUGO_RELATIVEURLS: 'true'
only:
- master

4
assets/icons/README.md

@ -0,0 +1,4 @@
Icons in this directory are sources from the following projects:
- [Feather](https://github.com/feathericons/feather) (MIT license)
- [Simple Icons](https://github.com/simple-icons/simple-icons) (CC0-1.0 license)

1
assets/icons/brands/github.svg

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>

Before

Width:  |  Height:  |  Size: 822 B

After

Width:  |  Height:  |  Size: 822 B

1
assets/icons/brands/gitlab.svg

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitLab</title><path d="M4.845.904c-.435 0-.82.28-.955.692C2.639 5.449 1.246 9.728.07 13.335a1.437 1.437 0 00.522 1.607l11.071 8.045c.2.145.472.144.67-.004l11.073-8.04a1.436 1.436 0 00.522-1.61c-1.285-3.942-2.683-8.256-3.817-11.746a1.004 1.004 0 00-.957-.684.987.987 0 00-.949.69l-2.405 7.408H8.203l-2.41-7.408a.987.987 0 00-.942-.69h-.006zm-.006 1.42l2.173 6.678H2.675zm14.326 0l2.168 6.678h-4.341zm-10.593 7.81h6.862c-1.142 3.52-2.288 7.04-3.434 10.559L8.572 10.135zm-5.514.005h4.321l3.086 9.5zm13.567 0h4.325c-2.467 3.17-4.95 6.328-7.411 9.502 1.028-3.167 2.059-6.334 3.086-9.502zM2.1 10.762l6.977 8.947-7.817-5.682a.305.305 0 01-.112-.341zm19.798 0l.952 2.922a.305.305 0 01-.11.341v.002l-7.82 5.68.026-.035z"/></svg>

Before

Width:  |  Height:  |  Size: 797 B

After

Width:  |  Height:  |  Size: 797 B

1
assets/icons/brands/keybase.svg

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Keybase</title><path d="M10.445 21.372a.953.953 0 1 1-.955-.954c.524 0 .951.43.951.955m5.923-.001a.953.953 0 1 1-.958-.954c.526 0 .954.43.954.955m4.544-9.16l-.156-.204c-.046-.06-.096-.116-.143-.175-.045-.06-.094-.113-.141-.169-.104-.12-.21-.239-.32-.359l-.075-.08-.091-.099-.135-.13c-.015-.019-.032-.035-.05-.054a10.87 10.87 0 0 0-3.955-2.504l-.23-.078.035-.083a4.109 4.109 0 0 0-.12-3.255 4.11 4.11 0 0 0-2.438-2.16c-.656-.216-1.23-.319-1.712-.305-.033-.105-.1-.577.496-1.848L10.662 0l-.287.399c-.33.455-.648.895-.945 1.328a1.857 1.857 0 0 0-1.245-.58L6.79 1.061h-.012c-.033-.003-.07-.003-.104-.003-.99 0-1.81.771-1.87 1.755l-.088 1.402v.003a1.876 1.876 0 0 0 1.755 1.98l1.002.06c-.065.84.073 1.62.405 2.306a11.28 11.28 0 0 0-3.66 2.484C.912 14.392.912 18.052.912 20.995v1.775l1.305-1.387c.266.93.652 1.807 1.145 2.615H5.06a9.197 9.197 0 0 1-1.68-3.848l1.913-2.03-.985 3.09 1.74-1.267c3.075-2.234 6.745-2.75 10.91-1.53 1.806.533 3.56.04 4.474-1.256l.104-.165c.09.498.14.998.14 1.496 0 1.563-.254 3.687-1.38 5.512h1.612c.776-1.563 1.181-3.432 1.181-5.512-.001-2.2-.786-4.421-2.184-6.274zM8.894 6.192c.122-1.002.577-1.949 1.23-2.97a1.36 1.36 0 0 0 1.283.749c.216-.008.604.025 1.233.232a2.706 2.706 0 0 1 1.608 1.425c.322.681.349 1.442.079 2.15a2.69 2.69 0 0 1-.806 1.108l-.408-.502-.002-.003a1.468 1.468 0 0 0-2.06-.205c-.334.27-.514.66-.534 1.058-1.2-.54-1.8-1.643-1.628-3.04zm4.304 5.11l-.52.425a.228.228 0 0 1-.323-.032l-.11-.135a.238.238 0 0 1 .034-.334l.51-.42-1.056-1.299a.307.307 0 0 1 .044-.436.303.303 0 0 1 .435.041l2.963 3.646a.309.309 0 0 1-.168.499.315.315 0 0 1-.31-.104l-.295-.365-1.045.854a.244.244 0 0 1-.154.055.237.237 0 0 1-.186-.09l-.477-.58a.24.24 0 0 1 .035-.335l1.05-.858-.425-.533zM7.752 4.866l-1.196-.075a.463.463 0 0 1-.435-.488l.09-1.4a.462.462 0 0 1 .461-.437h.024l1.401.091a.459.459 0 0 1 .433.488l-.007.101a9.27 9.27 0 0 0-.773 1.72zm12.525 11.482c-.565.805-1.687 1.08-2.924.718-3.886-1.141-7.397-.903-10.469.7l1.636-5.122-5.29 5.609c.098-3.762 2.452-6.967 5.757-8.312.471.373 1.034.66 1.673.841.16.044.322.074.48.102a1.41 1.41 0 0 0 .21 1.408l.075.09c-.172.45-.105.975.221 1.374l.476.582a1.39 1.39 0 0 0 1.079.513c.32 0 .635-.111.886-.314l.285-.232c.174.074.367.113.566.113a1.45 1.45 0 0 0 .928-.326c.623-.51.72-1.435.209-2.06l-1.67-2.057a4.07 4.07 0 0 0 .408-.38c.135.036.27.077.4.12.266.096.533.197.795.314a9.55 9.55 0 0 1 2.77 1.897c.03.03.06.055.086.083l.17.176c.038.039.076.079.11.12.08.085.16.175.24.267l.126.15c.045.053.086.104.13.16l.114.15c.04.05.079.102.117.154.838 1.149.987 2.329.404 3.157v.005zM7.718 4.115l-.835-.05.053-.836.834.051z"/></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

1
assets/icons/brands/matrix.svg

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Matrix</title><path d="M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033c.309-.443.683-.784 1.117-1.024.433-.245.936-.365 1.5-.365.54 0 1.033.107 1.481.314.448.208.785.582 1.02 1.108.254-.374.6-.706 1.034-.992.434-.287.95-.43 1.546-.43.453 0 .872.056 1.26.167.388.11.716.286.993.53.276.245.489.559.646.951.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66 1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499 1.946 1.946 0 0 0-.231.696 5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688 1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19-.111 0-.259.024-.439.074-.18.051-.36.143-.53.282-.171.138-.319.337-.439.595-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z"/></svg>

Before

Width:  |  Height:  |  Size: 939 B

After

Width:  |  Height:  |  Size: 939 B

1
assets/icons/brands/rss.svg

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>RSS</title><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 400 B

1
assets/icons/calendar.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-calendar"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line></svg>

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 410 B

1
assets/icons/clock.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-clock"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>

Before

Width:  |  Height:  |  Size: 304 B

After

Width:  |  Height:  |  Size: 304 B

1
assets/icons/mail.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-mail"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>

Before

Width:  |  Height:  |  Size: 354 B

After

Width:  |  Height:  |  Size: 354 B

1
assets/icons/rss.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-rss"><path d="M4 11a9 9 0 0 1 9 9"></path><path d="M4 4a16 16 0 0 1 16 16"></path><circle cx="5" cy="19" r="1"></circle></svg>

Before

Width:  |  Height:  |  Size: 330 B

After

Width:  |  Height:  |  Size: 330 B

347
assets/styles.scss

@ -0,0 +1,347 @@
@function subtract_color($a, $b) {
@return adjust_color($a, $red: -(red($b)), $green: -(green($b)), $blue: -(blue($b)));
}
@function add_color($a, $b) {
@return adjust_color($a, $red: (red($b)), $green: (green($b)), $blue: (blue($b)));
}
@function divide_color($a, $scalar) {
@return rgba(red($a) / $scalar, green($a) / $scalar, blue($a) / $scalar, alpha($a));
}
$black: rgb(22, 22, 22);
$white: subtract_color(rgb(255, 255, 255), $black);
$grey: divide_color($white, 2);
$dark: subtract_color($grey, $black);
$orange: rgb(233, 128, 22);
$side: $orange;
$back: subtract_color($white, $black);
$mainfont: 'Source Sans Pro Webfont', Helvetica, Arial, Sans-serif;
$headfont: 'Raleway Webfont', $mainfont;
$codefont: 'Source Code Pro Webfont', $mainfont;
$content_pad: 1em;
$content_min: 8em + $content_pad;
$content_max: 40em + $content_pad;
$nav_min: $content_min;
$nav_max: 100%;
$header_size: 2em;
$header_weight: 300;
@mixin transition($time) {
transition: all $time;
-moz-transition: all $time;
-webkit-transition: all $time;
-o-transition: all $time;
}
.hyphens {
hyphens: auto;
-moz-hyphens: auto;
-webkit-hyphens: auto;
-ms-hyphens: auto;
}
.bidi {
unicode-bidi: bidi-override;
direction: rtl;
}
.icon, .brand-icon {
display: inline-block;
margin: 0;
svg {
height: 1.25em;
width: 1.25em;
top: 0.2em;
position: relative;
}
}
.icon {
svg {
stroke: currentColor;
stroke-width: 0.1em;
fill: none;
}
}
.brand-icon {
svg {
fill: currentColor;
top: 0.15em;
}
}
a {
&:hover {
color: $orange;
.brand-icon svg {
fill: $orange;
}
.icon svg {
stroke: $orange;
}
}
}
h1, h2, h3, h4, h5 {
font-family: $headfont;
}
code, pre {
font-family: $codefont;
font-size: 94%;
white-space: pre-wrap;
background-color: subtract_color($white, $black);
border-radius: .2em;
padding: 0em .2em;
overflow: auto;
}
pre {
padding: .5em;
code {
white-space: pre;
padding: 0;
}
}
table {
margin: 1em auto;
border-collapse: collapse;
thead {
color: white;
background-color: $grey;
th {
font-weight: 200;
}
}
tbody {
tr:nth-child(even) {
background-color: rgba(0, 0, 0, 0.1);
}
}
tr {
th, td {
padding: .2em;
}
}
}
html, body {
position: relative;
}
body {
margin: 0;
padding: 0;
background: $back;
color: $black;
}
section {
width: 100%;
max-width: $content_max;
min-width: $content_min;
margin: 0 auto;
position: relative;
font-family: $mainfont;
font-weight: 400;
font-kerning: auto;
font-feature-settings: "liga", "onum";
}
aside {
position: relative;
overflow: hidden;
width: 100%;
min-width: $nav_min;
background-color: $black;
nav {
min-width: $nav_min;
text-align: center;
li {
display: inline-block;
&.active a {
color: $white;
background-color: $black;
}
}
a {
display: inline-block;
max-width: $nav_max;
$padding: 1em;
padding: $padding;
margin: 0 $padding;
text-decoration: none;
text-transform: uppercase;
font-family: $headfont;
font-weight: 400;
color: $orange;
@include transition(.25s);
&:hover {
color: $black;
background-color: $orange;
}
}
ul, li {
margin: 0;
padding: 0;
list-style: none;
}
}
}
header, footer {
font-family: $headfont;
position: relative;
font-size: $header_size;
font-weight: $header_weight;
a {
color: inherit;
text-decoration: none;
}
.brand-icon svg {
width: 0.8em;
height: 0.8em;
}
.icon svg {
stroke-width: .05em;
width: 1em;
height: 1em;
}
}
header {
padding: 1em 0;
h1 {
margin: 0;
font-weight: $header_weight;
}
div {
color: $dark;
font-size: 0.7em;
time, span {
margin-right: 1em;
}
}
}
footer {
padding: 0.5em 0;
display: flex;
align-items: baseline;
justify-content: space-between;
div {
display: inline-block;
}
a {
margin: 0 .25em;
}
}
@mixin hx($x, $font_size) {
h#{$x} {
font-size: 1em*$font_size;
margin: 1.5em -1em/$font_size 0.5em -1em/$font_size;
padding: .5em/$font_size 1em/$font_size;
}
}
article {
position: relative;
padding: $content_pad;
background-color: $white;
hyphens: auto;
min-width: $content_min;
max-width: $content_max;
h1, h2, h3 {
font-family: $headfont;
font-weight: $header_weight;
background-color: $black;
color: white;
a {
font-weight: $header_weight+100;
}
}
@include hx(1, 2);
@include hx(2, 1.5);
@include hx(3, 1.17);
@include hx(4, 1);
h3, h4 {
background-color: $grey;
}
p {
margin-top: .2em;
}
a {
text-decoration: none;
color: $orange;
&:hover {
text-decoration: underline;
}
}
img {
max-width: 100%;
}
ul.pages {
margin: 0;
padding: 0;
list-style: none;
li {
margin: .5em;
list-style: none;
a {
margin: 1em;
}
}
}
}

13
config.yaml

@ -2,13 +2,10 @@ baseURL: "https://slxh.nl/"
languageCode: en-GB
title: SLXH.nl
paginate: 10
permalinks:
blog: /blog/:year/:title/
blog: /blog/:year/:title/
menu:
main:
- name: Blog
url: /blog/
weight: 40
params:
github: silkeh
gitlab: silkeh
keybase: silke

12
content/404.md

@ -1,12 +0,0 @@
---
title: 404
---
Error: 404.
===========
You got a *404.*
This means I have no idea what you are looking for - try starting again from [*the homepage.*](main)
<p style="text-align: center">
<img src="/images/404.png" alt="TumbleBeast" id="tumblebeast"/>
<a href="http://theoatmeal.com"><em>Image courtesy of The Oatmeal</em></a>
</p>

7
content/_404.md

@ -0,0 +1,7 @@
---
title: "Error: 404"
type: 404
---
You got a *404.*
This means I have no idea what you are looking for -
try starting again from [*the homepage.*](/), or look through the pages below.

17
content/_index.md

@ -1,14 +1,17 @@
---
title: Home
menu: main
weight: -1
weight: 1
aliases:
- /home
---
Welcome
=======
I don't know why you came here but it's not likely you're going to find it as this website is pretty dull and empty.
Contact
=======
If you came here to contact me, try sending me an e-mail at <a href="mailto:&#99;&#111;&#110;&#116;&#97;&#99;&#116;&#64;&#115;&#108;&#120;&#104;&#46;&#110;&#108;">&#99;&#111;&#110;&#116;&#97;&#99;&#116;&#64;&#115;&#108;&#120;&#104;&#46;&#110;&#108;</a>.
This is the personal website of Silke Hofstra.
You can find/reach me on
[{{< brand gitlab >}} GitLab](https://gitlab.com/silkeh),
[{{< brand github >}} GitHub](https://github.com/silkeh),
[{{< brand keybase >}} Keybase](https://keybase.io/silke),
[{{< brand matrix >}} Matrix](https://matrix.to/#/@silex:slxh.eu)
and [{{< icon mail >}} e-mail](mailto:contact@slxh.nl).
I sometimes write down some experience/experiments below.

8
content/archive/_index.md

@ -0,0 +1,8 @@
---
title: Archive
menu: main
weight: 100
---
The pages below once had a (more) prominent place on the site,
but have been archived to make space for new stuff...

2
content/gamejam.md → content/archive/gamejam.md

@ -1,7 +1,5 @@
---
title: Gamejam
menu: main
weight: 20
---
# Last Minute Madness: Retribution
A multiplayer game made the the second IA gamejam of 2015.

20
content/latex.md → content/archive/latex.md

@ -1,57 +1,55 @@
---
title: LaTeX
menu: main
weight: 10
---
In this place I've tried to make an overview of all (somewhat public) {{<latex>}} Stuff I've created.
You can also check out my [CTAN](http://www.ctan.org/author/hofstra) or [GitHub](https://github.com/silkeh/) profile.
# Stable {{<latex>}} Packages
## Stable {{<latex>}} Packages
Compressed packages follow the [Tex Directory Structure (TDS)][2], you can unpack them directly into your `texmf` directory.
## sourcesanspro
### sourcesanspro
[CTAN](http://www.ctan.org/pkg/sourcesanspro),
[Documentation](https://github.com/silkeh/latex-sourcesanspro/blob/master/doc/latex/sourcesanspro/sourcesanspro.pdf),
[Releases](https://github.com/silkeh/latex-sourcesanspro/releases).
Adobe's first open source font family.
## sourcecodepro
### sourcecodepro
[CTAN](http://www.ctan.org/pkg/sourcecodepro),
[Documentation](https://github.com/silkeh/latex-sourcecodepro/blob/master/doc/latex/sourcecodepro/sourcecodepro.pdf),
[Releases](https://github.com/silkeh/latex-sourcecodepro/releases).
Adobe's first open source monospaced font.
## sourceserifpro
### sourceserifpro
[CTAN](http://www.ctan.org/pkg/sourceserifpro),
[Documentation](https://github.com/silkeh/latex-sourceserifpro/blob/master/doc/latex/sourceserifpro/sourceserifpro.pdf),
[Releases](https://github.com/silkeh/latex-sourceserifpro/releases).
Adobe's first open source serif font.
## raleway
### raleway
[CTAN](http://www.ctan.org/pkg/raleway),
[Documentation](https://github.com/silkeh/latex-raleway/blob/master/doc/latex/raleway.pdf),
[Releases](https://github.com/silkeh/latex-raleway/releases).
Matt McInerney's Raleway family.
## comicneue
### comicneue
[CTAN](http://www.ctan.org/pkg/raleway),
[Documentation](https://github.com/silkeh/latex-comicneue/blob/master/doc/latex/comicneue/comicneue.pdf),
[Releases](https://github.com/silkeh/latex-raleway/releases).
Comic Sans, redesigned!
# Other Projects
## Other Projects
An overview can also be found on [my local Git repositories](https://git.slxh.eu/tex).
## siltex
### siltex
Personal package for nicely layed out documents. [Download from Git](https://git.slxh.eu/tex/siltex.git).
## utwente
### utwente
Templates for University of Twente projects. [Download from Git](https://git.snt.utwente.nl/visual-identity/latex-utwente.git).

102
content/blog/How this site almost broke the internet.md

@ -1,102 +0,0 @@
---
date: 2016-11-02 09:48:32.106880653 +0100
title: How this site almost broke the internet
draft: true
---
When someone says *I broke the internet*, this usually one of two things:
- This person broke his or her internet connection
- This person is greatly exaggerating
I would like to say that this was one of those situations.
Unfortunately, it isn't.
Apparently this domain was setup in such a way that it had the potential to actually break the internet.
The setup
---------
I own two domains [slxh.nl] and [slxh.eu].
Both point to this website, but in the case of [slxh.nl],
something special is going on.
When asking the records for [www.slxh.eu], you get something like the following:
www.slxh.eu. 3600 IN AAAA 2001:470:7830:0:216:3eff:fef5:2ead
However, when doing the same with `www.slxh.nl`, a bit of magic is going on:
slxh.nl. 3600 IN DNAME slxh.eu.
www.slxh.nl. 3600 IN CNAME www.slxh.eu.
www.slxh.eu. 3600 IN AAAA 2001:470:7830:0:216:3eff:fef5:2ead
Now, this quickly gets [a bit more complicated][dnsviz] because of [DNSSEC],
but it tends to work fairly well.
Also, because both domains use the same authoritative DNS servers,
when a resolver asks for [slxh.nl] it receives all those records in the answer immediately. Very convenient.
The bug
-------
So, what happens if something does not exist in the zone?
The expected answer is an NXDOMAIN and no answer.
With DNSSEC one actually receives some signatures to prove that the record does not exist, but not much more.
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 32
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;nx.slxh.eu. IN AAAA
However, with the DNAME something else happens:
Because the server is authoritative for both the zones,
it returns the DNAME, CNAME and an NXDOMAIN:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 32
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;nx.slxh.eu. IN AAAA
;; ANSWER SECTION:
slxh.nl. 3600 IN DNAME scintilla.utwente.nl.
nx.slxh.nl. 0 IN CNAME nx.slxh.nl.
This does actually make sense, and is (as far as I know) correct behavior.
The developers of Bind, however, did not take this into account.
This meant that when asking the Bind recursor to resolve *nx.slxh.nl*,
[Bind would crash][cve]. Such a vulnerability warrants a CVE[[1]][cve].
Impact
------
What is the impact of this?
According to [the Bind website][bind] it is *"The most widely used Name Server Software"*. It seems to have a market share of about 55% of recursive resolvers[[2]][bindshare].
Assuming all are running a fairly up to date version of Bind,
this means that it is possible to kill the majority of DNS recursive resolvers using a DNS lookup.
How that lookup is to be spread, I leave up to the reader.
Conclusion
----------
So, did this site almost break the internet?
Well, it could have.
But, when I learned of this vulnerability the DNAME was disabled *almost* immediately.
*Almost*, because I broke the internet for a thousand people first (by accident)...
References
----------
- \[1]: [CVE-2016-8864][cve]: A problem handling responses containing a DNAME answer can lead to an assertion failure
- \[2]: [Happy Eyeballs for the DNS][bindshare] by Geoff Huston & George Michaelson
[slxh.nl]: https://slxh.nl
[slxh.eu]: https://slxh.eu
[www.slxh.nl]: https://www.slxh.nl
[www.slxh.eu]: https://www.slxh.eu
[dnsviz]: http://dnsviz.net/d/www.slxh.nl/dnssec/
[DNSSEC]: https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions
[cve]: https://kb.isc.org/article/AA-01434
[bind]: https://www.isc.org/downloads/bind/
[bindshare]: https://labs.apnic.net/presentations/store/2015-10-04-dns-dual-stack.pdf

7
content/blog/NAT64 for servers.md

@ -4,9 +4,16 @@ title: NAT64 for servers
draft: false
aliases:
- /blog/NAT64 for servers
tags:
- router
- ipv6
- nat64
- siit
---
This post details the setup of the additional steps required to deploy a IPv6-only server bedind [NAT64][] with [Tayga][].
<!--more-->
This post uses the *documentation prefix* (`2001:db8::/32`),
replace this with your own prefix.
This can be a ULA prefix.

237
content/blog/NAT64 performance.md

@ -0,0 +1,237 @@
---
title: NAT64 performance
date: 2021-03-31T20:07:06+02:00
draft: false
aliases:
- /blog/NAT64 performance
tags:
- router
- ipv6
- nat64
- siit
---
This post is an update of [my previous post about NAT64](/blog/NAT64%20for%20servers).
That post describes the following setup:
```
IPv4 IPv4
Internet ────── Router ────── NAT64
IPv6 │ │ IPv6
└────────── Host
IPv6
```
<!--more-->
This has the following components in the network:
- A *router* that routes IPv6 and routes or NATs IPv4.
- A *NAT64* server that performs thanslation of IPv4 and IPv6.
- A *host* that only has IPv6 connectivity.
The is to use the NAT64 server both ways:
the NAT64 server is used for IPv4 connectivity (looking at you, GitHub),
and to reach the IPv6-only hosts over IPv4.
Currently, I still use [Tayga][] for this setup.
The main downside of Tayga is it's (low) performance.
This performance is the main reason various hosts in my network still have
an IPv4 address.
I have also replaced my home router with a [PCEngines APU][],
which should perform much better than the Edgerouter Lite it replaced.
## Alternatives
There are various alternatives to Tayga:
- OpenBSD's [PF][] (using [af-to][]).
- [Jool][] can perform both (stateful) NAT64 and (stateless) [SIIT][].
- [map646][] only performs stateless NAT64.
The latter two have been compared against Tayga in [this paper][paper],
which found the following performance:
| Solution | frame/s | Mbps (est.) |
|----------|--------:|------------:|
| Jool | 230000 | 2760 |
| Tayga | 120000 | 1440 |
| map646 | 60000 | 720 |
Note that the throughput for Tayga is significantly greater than I was able to
achieve in my previous post (252 Mbps).
Additionally, the performance of Jool looks *interesting*...
## Test setup
The following devices are used for testing the performance of Tayga, Jool and PF:
| | PCEngines APU | Ryzen 2600X | Ryzen 4650G |
|-----|:-------------------|:----------------------|:------------|
| CPU | [AMD GX-412][] | [AMD Ryzen 5 2600X][] | [AMD Ryzen 5 PRO 4650G][]
| NIC | [Intel i211AT][] | [Intel X550-T2][] | [Mellanox ConnectX-3 EN][]
| RAM | 2GB DDR3-1333 | 32GB DDR4-3200 | 32GB DDR4-3200
Both the PCEngines APU and the Ryzen2600X are used as NAT64 device,
while the Ryzen 4650G is used to measure performance.
Fresh installations of OpenBSD 6.8 and Debian Bullseye are used for
the tests. No performance tuning is done.
Tests are performed using iPerf3 using a single TCP flow
on a single link (in full duplex).
The best of three measurements is used as the result.
A few notes:
- Note that these numbers do not include overhead from Ethernet, IP or TCP (5-6%).
- The network, and the devices, may be somewhat in use.
- Only a single full-duplex link is used.
This means that the results below should be taken with a grain of salt.
## Different types of NAT
Tayga, Jool and PF work differently:
- Tayga and PF (and Jool in NAT64 mode) masquerade the original IP.
Tayga can do so using an (optional) dynamic pool, and static mappings.
- PF also masquerades the IPv6 address in the NAT46 flow.
- Jool (in SIIT mode) does a stateless translation between IPs.
This means that the original IP also has to be one from the pool.
- Jool (in SIIT mode) translates *all* IPv4 traffic.
Example translations for NAT64:
| | Orig From | Orig To | NAT From | NAT To |
|-------|---------------------|---------------------|--------------|------------|
| Tayga | * | 64:ff9b::10.64.0.10 | 10.64.0.0/24 | 10.64.0.10 |
| Jool | 64:ff9b::10.64.1.10 | 64:ff9b::10.64.0.10 | 10.64.1.10 | 10.64.0.10 |
| PF | * | 64:ff9b::10.64.0.10 | 10.64.0.1 | 10.64.0.10 |
Example translations for NAT46:
| | Orig From | Orig To | NAT From | NAT To |
|-------|------------|------------|----------------------|----------------------|
| Tayga | 10.64.1.10 | 10.64.0.10 | 2001:db8::10.64.1.10 | 2001:db8::10.64.0.10 |
| Jool | 10.64.1.10 | 10.64.0.10 | 2001:db8::10.64.1.10 | 2001:db8::10.64.0.10 |
| PF | * | 10.64.0.10 | 2001:db8::1 | 2001:db8::10.64.0.10 |
## Results
Performance on the PCEngines APU in Mbps:
| | IPv4 | IPv6 | NAT64 | NAT46 |
|:------|-----:|-----:|------:|------:|
| Tayga | 903 | 887 | 199 | 197 |
| Jool | - | 869 | 805 | 825 |
| PF | 646 | 488 | 572 | 444 |
Performance on the Ryzen 2600X in Mbps:
| | IPv4 | IPv6 | NAT64 | NAT46 |
|:------|-----:|-----:|------:|------:|
| Tayga | 8478 | 8361 | 2971 | 2807 |
| Jool | - | 7819 | 8193 | 8091 |
| PF | 6292 | 5006 | 2354 | 5440 |
As a bonus: performance of Jool in a container on the Ryzen 4650G in Mbps:
| | IPv4 | IPv6 | NAT64 | NAT46 |
|:------|------:|------:|------:|------:|
| Jool | 15216 | 14406 | 14426 | 10097 |
This means the performance of the solutions,
when compared to the line rate,
is as follows:
| Solution | Platform | NAT64 | NAT46 |
|:---------|:--------------|-------:|--------:|
| Tayga | PCEngines APU | 21% | 21% |
| Tayga | Ryzen 2600X | 31% | 29% |
| PF | PCEngines APU | 50% | 47% |
| PF | Ryzen 2600X | 25% | 58% |
| Jool | PCEngines APU | 85% | 88% |
| Jool | Ryzen 2600X | 88% | 86% |
## Conclusion
While Tayga claims that it "can saturate gigabit Ethernet on modest PC hardware",
this is clearly not the case for the 'modest' PCEngines APU.
However, on a modern desktop CPU all solutions were able to attain performance
exceeding 1 Gbps.
The clear winner in terms of performance is Jool,
which is able to achieve almost 90% line rate on both platforms.
<!--
## Appendix: configurations
The following sections contain example configurations.
### Tayga
`/etc/default/tayga`:
```
# Configure NAT44 for the private IPv4 range
CONFIGURE_NAT44="no"
```
`/etc/tayga.conf`
```
tun-device nat64
prefix 2001:db8::/96
ipv4-addr 10.64.0.1
dynamic-pool 10.64.0.0/24
data-dir /var/spool/tayga
map 10.64.0.10 2001:db8:1::10
```
### Jool
```console
jool_siit instance add siit \
--netfilter \
--pool6 2001:db8::/96
```
### PF
```conf
# Translate all IPv4 traffic by adding a NAT46 prefix
pass in quick on ix1 inet from any to 10.64.0.0/16 \
af-to inet6 from 2001:db8::1 to 2001:db8::/112
# Translate all IPv6 traffic to IPv4
pass in quick on ix1 inet6 from any to 64:ff9b::/96 \
af-to inet from 10.64.0.1
```
-->
[PF]: https://www.openbsd.org/faq/pf/filter.html
[af-to]: https://man.openbsd.org/pf.conf.5#af-to
[NAT64]: https://en.wikipedia.org/wiki/NAT64
[Tayga]: http://www.litech.org/tayga/
[ipv6-only]: https://blog.luukhendriks.eu/2015/12/01/ipv6-only-network-at-home.html
[apu]: https://www.pcengines.ch/apu2.htm
[ryzen]: https://www.amd.com/en/products/apu/amd-ryzen-5-pro-4650g
[ryzen2]: https://www.amd.com/en/products/cpu/amd-ryzen-5-2600x
[Jool]: https://www.jool.mx
[SIIT]: https://tools.ietf.org/html/rfc7915
[map646]: https://github.com/keiichishima/map646
[paper]: https://link.springer.com/article/10.1007/s11235-020-00681-x
[PCEngines APU]: https://www.pcengines.ch/apu3c2.htm
[AMD GX-412]: https://www.amd.com/en/system/files?file=2017-06/g-series-soc-product-brief.pdf
[AMD Ryzen 5 2600X]: https://www.amd.com/en/products/cpu/amd-ryzen-5-2600x
[AMD Ryzen 5 PRO 4650G]: https://www.amd.com/en/products/apu/amd-ryzen-5-pro-4650g
[Intel i211AT]: https://ark.intel.com/content/www/us/en/ark/products/64404/intel-ethernet-controller-i211-at.html
[Intel X550-T2]: https://ark.intel.com/content/www/us/en/ark/products/88209/intel-ethernet-converged-network-adapter-x550-t2.html
[Mellanox ConnectX-3 EN]: https://www.mellanox.com/products/ethernet-adapters/connectx-3-pro

6
content/blog/PGP and DNS.md

@ -4,10 +4,16 @@ title: PGP and DNS
draft: false
aliases:
- /blog/PGP and DNS
tags:
- pgp
- gpg
- dns
---
Recently, I looked at all the ways GnuPG can retrieve PGP keys from the internet to see which of these methods are actually useful.
This blog post describes a summary of my conclusions.
<!--more-->
GnuPG modern (2.1.16) can retrieve keys from the internet using the following mechanisms:
- `cert`: a DNS CERT PGP record as defined in [RFC-4398][]

4
content/blog/X.509 IPsec on EdgeOS.md

@ -4,10 +4,14 @@ title: X.509 IPsec on EdgeOS
draft: false
aliases:
- /blog/X.509 IPsec on EdgeOS
tags:
- router
- ipsec
---
Configuring X.509 based IPsec on an Edgerouter running EdgeOS.
<!--more-->
Preparation
-----------
Create a directory in `/config` for persistent storage of the certificates.

7
content/blog/_index.md

@ -0,0 +1,7 @@
---
title: Blog
menu: main
weight: 10
---
Sometimes I write stuff about technology.

12
content/blog/covid.md

@ -1,12 +0,0 @@
---
title: "Covid Graphs"
date: 2020-04-02T09:46:38+02:00
draft: false
---
During a crisis, the most important thing is to have nice graphs:
- [RIVM](https://www.rivm.nl/actuele-informatie-over-coronavirus/data) publishes daily reports for the situation in the Netherlands.
- [Covid Trends](http://aatishb.com/covidtrends/) has nice log/log plots of cases vs growth.
- [Johns Hopkins](https://coronavirus.jhu.edu/map.html) publishes the default set of graphs in various ways.
- [Worldometer](https://www.worldometers.info/coronavirus/) also has the default set of graphs.

19
content/certs.md

@ -1,19 +0,0 @@
---
title: Certs
---
# Let's Encrypt
All certificates are or will be signed by Let's Encrypt.
The certificates are cross-signed and should be trusted.
To trust Let's Encrypt's root certificate specifically,
install their root and intermediate certificates:
[Let's Encrypt Certificates](https://letsencrypt.org/certificates/)
# OpenVPN
The OpenVPN certificate is also signed by Let's Encrypt.
You can download the certificate and configuration here:
* [Certificate](https://slxh.eu/files/slxh-openvpn-ca.crt)
* [Configuration and certificate](https://slxh.eu/files/slxh-openvpn.zip)
* [Tunnelblick config](https://slxh.eu/files/slxh-tunnelblick.zip)
Also see: [SLXH Kerberos](/kerberos) for changing your password.

24
content/dname-bugs.md

@ -1,24 +0,0 @@
---
title: DNAME bugs
---
# DNAME bugs
This is an overview of issues with DNAME's that were found using this (or related) domain.
DNS Server | Issues
------------------------|--------
Bind | [1 (cve)][b1]
Dnsmasq | |
Knot Authoritative | |
Knot Resolver | |
NSD | |
PowerDNS Authoritative | [1][p1]
PowerDNS Recursor | [1][p2] |
Unbound | [1][u1], [2 (Oct 20)][u2]
YADIFA | |
[p1]: https://github.com/PowerDNS/pdns/issues/3020
[p2]: https://github.com/PowerDNS/pdns/issues/6318
[u1]: https://www.unbound.net/pipermail/unbound-users/2015-December/004134.html
[u2]: https://www.unbound.net/pipermail/unbound-users/2016-December/004587.html
[b1]: https://kb.isc.org/article/AA-01434

4
content/footer.md

@ -1,4 +0,0 @@
---
title: Footer
---
Website designed by Silke

17
content/kerberos.md

@ -1,17 +0,0 @@
---
title: Kerberos
---
# SLXH Kerberos
Kerberos is used for authentication on all SLXH systems.
## Changing your password
Your password can be changed from any machine with Kerberos tools and an internet connection:
wget https://slxh.eu/files/krb5.conf && KRB5_CONFIG=krb5.conf kpasswd [username]@SLXH.EU
You might get the following error:
kpasswd: Cannot contact any KDC for requested realm changing password
This error can be ignored safely.

20
content/steamoverlay.md

@ -1,20 +0,0 @@
# Google
<form name="google" id="googlesearch" action="https://www.google.nl/" style="margin: 1em">
<input type="hidden" name="ie" value="utf-8" />
<input name="q" type="text" size="40" />
<input type="submit" name="sa" value="Search" />
</form>
# Kerbal Space Program
* [Interplanetary Calculator](http://ksp.olex.biz/)
* [Aerobraking Calculator](http://alterbaron.github.io/ksp_aerocalc/)
* [Launch Window Planner](http://alexmoon.github.io/ksp/)
* [Δv Map](http://i.imgur.com/q0gC9H7.png)
* [Interactive Δv Map](http://deltavmap.com/)
* [Wiki](http://wiki.kerbalspaceprogram.com/wiki/Main_Page)
# CiV
* [Carl's Guide](http://www.carlsguides.com/strategy/civilization5/)

28
deploy.sh

@ -1,28 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Default arguments for Hugo
if [ -z ${HUGOARGS+x}]; then
HUGOARGS="--cleanDestinationDir"
fi
# Loop through arguments
for arg in "$@"; do
echo "Step: ${arg}"
case "${arg}" in
less)
lessc static/css/styles.less static/css/styles.css
;;
hugo)
hugo ${HUGOARGS}
;;
minify)
minify -aro public/ public/
;;
ipfs)
ipfs add -qr public/ | tee ipfs.log
ipfs name publish /ipfs/$(tail -n1 ipfs.log)
;;
esac
done

19
layouts/404.html

@ -1,3 +1,18 @@
{{ range where .Site.Pages "Title" "404" }}
{{ template "_default/single.html" . }}
{{ range where .Site.Pages "Type" "404" }}
{{ partial "top.html" . }}
<header>
<h1>{{ .Title }}</h1>
</header>
<article>
{{ .Content }}
{{ range .Site.Sections }}
<h2><a href="{{ .Permalink }}">{{ .Title }}</a></h2>
<ul class="pages">
{{ range .Pages }}
{{ partial "list-entry.html" . }}
{{ end }}
</ul>
{{ end }}
</article>
{{ partial "bottom.html" . }}
{{ end }}

15
layouts/_default/list.html

@ -1,9 +1,16 @@
{{ partial "top.html" . }}
<header>
<h1>{{ .Title }}</h1>
</header>
<article>
{{ $paginator := .Paginate .Data.Pages }}
{{ range $paginator.Pages }}
{{ partial "summary.html" . }}
{{ if gt (len .Content) 0 }}
{{ .Content }}
<h2>{{ .Title | pluralize }}</h2>
{{ end }}
{{ partial "pagination.html" . }}
<ul class="pages">
{{ range .Data.Pages }}
{{ partial "list-entry.html" . }}
{{ end }}
</ul>
</article>
{{ partial "bottom.html" . }}

50
layouts/_default/rss.xml

@ -1,24 +1,28 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
<link>{{ .Permalink }}</link>
<description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
<generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
<language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
<managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
<webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
<copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
<lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
<atom:link href="{{.Permalink}}" rel="self" type="application/rss+xml" />
{{ range first 15 (where .Data.Pages "Type" "blog") }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
<guid>{{ .Permalink }}</guid>
<description>{{ .Content | html }}</description>
</item>
{{ end }}
</channel>
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
<link>{{ .Permalink }}</link>
<description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
<generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
<language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
<managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
<webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
<copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
<lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
{{- with .OutputFormats.Get "RSS" -}}
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{- end -}}
{{ range (where .Site.RegularPages "Type" "blog") }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
{{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
<guid>{{ .Permalink }}</guid>
<description type="html">{{ .Summary | html }}</description>
<content:encoded>{{ .Content | html }}</content:encoded>
</item>
{{ end }}
</channel>
</rss>

3
layouts/_default/single.html

@ -1,4 +1,7 @@
{{ partial "top.html" . }}
<header>
<h1>{{ .Title }}</h1>
</header>
<article>
{{ .Content }}
</article>

14
layouts/blog/single.html

@ -1,6 +1,18 @@
{{ partial "top.html" . }}
<header>
<h1>{{ .Title }}</h1>
<div>
<span class="date">
{{- partial "icon" "clock" -}}
<time datetime="{{ .Date.Format "2006-01-02T15:04:05-0700" }}">{{ .Date.Format "2006-01-02" }}</time>
</span>
<span class="reading-time">
{{- partial "icon" "calendar" -}}
{{ .ReadingTime }} minutes read time
</span>
</div>
</header>
<article>
<h1>{{ .Title }} (<time>{{ .Date.Format "2006-01-02" }}</time>)</h1>
{{ .Content }}
</article>
{{ partial "bottom.html" . }}

15
layouts/index.html

@ -1 +1,14 @@
{{ template "_default/single.html" . }}
{{ partial "top.html" . }}
<header>
<h1>{{ .Title }}</h1>
</header>
<article>
{{ .Content }}
<h2>Latest posts</h2>
<ul class="pages blogs">
{{ range (where .Site.RegularPages "Type" "blog") }}
{{ partial "list-entry.html" . }}
{{ end }}
</ul>
</article>
{{ partial "bottom.html" . }}

1
layouts/partials/bottom.html

@ -1,3 +1,4 @@
{{ partial "footer.html" . }}
</section>
</body>
</html>

6
layouts/partials/brand.html

@ -0,0 +1,6 @@
<span class="brand-icon">
{{- $icon := print "icons/brands/" . ".svg" -}}
{{ with resources.Get $icon }}
{{ .Content | safeHTML }}
{{ end }}
</span>

22
layouts/partials/footer.html

@ -1,5 +1,21 @@
<footer>
{{ range where .Site.Pages "Title" "Footer" }}
{{ .Content }}
{{ end }}
<div class="left">
{{- if isset .Site.Params "gitlab" -}}
<a href="https://github.com/{{ $.Site.Params.gitlab }}">{{ partial "brand" "gitlab" }}</a>
{{- end -}}
{{- if isset .Site.Params "github" -}}
<a href="https://github.com/{{ $.Site.Params.github }}">{{ partial "brand" "github" }}</a>
{{- end -}}
{{- if isset .Site.Params "keybase" -}}
<a href="https://keybase.io/{{ $.Site.Params.keybase }}">{{ partial "brand" "keybase" }}</a>
{{- end -}}
{{- if isset .Site.Params "matrix" -}}
<a href="https://matrix.to/#/{{ $.Site.Params.matrix }}">{{ partial "brand" "matrix" }}</a>
{{- end -}}
</div>
<div class="right">
{{- with .CurrentSection.OutputFormats.Get "rss" -}}
<a href="{{ .Permalink }}">{{ partial "icon" "rss" }}</a>
{{- end -}}
</div>
</footer>

12
layouts/partials/head.html

@ -1,13 +1,15 @@
{{ $sass := resources.Get "styles.scss" }}
{{ $style := $sass | resources.ToCSS | resources.Minify }}
<head>
<title>{{ .Title }}</title>
<title>{{ .Title }} - {{ .Site.Title }}</title>
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg"/>
<link rel="alternate icon" type="image/png" href="/images/favicon.png">
<link rel="stylesheet" href="/css/styles.css">
<link rel="stylesheet" href="{{ $style.RelPermalink }}">
<link rel="stylesheet" href="/fonts/sourcesanspro/sourcesanspro.css">
<link rel="stylesheet" href="/fonts/sourcecodepro/sourcecodepro.css">
<link rel="stylesheet" href="/fonts/raleway/raleway.css">
{{ if .RSSLink -}}
<link href="{{ .RSSLink | relURL }}" rel="feed" type="application/rss+xml" title="{{ .Site.Title }}">
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .RelPermalink }}" title="{{ $.Site.Title }}" />
{{ end -}}
{{ with .Site.Params.description -}}
<meta name="description" content="{{ . }}">
@ -15,7 +17,7 @@
{{ with .Site.Params.author -}}
<meta name="author" content="{{ . }}">
{{ end -}}
{{ .Hugo.Generator }}
{{ hugo.Generator }}
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" >

6
layouts/partials/icon.html

@ -0,0 +1,6 @@
<span class="icon">
{{- $icon := print "icons/" . ".svg" -}}
{{ with resources.Get $icon }}
{{ .Content | safeHTML }}
{{ end }}
</span>

6
layouts/partials/list-entry.html

@ -0,0 +1,6 @@
<li>
{{ if not .Date.IsZero }}
<time>{{ .Date.Format "2006-01-02" }}</time>
{{ end }}
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
</li>

10
layouts/partials/nav.html

@ -2,19 +2,11 @@
<nav>
<ul>
{{ $currentNode := . }}
{{ $url := .URL }}
{{ $url := .RelPermalink }}
{{ range .Site.Menus.main.ByWeight }}
<li{{if or ($currentNode.IsMenuCurrent "main" .) (and (eq .Name "Home") (eq $url "/")) }} class="active"{{end}}>
<a href="{{ .URL }}" >{{ .Name }}</a>
</li>
{{ end }}
</ul>
<h2>Latest posts:</h2>
<ul>
{{ range first 5 (where (where .Site.Pages "Type" "blog") "IsPage" true) }}
<li{{if eq $currentNode . }} class="active"{{end}}>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
</li>
{{ end }}
</ul>
</nav>

9
layouts/partials/pagination.html

@ -1,9 +0,0 @@
<div>
{{ if .Paginator.HasPrev }}
<a href="{{ .Paginator.Prev.URL }}">Previous Page</a>
{{ end }}
{{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }}
{{ if .Paginator.HasNext }}
<a href="{{ .Paginator.Next.URL }}">Next Page</a>
{{ end }}
</div>

5
layouts/partials/summary.html

@ -1,5 +0,0 @@
<h1><a href="{{ .RelPermalink }}">{{ .Title }}</a> <time>({{ .Date.Format "2006-01-02" }})</time></h1>
<p>{{ .Summary }}</p>
{{ if .Truncated }}
<p><a href="{{ .RelPermalink }}">Read More…</a></p>
{{ end }}

10
layouts/partials/top.html

@ -2,11 +2,7 @@
<html lang="{{ .Site.LanguageCode }}">
{{ partial "head.html" . }}
<body>
<aside>
{{ partial "nav.html" . }}
</aside>
<section>
<header>
<a href="{{ .Site.BaseURL | relURL }}">{{ .Site.Title }}</a>
</header>
<aside>
{{ partial "nav.html" . }}
{{ partial "footer.html" . }}
</aside>

2
layouts/shortcodes/brand.html

@ -0,0 +1,2 @@
{{- $arg := .Get 0 -}}
{{- partial "brand" $arg -}}

2
layouts/shortcodes/icon.html

@ -0,0 +1,2 @@
{{- $arg := .Get 0 -}}
{{- partial "icon" $arg -}}

307
static/css/styles.less

@ -1,307 +0,0 @@
@black: rgb(22,22,22);
@white: (#FFF - @black);
@grey: @white/2;
@orange:rgb(233,128,22);
@side: @orange;
@back: @white;
@mainfont: 'Source Sans Pro Webfont', Helvetica, Arial, Sans-serif;
@headfont: 'Raleway Webfont', @mainfont;
@codefont: 'Source Code Pro Webfont', @mainfont;
// Layout
@view_max: 52em;
@left_side: 25%;
// Navigation size
@nav_min: @content_min/(100%/@left_side - 1);
@nav_width: 8em;
// Header font size
@header_scale: 10em;
// Content size
@content_pad: 1em;
@content_margin: @left_side/100% * @view_max - @nav_width + 2 * @content_pad;
@right_side: 100% - @left_side - 100%*@content_margin/@view_max;
@content_width: @view_max * @right_side/100%;
@content_min: @content_width/2 - 2*@content_pad;
.transition (@time) {
transition: all @time;
-moz-transition: all @time;
-webkit-transition: all @time;
-o-transition: all @time;
}
.hyphens {
hyphens: auto;
-moz-hyphens: auto;
-webkit-hyphens: auto;
-ms-hyphens: auto;
}
.bidi {
unicode-bidi: bidi-override;
direction: rtl;
}
h1,h2,h3,h4,h5 {
font-family: @headfont;
}
code, pre {
font-family: @codefont;
font-size: 94%;
xwhite-space: pre-wrap;
background-color: @white - @black;
border-radius: .2em;
padding: 0em .2em;
overflow: auto;
}
pre {
padding: .5em;
code {
white-space: pre;
padding: 0;
}
}
table {
margin: 1em auto;
border-collapse: collapse;
thead {
color: white;
background-color: @grey;
th {
font-weight: 200;
}