main
  1<!DOCTYPE html>
  2<html lang="en">
  3<head>
  4<!-- Sep 03, 2024 -->
  5<meta charset="utf-8" />
  6<meta name="viewport" content="width=device-width, initial-scale=1" />
  7<title>config: Email configuration</title>
  8<meta name="author" content="Vincent Demeester" />
  9<meta name="generator" content="Org Mode" />
 10<link rel='icon' type='image/x-icon' href='/images/favicon.ico'/>
 11<meta name='viewport' content='width=device-width, initial-scale=1'>
 12<link rel='stylesheet' href='/css/new.css' type='text/css'/>
 13<link rel='stylesheet' href='/css/syntax.css' type='text/css'/>
 14<link href='/index.xml' rel='alternate' type='application/rss+xml' title='Vincent Demeester' />
 15</head>
 16<body>
 17<main id="content" class="content">
 18<header>
 19<h1 class="title">config: Email configuration</h1>
 20<p class="subtitle" role="doc-subtitle">A very opiniated mail setup</p>
 21</header><div class="abstract" id="orgfdf41fd">
 22<p>
 23This article presents my opinionated email setup, client side. By opinionated I mean that
 24it requires quite some stuff (like <code>nixpkgs</code>) and is cli/emacs/… oriented.
 25</p>
 26
 27</div>
 28
 29<p>
 30I used to read my mails only through the web interface of my mail provider (GMail for the
 31most part), or through my phone. As I&rsquo;m trying to use my phone less, at least for work,
 32and as I wanted to not have a gmail tab always opened on my browser, I decided to
 33configure an email client on my laptops/desktops.
 34</p>
 35
 36<nav id="table-of-contents" role="doc-toc">
 37<h2>Table of Contents</h2>
 38<div id="text-table-of-contents" role="doc-toc">
 39<ul>
 40<li><a href="#h:db00a56e-c928-47d4-a784-3b2d2600759c">Module</a></li>
 41<li><a href="#h:e492a4cf-41e5-4091-9fc3-1294bef31875">Base settings</a>
 42<ul>
 43<li><a href="#h:ddef34cf-07c6-4ae1-abc9-129440ded5e2">Accounts</a></li>
 44<li><a href="#h:cc9d0707-d775-49ef-884d-ae65174fb259"><code>msmtp</code> wrapper</a></li>
 45</ul>
 46</li>
 47<li><a href="#h:47e38880-580e-4335-a504-b3c9c580ec91">Syncing</a>
 48<ul>
 49<li><a href="#h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1">Service</a></li>
 50<li><a href="#h:8e918ee0-4ef7-4f98-b170-dcfea20c6443">Programs</a></li>
 51</ul>
 52</li>
 53<li><a href="#h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f">Close the module</a></li>
 54<li><a href="#h:7012be97-2b81-44e9-b9bb-8c4147e3d561">References</a></li>
 55</ul>
 56</div>
 57</nav>
 58
 59<p>
 60So far, I ended up using the following tools:
 61</p>
 62
 63<ul class="org-ul">
 64<li><a href="http://isync.sourceforge.net/mbsync.html"><code>mbsync</code></a> to sync mails between server and laptop/desktop.</li>
 65<li><a href="https://marlam.de/msmtp/"><code>msmtp</code></a> to send mails.</li>
 66<li><a href="https://notmuchmail.org/"><code>notmuch</code></a> to index, and tag mails.</li>
 67<li><a href="https://www.gnu.org/software/emacs/"><code>emacs</code></a> with <a href="https://www.gnu.org/software/emacs/manual/html_node/gnus/"><code>gnus</code></a> and <a href="https://notmuchmail.org/notmuch-emacs/"><code>notmuch</code></a> for reading/sending mails.</li>
 68</ul>
 69
 70<p>
 71Something a bit special here is that I also use <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a>… and <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a> has
 72modules for those tools, so we are going to use thoses.
 73</p>
 74
 75<p>
 76<b>This needs to be updated and rewritten</b>.
 77</p>
 78<section id="outline-container-h:db00a56e-c928-47d4-a784-3b2d2600759c" class="outline-2">
 79<h2 id="h:db00a56e-c928-47d4-a784-3b2d2600759c">Module</h2>
 80<div class="outline-text-2" id="text-h:db00a56e-c928-47d4-a784-3b2d2600759c">
 81<p>
 82Let&rsquo;s start by defining the module, the usual Nix way.
 83</p>
 84
 85<div class="org-src-container">
 86<pre class="src src-nix"># Generated from an org file 💃
 87# See : https://sbr.pm/technical/configurations/mails.html
 88{ config, lib, pkgs, ... }:
 89
 90with lib;
 91let
 92  cfg = config.profiles.mails;
 93in
 94{
 95</pre>
 96</div>
 97
 98<p>
 99Let&rsquo;s now define options. As of now, except <code>enable</code> (to activate or not the module) I
100don&rsquo;t have any options in mind.
101</p>
102
103<div class="org-src-container">
104<pre class="src src-nix">options = {
105  profiles.mails = {
106    enable = mkEnableOption "Enable mails configuration";
107    sync = mkEnableOption "Enable sync mail service";
108    frequency = mkOption {
109      default = "*:0/30";
110      description = "Frequency at which the mail should be checked";
111      type = types.str;
112    };
113  };
114};
115</pre>
116</div>
117
118<p>
119Finally, create the configuration.
120</p>
121
122<div class="org-src-container">
123<pre class="src src-nix">config = mkIf cfg.enable (mkMerge [
124  {
125</pre>
126</div>
127</div>
128</section>
129<section id="outline-container-h:e492a4cf-41e5-4091-9fc3-1294bef31875" class="outline-2">
130<h2 id="h:e492a4cf-41e5-4091-9fc3-1294bef31875">Base settings</h2>
131<div class="outline-text-2" id="text-h:e492a4cf-41e5-4091-9fc3-1294bef31875">
132</div>
133<div id="outline-container-h:ddef34cf-07c6-4ae1-abc9-129440ded5e2" class="outline-3">
134<h3 id="h:ddef34cf-07c6-4ae1-abc9-129440ded5e2">Accounts</h3>
135<div class="outline-text-3" id="text-h:ddef34cf-07c6-4ae1-abc9-129440ded5e2">
136<p>
137The next step is to actually define the accounts we want use and where we want to store
138email, amongst other need.
139</p>
140
141<ul class="org-ul">
142<li>We want to store mails in <code>desktop/mails/{account}</code>.</li>
143<li>We don&rsquo;t want to input password each and every time so we&rsquo;re using an encrypted file
144(<a href="https://www.gnupg.org/gph/en/manual/x110.html">symmetric encryption using GnuPG</a> with a passphrase file).</li>
145<li>We&rsquo;re gonna enable diverse modules on each account
146<ul class="org-ul">
147<li><code>mbsync</code> to sync the mail with some setupts (like specific rules for GMail specific
148folders)</li>
149<li><code>notmuch</code> for email indexing</li>
150<li><code>msmtp</code> to send a mail, using the account&rsquo;s smtp server</li>
151<li><code>astroid</code> for a GUI</li>
152</ul></li>
153</ul>
154
155<div class="org-src-container">
156<pre class="src src-nix">accounts.email = {
157  maildirBasePath = "desktop/mails";
158  accounts = {
159    "redhat" = {
160      address = "vdemeest@redhat.com";
161      userName = "vdemeest@redhat.com";
162      realName = "Vincent Demeester";
163      passwordCommand = "${pkgs.gnupg}/bin/gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ${config.home.homeDirectory}/sync/rh.pass -d ${config.home.homeDirectory}/desktop/documents/rh.pass.gpg";
164      imap.host = "imap.gmail.com";
165      smtp.host = "smtp.gmail.com";
166      mbsync = {
167        enable = true;
168        create = "both";
169        expunge = "both";
170        patterns = ["*" "![Gmail]*" "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail"];
171        extraConfig = {
172          channel = {
173            Sync = "All";
174          };
175          account = {
176            Timeout = 120;
177            PipelineDepth = 1;
178          };
179        };
180      };
181      notmuch.enable = cfg.sync;
182      astroid.enable = cfg.sync;
183      msmtp.enable = true;
184    };
185    "perso" = {
186      address = "vinc.demeester@gmail.com";
187      userName = "vinc.demeester@gmail.com";
188      realName = "Vincent Demeester";
189      passwordCommand = "${pkgs.gnupg}/bin/gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ${config.home.homeDirectory}/sync/perso.pass -d ${config.home.homeDirectory}/desktop/documents/perso.pass.gpg";
190      imap.host = "imap.gmail.com";
191      smtp.host = "smtp.gmail.com";
192      mbsync = {
193        enable = true;
194        create = "both";
195        expunge = "both";
196        patterns = ["*" "![Gmail]*" "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail"];
197        extraConfig = {
198          channel = {
199            Sync = "All";
200          };
201          account = {
202            Timeout = 120;
203            PipelineDepth = 1;
204          };
205        };
206      };
207      notmuch.enable = cfg.sync;
208      astroid.enable = cfg.sync;
209      msmtp.enable = true;
210    };
211    "prv" = {
212      primary = true;
213      address = "vincent@demeester.fr";
214      userName = "vincent@demeester.fr";
215      realName = "Vincent Demeester";
216      passwordCommand = "${pkgs.gnupg}/bin/gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ${config.home.homeDirectory}/sync/prv.pass -d ${config.home.homeDirectory}/desktop/documents/prv.pass.gpg";
217      imap.host = "mail.gandi.net";
218      smtp.host = "mail.gandi.net";
219      mbsync = {
220        enable = true;
221        create = "both";
222        expunge = "both";
223        patterns = ["*"];
224        extraConfig = {
225          channel = {
226            Sync = "All";
227          };
228          account = {
229            Timeout = 120;
230            PipelineDepth = 1;
231          };
232        };
233      };
234      notmuch.enable = cfg.sync;
235      astroid.enable = cfg.sync;
236      msmtp.enable = true;
237    };
238  };
239};
240</pre>
241</div>
242
243<p>
244To create the pasword files:
245</p>
246<ul class="org-ul">
247<li>create <code>~/desktop/documents/{account}.pass.gpg</code> file, you need to create a
248<code>~/desktop/documents/prv.pass</code> file with the actual password.</li>
249<li>create <code>~/sync/{account}.pass</code> with a passphrase (long, complex, whatever…)</li>
250<li><p>
251encrypt <code>~/desktop/documents/{account}.pass.gpg</code> with the following command
252</p>
253
254<div class="org-src-container">
255<pre class="src src-bash">gpg --batch --yes --symmetric --passphrase-file ~/sync/{account}.pass --encrypt {account.pass}
256</pre>
257</div></li>
258
259<li>remove <code>~/desktop/documents/{account}.pass</code></li>
260</ul>
261</div>
262</div>
263<div id="outline-container-h:cc9d0707-d775-49ef-884d-ae65174fb259" class="outline-3">
264<h3 id="h:cc9d0707-d775-49ef-884d-ae65174fb259"><code>msmtp</code> wrapper</h3>
265<div class="outline-text-3" id="text-h:cc9d0707-d775-49ef-884d-ae65174fb259">
266<p>
267As I have multiple accounts, I need to be able to send mails from those multiple accounts
268too. For this we will use <code>msmtp</code>. We will <code>$HOME/.nix-profile/bin/msmtp</code> to make sure it
269uses <code>--read-envolep-from</code>. This means it will look at what <code>FROM</code> header is set in the
270e-mail and use the correct account accordingly.
271</p>
272
273<div class="org-src-container">
274<pre class="src src-nix">home.file."bin/msmtp" = {
275  text = ''
276  #!${pkgs.stdenv.shell}
277  ${pkgs.libnotify}/bin/notify-send "Sending mail ✉️"
278  ${pkgs.msmtp}/bin/msmtp --read-envelope-from $@
279  '';
280  executable = true;
281};
282</pre>
283</div>
284
285<p>
286We also want to make sure we enable <code>msmtp</code>.
287</p>
288
289<div class="org-src-container">
290<pre class="src src-nix">programs.msmtp.enable = true;
291</pre>
292</div>
293
294<p>
295And that should be all for the base settings, so let&rsquo;s close that part
296</p>
297
298<div class="org-src-container">
299<pre class="src src-nix">}
300</pre>
301</div>
302</div>
303</div>
304</section>
305<section id="outline-container-h:47e38880-580e-4335-a504-b3c9c580ec91" class="outline-2">
306<h2 id="h:47e38880-580e-4335-a504-b3c9c580ec91">Syncing</h2>
307<div class="outline-text-2" id="text-h:47e38880-580e-4335-a504-b3c9c580ec91">
308<p>
309I may not want to sync and index mails on all computers. In practice, I only do that on
310one computer and I sync these mails with the others.
311</p>
312
313<div class="org-src-container">
314<pre class="src src-nix">(mkIf cfg.sync {
315</pre>
316</div>
317</div>
318<div id="outline-container-h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1" class="outline-3">
319<h3 id="h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1">Service</h3>
320<div class="outline-text-3" id="text-h:2b822f1b-cd0a-430d-8942-3ad21a4bcaa1">
321<p>
322Now that all the configuration are defined (and generated once we run <a href="https://github.com/rycee/home-manager"><code>home-manager</code></a>),
323we&rsquo;re going to enable the <code>mbsync</code> service to synchronize email at the given frequency.
324</p>
325
326<div class="org-src-container">
327<pre class="src src-nix">services.mbsync = {
328  enable = true;
329  preExec = "${config.xdg.configHome}/mbsync/preExec";
330  postExec = "${config.xdg.configHome}/mbsync/postExec";
331  frequency = cfg.frequency;
332};
333</pre>
334</div>
335
336<p>
337We also setup <code>preExec</code> and <code>postExec</code> hooks on the service to be able to run commands
338before and after actually running <code>mbsync</code>.
339</p>
340
341<ul class="org-ul">
342<li><code>preExec</code> has two main purpose :
343
344<ul class="org-ul">
345<li>Create the accounts mail folder — this is <b>only</b> useful for the first run ever, but it
346is required.</li>
347<li>Move mails on the right folders
348<ul class="org-ul">
349<li>from Inbox to elsewhere (All mails, …)</li>
350<li>(in the future) to the right folders (from the tags)</li>
351</ul></li>
352</ul></li>
353</ul>
354
355<div class="org-src-container">
356<pre class="src src-nix">xdg.configFile."mbsync/preExec" = {
357  text = ''
358  #!${pkgs.stdenv.shell}
359
360  export NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc
361  export NMBGIT=${config.xdg.dataHome}/notmuch/nmbug
362
363  ${pkgs.coreutils}/bin/mkdir -p ${config.home.homeDirectory}/desktop/mails/redhat ${config.home.homeDirectory}/desktop/mails/perso
364  ${pkgs.afew}/bin/afew -C  ${config.xdg.configHome}/notmuch/notmuchrc -m -v
365  '';
366  executable = true;
367};
368</pre>
369</div>
370
371<ul class="org-ul">
372<li><code>postExec</code> will index the new emails in the <code>notmuch</code> database and tag mail accordingly
373(to their folders and other rules in place).</li>
374</ul>
375
376<div class="org-src-container">
377<pre class="src src-nix">xdg.configFile."mbsync/postExec" = {
378  text = ''
379  #!${pkgs.stdenv.shell}
380
381  export NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc
382  export NMBGIT=${config.xdg.dataHome}/notmuch/nmbug
383
384  ${pkgs.notmuch}/bin/notmuch new
385  ${pkgs.afew}/bin/afew -C ${config.xdg.configHome}/notmuch/notmuchrc --tag --new -v
386  # Remove inbox (lower-case)
387  ${pkgs.notmuch}/bin/notmuch tag -inbox -- tag:inbox
388  # Remove Inbox tagged message that are not in an Inbox
389  ${pkgs.notmuch}/bin/notmuch tag -Inbox -- not folder:redhat/Inbox and not folder:perso/Inbox and tag:Inbox
390  ${pkgs.libnotify}/bin/notify-send "Mails synced 📬"
391  '';
392  executable = true;
393};
394</pre>
395</div>
396
397<p>
398Finally, let&rsquo;s define custom commands to simplify my mail usage. Those should be nix
399package in the near future — as of now, it is a bit ugly as I&rsquo;m creating binaries inside
400<code>$HOME/bin</code> instead of relying of Nix.
401</p>
402
403<ul class="org-ul">
404<li><code>msync</code> is an helper to run quickly <code>mbsync</code> systemd service from anywhere</li>
405</ul>
406
407<div class="org-src-container">
408<pre class="src src-nix">home.file."bin/msync" = {
409  text = ''
410  #!${pkgs.stdenv.shell}
411  ${pkgs.libnotify}/bin/notify-send "Syncing mails 📫️"
412  systemctl --user start mbsync
413  '';
414  executable = true;
415};
416</pre>
417</div>
418</div>
419</div>
420<div id="outline-container-h:8e918ee0-4ef7-4f98-b170-dcfea20c6443" class="outline-3">
421<h3 id="h:8e918ee0-4ef7-4f98-b170-dcfea20c6443">Programs</h3>
422<div class="outline-text-3" id="text-h:8e918ee0-4ef7-4f98-b170-dcfea20c6443">
423<p>
424Additionally we can enable some programs and customize their behavior. Let&rsquo;s enable
425<code>programs.mbsync</code>, which has for effect to put <code>mbsync</code> binary in <code>PATH</code> so that the user
426(us) can call it. Same goes for <code>programs.msmtp</code> and <code>programs.notmuch</code>.
427</p>
428
429<div class="org-src-container">
430<pre class="src src-nix">programs.mbsync.enable = true;
431programs.notmuch.enable = true;
432</pre>
433</div>
434</div>
435<div id="outline-container-h:74f4160b-d34a-490e-b56a-ad3d0e5f966c" class="outline-4">
436<h4 id="h:74f4160b-d34a-490e-b56a-ad3d0e5f966c">Afew</h4>
437<div class="outline-text-4" id="text-h:74f4160b-d34a-490e-b56a-ad3d0e5f966c">
438<p>
439<a href="https://github.com/afewmail/afew"><code>afew</code></a> is &ldquo;an initial tagging script for notmuch mail&rdquo;. We&rsquo;re going to define some extra
440configuration to enable some filters and <code>MailMover</code> rules.
441</p>
442
443<p>
444Note: This should go away at some point as these rules are not dynamic enough for my usage.
445</p>
446
447<div class="org-src-container">
448<pre class="src src-nix">programs.afew = {
449  enable = true;
450  extraConfig = ''
451    [SpamFilter]
452    [KillThreadsFilter]
453    [ListMailsFilter]
454    [ArchiveSentMailsFilter]
455    [FolderNameFilter]
456    maildir_separator = /
457
458    [MailMover]
459    folders = perso/Inbox redhat/Inbox
460    rename = true
461
462    perso/Inbox = 'NOT tag:Inbox':"perso/[Gmail]/All Mail"
463    redhat/Inbox = 'NOT tag:Inbox':"redhat/[Gmail]/All Mail"
464  '';
465};
466</pre>
467</div>
468</div>
469</div>
470<div id="outline-container-h:2d4558d2-0596-4c80-bab0-f259385375b1" class="outline-4">
471<h4 id="h:2d4558d2-0596-4c80-bab0-f259385375b1">Astroid</h4>
472<div class="outline-text-4" id="text-h:2d4558d2-0596-4c80-bab0-f259385375b1">
473<p>
474<a href="https://github.com/astroidmail/astroid/"><code>astroid</code></a> is a &ldquo;graphical threads-with-tags style, lightweight and fast, e-mail client for
475Notmuch&rdquo;. My main e-mail client is <code>emacs</code> with the <code>notmuch</code> mode, but sometimes I want a
476GUI, mainly to see wanky HTML mails that would not render correctly some times.
477</p>
478
479<div class="org-src-container">
480<pre class="src src-nix">programs.astroid = {
481  enable = true;
482  externalEditor = "emacsclient -c";
483  extraConfig = {
484    startup.queries.inbox = "tag:Inbox";
485    startup.queries.inbox_perso = "folder:perso/Inbox";
486    startup.queries.inbox_redhat = "folder:redhat/Inbox";
487  };
488};
489</pre>
490</div>
491
492<p>
493And that&rsquo;s all for the sync part, so let&rsquo;s close it
494</p>
495
496<div class="org-src-container">
497<pre class="src src-nix">})
498</pre>
499</div>
500</div>
501</div>
502</div>
503</section>
504<section id="outline-container-h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f" class="outline-2">
505<h2 id="h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f">Close the module</h2>
506<div class="outline-text-2" id="text-h:7672fedf-2afa-4eb1-a9f2-38a6aada5f5f">
507<div class="org-src-container">
508<pre class="src src-nix">]);
509}
510</pre>
511</div>
512</div>
513</section>
514<section id="outline-container-h:7012be97-2b81-44e9-b9bb-8c4147e3d561" class="outline-2">
515<h2 id="h:7012be97-2b81-44e9-b9bb-8c4147e3d561">References</h2>
516<div class="outline-text-2" id="text-h:7012be97-2b81-44e9-b9bb-8c4147e3d561">
517<ul class="org-ul">
518<li><a href="https://copyninja.info/blog/email_setup.html">My personal Email setup - Notmuch, mbsync, postfix and dovecot</a></li>
519<li><a href="https://anarc.at/blog/2016-05-12-email-setup/">Notmuch, offlineimap and Sieve setup - anarcat</a></li>
520<li><a href="https://github.com/kzar/davemail">https://github.com/kzar/davemail</a></li>
521<li><a href="https://martinralbrecht.wordpress.com/2016/05/30/handling-email-with-emacs/">Handling Email with Emacs – malb::blog</a></li>
522<li><a href="https://kirang.in/post/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx/">Emacs as email client with offlineimap and mu4e on OS X</a></li>
523<li><a href="http://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and-/">A Complete Guide to Email in Emacs using Mu and Mu4e</a></li>
524<li><a href="https://notmuchmail.org/emacstips/#index24h2">emacstips</a></li>
525<li><a href="https://kkatsuyuki.github.io/notmuch-conf/">notmuch + emacs + offlineimap configuration procedure</a></li>
526<li><a href="https://wiki.archlinux.org/index.php/Isync">isync - ArchWiki</a></li>
527<li><a href="https://superuser.com/questions/437027/emacs-and-multiple-smtp-servers">email - Emacs and Multiple SMTP servers - Super User</a></li>
528<li><a href="https://notanumber.io/2016-10-03/better-email-with-mu4e/">Better Email with mu4e | NaN</a></li>
529<li><a href="https://wwwtech.de/articles/2016/jul/my-personal-mail-setup">My personal mail setup</a></li>
530<li><a href="https://foobacca.co.uk/blog/2013/04/initial-tagging-and-afew/">initial tagging and afew - Foobacca</a></li>
531<li><a href="https://martinralbrecht.wordpress.com/2016/05/30/handling-email-with-emacs/">Handling Email with Emacs – malb::blog</a></li>
532<li><a href="http://deferred.io/2016/01/18/how-i-email.html">How I email, 2016 edition</a></li>
533<li><a href="https://bostonenginerd.com/posts/notmuch-of-a-mail-setup-part-2-notmuch-and-emacs/">Notmuch of mail a setup Part 2 - notmuch and Emacs | Assorted Nerdery</a></li>
534<li><a href="http://www.johnborwick.com/2019/02/09/notmuch-gmailieer.html">Checking email with gmailieer + notmuch + Emacs | John’s Blog</a></li>
535<li><a href="https://blog.einval.eu/2019/06/one-year-with-notmuch.html">One year with Notmuch</a></li>
536</ul>
537</div>
538</section>
539</main>
540<footer id="postamble" class="status">
541<footer>
542     <small><a href="/" rel="history">Index</a><a href="/sitemap.html">Sitemap</a><a href="https://dl.sbr.pm/">Files</a></small><br/>
543     <small class='questions'>Questions, comments ? Please use my <a href="https://lists.sr.ht/~vdemeester/public-inbox">public inbox</a> by sending a plain-text email to <a href="mailto:~vdemeester/public-inbox@lists.sr.ht">~vdemeester/public-inbox@lists.sr.ht</a>.</small><br/>
544     <small class='copyright'>
545      Content and design by Vincent Demeester
546      (<a rel='licence' href='http://creativecommons.org/licenses/by-nc-sa/3.0/'>Some rights reserved</a>)
547    </small><br />
548</footer>
549</footer>
550</body>
551</html>