about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--assets/css/custom.css14
-rw-r--r--config.yaml119
-rw-r--r--content/about.md53
-rw-r--r--content/about/_index.md22
-rw-r--r--content/about/contact.md42
-rw-r--r--content/about/rss.md (renamed from content/rss.md)0
-rw-r--r--content/about/uses.md (renamed from content/uses.md)9
-rw-r--r--content/about/works.md (renamed from content/works.md)21
-rw-r--r--content/book-reviews/_index.fr.md2
-rw-r--r--content/book-reviews/_index.md2
-rw-r--r--content/book-reviews/relevant-search.md2
-rw-r--r--content/doodles/1.md (renamed from content/comics/1.md)0
-rw-r--r--content/doodles/2.md (renamed from content/comics/2.md)0
-rw-r--r--content/doodles/3.md (renamed from content/comics/3.md)0
-rw-r--r--content/doodles/4.md (renamed from content/comics/4.md)0
-rw-r--r--content/doodles/_index.md (renamed from content/comics/_index.md)4
-rw-r--r--content/misc/_index.md (renamed from content/misc.md)6
-rw-r--r--content/posts/2023-09-02-setup-external-backup.md120
-rw-r--r--content/posts/_index.md9
-rw-r--r--content/til/_index.fr.md2
-rw-r--r--content/til/_index.md3
-rw-r--r--content/til/vim-jp.fr.md2
-rw-r--r--content/til/vim-jp.md2
-rwxr-xr-xcreate-webring.sh2
-rw-r--r--fead.patch54
-rw-r--r--layouts/_default/books.html2
-rw-r--r--layouts/_default/list.old.html (renamed from layouts/_default/list.html)0
-rw-r--r--layouts/index.old.html (renamed from layouts/index.html)0
-rw-r--r--layouts/partials/custom-webring.html4
m---------themes/victor0
-rw-r--r--webring.template2
32 files changed, 311 insertions, 190 deletions
diff --git a/.gitmodules b/.gitmodules
index bc5d8ab..1398aa9 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -2,3 +2,6 @@
 	path = themes/anibus
 	url = https://git.sr.ht/~huyngo/hugo-anubis-fork
 	branch = custom
+[submodule "themes/victor"]
+	path = themes/victor
+	url = https://git.sr.ht/~huyngo/victor
diff --git a/assets/css/custom.css b/assets/css/custom.css
new file mode 100644
index 0000000..e5656aa
--- /dev/null
+++ b/assets/css/custom.css
@@ -0,0 +1,14 @@
+.no-prefix::before {
+    content: "";
+}
+
+.webring article {
+    border: 1px solid var(--color);
+    margin: 0.5rem 0;
+    padding: 0.5rem;
+}
+
+.webring article h3 {
+    margin-top: 0;
+    padding-top: 0;
+}
diff --git a/config.yaml b/config.yaml
index b796274..a3aebf4 100644
--- a/config.yaml
+++ b/config.yaml
@@ -1,135 +1,36 @@
-AvailableText: 'This post is available in:'
-baseURL: https://huyngo.envs.net/
+baseURL: https://xrvs.net/
 copyright: CC-BY-SA 4.0
 defaultContentLanguage: en
+defaultContentLanguageInSubdir: true
+sectionPagesMenu: main
 languageCode: en-us
 languages:
   de:
-    about: Info
     languageName: Deutsch
-    menu:
-      main:
-      - identifier: home
-        name: Startseite
-        url: /
-        weight: 1
-      - identifier: about
-        name: Info
-        url: /about/
-        weight: 2
-      - identifier: works
-        name: Arbeite
-        url: /works/
-        weight: 5
-      - identifier: rss
-        name: RSS
-        url: /rss/
-        weight: 11
   en:
-    about: About
     languageName: English
   fr:
-    about: À propos
     languageName: Français
-    menu:
-      main:
-      - identifier: home
-        name: Accueil
-        url: /
-        weight: 1
-      - identifier: about
-        name: À propos
-        url: /about/
-        weight: 2
-      - identifier: works
-        name: Travail
-        url: /works/
-        weight: 5
-      - identifier: rss
-        name: RSS
-        url: /rss/
-        weight: 11
   vi:
