about summary refs log tree commit diff
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/about.md14
-rw-r--r--content/book-reviews/relevant-search.md12
-rw-r--r--content/book-reviews/xkcd-what-if.md8
-rw-r--r--content/posts/2021-01-02-wordpress.fr.md16
-rw-r--r--content/posts/2021-01-11-openring.fr.md10
-rw-r--r--content/posts/2021-01-11-openring.md10
-rw-r--r--content/posts/2021-02-08-naming.md6
-rw-r--r--content/posts/2021-05-01-accessible-web.md18
-rw-r--r--content/posts/2021-05-30-css-stylus.md4
-rw-r--r--content/posts/2021-06-13-jq.md4
-rw-r--r--content/posts/2021-06-21-ipwhl-update.md22
-rw-r--r--content/posts/2021-07-03-decentral-contribution.md4
-rw-r--r--content/projects/mastodon.md8
-rw-r--r--content/rss.md10
-rw-r--r--content/works.md10
15 files changed, 78 insertions, 78 deletions
diff --git a/content/about.md b/content/about.md
index 2c4cf76..1fc1277 100644
--- a/content/about.md
+++ b/content/about.md
@@ -5,7 +5,7 @@ ref: about
 disable_feed: true
 ---
 
-# Me
+## Me
 
 ![I literally used this duck image for debugging](rubber-duck.png)
 
@@ -23,18 +23,18 @@ I am Huy[^0], a Vietnamese undergraduate student in ICT[^1].
   - [plain text email][plain]
   - [no Word document][no-word] or other proprietary format like RAR
 
-## Works
+### Works
 
 I write [free software][free-sw], but unfortunately not as a professional job.
 
 If you're an employer, you can find my [CV][cv] in PDF format.  I am not
 available for hire at the moment, however.
 
-## Donate
+### Donate
 
 I receive donation on [liberapay][liberapay] and [patreon][patreon].
 
-# This blog
+## This blog
 
 I write about:
 
@@ -46,12 +46,12 @@ I write about:
 
 But it's primarily about technology in general.
 
-## Correct mistakes
+### Correct mistakes
 
 Any correction is appreciated, whether I state a wrong fact or make a grammar
 mistake.
 
-## Copying
+### Copying
 
 <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">
 <img alt="Creative Commons License" style="border-width:0"
@@ -67,7 +67,7 @@ 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.
 
-## Source
+### Source
 
 The source code for generating this website can be found on
 [source hut][srht-blog].
diff --git a/content/book-reviews/relevant-search.md b/content/book-reviews/relevant-search.md
index 23b7374..e46ac91 100644
--- a/content/book-reviews/relevant-search.md
+++ b/content/book-reviews/relevant-search.md
@@ -13,8 +13,8 @@ lang: en
 layout: books
 ---
 
-# Summary
-## The search relevance problem
+## Summary
+### The search relevance problem
 
 Given an increasingly large amount of information, it is infeasible for users
 to retrieve what they needed.  Relevance scoring is therefore essential for
@@ -33,7 +33,7 @@ Even the academic field that thoroughly study this problem, information
 retrieval is not a one-size-fit all solution.  Relevance is strongly tied with
 the field and the application purpose.
 
-## Tackling the problem
+### Tackling the problem
 
 The book approaches the problem first by a top-down analysis of how a typical
 search engine works.  It then shows how a search query is processed by the
@@ -44,9 +44,9 @@ authors also approach the problem from business view: they note that
 interdiscipline collaboration is important in order to define and increase
 relevance.
 
-# Comments
+## Comments
 
-## What I like
+### What I like
 
 The book approaches the problem from various views: business view, algorithmic
 view, and practical view (giving examples). The book accentuates the diversity
@@ -54,7 +54,7 @@ of problems and thereby encouraging readers to critically think of their own
 problems.  While it suggests that search results should be influenced by
 sponsors, it also notes that without balance that will as well lead to failure.
 
-## What I don't like
+### What I don't like
 
 Its structure is somewhat unclear and flow to me.  I think some chapters can be
 re-ordered so it's more logical.  Also, I find weighing sponsors' priorities
