about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/jekyll.yml20
-rw-r--r--.gitmodules3
-rw-r--r--404.html25
-rw-r--r--Gemfile30
-rw-r--r--Gemfile.lock85
-rw-r--r--_config.yml116
-rw-r--r--_drafts/menglish.md26
-rw-r--r--_includes/custom-head.html5
-rw-r--r--_includes/custom-webring.html51
-rw-r--r--_includes/footer.html38
-rw-r--r--_layouts/post.html65
-rw-r--r--archetypes/default.md6
-rw-r--r--config.toml65
-rw-r--r--conlang.md30
-rw-r--r--contact.md48
-rw-r--r--content/about.md (renamed from about.md)24
-rw-r--r--content/homepage/about.md7
-rw-r--r--content/homepage/index.md3
-rw-r--r--content/homepage/work.md7
-rw-r--r--content/posts/2021-01-02-wordpress.fr.md114
-rw-r--r--content/posts/2021-01-02-wordpress.md (renamed from _posts/2021-01-02-giving-up-on-wordpress.markdown)9
-rw-r--r--content/posts/2021-01-09-big-tech.md (renamed from _posts/2021-01-09-moving-away-from-big-brothers.markdown)9
-rw-r--r--content/posts/2021-01-11-openring.fr.md113
-rw-r--r--content/posts/2021-01-11-openring.md (renamed from _posts/2021-01-11-using-openring-to-add-blogs-you-follow.md)9
-rw-r--r--content/posts/2021-02-08-naming.md (renamed from _posts/2021-02-08-enough-for-first-name-last-name-bs.md)8
-rw-r--r--content/social.md (renamed from social.md)18
-rw-r--r--content/works.md (renamed from work.md)20
-rwxr-xr-xcreate-webring.sh2
-rw-r--r--glossary.md32
-rw-r--r--index.markdown6
-rw-r--r--layouts/_default/single.html26
-rw-r--r--layouts/partials/footer-extra.html12
-rw-r--r--layouts/partials/head-extra.html5
-rw-r--r--layouts/partials/languageSelect.html10
-rwxr-xr-xnewpost.sh21
-rw-r--r--static/css/custom.css68
-rw-r--r--static/favicon.icobin0 -> 15406 bytes
-rw-r--r--static/images/android-chrome-192x192.pngbin0 -> 1510 bytes
-rw-r--r--static/images/android-chrome-512x512.pngbin0 -> 3768 bytes
-rw-r--r--static/images/apple-touch-icon.pngbin0 -> 1350 bytes
-rw-r--r--static/images/favicon-16x16.pngbin0 -> 217 bytes
-rw-r--r--static/images/favicon-32x32.pngbin0 -> 296 bytes
-rw-r--r--static/images/favicon.icobin0 -> 15406 bytes
-rw-r--r--static/images/site.webmanifest1
m---------themes/anubis0
-rw-r--r--webring.template2
46 files changed, 509 insertions, 630 deletions
diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml
deleted file mode 100644
index 64df081..0000000
--- a/.github/workflows/jekyll.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-name: Jekyll site CI
-
-on:
-  push:
-    branches: [ master ]
-  pull_request:
-    branches: [ master ]
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v2
-    - name: Build the site in the jekyll/builder container
-      run: |
-        docker run \
-        -v ${{ github.workspace }}:/srv/jekyll -v ${{ github.workspace }}/_site:/srv/jekyll/_site \
-        jekyll/builder:latest /bin/bash -c "chmod 777 /srv/jekyll && jekyll build --future"
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..5a69223
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "themes/anubis"]
+	path = themes/anubis
+	url = https://github.com/mitrichius/hugo-theme-anubis.git
diff --git a/404.html b/404.html
deleted file mode 100644
index 086a5c9..0000000
--- a/404.html
+++ /dev/null
@@ -1,25 +0,0 @@
----
-permalink: /404.html
-layout: default
----
-
-<style type="text/css" media="screen">
-  .container {
-    margin: 10px auto;
-    max-width: 600px;
-    text-align: center;
-  }
-  h1 {
-    margin: 30px 0;
-    font-size: 4em;
-    line-height: 1;
-    letter-spacing: -1px;
-  }
-</style>
-
-<div class="container">
-  <h1>404</h1>
-
-  <p><strong>Page not found :(</strong></p>
-  <p>The requested page could not be found.</p>
-</div>
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index 2d8b58c..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,30 +0,0 @@
-source "https://rubygems.org"
-# Hello! This is where you manage which Jekyll version is used to run.
-# When you want to use a different version, change it below, save the
-# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
-#
-#     bundle exec jekyll serve
-#
-# This will help ensure the proper Jekyll version is running.
-# Happy Jekylling!
-gem "jekyll", "~> 4.2.0"
-# This is the default theme for new Jekyll sites. You may change this to anything you like.
-gem "minima", git: "https://github.com/jekyll/minima"
-# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
-# uncomment the line below. To upgrade, run `bundle update github-pages`.
-# gem "github-pages", group: :jekyll_plugins
-# If you have any plugins, put them here!
-group :jekyll_plugins do
-  gem "jekyll-feed", "~> 0.12"
-end
-
-# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
-# and associated library.
-platforms :mingw, :x64_mingw, :mswin, :jruby do
-  gem "tzinfo", "~> 1.2"
-  gem "tzinfo-data"
-end
-
-# Performance-booster for watching directories on Windows
-gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
-
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index b259b1b..0000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,85 +0,0 @@
-GIT
-  remote: https://github.com/jekyll/minima
-  revision: 3cdd14dff1216f561c68329e0b7420c2dc9b796a
-  specs:
-    minima (2.5.1)
-      jekyll (>= 3.5, < 5.0)
-      jekyll-feed (~> 0.9)
-      jekyll-seo-tag (~> 2.1)
-
-GEM
-  remote: https://rubygems.org/
-  specs:
-    addressable (2.7.0)
-      public_suffix (>= 2.0.2, < 5.0)
-    colorator (1.1.0)
-    concurrent-ruby (1.1.7)
-    em-websocket (0.5.2)
-      eventmachine (>= 0.12.9)
-      http_parser.rb (~> 0.6.0)
-    eventmachine (1.2.7)
-    ffi (1.14.2)
-    forwardable-extended (2.6.0)
-    http_parser.rb (0.6.0)
-    i18n (1.8.7)
-      concurrent-ruby (~> 1.0)
-    jekyll (4.2.0)
-      addressable (~> 2.4)
-      colorator (~> 1.0)
-      em-websocket (~> 0.5)
-      i18n (~> 1.0)
-      jekyll-sass-converter (~> 2.0)
-      jekyll-watch (~> 2.0)
-      kramdown (~> 2.3)
-      kramdown-parser-gfm (~> 1.0)
-      liquid (~> 4.0)
-      mercenary (~> 0.4.0)
-      pathutil (~> 0.9)
-      rouge (~> 3.0)
-      safe_yaml (~> 1.0)
-      terminal-table (~> 2.0)
-    jekyll-feed (0.15.1)
-      jekyll (>= 3.7, < 5.0)
-    jekyll-sass-converter (2.1.0)
-      sassc (> 2.0.1, < 3.0)
-    jekyll-seo-tag (2.7.1)
-      jekyll (>= 3.8, < 5.0)
-    jekyll-watch (2.2.1)
-      listen (~> 3.0)
-    kramdown (2.3.0)
-      rexml
-    kramdown-parser-gfm (1.1.0)
-      kramdown (~> 2.0)
-    liquid (4.0.3)
-    listen (3.4.0)
-      rb-fsevent (~> 0.10, >= 0.10.3)
-      rb-inotify (~> 0.9, >= 0.9.10)
-    mercenary (0.4.0)
-    pathutil (0.16.2)
-      forwardable-extended (~> 2.6)
-    public_suffix (4.0.6)
-    rb-fsevent (0.10.4)
-    rb-inotify (0.10.1)
-      ffi (~> 1.0)
-    rexml (3.2.4)
-    rouge (3.26.0)
-    safe_yaml (1.0.5)
-    sassc (2.4.0)
-      ffi (~> 1.9)
-    terminal-table (2.0.0)
-      unicode-display_width (~> 1.1, >= 1.1.1)
-    unicode-display_width (1.7.0)
-
-PLATFORMS
-  x86_64-linux
-
-DEPENDENCIES
-  jekyll (~> 4.2.0)
-  jekyll-feed (~> 0.12)
-  minima!
-  tzinfo (~> 1.2)
-  tzinfo-data
-  wdm (~> 0.1.1)
-
-BUNDLED WITH
-   2.2.4
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 1eb2c27..0000000
--- a/_config.yml
+++ /dev/null
@@ -1,116 +0,0 @@
-# Welcome to Jekyll!
-#
-# This config file is meant for settings that affect your whole blog, values
-# which you are expected to set up once and rarely edit after that. If you find
-# yourself editing this file very often, consider using Jekyll's data files
-# feature for the data you need to update frequently.
-#
-# For technical reasons, this file is *NOT* reloaded automatically when you use
-# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
-#
-# If you need help with YAML syntax, here are some quick references for you: 
-# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
-# https://learnxinyminutes.com/docs/yaml/
-#
-# Site settings
-# These are used to personalize your new site. If you look in the HTML files,
-# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
-# You can create any custom variable you would like, and they will be accessible
-# in the templates via {{ site.myvariable }}.
-
-title: Huy Ngo's blog
-author: Ngô Ngọc Đức Huy
-email: huyngo@disroot.org
-description: >- # this means to ignore newlines until "baseurl:"
-  This is Huy's blog, built with Jekyll. Its source code is released under MIT License.
-  Its content is released under CC-BY-SA-4.0.
-baseurl: "" # the subpath of your site, e.g. /blog
-url: "" # the base hostname & protocol for your site, e.g. http://example.com
-
-timezone: Asia/Ho_Chi_Minh
-
-# Build settings
-theme: minima
-kramdown:
-  toc_levels: 1..1
-minima:
-  skin: dark
-  date_format: "%Y-%m-%d"
-  social_links:
-    mastodon:
-      - username: huy_ngo
-        instance: fosstodon.org
-    github:  Huy-Ngo
-    twitter: false
-plugins:
-  - jekyll-feed
-
-# Exclude from processing.
-# The following items will not be processed, by default.
-# Any item listed under the `exclude:` key here will be automatically added to
-# the internal "default list".
-#
-# Excluded items can be processed by explicitly listing the directories or
-# their entries' file path in the `include:` list.
-#
-exclude:
-  - .sass-cache/
-  - .jekyll-cache/
-  - gemfiles/
-  - Gemfile
-  - Gemfile.lock
-  - node_modules/
-  - vendor/bundle/
-  - vendor/cache/
-  - vendor/gems/
-  - vendor/ruby/
-  - _drafts/
-  - README.md
-  - .gitignore
-  - .git/
-  - LICENSE
-  - newpost.sh
-  - webring.template
-  - create-webring.sh
-
-defaults:
-    -
-     scope:
-         path: ""
-     values:
-         lang: en
-         link-str: Read this post in English
-         correct: >
-           If you find a mistake in my post,
-           please send me an email about that.
-         base-url: "/"
-    -
-     scope:
-         path: fr
-     values:
-         lang: fr
-         link-str: Lire ce post en français
-         correct: >
-           Si vous trouvez un erreur dans mon post,
-           envoyez-moi un email pour le corriger, s'il vous plait.
-         base-url: "/fr/"
-    -
-     scope:
-         path: de
-     values:
-         lang: de
-         link-str: Diesen Beitrag auf Deutsch lesen
-         correct: >
-           Wenn Sie finden eine Fehlung in meinem Beitrag,
-           schicken Sie mir darüber ein Email, bitte.
-         base-url: "/de/"
-    -
-     scope:
-         path: vi
-     values:
-         lang: vi
-         link-str: Đọc bài viết này bằng tiếng Việt
-         correct: >
-           Nếu bạn thấy có sai sót gì trong bài viết,
-           hãy nói với tôi qua email.
-         base-url: "/vi/"
diff --git a/_drafts/menglish.md b/_drafts/menglish.md
deleted file mode 100644
index ff7b8f2..0000000
--- a/_drafts/menglish.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-layout: page
-title: mEnglish
-permalink: /menglish/
----
-You may notice I sometimes use some weird or archaic English grammar or vocabulary.
-This is intentional. I treat language like I treat software: If I don't like it, I modify
-it, or I make a new one. Of course, the latter requires considerable effort, so while
-I may enjoy the process, it may be not practical. Moreover, not many people would learn
-my conlang if I made one.
-
-I call this modification "mEnglish"; "m" stands for "me", "my", or "modified".
-
-# Pronoun
-
-## Thou
-
-Originally, 
-
-## Ze
-
-# Syntax
-# Vocabulary
-
-whence
-: from where
diff --git a/_includes/custom-head.html b/_includes/custom-head.html
deleted file mode 100644
index 38fa5de..0000000
--- a/_includes/custom-head.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<link rel="stylesheet" href="/assets/css/custom.css">
-<link rel="apple-touch-icon" sizes="180x180" href="/assets/images/apple-touch-icon.png">
-<link rel="icon" type="image/png" sizes="32x32" href="/assets/images/favicon-32x32.png">
-<link rel="icon" type="image/png" sizes="16x16" href="/assets/images/favicon-16x16.png">
-<link rel="manifest" href="/assets/images/site.webmanifest">
diff --git a/_includes/custom-webring.html b/_includes/custom-webring.html
deleted file mode 100644
index 3a8e472..0000000
--- a/_includes/custom-webring.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<section class="webring">
-  <h2>
-    Articles from blogs I read
-    <small class="attribution">
-      Generated by
-      <a href="https://git.sr.ht/~sircmpwn/openring">openring</a>
-    </small>
-  </h2>
-  <section class="footer-col-wrapper">
-    
-    <div class="footer-col article">
-      <h4 class="title">
-        <a href="https://stallman.org/archives/2021-jan-apr.html#13_March_2021_%28Yemeni_journalist_jailed%29" target="_blank" rel="noopener">Yemeni journalist jailed</a>
-      </h4>
-      <p class="summary">
-
-Proxies of the UAE have jailed Yemeni journalist Adel al-Hasani,
-who reported on ties between UAE and al-Qa&#39;ida.
-
-
-</p>
-      <small class="source">
-        via <a href="https://stallman.org/archives/polnotes.html">Richard Stallman&#39;s Political Notes</a>
-      </small>
-      <small class="date">March 13, 2021</small>
-    </div>
-    
-    <div class="footer-col article">
-      <h4 class="title">
-        <a href="https://www.eff.org/deeplinks/2021/03/seattle-and-portland-say-no-public-private-surveillance-networks" target="_blank" rel="noopener">Seattle and Portland: Say No to Public-Private Surveillance Networks</a>
-      </h4>
-      <p class="summary">An organization calling itself Safe Cities Northwest is aiming to create public-private surveillance networks in Portland, Oregon and Seattle, Washington. The organization claims that it is building off of a “successful model for public safety” that it bu…</p>
-      <small class="source">
-        via <a href="https://www.eff.org/rss/updates.xml">Deeplinks</a>
-      </small>
-      <small class="date">March 12, 2021</small>
-    </div>
-    
-    <div class="footer-col article">
-      <h4 class="title">
-        <a href="https://news.opensuse.org/2021/03/11/opensuse-project-selected-for-gsoc-mentoring/" target="_blank" rel="noopener">openSUSE Project Selected for Google Summer of Code Mentoring</a>
-      </h4>
-      <p class="summary">Let’s gehts los! The openSUSE Project is one of about 200 mentoring organizations selected for this year’s Google Summer of Code. The openSUSE Project has participated in several GSoC events since 2006 and the project’s mentors have helped more than 60 st…</p>
-      <small class="source">
-        via <a href="https://news.opensuse.org">openSUSE News</a>
-      </small>
-      <small class="date">March 11, 2021</small>
-    </div>
-    
-  </section>
-</section>
diff --git a/_includes/footer.html b/_includes/footer.html
deleted file mode 100644
index ca0157a..0000000
--- a/_includes/footer.html
+++ /dev/null
@@ -1,38 +0,0 @@
-{%- include custom-webring.html -%}
-<footer class="site-footer h-card">
-  <data class="u-url" href="{{ "/" | relative_url }}"></data>
-
-  <div class="wrapper">
-
-    <div class="footer-col-wrapper">
-      <div class="footer-col">
-        <p class="feed-subscribe">
-          <a href="{{ 'feed.xml' | relative_url }}">
-            <svg class="svg-icon orange">
-              <use xlink:href="{{ 'assets/minima-social-icons.svg#rss' | relative_url }}"></use>
-            </svg><span>Subscribe</span>
-          </a>
-        </p>
-      {%- if site.author %}
-        <ul class="contact-list">
-          {% if site.author.name -%}
-            <li class="p-name">{{ site.author.name | escape }}</li>
-          {% endif -%}
-          {% if site.author.email -%}
-            <li><a class="u-email" href="mailto:{{ site.author.email }}">{{ site.author.email }}</a></li>
-          {%- endif %}
-        </ul>
-      {%- endif %}
-      </div>
-      <div class="footer-col">
-        <p>{{ site.description | escape }}</p>
-      </div>
-    </div>
-
-    <div class="social-links">
-      {%- include social.html -%}
-    </div>
-
-  </div>
-
-</footer>
diff --git a/_layouts/post.html b/_layouts/post.html
deleted file mode 100644
index 03c0609..0000000
--- a/_layouts/post.html
+++ /dev/null
@@ -1,65 +0,0 @@
----
-layout: default
----
-
-{% assign postsTrans=site.posts | where:"ref", page.ref | sort: 'lang' %}
-
-{% if postsTrans.size == 0 %}
-  {% assign postsTrans=site.pages | where:"ref", page.ref | sort: 'lang' %}
-{% endif %}
-
-<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
-
-  <header class="post-header">
-    <h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1>
-    <p class="post-meta">
-      {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%}
-      <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
-        {{ page.date | date: date_format }}
-      </time>
-      {%- if page.modified_date -%}
-        ~
-        {%- assign mdate = page.modified_date | date_to_xmlschema -%}
-        <time class="dt-modified" datetime="{{ mdate }}" itemprop="dateModified">
-          {{ mdate | date: date_format }}
-        </time>
-      {%- endif -%}
-      {%- if page.author -%}
-        • {% for author in page.author %}
-          <span itemprop="author" itemscope itemtype="http://schema.org/Person">
-            <span class="p-author h-card" itemprop="name">{{ author }}</span></span>
-            {%- if forloop.last == false %}, {% endif -%}
-        {% endfor %}
-      {%- endif -%}</p>
-  </header>
-
-  {% if postsTrans.size != 1 %}
-  <div class="lang">
-    <ul>
-      {% for post in postsTrans %}
-      {% if post.lang != page.lang %}
-      <li>
-        <a class="{{ post.lang }}" href="{{ site.base-url }}{{ post.url }}">
-          {{ post.link-str }}
-        </a>
-      </li>
-      {% endif %}
-      {% endfor %}
-    </ul>
-    {{ page.correct }}
-  </div>
-
-  <hr>
-
-  {% endif %}
-
-  <div class="post-content e-content" itemprop="articleBody">
-    {{ content }}
-  </div>
-
-  {%- if site.disqus.shortname -%}
-    {%- include disqus_comments.html -%}
-  {%- endif -%}
-
-  <a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
-</article>
diff --git a/archetypes/default.md b/archetypes/default.md
new file mode 100644
index 0000000..00e77bd
--- /dev/null
+++ b/archetypes/default.md
@@ -0,0 +1,6 @@
+---
+title: "{{ replace .Name "-" " " | title }}"
+date: {{ .Date }}
+draft: true
+---
+
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..cdca60f
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,65 @@
+baseURL = "http://example.org/"
+copyright = "CC-BY-SA 4.0"
+defaultContentLanguage = "en"
+languageCode = "en-us"
+summaryLength = 0
+title = "Huy's site"
+theme = "anubis"
+AvailableText = "This post is available in:"
+
+[languages]
+
+[languages.en]
+about = "About"
+languageName = "English"
+
+[languages.fr]
+about = "À propos"
+languageName = "Français"
+
+[[languages.fr.menu.main]]
+identifier = "about"
+name = "À propos"
+url = "/about/"
+weight = 1
+
+[[languages.fr.menu.main]]
+identifier = "tags"
+name = "Étiquettes"
+url = "/tags/"
+weight = 2
+
+[[languages.fr.menu.main]]
+identifier = "archive"
+name = "Archive"
+url = "/posts/"
+weight = 3
+
+[menu]
+[[menu.main]]
+identifier = "about"
+name = "About"
+url = "/about/"
+weight = 1
+
+[[menu.main]]
+identifier = "tags"
+name = "Tags"
+url = "/tags/"
+weight = 2
+
+[[menu.main]]
+name = "Archive"
+identifier = "archive"
+url = "/posts/"
+weight = 3
+
+[params]
+author = "Ngô Ngọc Đức Huy"
+email = "huyngo@disroot.org"
+style = "auto"
+custom_css = ["css/custom.css"]
+
+
+[markup.goldmark.renderer]
+unsafe = true
diff --git a/conlang.md b/conlang.md
deleted file mode 100644
index 9075239..0000000
--- a/conlang.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: page
-title: Conlang
-language: en
-ref: conlang
----
-
-# Conlang
-
-You can find my posts about conlanging here:
-
-<ul>
-  {% for post in site.categories.conlang %}
-    {% if post.url %}
-        <li><a href="{{ post.url }}">{{ post.title }}</a></li>
-    {% endif %}
-  {% endfor %}
-</ul>
-
-# Hàësdáaga
-
-You can find my posts about my conlang Hàësdáaga here:
-
-<ul>
-  {% for post in site.categories.haesdaaga %}
-    {% if post.url %}
-        <li><a href="{{ post.url }}">{{ post.title }}</a></li>
-    {% endif %}
-  {% endfor %}
-</ul>
diff --git a/contact.md b/contact.md
deleted file mode 100644
index cdc7cdb..0000000
--- a/contact.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-layout: page
-title: Contact
-language: en
-ref: contact
-permalink: /about/contact
----
-
-If you don't know me, it's probably best to contact me via [email][email].
-
-# Language
-
-- I prefer English as my working language, but feel free to use any other if it's relevant.
-- Call me Huy, not Ngo. Vietnamese people don't refer to each other by family name.
-- No need for Mr., just the name is fine.
-
-# Attachment
-
-- [Don't send Word documents][no-word], and don't tell me to use it.
-- Similarly, don't send RAR archive. Maybe avoid sending archive in general.
-- Avoid sending videos (send a PeerTube link instead for example),
-  executables (send link to source code instead with instruction to build).
-
-# Send in plain text
-
-I probably would not read HTML emails, which is problematic.
-Read [this page][useplaintext] to see how to write mail in plain text file.
-
-## What if I want to include an image?
-
-Attach it as a file and refer to that. Maybe avoid images as a whole
-
-## Links are usually long and I'm afraid it can be disruptive
-
-You can use reference, like this:
-
-	Please read the post [1] for more information.
-	...
-
-	[1]: https://example.org/this-link-is-long-and-disruptive
-
-[disroot]: mailto:huyngo@disroot.org
-[email]: mailto:huyngo@disroot.org
-[fosstodon]: https://fosstodon.org/@huy_ngo
-[gmail]: mailto:duchuy29092000@gmail.com
-[matrix]: https://matrix.to/#/@xarvos:matrix.org
-[no-word]: https://www.gnu.org/philosophy/no-word-attachments.html
-[useplaintext]: https://useplaintext.email
diff --git a/about.md b/content/about.md
index deea833..c1c3d0e 100644
--- a/about.md
+++ b/content/about.md
@@ -1,9 +1,25 @@
 ---
-layout: page
 title: About
 language: en
 ref: about
-permalink: /about/
+menu:
+  about:
+    identifier: about
+    name: About
+    url: /about/
+    weight: 1
+  social:
+    identifier: social
+    parent: about
+    name: Social media
+    url: /about/social/
+    weight: 2
+  works:
+    identifier: works
+    parent: about
+    name: Works
+    url: /about/works/
+    weight: 3
 ---
 
 I am Huy. Use the pronoun "he" to refer to me in third person.  I'm from
@@ -41,10 +57,6 @@ This means you are free to share the posts and modify them, provided that you
 attribute properly, link to the original content, and state your changes.
 Additionally, you have to share those changes under the same license.
 
-# Acknowledgement
-
-This blog is built with [jekyll] and its [minima] theme. I used [openring] to generate others' blog posts from RSS feed.
-
 # Donate
 
 I receive donate on [liberapay/huy.ngo][liberapay] and [patreon/\_\_huy_ngo\_\_][patreon].
diff --git a/content/homepage/about.md b/content/homepage/about.md
new file mode 100644
index 0000000..7b4bc91
--- /dev/null
+++ b/content/homepage/about.md
@@ -0,0 +1,7 @@
+---
+title: 'Our Difference'
+button: 'About us'
+weight: 2
+---
+
+Lorem ipsum dolor sit amet, et essent mediocritatem quo, choro volumus oporteat an mei. ipsum dolor sit amet, et essent mediocritatem quo,
diff --git a/content/homepage/index.md b/content/homepage/index.md
new file mode 100644
index 0000000..ca03031
--- /dev/null
+++ b/content/homepage/index.md
@@ -0,0 +1,3 @@
+---
+headless: true
+---
diff --git a/content/homepage/work.md b/content/homepage/work.md
new file mode 100644
index 0000000..28c7b89
--- /dev/null
+++ b/content/homepage/work.md
@@ -0,0 +1,7 @@
+---
+title: 'We Help Business Grow'
+button: 'Our Work'
+weight: 1
+---
+
+Lorem ipsum dolor sit amet, et essent mediocritatem quo, choro volumus oporteat an mei. Numquam dolores mel eu, mea docendi omittantur et, mea ea duis erat. Elit melius cu ius. Per ex novum tantas putant, ei his nullam aliquam apeirian. Aeterno quaestio constituto sea an, no eum intellegat assueverit. 
diff --git a/content/posts/2021-01-02-wordpress.fr.md b/content/posts/2021-01-02-wordpress.fr.md
new file mode 100644
index 0000000..d0a54e7
--- /dev/null
+++ b/content/posts/2021-01-02-wordpress.fr.md
@@ -0,0 +1,114 @@
+---
+category: blog
+date:   2021-01-02 14:44:00 +0700
+lang: fr
+tags: [blog, wordpress, writing, selfhost]
+title:  "Je quitte WordPress"
+translationKey: "give-up-wp"
+---
+
+Pendant la semaine dernière, j'installe à peine ma propre instance de WordPress,
+parce que j'ai accès à un serveur et je peux utiliser un nom de domaine gratuit.
+Mais c'était quel horreur. <!--more-->
+
+# Pourquoir écrire un blog
+
+J'écris pour le faire mieux (et pour me défier de écrire des articles en langues
+à part anglais). Il y avait longtemps que je n'ai rien écrit que le code.
+Mais écrire des essais c'est important pour moi : pour ma graduation, il faut écrire
+des rapports et un thèse.
+
+Mais ce n'est pas la seule raison. C'est aussi un moyen de m'exprimer. Le média sociel
+peut m'aider à le faire, mais je quitte Facebook à cause du manque de confidentialité
+premièrement et de la haine partout où je cherche le divertissement, et Mastodon a une
+limitation de caractères pour une publication. Les catégories et les tags sont aussi
+des aides pour mettre des publications en ordre.
+
+# Choisir WordPress
+
+WordPress c'est une plate-forme populaire pour blogger. Au debut je pensais de choisir
+wordpress.com, car il est déjà hébergé. Mais j'ai découvert qu'il mettrais des ads
+sur mes blogs sans mon approbation. De plus, si je héberge moi-même, j'ai du contrôle.
+Je ne veux pas que mes lecteurs doivent voir les ads qui sont mis par un tier.
+
+Le serveur fonctionne sous Ubuntu 16.04, qui est très vieux. Ainsi, il n'a pas les plus
+récents paquets, y compris Apache, PHP, et WordPress, et je n'ose pas le mettre à niveau.
+
+J'y avait déjà des autres services avec nginx, alors je préfère utiliser nginx comme
+serveur web. Il y a [un guide][wp-nginx] pour exactement ça, mais malheureusement,
+ces fichiers de la configuration sont longs et j'ai peur de mettre quelque chose en panne
+cependant (et de plus, je suis paresseux ;) ).
+
+Alors, c'est ça, j'utilise Apache, ce n'est pas une mauvaise chose, et j'utilise nginx
+comme proxy inverse. Ça a marché.
+
+# Utiliser Docker
+
+J'ai aussi essaié docker. Je me demandais pourquoi je n'avais pas penser à
+cette solution plus tôt.
+J'ai récemment utilisé docker très fréquemment, e.g. pour CouchDB et RethinkDB, qui
+ne sont pas paqueté pour Tumbleweed, our SQLServer et MongoDB, qui étaient nécessaire
+pour mon cours de base de données.
+
+Docker exécute des programmes dans un container ( « conteneur » ) que 
+l'on peut facilement configurer avec docker-compose ou par ligne de commande.
+Surtout, on peut être sûr que ça marche.
+
+Et ça marche merveilleusement.
+
+# Redirection de port
+
+Ce n'était pas un problème que WordPress a créé, c'était ma faute, mais comme la faute
+est aussi une leçon, je la raconte quand même.
+
+Pour ne pas faire la même faute à l'avenir: il faut lier les fichiers configs dans
+`/etc/nginx/sites-available/` à `/etc/nginx/sites-enabled/` avec des paths absolus,
+sinon le lien serait cassé et ne marcherait pas.
+
+# Changer le nom casse les liens
+
+WordPress utilise apparamment des liens absolus (`example.com/blog/quelque-chose`)
+au lieu des liens relatifs (`/blog/quelque-chose`).
+C'est pas un bon pratique : si je change le hébergeur ou le nom de domain
+(qui arrivera sûrement, car les noms de domaine gratuits expiront tôt ou tard).
+Je l'ai découvert quand je changeais de IP du hébergeur au nom de domaine.
+
+# Des expériences déçues
+
+WordPress n'est pas la chose pour moi. Il contient trop de drag-and-drop pour écrire
+un post que je trouve difficile à utiliser. Il contient aussi beaucoup de widgets que
+je ne jamais utiliser et qui prend trop de temps à charger.
+
+Étant résultat, je n'ai pas envie d'y écrire.
+
+# Write.as
+
+Et puis quelqu'un sur Mastodon m'a fait savoir de write.as.
+Cette service utilise Markdown pour rendre les posts, et comme Markdown est si facile
+à écrire, je l'aimais immédiatement.
+
+[WriteFreely][writefreely] est le logiciel grâce auquel write.as fonctionne. J'ai
+hébergé une instance moi-même, et il marchait exactement comme j'en ai attendu.
+
+# Mise à jour
+
+J'ai essayé [jekyll][jekyll], et c'est merveilleux.
+
+Maintenant mon blog est sur [GitHub](https://huy-ngo.github.io)
+et [huyngo.cf](http://huyngo.cf). GitHub ne supporte pas des thèmes que j'utilise, alors
+là le blog ne apparaît correctement.
+
+Jekyll est meilleur que WriteFreely pour moi, parce que les posts sont stockés simplement
+comme texte plain, par contre WriteFreely les stocke dans SQL, ce que je considère
+un overhead. Le seul désavantage c'est que je n'ai jamais appris Ruby avant.
+
+J'ai envie d'essayer [Hugo][hugo], qui est programmé dans Go, une langue que je connais
+mieux que Ruby. En outre, Hugo supporte rendre des pages pour gemini, que je veux aussi
+essayer.
+Mais ça va attendre, je ne devrais pas dépenser trop de temps pour
+la choice de techonologie.
+
+[wp-nginx]: https://wordpress.org/support/article/nginx/
+[writefreely]: https://github.com/writeas/writefreely
+[jekyll]: https://jekyllrb.com/
+[hugo]: https://gohugo.io
diff --git a/_posts/2021-01-02-giving-up-on-wordpress.markdown b/content/posts/2021-01-02-wordpress.md
index 708d029..8bd82a0 100644
--- a/_posts/2021-01-02-giving-up-on-wordpress.markdown
+++ b/content/posts/2021-01-02-wordpress.md
@@ -1,11 +1,10 @@
 ---
-layout: post
-title:  "Giving up on WordPress!"
+category: blog
 date:   2021-01-02 14:44:00 +0700
-tags: blog wordpress writing selfhost
 lang: en
-ref: give-up-wp
-categories: blog
+translationKey: "give-up-wp"
+tags: [blog, wordpress, writing, selfhost]
+title:  "Giving up on WordPress!"
 ---
 For the last week, I was trying to setting up my own WordPress instance, since I have access to a server and use a free domain name. It was such a hassle. <!--more-->
 
diff --git a/_posts/2021-01-09-moving-away-from-big-brothers.markdown b/content/posts/2021-01-09-big-tech.md
index e1007e9..a948d08 100644
--- a/_posts/2021-01-09-moving-away-from-big-brothers.markdown
+++ b/content/posts/2021-01-09-big-tech.md
@@ -1,11 +1,10 @@
 ---
-layout: post
-title:  "Moving away from Big Brother(s)"
+category: blog
 date:   2021-01-09 14:44:00 +0700
-tags: software freedom surveillance communication privacy
 lang: en
-ref: big-bros
-categories: freedom privacy
+translationKey: "big-bros"
+tags: [software, freedom, surveillance, communication, privacy]
+title:  "Moving away from Big Brother(s)"
 ---
 
 Due to a [recent event][whatsapp], people have been actively moving away from it to Telegram[^1] or Signal.
diff --git a/content/posts/2021-01-11-openring.fr.md b/content/posts/2021-01-11-openring.fr.md
new file mode 100644
index 0000000..353361f
--- /dev/null
+++ b/content/posts/2021-01-11-openring.fr.md
@@ -0,0 +1,113 @@
+---
+category: blog
+date:   2021-01-11 15:51:31 +0700
+lang: fr
+tags: [rss, blog, openring, tutorial]
+title:  "Ajouter des blogs qu'on suit avec openring"
+translationKey: "openring-tutor"
+---
+
+J'ai ajouté une section près du bas de page : une liste d'articles de blogs auxquels
+je m'abonne. Elle est générée par [openring], un outil qui réçoit le flux de RSS et
+génère un webring.
+
+Je l'ai découvert pendant lire [le blog de Drew DeVault][ddvault] (qui l'a créé).
+Comme je pense qu'il est un moyen de soutenir les auteurs qu'on aime
+et cependant partager des articles géniaux aux lecteurs, alors, je l'ai ajouté dans mon
+blog.
+
+Ce post va vous apprendre comment l'ajouter à votre blog.
+
+# Installer openring
+
+Je ne suis pas sûr qu'il y ait un paquet precompilé pour openring,
+donc on va l'installer de la source.
+
+## Installer des dépendances
+
+Openring dépends de golang.  Quand ça marche avec go1.14, la version la plus récente
+sur la dépôt de mon distro Tumbleweed, mais je recommande installer la plus récente
+sur [golang].
+
+Vous pouvez lire l'instruction de [golang].
+
+## Compiler openring de la source
+
+D'abord, clonez le dépôt:
+
+```bash
+git clone https://git.sr.ht/~sircmpwn/openring
+```
+
+Après, compilez le paquet et copiez-le à `/usr/local/bin` pour l'exécuter:
+
+```bash
+go build -o openring
+sudo cp openring /usr/local/bin/
+```
+
+# Customiser l'apparence
+
+Selon le README de openring:
+
+> This is a tool for generating a webring from RSS feeds, so you can link to other blogs you like on your own blog. It's designed to be fairly simple and integrate with any static site generator. The basic usage is:
+> 
+> ```bash
+> openring \
+>   -s https://drewdevault.com/feed.xml \
+>   -s https://emersion.fr/blog/rss.xml \
+>   -s https://danluu.com/atom.xml \
+>   < in.html \
+>   > out.html
+> ```
+
+Le fichier `in.html` est un modèle duquel openring génère le HTML pour le flux.
+
+Je l'ai copié de [le blog de DeVault][ring-tmpl] (ne vous inquiétez pas, c'est partagé
+avec un license MIT),
+avec des modifications:
+
+- J'ai mis le webring dans un `div.wrapper`.
+	La class `wrapper` est une class dans le thème minima
+	qui limite le largeur maximum, ce qui aide lisibilité
+- J'ai ajouté  `footer-col` pour chaque article. Cette classe rendre les articles
+	en colonne grâce à minima.
+- J'ai ajouté une bordure pour les article avec sass
+	(le code est aussi basé sur celui de DeVault)
+
+```scss
+---
+---
+
+.webring {
+  margin-bottom: 1rem;
+  .attribution {
+    float: right;
+    font-size: .8rem;
+    line-height: 3;
+  }
+
+  .footer-col.article {
+    padding: 0.5rem;
+
+    margin: 0 0.5rem;
+    border: 0.01rem solid #333;
+    @media(max-width: 640px) {
+      margin: 0.5rem 0;
+    }   
+  }
+}
+```
+
+# Chose à faire?
+
+Je génère le flux manuellement quand je mis mon blog à jour en ce moment.
+C'est probablement pas une bonne chose si je veux que le webring soit à jour
+même quand je ne suis pas actif.
+Un cronjob peut résoudre ce problème, mais je le laisse comme exercice pour les lecteurs.
+
+[openring]: https://git.sr.ht/~sircmpwn/openring
+[ddvault]: https://drewdevault.com/
+[golang]: https://golang.org/doc/install
+[ring-tmpl]: https://git.sr.ht/~sircmpwn/drewdevault.com/tree/master/item/webring-in.template
+[whence]: /menglish/
diff --git a/_posts/2021-01-11-using-openring-to-add-blogs-you-follow.md b/content/posts/2021-01-11-openring.md
index e306736..79aa5cc 100644
--- a/_posts/2021-01-11-using-openring-to-add-blogs-you-follow.md
+++ b/content/posts/2021-01-11-openring.md
@@ -1,11 +1,10 @@
 ---