-    about: Thông tin
     languageName: Tiếng Việt
-    menu:
-      main:
-      - identifier: home
-        name: Trang chủ
-        url: /
-        weight: 1
-      - identifier: about
-        name: Thông tin
-        url: /about/
-        weight: 2
-      - identifier: works
-        name: Công việc
-        url: /works/
-        weight: 5
-      - identifier: rss
-        name: RSS
-        url: /rss/
-        weight: 11
 markup:
   goldmark:
     renderer:
       unsafe: true
   highlight:
     noclasses: false
-menu:
-  main:
-  - identifier: home
-    name: Home
-    url: /
-    weight: 1
-  - identifier: about
-    name: About
-    url: /about/
-    weight: 2
-  - identifier: misc
-    name: Miscellanea
-    url: /misc/
-    weight: 10
-  - identifier: rss
-    name: RSS
-    url: /rss/
-    weight: 11
 params:
   author: Ngô Ngọc Đức Huy
   disableSummary: true
   email: huyngo@disroot.org
+  relMe:
+    - https://outerheaven.club/xarvos
+    - https://social.treehouse.systems/@xarvos
+    - https://fedi.criminallycute.fi/xarvos
+    - https://nixnet.social/xarvos
+    - https://git.sr.ht/~huyngo/
   mainSections:
     - posts
-  social:
-    - id: email
-      label: Work
-      name: huyngo@disroot.org
-    - id: email
-      label: Friends
-      name: xarvos@loang.net
-    - id: pleroma
-      name: xarvos
-      instance: outerheaven.club
-      label: Pleroma
-      url: https://outerheaven.club/%s
-    - id: mastodon
-      name: xarvos
-      instance: treehouse.systems
-      label: Masto
-      url: https://social.treehouse.systems/@%s
-    - id: sourcehut
-      label: Code
-      name: ~huyngo
-      alt: sr.ht
-    - id: matrix
-      label: Chat
-      name: huyngo
-      instance: envs.net
-      url: matrix:u/%s:envs.net
-    - id: liberapay
-      label: Donate
-      name: huy.ngo
-  style: auto-without-switcher
 summaryLength: 0
-theme: anibus
+theme: victor
 title: xarvos