diff --git a/content/book-reviews/xkcd-what-if.md b/content/book-reviews/xkcd-what-if.md
index 40f4f9b..1f93402 100644
--- a/content/book-reviews/xkcd-what-if.md
+++ b/content/book-reviews/xkcd-what-if.md
@@ -14,9 +14,9 @@ lang: en
 layout: books
 ---
 
-# Summary
-# Comments
+## Summary
+## Comments
 
-## What I like
+### What I like
 
-## What I don't like
+### What I don't like
diff --git a/content/posts/2021-01-02-wordpress.fr.md b/content/posts/2021-01-02-wordpress.fr.md
index 35df353..209355a 100644
--- a/content/posts/2021-01-02-wordpress.fr.md
+++ b/content/posts/2021-01-02-wordpress.fr.md
@@ -11,7 +11,7 @@ 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]
+## Pourquoir écrire un [blog]
 
 J'écris pour le faire mieux (et pour me défier d'écrire des articles en langues
 à part anglais). Il y avait longtemps que je n'ai rien écrit que le code.  Mais
@@ -25,7 +25,7 @@ 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
+## Choisir WordPress
 
 WordPress c'est une plate-forme populaire pour [blog]uer. Au début je pensais de
 choisir wordpress.com, car il est déjà hébergé. Mais j'ai découvert qu'il
@@ -45,7 +45,7 @@ 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
+## Utiliser Docker
 
 J'ai aussi essayé docker. Je me demandais pourquoi je n'avais pas pensé à cette
 solution plus tôt.  J'ai récemment utilisé docker très fréquemment, par exemple
@@ -58,7 +58,7 @@ on peut être sûr que ça marche.
 
 Et ça marche merveilleusement.
 
-# Redirection de port
+## 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.
@@ -67,7 +67,7 @@ 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
+## Changer le nom casse les liens
 
 WordPress utilise apparemment des liens absolus
 (`example.com/[blog]/quelque-chose`) au lieu des liens relatifs
@@ -76,7 +76,7 @@ ou le nom de domaine (qui arrivera sûrement, car les noms de domaine gratuits
 expireront tôt ou tard).  Je l'ai découvert quand je changeais d'IP de
 l'hébergeur au nom de domaine.
 
-# Des expériences déçues
+## 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
@@ -84,7 +84,7 @@ de widgets que je n'utilise jamais et qui prend trop de temps à charger.
 
 Étant résultat, je n'ai pas envie d'y écrire.
 
-# Write.as
+## Write.as
 
 Et puis quelqu'un sur Mastodon m'a fait savoir de WriteAs.  Ce service
 utilise Markdown pour rendre les posts, et comme Markdown est si facile à
@@ -94,7 +94,7 @@ utilise Markdown pour rendre les posts, et comme Markdown est si facile à
 J'ai hébergé une instance moi-même, et il marchait exactement comme j'en ai
 attendu.
 
-# Mise à jour
+## Mise à jour
 
 J'ai essayé [jekyll][jekyll], et c'est merveilleux.
 
diff --git a/content/posts/2021-01-11-openring.fr.md b/content/posts/2021-01-11-openring.fr.md
index 9c2bde8..7a9508f 100644
--- a/content/posts/2021-01-11-openring.fr.md
+++ b/content/posts/2021-01-11-openring.fr.md
@@ -18,12 +18,12 @@ dans mon blog.
 
 Ce post va vous apprendre comment l'ajouter à votre blog.
 
-# Installer openring
+## 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
+### Installer des dépendances
 
 Openring dépends de golang.  Quand ça marche avec go1.14, la version la plus
 récente sur le dépôt de mon distro Tumbleweed, mais je recommande installer la
@@ -31,7 +31,7 @@ plus récente sur [golang].
 
 Vous pouvez lire l'instruction de [golang].
 
-## Compiler openring de la source
+### Compiler openring de la source
 
 D'abord, clonez le dépôt:
 
