Cadey is coffee
<Cadey> Hello! Thank you for visiting my website. You seem to be using an ad-blocker. I understand why you do this, but I'd really appreciate if it you would turn it off for my website. These ads help pay for running the website and are done by Ethical Ads. I do not receive detailed analytics on the ads and from what I understand neither does Ethical Ads. If you don't want to disable your ad blocker, please consider donating on Patreon or sending some extra cash to xeiaso.eth or 0xeA223Ca8968Ca59e0Bc79Ba331c2F6f636A3fB82. It helps fund the website's hosting bills and pay for the expensive technical editor that I use for my longer articles. Thanks and be well!

Various site updates

Read time in minutes: 17

hero image foxgirl-surfing
Waifu Diffusion v1.3 (float16) -- landscape, mountains, breath of the wild, 1girl, fox ears, dark blue hair, blue eyes, surfboard, surfing, beach, simple sketch, clean lines, rakugaki

Hey all, just some smaller updates on my site and the infrastructure around this blog. I'm also throwing in some of my smaller project updates that I haven't gotten to on the blog.

Sonic Frontiers stream

I'm going to be streaming the game Sonic Frontiers on Twitch on November 8th, 2022 at 10:00 EDT through at least 12:00 EDT. I may go longer depending on how the game is, but I took the day off for this so I may as well take advantage of it.

If you want to add this to your calendar, you can either import the ICS file for the event or add it to Google Calendar. This is my first time pre-announcing a stream like this and I hope that this will be worth it.

the profile picture for cadey
Xe @cadey
M10 30 2022 21:04 (UTC)

Do you like "video games"? I'm going to be playing Sonic Frontiers on Twitch on its release date! Check it out at on Tuesday, November 8th at 10:00 Eastern through at least 12:00 Eastern.

The text "Xe Iaso Plays Sonic Frontiers, tuesday November 8th 10:00 Eastern time" superimposed over an AI generated landscape with a foxgirl surfing on some shallow waves.

Mastodon quoting

One of the big things I've done is add support for embedding mastodon posts in a more native way. Mastodon normally has an "embed this post" link, which makes things look like this:

However, I think I can do it better. I wrote some code to serialize the mastodon post information to JSON on the disk and then I can render out toots like this:

the profile picture for cadey
Xe @cadey
M10 27 2022 20:48 (UTC)

This new watch feels great. I love how the pride edition band looks.

An Apple Watch series 8 with the pride edition band and the time saying "16:47"

It also works with embedded videos:

the profile picture for cadey
Xe @cadey
M10 30 2022 17:38 (UTC)

Testing a video upload for writing something to do with Mastodon


I think this looks much cleaner. It also puts a lot less load on the Mastodon server that I use, which will certainly make Cult Pony happier.

This works by putting the mastodon data into .json files that I ship around with both my site's git repo and the runtime closure of my website binary. When the HTML parser sees one of these tags:

<xeblog-toot url=""></xeblog-toot>

It looks up that toot's information on the disk and then renders that into memory. This allows me to ensure all this information is not fetched from the target Mastodon server on every page load, which should help with reducing load on the fediverse servers that I link to.

Ads enabled globally

Previously I only enabled ads for users visiting my blog from Hacker News and Reddit. These ads are done with Ethical Ads, which is done by the people behind the popular documentation service Read the Docs.

I want to stress the following things:

  • The income that I get from the advertisements is being used to fund the infrastructure for this website and other hilarious projects I have in the pipeline, just like the Patreon.
  • You can use an ad blocker all you want. The only thing that will happen is that you will see a "nag message" that gently asks you to not as well as linking to my Patreon. I have no way of tracking who actually blocks ads.
  • I have identified a few websites that I think are cool in an attempt to not show ads when you visit from them, but the main one that I wanted to get working with this (Lobsters) appears to only sometimes give out referrer information in an effort to discourage content marketing. I am going to come up with an alternative workaround for Lobsters users to view my posts without advertising income.
  • It turns out hosting video is kinda expensive.