-layout: post
-title:  "Using openring to add blogs you follow"
+category: blog
 date:   2021-01-11 15:51:31 +0700
-tags:   rss blog openring tutorial
 lang: en
-ref: openring-tutor
-categories: tech tutorial
+translationKey: "openring-tutor"
+tags: [rss, blog, openring, tutorial]
+title:  "Using openring to add blogs you follow"
 ---
 
 You may notice that now my blog now has a new section near the footer: a list of articles
diff --git a/_posts/2021-02-08-enough-for-first-name-last-name-bs.md b/content/posts/2021-02-08-naming.md
index 022e021..da48a91 100644
--- a/_posts/2021-02-08-enough-for-first-name-last-name-bs.md
+++ b/content/posts/2021-02-08-naming.md
@@ -1,10 +1,10 @@
 ---
-layout: post
-title:  "Enough for first name/last name BS"
+category: blog
 date:   2021-02-08 17:14:08 +0700
-tags:   name culture inclusion awareness
 lang: en
-ref: first-name-last-name
+translationKey: "first-name-last-name"
+tags: [name, culture, inclusion, awareness]
+title:  "Enough for first name/last name BS"
 ---
 
 I keep seeing registration where I have to input my "First name" and my "Last name".
diff --git a/social.md b/content/social.md
index 20ec285..73adffa 100644
--- a/social.md
+++ b/content/social.md
@@ -1,9 +1,23 @@
 ---