@@ -46,7 +46,7 @@ go build -o openring
 sudo cp openring /usr/local/bin/
 ```
 
-# Customiser l'apparence
+## Customiser l'apparence
 
 Selon le README de openring :
 
@@ -98,7 +98,7 @@ partagé avec un licence MIT), avec des modifications :
 }
 ```
 
-# Chose à faire?
+## 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
diff --git a/content/posts/2021-01-11-openring.md b/content/posts/2021-01-11-openring.md
index b00e66b..993ea5c 100644
--- a/content/posts/2021-01-11-openring.md
+++ b/content/posts/2021-01-11-openring.md
@@ -17,18 +17,18 @@ to endorse authors we want to support and share cool things we read to our audie
 
 In this blog, I will write a tutorial to use this with jekyll.
 
-# Install openring
+## Install openring
 
 I am not aware of any prebuilt packages for openring, so let's build it from source.
 
-## Install dependencies
+### Install dependencies
 
 Openring depends on golang.  This works on go1.14, the latest version on Tumbleweed
 repository, but I recommend installing the latest version from [golang].
 
 You can refer to [golang]'s installation instruction for details.
 
-## Build from source
+### Build from source
 
 Firstly, clone the repository:
 
@@ -43,7 +43,7 @@ go build -o openring
 sudo cp openring /usr/local/bin/
 ```
 
-# Customize looks
+## Customize looks
 
 From openring's README:
 
@@ -91,7 +91,7 @@ with a little modification:
 }
 ```
 
-# Future works?
+## Future works?
 
 Currently, I generate the feed manually when I update my blog.
 This probably is not good enough if I want the webring to be updated
diff --git a/content/posts/2021-02-08-naming.md b/content/posts/2021-02-08-naming.md
index d7f9175..2d35199 100644
--- a/content/posts/2021-02-08-naming.md
+++ b/content/posts/2021-02-08-naming.md
@@ -10,7 +10,7 @@ title:  "Enough for first name/last name BS"
 I keep seeing registration where I have to input my "First name" and my "Last name".
 What's the point? Isn't the user's full name just enough, if it's even needed?
 
-# Why you should avoid that
+## Why you should avoid that
 
 It's blatantly ignorant!
 
@@ -30,12 +30,12 @@ but when full name is required (e.g. my school G-Suite account or for IELTS regi
 it is problematic how they represent my name. A few lecturers whom I'm not close with
 keep referring to me by my middle name due to how Google displays my name.
 
-# Who do this?
+## Who do this?
 
 - Many web services, e.g. Facebook, Google, LinkedIn
 - Language certification tests: IELTS, TCF, DELF/DALF, ...
 
-# Proposed alternative
+## Proposed alternative
 
 - Just ask for full name. Governments do that and they're fine.
 - Ask how users want to be referred as, don't assume.
diff --git a/content/posts/2021-05-01-accessible-web.md b/content/posts/2021-05-01-accessible-web.md
index 8d7f584..a1489ae 100644
--- a/content/posts/2021-05-01-accessible-web.md
+++ b/content/posts/2021-05-01-accessible-web.md
@@ -11,7 +11,7 @@ as blindness or deafness.  In this post I mainly discuss the wider sense, which
 also includes the narrower sense, but as I don't usually use technologies
 specifically for them, I can't affirm how effective my approach can be.
 
-# Why is it important?
+## Why is it important?
 
 If you are a content creator, certainly you would want your content to reach as
 many people as possible.  From an ethical point of view, it is unfair to people
@@ -30,9 +30,9 @@ These people also benefit from it:
 
 I have personally experienced difficulties in all the above five cases.
 
-# How to do it
+## How to do it
 
-## Semantic HTML
+### Semantic HTML
 
 Semantic HTML is HTML elements used with its intended purpose.
 Don't use `<div>` for paragraphs.
@@ -43,9 +43,9 @@ That helps both screen readers and text browsers to render contents correctly.
 
 Semantic HTML also helps SEO, which makes your content more findable[^1].
 
-## Less is more
+### Less is more
 
-### Less unnecessary media
+#### Less unnecessary media
 
 Can this logo be done as a simple vector image instead of a full HD 8K png?[^2]
 Can it be simply just text?[^3]
@@ -60,7 +60,7 @@ WP themes promote this)
 Of course, images and videos have their place, just don't spam it and keep it
 mind that it prevents someone from loading your website.
 