I am working on an integration with Patreon that allows patrons to bypass ads from being shown in the blog. I have also been considering having other features like commenting on posts, but for right now I am focusing on other things.

Robocadey 2: Stable Diffusion edition

Recently I created a project named robocadey. This took all of my tweets, fed them into GPT-2 and then generated new tweets. This worked for a while, but then things fell apart due to python catastrophes and I never was able to get things working again.

Don't worry, because I have created a brand new python catastrophe using Stable Diffusion. More specifically using a variant of the Stable Diffusion model named Waifu Diffusion. Waifu Diffusion is the model that you see in most of my blog's hero images. Scrying an image out of Waifu Diffusion is similar to searching danbooru (warning, NSFW images) for images.

To use Robocadey 2, all you need to do is mention with a set of tags. For example, this input:

the profile picture for cadey
Xe @cadey
M10 30 2022 20:17 (UTC)

@robocadey 1girl, cute, solo, portrait, brown hair, brown eyes, long hair, smile, blush, laptop, coffee shop, katana


Will get you this output:

the profile picture for robocadey
Robocadey @robocadey
M10 30 2022 20:17 (UTC)
Content warning: AI generated image (can be NSFW)

@cadey here is your image:

prompt: 1girl, cute, solo, portrait, brown hair, brown eyes, long hair, smile, blush, laptop, coffee shop, katana
seed: 1099521048
Generated with Waifu Diffusion v1.3 (float16)

Waifu Diffusion v1.3 with the prompt: 1girl, cute, solo, portrait, brown hair, brown eyes, long hair, smile, blush, laptop, coffee shop, katana

Please do feel free to experiment with this. Keep in mind that it can only process one image at a time (the poor 2060 in ontos only has enough vram to do one image at a time), so depending on load you may have to wait your turn.

I'm not sure if this is a bug or a feature, but if you reply to the bot, it'll also take that as input to generate new images:

the profile picture for robocadey
Robocadey @robocadey
M10 30 2022 20:44 (UTC)
Content warning: AI generated image (can be NSFW)

@dee @cadey here is your image:

prompt: that's really well done. Your prompt is a good 'un
seed: 2139947102
Generated with Waifu Diffusion v1.3 (float16)

Waifu Diffusion v1.3 with the prompt: that's really well done. Your prompt is a good 'un

You can find the source code here. This is not in a state that is ready for other people to use though. I don't expect it to ever get in such a state. This is an experiment that will some day stop working and that's okay.

Be sure to save images that you really like, the bot account is configured to autodelete generated images after two weeks. This means that the images in my post are going to eventually go dead too, but that's okay.

Mastodon as my main microblogging outlet

I am really not getting good vibes with the results of Elon Musk purchasing Twitter. I'm starting to post more on Mastodon at instead. I currently have a reposting service set up to ferry posts between Mastodon and Twitter, but there is a significant delay when things get reposted. If you want things more expediently, I suggest you follow me on Mastodon.

Cadey is coffee
<Cadey> If you see the #noxp hashtag in either my Twitter or Mastodon posts, the reason it is there is to stop the reposting service from reposting things.

I made a LinkedIn

I have given in and created a LinkedIn account. I really don't like how LinkedIn traps a lot of information about people, and how that information is used by attackers in order to social engineer people better. But, most of the industry expects you to have one. If I have to have one, then at least I want to do it "right". I'll be reposting my blog content there.

API endpoints

I have created a few small API endpoints for the blog. They allow you to get information about the most recent post on the blog as well as more detailed information on individual posts. I am considering these endpoints stable and I am working hard to make sure that the API compatibility will not break in future releases without proper warning.

These API calls don't have rate limits currently, but please don't be the person that makes me have to add them.


This returns information about the most recent post to my blog. This will return a JSON object that contains at least the following fields:

  • title - The title of the post
  • summary - Either a human-readable summary of the post or the description of the estimated read time of the post
  • link - The link to the post

Here is an example (piped through jq):

  "title": "How to make NixOS compile nginx with OpenSSL 1.x",
  "summary": "3 minute read",
  "link": ""