-layout: page
 title: Social Media
 language: en
 ref: social
-permalink: /about/social
+slug: /about/social/
+menu:
+  about:
+    name: About
+    url: /about/
+    weight: 1
+  social:
+    parent: about
+    name: Social media
+    url: /about/social/
+    weight: 2
+  works:
+    parent: about
+    name: Works
+    url: /about/works/
+    weight: 3
 ---
 
 I practically left Facebook et al. Currently I am federated social networks, namely:
diff --git a/work.md b/content/works.md
index 402c80e..3b975c8 100644
--- a/work.md
+++ b/content/works.md
@@ -1,9 +1,23 @@
 ---
-layout: page
 title: Work
 language: en
-ref: work
-permalink: /about/work
+ref: works
+slug: /about/works/
+menu:
+  about:
+    name: About
+    url: /about/
+    weight: 1
+  social:
+    parent: about
+    name: Social media
+    url: /about/social/
+    weight: 2
+  works:
+    parent: about
+    name: Works
+    url: /about/works/
+    weight: 3
 ---
 
 I am a web backend developer, though I'm open to experiment in other fields as
diff --git a/create-webring.sh b/create-webring.sh
index 1f30dcc..52f4e15 100755
--- a/create-webring.sh
+++ b/create-webring.sh
@@ -6,4 +6,4 @@ openring \
   -s https://stallman.org/rss/rss.xml \
   -s https://www.eff.org/rss/updates.xml \
   < webring.template \