-### Less JavaScript
+#### Less JavaScript
 
 Making your website dependent on JS is a big no-no.
 There is a reason "JS bad" is a thing.
@@ -70,7 +70,7 @@ support it.  There are a larger number of people who intentionally block JS,
 because of privacy concerns -- JS can do nasty things fyi.
 Nonstandard JS API not supported by browser is even a more commonplace.
 
-### Less options in the navigation bar
+#### Less options in the navigation bar
 
 Too much navigation is bad navigation.
 I have a terrible experience (two, actually) using only my keyboard for
@@ -88,7 +88,7 @@ But at least Google in text browser is not that bad.  GitHub is much worse:
 It has more than two pages for just navigation!  Compare that to SourceHut, on
 which the main content already appears in the first page.
 
-## Don't put ads!
+### Don't put ads!
 
 Privacy concerns aside, ads is terrible for accessibility:
 
@@ -102,7 +102,7 @@ using adblockers, but also people who don't use JS (see above).  I would
 recommend everyone to put such websites on block list so they won't waste any
 more bandwith with them.
 
-# Further reading
+## Further reading
 
 There are too much bad practices nowadays I can't cover within a post.
 I found these websites helpful to learn to avoid these bad practices:
diff --git a/content/posts/2021-05-30-css-stylus.md b/content/posts/2021-05-30-css-stylus.md
index b5206ae..81a3839 100644
--- a/content/posts/2021-05-30-css-stylus.md
+++ b/content/posts/2021-05-30-css-stylus.md
@@ -5,7 +5,7 @@ categories: [blog]
 tags: [recommendation, css, custom, stylus, "browser addon"]
 ---
 
-# No more theme-switcher
+## No more theme-switcher
 
 So, I dropped the theme switcher to `auto` theme, which means it will switch
 theme automagically according to your system setting.
@@ -24,7 +24,7 @@ privacy policy:
 > Your questionable browsing history should remain between you and the NSA.
 > Stylus collects nothing. Period.
 
-# Applying to my website
+## Applying to my website
 
 I've customized my theme to look a bit like my vim theme, badwolf, but with a
 lighter background:
diff --git a/content/posts/2021-06-13-jq.md b/content/posts/2021-06-13-jq.md
index 49d2148..2d416cf 100644
--- a/content/posts/2021-06-13-jq.md
+++ b/content/posts/2021-06-13-jq.md
@@ -9,7 +9,7 @@ So lately I've been using `jq` quite a bit. It is a CLI JSON processor that
 makes your life easier if you have to deal with a lot of JSON.  Here I'm going
 to give two examples of how it's used.
 
-# Search response
+## Search response
 
 I've been dealing with JSON from Elasticsearch API[^0], but as they would not
 release their documents under a free license, I will take an example from
@@ -133,7 +133,7 @@ taken.
 There might be the option to write that in the search query DSL, which also
 reduces the data transferred, but I bet this is much easier to write.
 
-# Wallpaper
+## Wallpaper
 
 I use `feh` for setting wallpaper, which can take an image from the internet.
 Previously, I used a static list that I collected myself, but I recently
diff --git a/content/posts/2021-06-21-ipwhl-update.md b/content/posts/2021-06-21-ipwhl-update.md
index fc8d3f2..a4af78f 100644
--- a/content/posts/2021-06-21-ipwhl-update.md
+++ b/content/posts/2021-06-21-ipwhl-update.md
@@ -15,7 +15,7 @@ introduction.
 [ipwhl-annonce]: https://lists.sr.ht/~cnx/ipwhl-announce/%3CCC8HUR1YAFDL.YHJBG1SM70WE%40nix%3E
 [ipwhl]: https://sr.ht/~cnx/ipwhl/
 
-# Les Cheeses
+## Les Cheeses
 
 In short, IPWHL is a PyPI alternative (though, initially the package database
 would be collected from there).  What it provides:
@@ -24,7 +24,7 @@ would be collected from there).  What it provides:
 - Security
 - Reproducibility
 
-## Decentralization
+### Decentralization
 
 IPWHL uses [IPFS][ipfs] for storing packages.  This provides several
 advantages:
@@ -38,7 +38,7 @@ to use our cheeses.
 
 [ipfs]: https://ipfs.io/
 
-## Security
+### Security
 
 No single point of failure is a security feature itself, but besides that,
 IPWHL also is more secure because:
@@ -46,18 +46,18 @@ IPWHL also is more secure because:
 - We have CIDs and we cryptographically sign the packages thanks to merkle dag
 - We avoid packaging packages that are typosquat attacks
 
-## Reproducibility
+### Reproducibility
 
 IPWHL has a pre-resolved dependency and its packaging strategy is similar to
 NixOS, a distro known for its reproducibility.  The installer can uses the CID
 and the package name to reproduce exactly the package.
 
-# Current problems
+## Current problems
 
 Despite the theoretical advantages, IPWHL is a new project and thus has several
 problems
 
-## Lack of packages
+### Lack of packages
 
 A distribution doesn't mean anything without packages, and IPWHL is indeed in
 need of them.
@@ -69,7 +69,7 @@ sole maintainers, keep up with too many packages and make sure they're all
 up-to-date.  Therefore, please, come help us if you're interested in this
 project.
 
-## Dependency Hell
+### Dependency Hell
 
 Maybe you've heard of `npm install is-even` meme, if you hang out in some
 programming meme groups.  It represents an underlying problem of having too
@@ -124,7 +124,7 @@ Or, in some cases, such as for `tox`, it can even be like this:
   </figcaption>
 </figure>
 
-# How to help
+## How to help
 
 <picture>
   <source srcset="/images/begging-for-help.webp" type="image/webp">
@@ -137,13 +137,13 @@ To start, please take a look at [the manual page][ipwhl-man]
 
 [ipwhl-man]: https://man.sr.ht/~cnx/ipwhl/guides/contrib.md
 
-## Help declaring packages information
+### Help declaring packages information
 
 Currently, the packages with high priority is listed here:
 
 https://todo.sr.ht/~cnx/ipwhl/5
 
-## Write docs
+### Write docs
 
 User and contribution manuals are not really clearly written, and some
 information are scattered across the [mailing lists][lists].  You can help by
@@ -151,7 +151,7 @@ compile them into a comprehensive structured manual.
 
 [lists]: https://sr.ht/~cnx/ipwhl/lists
 
-## Help resolving dependency conflicts
+### Help resolving dependency conflicts
 
 > *Maybe the real cheeses are the packages we helped along the way*
 
diff --git a/content/posts/2021-07-03-decentral-contribution.md b/content/posts/2021-07-03-decentral-contribution.md
index b3cade5..d747afd 100644
--- a/content/posts/2021-07-03-decentral-contribution.md
+++ b/content/posts/2021-07-03-decentral-contribution.md
@@ -23,7 +23,7 @@ How ironic, because *free software developers* use a *non-free service* for
 development, which is a *centralized* service that wraps around a
 *decentralized* protocol.
 
-# Decentralized hosting
+## Decentralized hosting
 
 Let's ignore that thread for a moment.  If you want to avoid GitHub (and you
 should), there are two solutions:
@@ -60,7 +60,7 @@ git and is what happens behind the scene in GitHub pull request (except a
 GitHub PR pull directly to maintainer's remote and the remotes must be hosted
 by them).
 
-# Mailing list workflow
+## Mailing list workflow
 
 It is reasonable to assume everyone has an email.  After all, most services
 require emails for registration, and more importantly, to `git commit` you have
diff --git a/content/projects/mastodon.md b/content/projects/mastodon.md
index 180682b..bcdf775 100644
--- a/content/projects/mastodon.md
+++ b/content/projects/mastodon.md
@@ -21,7 +21,7 @@ tags: ["social network", "federation", "fediverse"]
 
 [fedi]: https://en.wikipedia.org/wiki/Fediverse
 
