···11let xesite = ./types/package.dhall
2233-let Prelude = ./Prelude.dhall
44-53let C = xesite.Character
6475let they = ./pronouns/they.dhall
-27
dhall/nagMessages.dhall
···11-let NagMessage = ./types/NagMessage.dhall
22-33-in [ NagMessage::{
44- , name = "Cadey"
55- , mood = "coffee"
66- , message =
77- "Hello! Thank you for visiting my website. You seem to have ads disabled. These ads help pay for running the website and are done by <a href=\"https://ethicalads.io\">Ethical Ads</a>. 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 <a href=\"https://www.patreon.com/cadey\">Patreon</a>. 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!"
88- }
99- , NagMessage::{
1010- , name = "Cadey"
1111- , mood = "coffee"
1212- , message =
1313- "Hi! Thanks for reading the blog! Your ad blocker seems to be preventing the ads from showing up. Hosting is expensive, and I use <a href=\"https://ethicalads.io\">Ethical Ads</a> to help offset the bills. Every time one of my posts gets very popular, the hosting costs go up accordingly. If you don't want to have ads enabled, please consider becoming a patron on my <a href=\"https://www.patreon.com/cadey\">Patreon</a> instead. This helps me further my goals of making highly readable, entertaining, and inspirational articles so that readers like you can benefit from my struggles. Thanks and be well!"
1414- }
1515- , NagMessage::{
1616- , name = "Mara"
1717- , mood = "hacker"
1818- , message =
1919- "Hey, I don't mean to be a bother but you seem to have an ad blocker configured for this domain. Independent tech writing and talks like these require a lot of investment in terms of writing and infrastructure. If you don't want to support the blog through ads, that's fine. Please consider donating on <a href=\"https://www.patreon.com/cadey\">Patreon</a> instead. That will help balance out the increased costs of hosting this website and get you some posts a week early as well as occasional patron-exclusive content. Thanks for reading! Hope you enjoy the article."
2020- }
2121- , NagMessage::{
2222- , name = "Mara"
2323- , mood = "happy"
2424- , message =
2525- "Thanks for reading the latest issue of the xeiaso dot net cinematic universe! Running a cinmatic universe takes more resources than you'd think. If you don't feel comfortable supporting the blog with <a href=\"https://ethicalads.io\">Ethical Ads</a>, please consider donating on <a href=\"https://www.patreon.com/cadey\">Patreon</a>. Hosting is expensive, especially at the scale this website operates at. Every little bit helps."
2626- }
2727- ]
···11-let xesite = ./types/package.dhall
22-33-let VOD = xesite.StreamVOD
44-55-in [ VOD::{
66- , title = "Shouting at my editor"
77- , slug = "cursorless"
88- , description =
99- ''
1010- This is a bit of an experimental stream where I attempted to dictate code with [cursorless](https://www.cursorless.org/). When I recorded this stream, I was at minute twenty of playing with this tool. This stream is going to sound really weird, because I am going to be rattling off voice commands that will sound weird at first.
1111-1212- On this stream, I decided to implement a stable diffusion feature for my CDN XeDN. It replicates the API of the service gravatar, but backed by stable diffusion based off of the hash. There is a terrible bit of code that turns a gravatar hash into a stable diffusion prompt and seed combination.
1313-1414- This stream covers the following topics:
1515-1616- * Basic navigation with cursorless
1717- * Data transformations
1818- * How to execute on terrible ideas
1919- ''
2020- , date = "2023-03-04"
2121- , cdnPath = "talks/vod/2023/03-04-cursorless"
2222- , tags = [ "accessibility", "voiceControl", "go", "stableDiffusion" ]
2323- }
2424- , VOD::{
2525- , title = "Ripping the bandaid off and using Emacs managed by Nix"
2626- , slug = "emacs-nix"
2727- , description =
2828- ''
2929- This is a shorter stream where I switched my Emacs config from [Spacemacs](https://spacemacs.org) to a custom configuration I've been prototyping for a year or so that has everything managed with [home-manager](https://nixos.wiki/wiki/Home_Manager) on NixOS. This allows my configuration to be completely managed in configuration and all packages that I depend on can be precompiled at deploy time_, allowing me to run my complicated configurations on less powerful hardware without having to wait for bytecode compilation to happen. Most of the rest of the stream was just going through the motions of actually making the change, and then trying to make some ergonomics changes so that I could use it as a replacement for tmux.
3030-3131- This stream covers the following topics:
3232-3333- * Nix/NixOS configuration management
3434- * Emacs Lisp programming
3535- * Writing custom interactive commands in Emacs
3636- * Proving chat wrong about the capabilities of Emacs
3737- ''
3838- , date = "2023-02-04"
3939- , cdnPath = "talks/vod/2023/02-04-emacs"
4040- , tags = [ "emacs", "nix", "lisp", "tmux" ]
4141- }
4242- , VOD::{
4343- , title = "Fixing Xesite in reader mode and RSS readers"
4444- , slug = "reader-mode-css"
4545- , description =
4646- ''
4747- When you are using reader mode in Firefox, Safari or Google Chrome, the browser rends control of the website's design and renders its own design. This is typically done in order to prevent people's bad design decisions from making webpages unreadable and also to strip away advertisements from content. As a website publisher, I rely on the ability to control the CSS of my blog a lot. This stream covers the research/implementation process for fixing some long-standing issues with the Xesite CSS and making a fix to XeDN so that the site renders acceptably in reader mode.
4848-4949- This stream covers the following topics:
5050-5151- * Understanding complicated CSS rules and creating fixes for issues with them
5252- * Using content distribution networks (CDNs) to help reduce page load time for readers
5353- * Implementing image resizing capabilities into an existing CDN program (XeDN)
5454- * Design with end-users in mind
5555- ''
5656- , date = "2023-01-21"
5757- , cdnPath = "talks/vod/2023/01-21-reader-mode"
5858- , tags = [ "css", "xedn", "imageProcessing", "scalability", "bugFix" ]
5959- }
6060- , VOD::{
6161- , title = "Implementing the Pronouns service in Rust and Axum"
6262- , slug = "pronouns-service"
6363- , description =
6464- ''
6565- In this stream I implemented the [pronouns](https://pronouns.within.lgbt) service and deployed it to the cloud with [fly.io](https://fly.io). This was mostly writing a bunch of data files with [Dhall](https://dhall-lang.org) and then writing a simple Rust program to query that 'database' and then show results based on the results of those queries.
6666-6767- This stream covers the following topics:
6868-6969- * Starting a new Rust project from scratch with Nix flakes, Axum, and Maud
7070- * API design for human and machine-paresable outputs
7171- * DevOps deployment to the cloud via [fly.io](https://fly.io)
7272- * Writing Terraform code for the pronouns service
7373- * Building Docker images with Nix flakes and `pkgs.dockerTools.buildLayeredImage`
7474- * Writing API documentation
7575- * Writing [the writeup](https://xeiaso.net/blog/pronouns-service) on the service
7676- ''
7777- , date = "2023-01-07"
7878- , cdnPath = "talks/vod/2023/01-07-pronouns"
7979- , tags = [ "rust", "axum", "terraform", "nix", "flyio", "docker" ]
8080- }
8181- , VOD::{
8282- , title = "Modernizing hlang with the nguh compiler"
8383- , slug = "hlang-nguh-compiler"
8484- , description =
8585- ''
8686- This stream was the last stream of 2022 and focused on modernizing the [hlang](https://xeiaso.net/blog/series/h) compiler. In this stream I reverse-engineered how WebAssembly modules work and wrote my own compiler for a trivial esoteric programming language named h. The existing compiler relied on legacy features of WebAssembly tools that don't work anymore.
8787-8888- This stream covers the following topics:
8989-9090- * Reverse-engineering the WebAssembly module format based on the specification and other reverse-engineering tools
9191- * Adapting an existing compiler to output WebAssembly directly
9292- * Deploying a new service to my NixOS machines in the cloud
9393- * Building a Nix flake and custom NixOS module to build and deploy the new hlang website
9494- * Terraform DNS config
9595- * Writing [the writeup on the new compiler](https://xeiaso.net/blog/hlang-nguh)
9696- ''
9797- , date = "2022-12-31"
9898- , cdnPath = "talks/vod/2022/12-31-nguh"
9999- , tags =
100100- [ "hlang"
101101- , "go"
102102- , "wasm"
103103- , "philosophy"
104104- , "devops"
105105- , "terraform"
106106- , "aws"
107107- , "route53"
108108- , "nixos"
109109- ]
110110- }
111111- ]
-23
dhall/types/Author.dhall
···11-let PronounSet = ./PronounSet.dhall
22-33-in { Type =
44- { name : Text
55- , handle : Text
66- , image : Optional Text
77- , url : Optional Text
88- , sameAs : List Text
99- , jobTitle : Text
1010- , inSystem : Bool
1111- , pronouns : PronounSet.Type
1212- }
1313- , default =
1414- { name = ""
1515- , handle = ""
1616- , image = None Text
1717- , url = None Text
1818- , sameAs = [] : List Text
1919- , jobTitle = ""
2020- , inSystem = False
2121- , pronouns = ../pronouns/she.dhall
2222- }
2323- }
-16
dhall/types/Config.dhall
···11let Person = ./Person.dhall
2233-let Author = ./Author.dhall
44-53let Character = ./Character.dhall
6475let Job = ./Job.dhall
8697let Link = ./Link.dhall
1010-1111-let NagMessage = ./NagMessage.dhall
128139let SeriesDescription = ./SeriesDescription.dhall
14101515-let VOD = ./StreamVOD.dhall
1616-1711let PronounSet = ./PronounSet.dhall
1818-1919-let Prelude = ../Prelude.dhall
20122113let Resume = ./Resume.dhall
2214···28202921in { Type =
3022 { signalboost : List Person.Type
3131- , defaultAuthor : Author.Type
3232- , authors : Prelude.Map.Type Text Author.Type
3323 , port : Natural
3424 , clackSet : List Text
3525 , webMentionEndpoint : Text
3626 , miToken : Text
3727 , jobHistory : List Job.Type
3828 , seriesDescriptions : List SeriesDescription.Type
3939- , seriesDescMap : Prelude.Map.Type Text Text
4029 , notableProjects : List Link.Type
4130 , contactLinks : List Link.Type
4231 , pronouns : List PronounSet.Type
4332 , characters : List Character.Type
4444- , vods : List VOD.Type
4533 , resume : Resume.Type
4634 }
4735 , default =
4836 { signalboost = [] : List Person.Type
4949- , defaultAuthor = Author::{=}
5050- , authors = [] : List Author.Type
5137 , port = defaultPort
5238 , clackSet = [ "Ashlynn" ]
5339 , webMentionEndpoint = defaultWebMentionEndpoint
5440 , miToken = "${env:MI_TOKEN as Text ? ""}"
5541 , jobHistory = [] : List Job.Type
5642 , seriesDescriptions = [] : List SeriesDescription.Type
5757- , seriesDescMap = [] : Prelude.Map.Type Text Text
5843 , notableProjects = [] : List Link.Type
5944 , contactLinks = [] : List Link.Type
6045 , pronouns = [] : List PronounSet.Type
6146 , characters = [] : List Character.Type
6262- , vods = [] : List VOD.Type
6347 , resume = Resume::{=}
6448 }
6549 }
-3
dhall/types/NagMessage.dhall
···11-{ Type = { name : Text, mood : Text, message : Text }
22-, default = { name = "", mood = "", message = "" }
33-}
-19
dhall/types/StreamVOD.dhall
···11-let Link = ./Link.dhall
22-33-in { Type =
44- { title : Text
55- , slug : Text
66- , date : Text
77- , description : Text
88- , cdnPath : Text
99- , tags : List Text
1010- }
1111- , default =
1212- { title = ""
1313- , slug = ""
1414- , date = ""
1515- , description = ""
1616- , cdnPath = ""
1717- , tags = [] : List Text
1818- }
1919- }