-  > _includes/custom-webring.html
+  > layouts/partials/custom-webring.html
diff --git a/glossary.md b/glossary.md
deleted file mode 100644
index c98ce4b..0000000
--- a/glossary.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-layout: page
-title: Glossary
-language: en
-ref: gloss
----
-
-This list contains some words I use even though it is not 
-considered as standard English, or rarely used in English.
-
-whence
-: from where
-
-thou
-: singular second-person pronoun
-
-ze
-
-: singular gender-neutral third-person pronoun
-
-  pronunciation /ziː/, similar to German *sie*\
-  objective **zem**, possessive **zer**, reflexive **zemself**
-
-  I derived it from English determiner *this*, since modern pronouns
-  also come from Old English words for *this*. Logically, it would more likely
-  becomes *de* or *fe*. *Fe* seems out of place for me, and *de* may make me
-  look like appropriating AAVE.
-
-  *They* as a singular pronoun kinda works, but it causes confusion.
-  I prefer clarity, which is also the reason why I use the archaic *thou*
-  when the situation allows. Of course, I respect everyone's pronoun preference
-  so this is only used when I don't know it.
diff --git a/index.markdown b/index.markdown
deleted file mode 100644
index 0671507..0000000
--- a/index.markdown
+++ /dev/null
@@ -1,6 +0,0 @@
----
-# Feel free to add content and custom Front Matter to this file.
-# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults
-
-layout: home
----
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
new file mode 100644
index 0000000..f74ec16
--- /dev/null
+++ b/layouts/_default/single.html
@@ -0,0 +1,26 @@
+{{ define "main" }}
+{{ if .Menus }}
+<nav class="post-navigation">
+	{{ range .Menus }}
+	<a href="{{ .URL | absLangURL }}" title="{{ .Title }}">{{ .Name }}</a>
+	{{ end }}
+</nav>
+{{ end }}
+
+<article class="post h-entry">
+	<header class="post-header">
+		<h1 class="p-name post-title{{ if .Params.favorite }} favorite{{end}}{{ if .Params.draft }} draft{{end}}">{{ trim .Title  " " }}</h1>
+	</header>
+	<div class="content e-content">
+		{{ .Content }}
+	</div>
+	{{ partial "postInfo.html" . }}
+</article>
+
+{{ if and (.Site.Params.paginationSinglePost) (ne .Type "page") }}
+{{ partial "paginationPost.html" . }}
+{{ end }}
+
+{{ partial "custom-webring.html" }}
+
+{{ end }}
diff --git a/layouts/partials/footer-extra.html b/layouts/partials/footer-extra.html
new file mode 100644
index 0000000..bef79ed
--- /dev/null
+++ b/layouts/partials/footer-extra.html
@@ -0,0 +1,12 @@
+<footer>
+	<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">
+		<img alt="Creative Commons License" style="border-width:0"
+				      src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" />
+	</a>
+	<br>
+	The content for this site is
+	<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>.
+	<br>
+	The <a href="https://git.sr.ht/~sircmpwn/drewdevault.com">code for this site</a>
+	is <a href="https://opensource.org/licenses/MIT">MIT</a>.
+</footer>
diff --git a/layouts/partials/head-extra.html b/layouts/partials/head-extra.html
new file mode 100644
index 0000000..d0d0022
--- /dev/null
+++ b/layouts/partials/head-extra.html
@@ -0,0 +1,5 @@
+<link rel="stylesheet" href="/css/custom.css">
+<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
+<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
+<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
+<link rel="manifest" href="/images/site.webmanifest">
diff --git a/layouts/partials/languageSelect.html b/layouts/partials/languageSelect.html
new file mode 100644
index 0000000..029a34d
--- /dev/null
+++ b/layouts/partials/languageSelect.html
@@ -0,0 +1,10 @@
+{{ if .IsTranslated }}
+<h4>{{ i18n "translations" }}</h4>
+<ul>
+  {{ range .Translations }}
+  <li>
+    <a href="{{ .Permalink }}">{{ .Language.LanguageName }}: {{ .Title }}{{ if .IsPage }} ({{ i18n "wordCount" . }}){{ end }}</a>
+  </li>
+  {{ end }}
+</ul>
+{{ end }}
diff --git a/newpost.sh b/newpost.sh
deleted file mode 100755
index cc1025b..0000000
--- a/newpost.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-printf "Blog title: "
-read title
-printf "Tags: "
-read tags
-printf "Categories: "
-read categories
-printf "Ref: "
-read ref
-name="_posts/$(date -I)-${ref}.md"
-_date=$(date "+%Y-%m-%d %T %z")
-echo $name
-echo "---" > "$name"
-echo "layout: post" >> "$name"
-echo "title:  \"$title\"" >> "$name"
-echo "date:   $_date" >> "$name"
-echo "tags:   $tags" >> "$name"
-echo "categories: $categories" >>"$name"
-echo "lang: en" >>"$name"
-echo "ref:    $ref" >>"$name"
-echo "---" >> "$name"
-vim $name
diff --git a/static/css/custom.css b/static/css/custom.css
new file mode 100644
index 0000000..066803e
--- /dev/null
+++ b/static/css/custom.css
@@ -0,0 +1,68 @@
+---
+---
+
+body {
+  font-family: serif;
+}
+
+.webring {
+  margin-top: 2rem;
+}
+
+.webring h2 {
+  font-size: 1.2rem;
+}
+
+.webring .articles {
+  width: 100%;
+  display: flex;
+}
+
+.webring .title {
+  margin: 0;
+}
+
+.webring .article {
+  flex: 1 1 0;
+  display: flex;
+  flex-direction: column;
+  padding: 0.5rem;
+  border: 1px solid #333;
+  margin: 0 0.5rem;
+}
+
+@media(max-width: 640px) {
+  .webring .articles {
+    flex-direction: column;
+  } 
+  .webring .article {
+    margin: 0.5rem 0;
+  }
+}
+
+.webring .article:first-child {
+  margin-left: 0;
+}
+
+.webring .article:last-child {
+  margin-right: 0;
+}
+
+.webring .summary {
+  font-size: 0.8rem;
+  flex: 1 1 0;
+}
+
+.webring .attribution {
+  float: right;
+  font-size: 0.8rem;
+  color: #555;
+  line-height: 3;
+}
+
+dl dt {
+  font-weight: bold;
+}
+dl dd {
+  text-indent: 1em;
+}
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644
index 0000000..d9ff90e
--- /dev/null
+++ b/static/favicon.ico
Binary files differdiff --git a/static/images/android-chrome-192x192.png b/static/images/android-chrome-192x192.png
new file mode 100644
index 0000000..334222b
--- /dev/null
+++ b/static/images/android-chrome-192x192.png
Binary files differdiff --git a/static/images/android-chrome-512x512.png b/static/images/android-chrome-512x512.png
new file mode 100644
index 0000000..d935e97
--- /dev/null
+++ b/static/images/android-chrome-512x512.png
Binary files differdiff --git a/static/images/apple-touch-icon.png b/static/images/apple-touch-icon.png
new file mode 100644
index 0000000..3dcf481
--- /dev/null
+++ b/static/images/apple-touch-icon.png
Binary files differdiff --git a/static/images/favicon-16x16.png b/static/images/favicon-16x16.png
new file mode 100644
index 0000000..4e2eee7
--- /dev/null
+++ b/static/images/favicon-16x16.png
Binary files differdiff --git a/static/images/favicon-32x32.png b/static/images/favicon-32x32.png
new file mode 100644
index 0000000..9ad0725
--- /dev/null
+++ b/static/images/favicon-32x32.png
Binary files differdiff --git a/static/images/favicon.ico b/static/images/favicon.ico
new file mode 100644
index 0000000..d9ff90e
--- /dev/null
+++ b/static/images/favicon.ico
Binary files differdiff --git a/static/images/site.webmanifest b/static/images/site.webmanifest
new file mode 100644
index 0000000..45dc8a2
--- /dev/null
+++ b/static/images/site.webmanifest
@@ -0,0 +1 @@
+{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
\ No newline at end of file
diff --git a/themes/anubis b/themes/anubis
new file mode 160000
+Subproject 1ddecf607dc7f59db7cc64e17f75d67d2a3b08a
diff --git a/webring.template b/webring.template
index 912baa2..d9d4c50 100644
--- a/webring.template
+++ b/webring.template
@@ -6,7 +6,7 @@
       <a href="https://git.sr.ht/~sircmpwn/openring">openring</a>
     </small>
   </h2>
-  <section class="footer-col-wrapper">
+  <section class="articles">
     {{range .Articles}}
     <div class="footer-col article">
       <h4 class="title">