This returns information on a blog post by URL slug. In the blogpost URL, the slug is the nixos-nginx-openssl-1.x part. This returns the JSON Feed Item form of the blogpost or talk summary in question.

This also includes a custom _xesite_frontmatter extension that will contain at least this information:

  • about (required, string) is a link to the documentation for the extension in my blog's GitHub repository. It gives readers of the JSON Feed information about what this extension does. This is for informational purposes only and can safely be ignored by programs.
  • series (optional, string) is the optional blogpost series name that this item belongs to. When I post multiple posts about the same topic, I will usually set the series to the same value so that it is more discoverable on my series index page.
  • slides_link (optional, string) is a link to the PDF containing the slides for a given talk. This is always set on talks, but is technically optional because not everything I do is a talk.
  • vod (optional, string) is an object that describes where you can watch the Video On Demand (vod) for the writing process of a post. When populated, this is an object that always contains the string fields twitch and youtube. These will be URLs to the videos so that you can watch them on demand.

I reserve the right to add fields to this in the future, but when I do I will update the documentation accordingly.

XeDN video metrics plans

I'm considering adding some Xeact-powered JavaScript to allow me to track events on the video I'm hosting on my own infrastructure. My intent is to create some grafana graphs to track the following events:

  • The video being watched to completion
  • The video load being stalled
  • The video is able to be played
  • If HTTP Live Streaming works

I also plan to surface some of these metrics on the blog itself, namely having the video being watched to completion function as a proxy for the view count metric on YouTube.

Updates on longer projects

This is going to have some smaller updates that aren't worth their own sections.

  • I am researching part 2 of my Bitcoin/Ethereum article that I'll be writing with Open Skies again. We plan to have this article cover smart contracts, how to use them, why you would want to use them, and what problems they have when they intersect with the "real world". At this point I'm almost certain that calling them "contracts" is a misnomer that is misleading enough to be observably harmful.
  • waifud is still in progress, I am currently stalled on the metadata API. I can't figure out how to make the libvirt virtual machine connect to the new metadata service isekaid without either the flow being rejected or libvirt NAT-ing the connection. I am trying to get a direct connection to either or fc00::da1a (data) so that virtual machines can use that to bootstrap cloud-init. If anyone has ideas, please contact me. I hope to have this usable for other people by the end of the year. Please let me know if you want to be an early beta tester.
  • I have been planning out ideas for a completely AI generated image booru like danbooru, e621, Derpibooru or Furbooru. I want to create this as a demonstration of what image generation technology could be able to do if this technology was a bit more efficient. I don't expect this to be ready any time soon, and when it is ready I will likely be limiting it heavily.
  • XeDN needs to be rewritten to have a better caching strategy. Right now it does work but it has a slight habit of totally falling over at the worst possible times. Browsers retry things, so it's not realistically as bad as you'd think.
  • My blog is built using Nix flakes now. I need to finish migrating my last cloud server over to flakes.
  • My blog is being served with LibreSSL instead of OpenSSL 3.x. I plan to write about how you can use system.replaceRuntimeDependencies to mitigate the OpenSSL vulnerability with the patched version of OpenSSL on Tuesday, when the patch is released. I don't know if the OpenSSL bug is going to be super bad, but if it is then I get to show off a neat trick with NixOS so it's win/win in my book.

And that's what's going on in my world! Hope this was an interesting look into all of the things that I'm tinkering with and working on for my personal projects. Hopefully things will settle down once I get someone to help me do DevRel at Tailscale. I've hit a point where I'm not able to do everything on my own anymore and if you want to help make things happen, please apply to that role.

Be well!

This article was posted on M10 30 2022. Facts and circumstances may have changed since publication. Please contact me before jumping to conclusions if something seems wrong or unclear.

Series: site-update

Tags: mastodon stream sonicfrontiers robocadey noxp

This post was not WebMentioned yet. You could be the first!

The art for Mara was drawn by Selicre.

The art for Cadey was drawn by ArtZora Studios.

Some of the art for Aoi was drawn by @Sandra_Thomas01.