diff --git a/content/about.md b/content/about.md
deleted file mode 100644
index 74dcf78..0000000
--- a/content/about.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-title: About
-language: en
-ref: about
-disable_feed: true
----
-
-## Me
-
-![I literally used this duck image for debugging](rubber-duck.png)
-
-Hi, this is <i>xarvos</i>, also known in meatspace as <i>Huy</i>.  I write
-about all kinds of stuff; expect tech discussion, shitposts, language stuff,
-fictions, blah blah.
-
-- languages: Vietnamese, English, French, German, with proficiency and
-  fluency decrementally sorted
-- Contacts: See [footer](#footer)
-  - If you're a friend/want a friendly discussion, contact me at loang.net
-  - If you're a company/want a professional discussion, contact me at
-      disroot.org
-  - etiquette:
-    - use [plain text for email][plain]
-    - [no Word document][no-word] or other proprietary format like RAR.
-    - Avoid any unnecessary attachments, if possible.
-    - If the platform support it, media description (e.g. [alt text][alt]) is much appreciated
-
-[alt]: https://www.w3.org/WAI/PF/HTML/wiki/Media_Alt_Technologies
-
-### 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 web format, printable as
-PDF, browse some miscellaenous [work](/works/).
-
-I accept payment and donation on [liberapay][liberapay].
-You can also send me money on [patreon][patreon] ~~and
-[PayPal](https://paypal.me/huynnd)~~. My PayPal account is currently locked.
-If you want to pay in another way, such as bank transfer or cash, please
-contact me via Matrix or email.
-
-[free-sw]: https://www.gnu.org/philosophy/free-sw.html
-
-<!-- donations -->
-[cv]: https://raw.githubusercontent.com/Huy-Ngo/my-cv/master/huy-cv.pdf
-[liberapay]: https://liberapay.com/huy.ngo/
-[patreon]: https://www.patreon.com/__huy_ngo__
-
-<!-- contact -->
-
-[plain]: https://useplaintext.email
-[no-word]: https://www.gnu.org/philosophy/no-word-attachments.html
diff --git a/content/about/_index.md b/content/about/_index.md
new file mode 100644
index 0000000..a880e48
--- /dev/null
+++ b/content/about/_index.md
@@ -0,0 +1,22 @@
+---
+title: About
+language: en
+ref: about
+disable_feed: true
+---
+
+## Me
+
+![I literally used this duck image for debugging](rubber-duck.png)
+
+Hi, this is <i>xarvos</i>, also known in meatspace as <i lang="vi">Huy</i>.
+I write about all kinds of stuff; expect tech discussion, shitposts, language
+stuff, fictions, blah blah.  I [work][work] as a software developer, and that
+means I [hate software][relevant-xkcd] more than others.
+
+I speak Vietnamese, English, French, German, with proficiency and fluency
+decrementally sorted.  Please [contact][contact] if you want language exchange.
+
+[contact]: /en/about/contact/
+[work]: /en/about/works/
+[relevant-xkcd]: https://xkcd.com/2030/
diff --git a/content/about/contact.md b/content/about/contact.md
new file mode 100644
index 0000000..fe990a9
--- /dev/null
+++ b/content/about/contact.md
@@ -0,0 +1,42 @@
+---
+title: Contact
+language: en
+ref: contact
+disable_feed: true
+---
+
+## Email
+
+I have two emails.  If you want to contact about work, even if it's volunteer
+work, contact my [professional email][work-mail].  If you are or want to be a
+friend, contact my [personal email][perso-mail].  If in doubt, use the first
+one.
+
+[work-mail]: huyngo@disroot.org
+[perso-mail]: xarvos@loang.net
+
+Etiquette:
+
+- use [plain text for email][plain]
+- [no Word document][no-word] or other proprietary format like RAR.
+
+## Fediverse
+
+I have multiple matrix accounts.  My main one is
+[@xarvos@outerheaven.club][fedi]
+
+[fedi]: https://outerheaven.club/users/xarvos
+
+## Matrix
+
+Send private messages to me at [@huyngo:envs.net][matrix]
+
+[matrix]: matrix:u/huyngo:envs.net
+
+[alt]: https://www.w3.org/WAI/PF/HTML/wiki/Media_Alt_Technologies
+
+<!-- contact -->
+
+[plain]: https://useplaintext.email
+[no-word]: https://www.gnu.org/philosophy/no-word-attachments.html
+
diff --git a/content/rss.md b/content/about/rss.md
index 6ab1d13..6ab1d13 100644
--- a/content/rss.md
+++ b/content/about/rss.md
diff --git a/content/uses.md b/content/about/uses.md
index 25e810f..e32b69d 100644
--- a/content/uses.md
+++ b/content/about/uses.md
@@ -70,7 +70,9 @@ I use vim and neovim, mostly.  The reason is:
 
 Emacs would probably be the same, but I'm not as used to its keybinding.
 "Vim mode", or the bastardisation of vim keybinding in other editors, never
-appeals me.  Besides these two, I'm OK with any graphical editors, it is 
+appeals me.  Besides these two, I'm OK with any graphical editors, though big,
+bloated <abbr title="Integrated Development Environment">IDE</abbr>s,
+especially proprietary ones, are quite repulsive to me.
 
 ## Hardware
 
@@ -103,5 +105,6 @@ Anyways, here is the setup:
   <dt>Mouse</dt><dd>Logitech G102 LightSync Gaming Mouse</dd>
 </dl>
 
-I fail to understand why most custom-built PC are marketed only towards gamers
-who like shiny flashy RGB LEDs? I don't appreciate that aesthestics.
+On a related note, I fail to understand why most custom-built PC are marketed
+only towards gamers who like shiny flashy RGB LEDs? I don't appreciate that
+aesthestics.
diff --git a/content/works.md b/content/about/works.md
index a0b21f1..4df9409 100644
--- a/content/works.md
+++ b/content/about/works.md
@@ -10,9 +10,24 @@ Consider this my informal portfolio.  My projects can be found on
 
 For a more formal one, see my [CV in web format][cv] (printable as PDF).
 
-[cv]: /cv/
+## Expectations
+
+Unless you're able to provide me a full-time employment with required benefits,
+any contractual works must be [free software][free-sw].
+
+I accept payment and donation on [liberapay][liberapay].
+You can also send me money on [patreon][patreon] ~~and
+[PayPal](https://paypal.me/huynnd)~~. My PayPal account is currently locked.
+If you want to pay in another way, such as bank transfer or cash, please
+contact me via Matrix or email.
 
-## Expectation
+[free-sw]: https://www.gnu.org/philosophy/free-sw.html
+
+<!-- donations -->
+[liberapay]: https://liberapay.com/huy.ngo/
+[patreon]: https://www.patreon.com/__huy_ngo__
+
+[cv]: /cv/
 
 ### Things I can offer
 
@@ -36,7 +51,7 @@ overtime. Other than that, these are nice things to have:
 - fully [remote work][remote] with occasional hanging out onsite
 - letting me work for slightly less than full-time (e.g. 4 days per week)
 
-[remote]: /posts/2022-10-15-remote-work/
+[remote]: /en/posts/2022-10-15-remote-work/
 
 ### Things I'm not interested in
 
diff --git a/content/book-reviews/_index.fr.md b/content/book-reviews/_index.fr.md
index 9610cd9..a83c7c0 100644
--- a/content/book-reviews/_index.fr.md
+++ b/content/book-reviews/_index.fr.md
@@ -1,6 +1,6 @@
 ---
 categories: ["book review"]
-title: book-reviews
+title: Commentaires des livres
 ---
 
 Ce sont des livres que j'ai lu et mes pensées d'eux.
diff --git a/content/book-reviews/_index.md b/content/book-reviews/_index.md
index c463b64..3ebe3bd 100644
--- a/content/book-reviews/_index.md
+++ b/content/book-reviews/_index.md
@@ -1,6 +1,6 @@
 ---
 categories: ["book review"]
-title: book-reviews
+title: Book Reviews
 ---
 
 I review books as I read.  Each review will contain:
diff --git a/content/book-reviews/relevant-search.md b/content/book-reviews/relevant-search.md
index 801efec..c91b9f6 100644
--- a/content/book-reviews/relevant-search.md
+++ b/content/book-reviews/relevant-search.md
@@ -1,6 +1,6 @@
 ---
 categories: ["book review"]
-title: "[Book review] Relevant Search"
+title: "Relevant Search: With applications for Solr and Elasticsearch"
 date: 2021-05-06
 tags: [book, review, search, programming, algorithm]
 book: "Relevant Search: With applications for Solr and Elasticsearch"
diff --git a/content/comics/1.md b/content/doodles/1.md
index eea799c..eea799c 100644
--- a/content/comics/1.md
+++ b/content/doodles/1.md
diff --git a/content/comics/2.md b/content/doodles/2.md
index 5aa3c42..5aa3c42 100644
--- a/content/comics/2.md
+++ b/content/doodles/2.md
diff --git a/content/comics/3.md b/content/doodles/3.md
index 8900e1e..8900e1e 100644
--- a/content/comics/3.md
+++ b/content/doodles/3.md
diff --git a/content/comics/4.md b/content/doodles/4.md
index dacbf91..dacbf91 100644
--- a/content/comics/4.md
+++ b/content/doodles/4.md
diff --git a/content/comics/_index.md b/content/doodles/_index.md
index 42c3408..794fa1a 100644
--- a/content/comics/_index.md
+++ b/content/doodles/_index.md
@@ -1,7 +1,7 @@
 ---
-title: comics
+title: Doodles
 lang: en
-translationKey: comics
+translationKey: doodles
 ---
 
 Here are some attempts of mine to draw webcomics, or I should say random
diff --git a/content/misc.md b/content/misc/_index.md
index 7aeba6c..940b1d3 100644
--- a/content/misc.md
+++ b/content/misc/_index.md
@@ -1,11 +1,13 @@
 ---
-title: Miscellanea
+title: Misc
 language: en
 ref: misc
 translationKey: misc
 disable_feed: true
 ---
 
+# Miscellanea
+
 Here are some miscellanous things I do.
 
 ## Conlangs
@@ -96,4 +98,4 @@ may have heard of:
 
 I also enjoy drawing every now and then, not that I want to be an artist or I
 draw well.  I just find scribbling something fun.  I recently decided to post
-[my scribbles](/comics/) on this website.
+[my doodles](/en/doodles/) on this website.
diff --git a/content/posts/2023-09-02-setup-external-backup.md b/content/posts/2023-09-02-setup-external-backup.md
new file mode 100644
index 0000000..6a94158
--- /dev/null
+++ b/content/posts/2023-09-02-setup-external-backup.md
@@ -0,0 +1,120 @@
+---
+title: "Setup backup on external disk"
+date: 2023-09-02
+draft: true
+lang: en
+categories: [ blog ]
+tags: []
+translationKey: "2023-09-02-setup-external-backup"
+---
+
+## Backstory
+
+A few weeks ago (not today), I fucked up:
+During irregular disk cleanup, I accidentally removed the config folder!
+
+Fortunately, I "backed up" the config with git, didn't I? 😌
+
+Well yes, but actually no! 🥲 I did commit, but I didn't push.
+The latest pushed config had been 9 months before this incident.
+
+On top of that, many programs generate unreadable configs, which I prefer not
+to put into version control, or put sensitive information or large data into
+`.config`, which shouldn't be pushed into a remote repository on a server I
+don't own.  For example, nheko puts authentication info there, and after this
+incident I lost the session with several messages---well, matrix's irregularly
+regular decryption failure could be expanded into a post on its own, so let's
+not digress.
+
+And then there are more things to back up than just configs, say, my photos and
+music.  I mirror them between my devices with [syncthing], providing
+redundancy, but [syncthing is not backup][syncthing-failure],
+and neither is [RAID][raid-not-backup]
+
+[syncthing]: https://syncthing.net/
+[syncthing-failure]: https://forum.syncthing.net/t/syncthing-deleted-all-files-on-every-device/20518
+[raid-not-backup]: https://www.raidisnotabackup.com/
+
+I should back them up, or I might one day be doomed to repeat the mistake.
+
+## Preparation
+
+Despite the bitterness from the partial data loss, I kinda didn't have the
+spoon to do what I must, so I've been delaying it hitherto.
+
+### Hardware
+
+One of the reason I was cleaning up the disk in the first place was that it's
+start to be filled up, so I bought a large hard drive to store more data and
+backup.  Doesn't seem too safe, I know: if the hard drive gets lost or broken,
+I'll lose both the main data and the backup, but with a limited budget and
+space, that's good enough for now.
+
+I got a Seagate One Touch 2 TB[^0] HDD.  It seems to come with builtin backup
+software, which doesn't support Linux of course, and I likely wouldn't use it
+even if it did.  A USB hub is also needed, as my laptop has a limited number of
+USB ports.
+
+### Formatting
+
+Coming with the hard drive are several files, such as an `.exe` program to
+initialize the backup, I suppose.  I don't need these, and the disk can be
+formatted ~~right away~~ after I do full-disk encryption on that.
+
+No partitioning is needed: while I do seek [vegan alternative][margarine], I
+intended to use [btrfs][btrfs-kernel] as the file system, which can create
+subvolumes, which can act as separate mounted partitions.  I will just reformat
+the existing partition to btrfs.
+
+```sh
+mkfs.btrfs -L margarine /dev/sdb1
+```
+
+[margarine]: https://outerheaven.club/notice/AZ8wYpKOyp2p329V5M
+[btrfs-kernel]: https://www.kernel.org/doc/html/latest/filesystems/btrfs.html
+
+I intend to have three subvolumes, one for big data (not Big Data™) such as
+movies or music, one for more personal data and another for backup:
+
+```sh
+mount /dev/sdb1 /mnt
+btrfs subvolume /mnt/data/hoard
+btrfs subvolume /mnt/data/perso
+btrfs subvolume /mnt/backup
+```
+
+Finally, I need to declare those in the nix hardware configuration file.
+
+
+```nix
+{
+  (...)
+  fileSystems = {
+    "/" = {
+      (...)
+    };
+    "/data/hoard" = {
+      device = "/dev/disk/by-uuid/[subvolume uuid]";
+      fsType = "btrfs";
+      options = [ "subvol=data/hoard" "compress-force=zstd" "noatime" ];
+    };
+    "/data/perso" = {
+      device = "/dev/disk/by-uuid/[subvolume uuid]";
+      fsType = "btrfs";
+      options = [ "subvol=data/perso" "compress-force=zstd" "noatime" ];
+    };
+    "/backup" = {
+      device = "/dev/disk/by-uuid/[subvolume uuid]";
+      fsType = "btrfs";
+      options = [ "subvol=backup" "compress-force=zstd" ];
+    };
+  };
+  (...)
+}
+```
+
+## Setting up
+
+[^0]: That means 1.81 [TiB] and I feel cheated sometimes.
+
+[TiB]: https://en.wikipedia.org/wiki/Byte#Multiple-byte_units.
diff --git a/content/posts/_index.md b/content/posts/_index.md
index 54dd49c..7a11ae0 100644
--- a/content/posts/_index.md
+++ b/content/posts/_index.md
@@ -1,11 +1,8 @@
 ---
-title: Posts
+title: Blog
 lang: en
 translationKey: posts
+categories: [blog]
 ---
 
-Here are some attempts of mine to draw webcomics, or I should say random
-scribbles :)
-
-Transcript of each comic can be found by appending 'transcript.txt' to the
-comic URL.
+Here are my blog posts!
diff --git a/content/til/_index.fr.md b/content/til/_index.fr.md
index 52ef329..c331bf2 100644
--- a/content/til/_index.fr.md
+++ b/content/til/_index.fr.md
@@ -1,5 +1,5 @@
 ---
-title: til
+title: AJA
 translationKey: til
 ---
 
diff --git a/content/til/_index.md b/content/til/_index.md
index 09c6754..f4b57b0 100644
--- a/content/til/_index.md
+++ b/content/til/_index.md
@@ -1,7 +1,8 @@
 ---
-title: til
+title: TIL
 lang: en
 translationKey: til
+categories: [blog]
 ---
 
 These are lists of small tricks or fun trivia I learned.
diff --git a/content/til/vim-jp.fr.md b/content/til/vim-jp.fr.md
index ecbadec..ed86d0f 100644
--- a/content/til/vim-jp.fr.md
+++ b/content/til/vim-jp.fr.md
@@ -1,7 +1,7 @@
 ---
 title: "AJA que on peut écrire le japonais avec vim"
 date: 2021-04-19T17:58:51+07:00
-translationKey: json-output-format
+translationKey: vim-jp
 tags: [vim, japanese, useless, hiragana, katakana]
 ---
 
diff --git a/content/til/vim-jp.md b/content/til/vim-jp.md
index 033611c..5592824 100644
--- a/content/til/vim-jp.md
+++ b/content/til/vim-jp.md
@@ -1,7 +1,7 @@
 ---
 title: "TIL: You can type Hiragana and Katakana on vim"
 date: 2021-04-19T17:58:51+07:00
-translationKey: json-output-format
+translationKey: vim-jp
 tags: [vim, japanese, useless, hiragana, katakana]
 ---
 
diff --git a/create-webring.sh b/create-webring.sh
index 5d19c8c..090f9e1 100755
--- a/create-webring.sh
+++ b/create-webring.sh
@@ -1,2 +1,2 @@
 # Create webring
-python3 ../fead/src/fead.py -l 100 -F feeds -t webring.template -o layouts/partials/webring-articles.html
+python3 ../fead/src/fead.py -l 100 -F feeds -t webring.template -o layouts/partials/webring-articles.html --skip-error
diff --git a/fead.patch b/fead.patch
new file mode 100644
index 0000000..0915336
--- /dev/null
+++ b/fead.patch
@@ -0,0 +1,54 @@
+commit 277deed03833377bae0ae68cf7db3f0d3d578ccd
+Author: Ngô Ngọc Đức Huy <huyngo@disroot.org>
+Date:   2023-08-30 11:01:00 +0700
+
+    Add option to skip errors
+
+diff --git a/src/fead.py b/src/fead.py
+index 370b623..0b35119 100755
+--- a/src/fead.py
++++ b/src/fead.py
+@@ -185,11 +185,23 @@ async def fetch(raw_url):
+                         response.getheaders(), response)
+ 
+ 
+-async def fetch_all(urls):
++async def fetch_skip_error(url):
++    try:
++        return await fetch(url)
++    except Exception as e:
++        warn(f'fail to fetch {url}: {e}',
++             type('FailureWarning', (Warning,), {}))
++        return None
++
++
++async def fetch_all(urls, skip_error):
+     """Fetch all given URLs asynchronously and return them parsed."""
+-    tasks = gather(*map(fetch, urls))
++    if skip_error:
++        tasks = gather(*map(fetch_skip_error, urls))
++    else:
++        tasks = gather(*map(fetch, urls))
+     try:
+-        return await tasks
++        return filter(lambda t: t is not None, await tasks)
+     except:
+         tasks.cancel()  # structured concurrency
+         raise
+@@ -234,11 +246,15 @@ def main():
+     parser.add_argument('-o', '--output', metavar='PATH',
+                         type=FileType('w'), default=stdout,
+                         help='output file (default to stdout)')
++    parser.add_argument('-s', '--skip-error', action='store_true',
++                        default=False,
++                        help="errors not causing failure but logged")
+     args = parser.parse_args()
+ 
+     template = args.template.read()
+     args.template.close()
+-    for ad in select(args.count, (ad for feed in run(fetch_all(args.feeds))
++    for ad in select(args.count, (ad for feed in run(fetch_all(args.feeds,
++                                                               args.skip_error))
+                                   for ad in select(args.per_feed, feed))):
+         args.output.write(template.format(**truncate(ad, args.len)._asdict()))
+     args.output.close()
diff --git a/layouts/_default/books.html b/layouts/_default/books.html
index d3044c9..c0a74d0 100644
--- a/layouts/_default/books.html
+++ b/layouts/_default/books.html
@@ -12,7 +12,7 @@
     <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">
-    <h1>Book info</h1>
+    <h2>Book info</h2>
     <dl class="data">
       <dt>Book</dt>
       <dd>{{ .Params.book }}</dd>
diff --git a/layouts/_default/list.html b/layouts/_default/list.old.html
index 33bd8b5..33bd8b5 100644
--- a/layouts/_default/list.html
+++ b/layouts/_default/list.old.html
diff --git a/layouts/index.html b/layouts/index.old.html
index 8367de4..8367de4 100644
--- a/layouts/index.html
+++ b/layouts/index.old.html
diff --git a/layouts/partials/custom-webring.html b/layouts/partials/custom-webring.html
index d568b81..604afc4 100644
--- a/layouts/partials/custom-webring.html
+++ b/layouts/partials/custom-webring.html
@@ -1,12 +1,12 @@
 <section class="webring">
-  <h2>Fediring</h2>
+  <h2 class="no-prefix">Fediring</h2>
   Look at my fedi fellows' sites:
   <ol>
     <li style="list-style-type: '← ';"><a href="https://fediring.net/previous?host=xrvs.net">Previous site</a></li>
     <li style="list-style-type: '? ';"><a href="https://fediring.net/">What is Fediring?</a></li>
     <li style="list-style-type: '→ ';"><a href="https://fediring.net/next?host=xrvs.net">Next site</a></li>
   </ol>
-  <h2>Articles from blogs I read</h2>
+  <h2 class="no-prefix">Articles from blogs I read</h2>
   <section class="articles">
     {{ partial "webring-articles.html" }}
   </section>
diff --git a/themes/victor b/themes/victor
new file mode 160000
+Subproject 5228eacde06900f669ebf57354bd17187804713
diff --git a/webring.template b/webring.template
index 14ed9f7..ef4dc19 100644
--- a/webring.template
+++ b/webring.template
@@ -1,5 +1,5 @@
     <article class="footer-col article">
-      <h3 class="title">
+      <h3 class="title no-prefix">
         <small>
         <a href="{link}" target="_blank" rel="noopener">{title}</a>
         </small>