MIME support for inline images #email

I was about to send an image inline in an email using the venerable MIME standard, when I remembered that many clients don't handle that very well.

So I created a test email to see how they do.

The email is very simple - some text, an inline image, and some more text. Here is a copy, if you want to test your favourite client.

My email client shows it like this:

Gnus displaying my test email

Here are the results:

Client Shows image inline Shows text after image Screenshot
Gmail ❌ at bottom image
Office 365 Outlook ❌ at top❌ hidden as attachment image
Outlook iPhone ❌ hidden as attachment image
Protonmail ❌ as attachment at bottom image
Tutanota ❌ as attachment at top❌ hidden as attachment image
K9 Android ❌ as attachment at bottom image
Gnus image
Thunderbird image

So what I remembered was not wrong. Most email clients suck at MIME.

The Outlook app on the iPhone gets an extra half mark subtracted for showing an exceedingly ridiculous amount of vertical white space.

Which is not surprising, the relevant RFC is from 1996.


Installing Converse with Apache and ejabberd

Converse logo I banged my head against this for a while, so here is the short summary on how to get Converse going on a (Debian) server running Apache and ejabberd.

ejabberd is configured to have ejabberd_http_ws on "/websocket" on port 5280. This was already so in my setup.

I downloaded converse.min.css and converse.min.js from cdn.conversejs.org and put them in a folder called xmpp on my webserver. I also had to download a bunch of fonts: baumans.ttf, muli.ttf, fa-solid-900.{woff2,woff,ttf} and fa-regular-400.{woff2,woff,ttf}, which I put in xmpp/webfonts/.

Then I created xmpp/index.html, which simply contains:

<!DOCTYPE html>
<html lang="en">
    <title>Converse - koldfront</title>
    <link rel="stylesheet" type="text/css" media="screen" href="converse.min.css">
    <script src="converse.min.js" charset="utf-8"></script>
          websocket_url: 'wss://koldfront.dk/websocket/',
          view_mode: 'fullscreen'

Now, in Apache we need to include the proxy_wstunnel module, so run sudo a2enmod proxy_wstunnel. And in the configuration for the webserver, we need to tell it to proxy the /websocket URL to ejabberd:

    SSLProxyEngine on
    ProxyPass "/websocket/" "wss://koldfront.dk:5280/websocket/"
    ProxyPassReverse "/websocket/" "wss://koldfront.dk:5280/websocket/"

And then I was able to login.

I haven't figured out why image uploads don't work (they do from Conversations (Android) and jabber.el (Emacs)), but otherwise Converse seems to work.


Seamlessly going from wireless to wired network and back #net

One thing that has annoyed me for a while is that when I dock my laptop I lose all the current connections - so I have to close down Gnus and start it again, the same goes for jabber.el.

So this evening I looked for a solution, and found all kinds of suggestions about bonding, bridging, NAT, ebtables, arp routing and things.

It all looked... complicated. The recipe I tried... did not work.

Then I saw someone who wrote "Just assign both interfaces the same static IP address."

So I did. And it works.

If I am on wifi and plug in the cable, 5-10s later, the cabled network kicks in, and because I've set up metric on the interfaces for priority [I guess], the cable takes over. When I unplug the cable, it takes around 25-30s before the wifi takes over, but connections in Gnus and jabber.el "survive" unscathed.

This is great - \o/


ifmetric #free software #net

If you are annoyed when you dock your laptop that the cabled network doesn't get prioritized over the wifi, here are two steps for you:



Home server upgrade #debian #hardware

I thought it was time to upgrade my home server, virgil.

My home server runs a bunch of services:

Think about hosting your things yourselves, instead of "gifting" it all to big corporations, folks!

Apparently I am not good at recording/remembering when I do stuff like this, so let's try to remedy that.

I switched from a 4 core AMD FX-4170 CPU (125W) in a [large] Gigabyte motherboard with 32 MB of memory and a 1TB Samsung 850 SATA SSD to a 4 (8 with hyperthreading) AMD Ryzen 5 2400GE (35W) in a new and smaller Gigabyte B450M DS3H motherboard, equipped with 64GB of memory and a new 2TB Intel 660p NVMe SSD.

The new setup has built in graphics, so I could retire the fanless Asus Radeon-something graphics card I had attached.

What I hadn't thought about was that the new motherboard only has PCIe slots, while I was using a PCI slot for the Intel Pro 1000 GT network card, so now I'm using the Realtek 8169 that is built into the motherboard. So far it works.

Another problem was the huuuuge Scythe Ninja 3 rev B CPU cooler that I used - it doesn't fit the new motherboard, as the holes on an AM4 socket board are placed differently than on an AM3+ board. So I had to find an old cooler that clicks on in the standard way.

Side of cabinet modified to allow cable through I also went from no cabinet (parts lying on a shelf) to a SilverStone SUGO SG11. This posed some challenges - the old cooler I dug up is smaller than the huge one I was using, but it is large enough that the [fanless] power supply wouldn't fit in its natural place. So I yanked out the drive cage from the cabinet and plonked the power supply in there. Only problem then was that the plug had to go through the side of the cabinet. Nothing a little violence couldn't fix, though.

Transfering the contents of the old SSD to the new was as easy as connecting both of them, booting from a USB-stick, partitioning and formatting the new SSD, rsync'ing over the contents, chroot'ing into the new SSD with /sys, /proc and /dev bind-mounted, running grub-install, and rebooting, after adjusting the fstab and /etc/network/interfaces. Ah, the joy of Debian GNU/Linux.

Part of the exercise was to reduce the power consumption (although that was mostly an excuse for upgrading). I have an old "Watt-o-meter", which showed 75-80W most of the time for the old setup. Unfortunately it seems quite unreliable, because now it shows 0.4-0.5W.


Browsing gopher in Emacs #emacs

Screenshot of gopher.el in action There's a nice mode to browse gopher sites in Emacs: gopher.el on Microsoft Github.

First impressions:


Chromium won't show PDF's served from your webserver?

Grey with grey If Chromium won't show PDF's inline when served from your webserver, it might be because you followed some security advice and set a "Content-Security-Policy"-header, containing the rule "default-src 'none'".

The symptom is that instead of showing the PDF, Chromium will just show a grey page with a tiny rectangle with rounded corners in the middle.

I fixed it by changing "none" to "self"; but I guess I should figure out which of the more specific policies it is that Chromium needs to be changed.

Some more digging reveals the I can keep "default-src 'none'" if I add "object-src 'self'", and Chromium will then display PDF's inline, so that's what I'm using now.


Archive... Search... Keywords...
Sorø art museum


Langebro (65).


Atari Inc. (47).

τ day.


GNU GPL v3 (12).

0.0263 s