-# Features
+## Features
 
 - Content feeds: **home** (posts from accounts you follow), **local** (public
   posts from accounts on the same instance), and **federated** (public posts
@@ -39,7 +39,7 @@ tags: ["social network", "federation", "fediverse"]
 - Accounts can be exported and migrated to another server (posts are not
     migrated, however)
 
-# Forks
+## Forks
 
 Mastodon has a few forks, the most two popular ones are [Mastodon Glitch
 Edition][gs] and [hometown][ht], which provides some extra features.
@@ -47,7 +47,7 @@ Edition][gs] and [hometown][ht], which provides some extra features.
 [gs]: https://github.com/glitch-soc/mastodon
 [ht]: https://github.com/hometown-fork/hometown/
 
-# Personal opinions
+## Personal opinions
 
 Overall, Mastodon gives a nice and intuitive user interface.  It also provides
 quite flexible tools for moderating your timeline.  However, this can be abused
@@ -59,7 +59,7 @@ Mastodon doesn't support markups (the [glitch-soc][gs] fork does,
 embedding links into the text.  For this reason, I prefer
 [Pleroma][pleroma].
 
-# See also
+## See also
 
 - Guides:
   - [Kev's guide][kevq]
diff --git a/content/rss.md b/content/rss.md
index 398ce91..1302013 100644
--- a/content/rss.md
+++ b/content/rss.md
@@ -8,35 +8,35 @@ disable_feed: true
 If your RSS Feed Reader cannot get the feed from the link, you can find the
 feeds here:
 
-# The entire page
+## The entire page
 
 - [English](/index.xml)
 - [French](/fr/index.xml)
 - [German](/de/index.xml)
 - [Vietnamese](/vi/index.xml)
 
-# Posts
+## Posts
 
 - [English](/posts/index.xml)
 - [French](/fr/posts/index.xml)
 - [German](/de/posts/index.xml)
 - [Vietnamese](/vi/posts/index.xml)
 
-# TIL (Today I learned)
+## TIL (Today I learned)
 
 - [English](/til/index.xml)
 - [French](/fr/til/index.xml)
 - [German](/de/til/index.xml)
 - [Vietnamese](/vi/til/index.xml)
 
-# Book reviews
+## Book reviews
 
 - [English](/book-reviews/index.xml)
 - [French](/fr/book-reviews/index.xml)
 - [German](/de/book-reviews/index.xml)
 - [Vietnamese](/vi/book-reviews/index.xml)
 
-# Suspicious permission
+## Suspicious permission
 
 - [English](/sus-perm/index.xml)
 - [French](/fr/sus-perm/index.xml)
diff --git a/content/works.md b/content/works.md
index 738abea..f6b3512 100644
--- a/content/works.md
+++ b/content/works.md
@@ -14,16 +14,16 @@ well.  You can look at my projects on:
 
 See my CV in PDF format [here][cv].
 
-# Education
+## Education
 
 - Bachelor: University of Science and Technology of Hanoi, 2018-2021
 
-# Free Software work
+## Free Software work
 
 I support free software by writing it and contribute to some projects within my
 ability.  Below are some projects I've participated in development.
 
-## My own
+### My own
 
 - [Discord meme bot](/projects/discord-meme-bot/), a meme bot for Discord
 - [Acanban](/projects/acanban/), a project management system
@@ -33,7 +33,7 @@ ability.  Below are some projects I've participated in development.
 - [GenWord][genword] a word generator on Android, alternative to
   [its JS equivalent][gen]
 
-## Contribution
+### Contribution
 
 - [IPWHL (floating cheeses)](/projects/ipwhl/), a Python binary distributions
 - [Palace](/projects/palace/), a 3D audio library
@@ -42,7 +42,7 @@ ability.  Below are some projects I've participated in development.
 - A [small feature][cras-patch] in [cras][cras], an anti-procrastination TODO
   list
 
-### Super short contribution
+#### Super short contribution
 
 - [Nine-line PR][alt-client] for a software listing
 - [Three-line PR][site-envs] for envs.net website