<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/static/rss.xsl" type="text/xsl"?>
<rss version="2.0">
  <channel>
    <title>Nick Iaquinto&#39;s Blog</title>
    <link>https://niaquinto.com</link>
    <language>en-US</language>
    <item>
      <title>Adding Wi-Fi Printing for “Dumb” Printers</title>
      <link>https://niaquinto.com/blog/2026/05/wifi-printing-for-dumb-printers.html</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2026/05/wifi-printing-for-dumb-printers.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;adding-wi-fi-printing-for-dumb-printers&#34;&gt;Adding Wi-Fi Printing for “Dumb” Printers&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2026-05-24&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Printers are terrible. And yet, there are few contenders stepping up to fill the&#xA;void. After struggling with junky software, upsells, ads, subscriptions, and&#xA;broken printers again and again, I gave up and turned to the dumbest possible&#xA;printer I could find: Brother HL-L2300D black and white laser printer.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve been using this same Brother BW laser for 5 years, and it works great. No&#xA;screen. No networking. It just prints fast and reliably. But, I’ll admit that&#xA;wireless printing is pretty nice, especially for my wife who prints more than&#xA;me.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And 2 years ago, I thought: how hard could it be? I had a spare Raspberry Pi&#xA;2B lying around and gave it a shot. It’s been running ever since with no&#xA;attention needed, again reliable and simple.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In fact it’s been so reliable, that when I went to upgrade the OS recently, I&#xA;realized I had lost the credentials. So, I had to retrace my steps to re-install&#xA;the full setup from scratch. And I thought I’d share my notes in case anyone&#xA;else was looking for a hassle free wireless printing experience.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;what-you-need&#34;&gt;What You Need&lt;a href=&#34;#what-you-need&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A “dumb” USB printer&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;I use the Brother HL-L2300D, but any USB printer works&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;A Computer, ideally a small Single Board Computer (SBC)&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;I used a Raspberry Pi 2B, but anything that runs Linux will work.&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;A MicroSD card &lt;em&gt;for the OS&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;A USB cable to connect the printer to the SBC&lt;/li&gt;&#xA;&lt;li&gt;A Power cable to power the SBC&lt;/li&gt;&#xA;&lt;li&gt;Your home network&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Ethernet recommended for the Pi&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;step-1-flash-ubuntu-server&#34;&gt;Step 1: Flash Ubuntu Server&lt;a href=&#34;#step-1-flash-ubuntu-server&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://ubuntu.com/download/raspberry-pi&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Download Ubuntu Server&lt;/a&gt; 24.04 LTS&#xA;for Raspberry Pi and flash it to a MicroSD card with&#xA;&lt;a href=&#34;https://etcher.balena.io/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Balena Etcher&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then, boot the Pi for the first time:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Insert the MicroSD card&lt;/li&gt;&#xA;&lt;li&gt;Connect HDMI, keyboard, and power&lt;/li&gt;&#xA;&lt;li&gt;Connect Ethernet to your network&lt;/li&gt;&#xA;&lt;li&gt;Login with the default credentials (username: &lt;code&gt;ubuntu&lt;/code&gt;, password: &lt;code&gt;ubuntu&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Upgrade packages:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update &lt;span style=&#34;color:#719e07&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;step-2-set-up-ssh&#34;&gt;Step 2: Set Up SSH&lt;a href=&#34;#step-2-set-up-ssh&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;You’ll want to manage the Pi headlessly so you can put it anywhere the printer&#xA;is. No need to keep a keyboard and monitor attached.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, find the Pi’s IP address:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip addr | grep 192.168&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Look for your Ethernet IP, ex: 192.168.1.154&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# In rare cases, your home network might use another net block like 10.0.0.0/32 or 172.16.0.0/12&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Now, from your laptop, generate a key and copy it to the Pi:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Generate a key (replace my-computer with a more descriptive comment for your key)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -a &lt;span style=&#34;color:#2aa198&#34;&gt;100&lt;/span&gt; -t ed25519 -C my-computer -f ~/.ssh/id_printer_ed25519&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Copy the key to the Pi. Below I describe a janky way of getting your key over&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# using HTTP server logging. But you can also use magic-wormhole or temporarily&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# enabling password auth and then disabling later.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# On the Pi, start a temporary HTTP server:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 -m http.server --bind 0.0.0.0 &lt;span style=&#34;color:#2aa198&#34;&gt;8000&lt;/span&gt; 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; | tee log.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# From your laptop, upload the public key:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X PUT -T ~/.ssh/id_printer_ed25519_2026-03-07.pub http://192.168.1.154:8000/mykey&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# On the Pi, quit the HTTP server (Ctrl+C), then add the key:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.ssh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat log.txt | grep &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;PUT /mykey&amp;#34;&lt;/span&gt; | awk &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;{print $NF}&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Add the SSH alias to your laptop’s &lt;code&gt;~/.ssh/config&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#file:~/.ssh/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host rpi-printer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    User ubuntu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    HostName 192.168.1.154&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    IdentityFile ~/.ssh/id_printer_ed25519&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Test that it works:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh rpi-printer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Once you’ve confirmed SSH key login works, you’re done with SSH setup and can&#xA;disconnect the keyboard and monitor.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;step-3-enable-auto-login&#34;&gt;Step 3: Enable Auto-Login&lt;a href=&#34;#step-3-enable-auto-login&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Since this Pi is only running a print queue, you want it to come back up on its&#xA;own after power outages and other disruptions. Enable auto-login by editing the&#xA;getty service:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo vim /lib/systemd/system/getty@.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Replace this line:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Old&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStart=-/sbin/agetty -o &amp;#39;-p -- \u&amp;#39; --noclear %I $TERM&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;With this:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# New&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStart=-/sbin/agetty --noissue --autologin ubuntu %I $TERM Type=idle&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Here &lt;code&gt;ubuntu&lt;/code&gt; is the username. If you use a different username, change it&#xA;accordingly.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then reboot and hope it worked:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;If the SSH server isn’t reachable on the network after reboot, reconnect the&#xA;keyboard and monitor and dive in to figure out what the issue was.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;step-4-install-cups-and-configure-the-printer&#34;&gt;Step 4: Install CUPS and Configure the Printer&lt;a href=&#34;#step-4-install-cups-and-configure-the-printer&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;CUPS is the open source print server that handles everything: print queues,&#xA;drivers, the web UI, and so on.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Install and enable CUPS:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install cups&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start cups&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#b58900&#34;&gt;enable&lt;/span&gt; cups&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Now configure CUPS to allow remote access and printer sharing. Edit the config:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo vim /etc/cups/cupsd.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Make these changes:&lt;/p&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Enable printer sharing&lt;/strong&gt;: Change &lt;code&gt;Browsing No&lt;/code&gt; to &lt;code&gt;Browsing Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Allow remote printing&lt;/strong&gt;: Change &lt;code&gt;Listen localhost:631&lt;/code&gt; to &lt;code&gt;Listen 0.0.0.0:631&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Allow remote web UI access&lt;/strong&gt;: Update the &lt;code&gt;&amp;lt;Location /&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;Location /admin&amp;gt;&lt;/code&gt; blocks:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Old&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;Location /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Order allow,deny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/Location&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;Location /admin&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Order allow,deny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/Location&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# New&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;Location /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Order allow,deny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Allow @LOCAL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/Location&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;Location /admin&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Order allow,deny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Allow @LOCAL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/Location&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Add your user to the &lt;code&gt;lpadmin&lt;/code&gt; group so you can login to the CUPS web UI:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo usermod -aG lpadmin ubuntu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Install the printer driver. For the Brother HL-L2300D:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install printer-driver-brlaser&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Restart CUPS to pick up all the changes:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl restart cups&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Now visit the CUPS web UI in your browser. You’ll need to use HTTPS because&#xA;the login page requires it:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://192.168.1.154:631/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Your browser will warn you about the self-signed certificate. That’s fine,&#xA;proceed through it.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;step-5-add-the-printer-in-cups&#34;&gt;Step 5: Add the Printer in CUPS&lt;a href=&#34;#step-5-add-the-printer-in-cups&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Navigate to the &lt;em&gt;Administration&lt;/em&gt; tab and click &lt;em&gt;Add Printer&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The printer should show up automatically since we already installed the driver.&#xA;Follow the prompts to add it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./cups-add-printer_step01_add-printer-select.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./cups-add-printer_step02_add-printer-name.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./cups-add-printer_step03_add-printer-pick-driver.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./cups-add-printer_step04_add-printer-success.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then, set the default page settings. By default, the printer is configured for&#xA;double-sided printing on US Letter paper. To change this, go to the printer&#xA;page, click &lt;em&gt;Set Printer Default Options&lt;/em&gt; from the &lt;em&gt;Administration&lt;/em&gt; dropdown,&#xA;and adjust to your liking.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Print a test page to make sure everything works:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./cups-add-printer_step05_set-defaults.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./cups-add-printer_step06_print-test-page.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./cups-add-printer_step07_print-queue.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Finally, set this printer as the server default. This isn’t strictly necessary,&#xA;but it’s a good practice:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./cups-add-printer_step08_set-as-default.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./cups-add-printer_step09_set-default-success.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;step-6-enable-network-discovery-with-avahi&#34;&gt;Step 6: Enable Network Discovery with Avahi&lt;a href=&#34;#step-6-enable-network-discovery-with-avahi&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;This is the magic step. Avahi broadcasts your printer over Bonjour, so it shows&#xA;up automatically on Macs, iPhones, and anything else that supports AirPrint or&#xA;Bonjour. There’s no drivers or special software necessary.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, set a recognizable hostname so the printer shows up with a friendly name:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo vim /etc/hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Change to: rpi-printer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo hostname rpi-printer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Logout and log back in for the hostname change to take effect.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then install Avahi:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install avahi-daemon&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start avahi-daemon&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#b58900&#34;&gt;enable&lt;/span&gt; avahi-daemon&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;That’s it. The printer will now appear on your network as something like&#xA;&lt;code&gt;Brother HL-L2300D series @ rpi-printer&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;step-7-connect-and-print&#34;&gt;Step 7: Connect and Print&lt;a href=&#34;#step-7-connect-and-print&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;On Mac:&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Open &lt;em&gt;System Settings &amp;gt; Printers &amp;amp; Scanners&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Click &lt;em&gt;Add Printer&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Select &lt;code&gt;Brother HL-L2300D series @ rpi-printer&lt;/code&gt; and click &lt;em&gt;Add&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Open a document and print!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./mac-setup_printers-and-scanners.png&#34; alt=&#34;&#34;/&gt;&#xA;&lt;img src=&#34;./mac-setup_select-printer.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;On iPhone:&lt;/strong&gt; &lt;em&gt;No setup required.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tap &lt;em&gt;Share&lt;/em&gt; on something&lt;/li&gt;&#xA;&lt;li&gt;Scroll down and select &lt;em&gt;Print&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Tap &lt;em&gt;Printer&lt;/em&gt; and select &lt;code&gt;Brother HL-L2300D series @ rpi-printer&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;After less than an hour of setup, you should have an easy to use and &lt;em&gt;reliable&lt;/em&gt;&#xA;wireless printer. I use velcro-tape to stick the Raspbery Pi on the back of the&#xA;device and basically forget about it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For a deluxe setup, you might want to add something that sends an alert if the&#xA;IP address changes. Or, you can setup something to notify you if toner levels&#xA;get low.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And really, you have an always on computer now. So, you can also run all kinds&#xA;of interesting &lt;a href=&#34;https://github.com/awesome-selfhosted/awesome-selfhosted&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;self-hosted&lt;/a&gt;&#xA;stuff on there to solve other home problems.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Here’s to another 2 years of hassle free printing!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>Just Get Two or How I Learned Programming on a Throwaway Computer</title>
      <link>https://niaquinto.com/blog/2026/05/just-get-two_how-i-learned-programming-on-throwaway-computer.html</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2026/05/just-get-two_how-i-learned-programming-on-throwaway-computer.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;just-get-two-or-how-i-learned-programming-on-a-throwaway-computer&#34;&gt;Just Get Two or How I Learned Programming on a Throwaway Computer&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2026-05-01&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;just-get-two_how-i-learned-programming-on-throwaway-computer.opus&#34;&gt;&lt;audio src=&#34;just-get-two_how-i-learned-programming-on-throwaway-computer.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Orpheus TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;The craze of buying Mac Mini’s to run OpenClaw is waning, but it reminded me&#xA;of a simple solution that the modern software industry often seems to miss.&#xA;&lt;strong&gt;Using a separate device is a comparatively cheap solution to security &amp;amp;&#xA;reliability problems. And, a throwaway, destructible environment is key to&#xA;growth of new capabilities.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In fact, this is how I learned programming and systems administration-y stuff in&#xA;the first place. I go into some of that story below. Or, you can skip to &lt;a href=&#34;#implications&#34; rel=&#34;noreferrer&#34;&gt;the&#xA;end&lt;/a&gt;, where discuss some key insights here to two pressing&#xA;crises in software: securing agentic systems and supply chain security.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;origins&#34;&gt;Origins&lt;a href=&#34;#origins&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;In 2013, I started my first job at the &lt;a href=&#34;https://americangerman.institute/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;American German Institute&lt;/a&gt; in Washington, DC. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;At the institute, I handled the website, blog, email newsletter, YouTube channel,&#xA;printer maintenance, and general frontline tech support.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; rel=&#34;noreferrer&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, I caught the bug for programming right away. It started with building small&#xA;tools to learn HTML so that I could increase my confidence when editing the&#xA;newsletter.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; rel=&#34;noreferrer&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Initially, I built standalone HTML and JS pages. For example, I made a pretty&#xA;page with the institute’s logo and two columns of app icon-style buttons.&#xA;Something like this:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./aicgs-homepage-masterpiece.png&#34; alt=&#34;This is a mere shadow of my first masterpiece, lol.&#34;/&gt;&lt;figcaption&gt;This is a mere shadow of my first masterpiece, lol.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;When you clicked an “app”, it would either open the appropriate login page for&#xA;the service, or it would open another page explaining how to do something.&#xA;And, I used a Windows Group Policy to make it the default homepage for new&#xA;browser tabs on everyone’s computer in the office.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This was amazing because it saved me a lot of time answering questions from&#xA;visiting scholars like how to print things billed to their fellowship’s cost&#xA;center or how to login to Johns Hopkins University library resources like&#xA;JSTOR.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, I hit a brick wall in my progress soon after this initial victory. As I&#xA;started learning true programming languages like PHP and Python, I quickly&#xA;learned hosting static HTML was a lot easier than a dynamic program.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In hindsight, a viable path would have been to host PHP scripts on our shared&#xA;host. But with only a few months of “programming” experience, I didn’t know&#xA;enough to know that was even possible. And even if I did, I would have been too&#xA;afraid of screwing something up to log in and touch files in our shared host.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But based on previous experience, where a computer science student in my dorm&#xA;helped me&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; rel=&#34;noreferrer&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; dual boot Ubuntu on my Macbook, I knew Linux was the way to do&#xA;things that were hard on “normal” computers.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, I set out to learn Linux for real.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;learning-linux&#34;&gt;Learning Linux&lt;a href=&#34;#learning-linux&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Having tried and failed to install Linux just 6 months earlier, I knew I needed&#xA;another way, a way that didn’t risk my only working computer.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I started looking online. And, I quickly found a deal: $50 for a Dell OptiPlex&#xA;GX620 that served out it’s sentence of 6 long years in some corporate office and&#xA;was ready to live out it’s retirement roaming free range on the net.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;dell-optiplex-gx620.png&#34; alt=&#34;It was surprisingly fast running Linux for a $50, 6 year old computer.&#34;/&gt;&lt;figcaption&gt;It was surprisingly fast running Linux for a $50, 6 year old computer.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, I messaged the person on Craigslist and arranged a meeting way out at the&#xA;end of the DC metro in Rockville, MD.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It definitely felt like he was selling office equipment that he was supposed to&#xA;be throwing away. He had a ton of them in the back of his minivan; handing me a&#xA;random one from the pile, he asked me if I wanted to test it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And I just looked around, as if I might not have noticed that there was a&#xA;monitor, keyboard, and portable generator lying around in the train station&#xA;parking structure at 10pm at night. So, I shrugged, said no, gave him the $50,&#xA;and walked off.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Luckily, it did work! And I mean really luckily, because $50 was actually a&#xA;non-trivial expense for me at the time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then every day for the next 3 months, I’d come home from work, install Ubuntu&#xA;off of a bootable USB, and try to use the terminal until I broke something in a&#xA;way I couldn’t figure out how to recover from. It became like a ritual. I was&#xA;determined to learn this. It was like a time loop.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For weeks and weeks, I’d &lt;code&gt;apt-get install apache&lt;/code&gt; and throw myself against the&#xA;rocks of making random tweaks to the config file until it actually ran and did&#xA;something useful. I spent even more weeks figuring out file permissions and even&#xA;more time fighting with the PHP white screen of death from syntax errors, logic&#xA;bugs, and misused APIs.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But over time, I did learn how to keep the “server” running and stable. I wrote&#xA;actually functional programs and hosted them at home. I switched to NGINX,&#xA;learned &lt;code&gt;vim&lt;/code&gt; was faster for me than &lt;code&gt;nano&lt;/code&gt;, and got familiar with all the&#xA;Linux basics like processes, users, groups, initscripts, ports, connections, and&#xA;so on.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;implications&#34;&gt;Implications&lt;a href=&#34;#implications&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./agent-jail.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The core of this journey was the disposable computer, a safe environment for&#xA;experimentation. Once I figured out how to install the OS fresh to get myself&#xA;back to a usable state, it was inevitable that I’d figure it out.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This lesson is exactly what is needed to address two major software industry&#xA;trends today: securing agentic systems and supply chain security.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Although I’ve never been in this position at work, I hear that some dev teams&#xA;use a separate computer for accessing production and doing software releases.&#xA;Similarly, many software companies (ex. Meta, Stripe) use cloud VM’s for&#xA;developer environments.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These practices exercise the same underlying principle of good security: access&#xA;segmentation. You only give access to strictly what is needed.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The problem has always been the usability tradeoff with this approach. Getting&#xA;the quick bootable VM devbox experience just right is very very challenging.&#xA;And, I see this same dynamic playing out in the agentic world.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; rel=&#34;noreferrer&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You have to have just the right dev tools installed. The VM needs to be bootable&#xA;quickly. Your app’s developer experience needs to be super dialed in for the&#xA;agent to be able to start on a fresh checkout, install dependencies, start&#xA;services, and run linters &amp;amp; tests to make usable progress. The networking needs&#xA;to work so that you can reach services running there from your browser.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And the reality is the most existing software is not dialed in enough for this.&#xA;Most machine learning projects don’t even have functional &lt;code&gt;requirements.txt&lt;/code&gt; or&#xA;&lt;code&gt;pyproject.toml&lt;/code&gt;. And even in domains with better engineering best practices,&#xA;the setup instructions for most services leave a lot to be desired for humans,&#xA;let alone AI agents.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But given the potential of AI agents and the risk of increasing supply chain&#xA;exploits, I think there’s a huge, industry changing position on the table for&#xA;whoever figures out what the future of ergonomic, but isolated environments is.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, that brings us back to OpenClaw people. Instead of raw dogging their&#xA;computers with &lt;code&gt;--yolo&lt;/code&gt; mode and &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; while their&#xA;entire life sits innocently there in &lt;code&gt;~/.config&lt;/code&gt;, and &lt;code&gt;~/.ssh&lt;/code&gt;, and&#xA;&lt;code&gt;~/Library/Application Support&lt;/code&gt; waiting to get gobbled up and sent off to get&#xA;exploited, they at least know enough to know that this “thing” deserves it’s&#xA;own environment.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Their main mistake was passing too many secrets into that environment, instead&#xA;of building adapters outside of the environment to do privileged things.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, that’s the future I see: a fancy box for the AI and our developer&#xA;environments to live inside. Proxies &amp;amp; integrations at the edges that inject&#xA;secrets and do priviledged things from the outside, so AI never sees the&#xA;secrets and we can apply all kinds of policy limits.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Because there are unknown unknowns out there, and AI just can’t help itself but&#xA;do everything. It’ll spin for hours on a trivial roadblock, then build something&#xA;incredible, and then randomly download malware that uploads every credential it&#xA;can find to 4chan.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Even though you said &lt;strong&gt;&lt;em&gt;no mistakes&lt;/em&gt;&lt;/strong&gt;!&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;At the time, it was called the American Institute for Contemporary German Studies (AICGS).&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:2&#34;&gt;Occasionally, I did an extremely poor attempt at photography for AICGS conferences as well.&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:3&#34;&gt;Our CRM software was pretty bad and did not have any editor for page content. It just had a plain textarea and expected you to edit the HTML yourself by hand, then test email yourself to see it. So, I had to learn HTML quickly.&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:4&#34;&gt;And by “helped me”, I mean he did all the work while I watched and pretended to understand what he was talking about.&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:5&#34;&gt;I’m loving &lt;a href=&#34;https://agent-safehouse.dev/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Agent Safehouse&lt;/a&gt; for a lightweight agent sandbox. And, I’ve been experimenting with a Firecracker-based solution for the true VM-based devbox / agent sandbox experience.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>How I Used Self-Hosted AI in 2025</title>
      <link>https://niaquinto.com/blog/2025/12/how-i-used-selfhosted-ai-in-2025.html</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/12/how-i-used-selfhosted-ai-in-2025.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;how-i-used-self-hosted-ai-in-2025&#34;&gt;How I Used Self-Hosted AI in 2025&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-12-28&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/ml-ai.html&#34; rel=&#34;noreferrer&#34;&gt;ML/AI&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;how-i-used-selfhosted-ai-in-2025.opus&#34;&gt;&lt;audio src=&#34;how-i-used-selfhosted-ai-in-2025.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Orpheus TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;In early 2024, I bought an NVIDIA RTX 4090, which has 24GB of VRAM. This enabled&#xA;me to experiment with &lt;a href=&#34;/blog/2024/01/a-tour-of-gen-ai-2024.html&#34; rel=&#34;noreferrer&#34;&gt;tons of interesting AI&lt;/a&gt;.&#xA;Since 2025 was another amazing year for transformer and diffusion-based models,&#xA;I wanted to post again on how I’ve been using AI locally.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Below, I have a breakdown of each category: &lt;a href=&#34;#image-generation&#34; rel=&#34;noreferrer&#34;&gt;Image Generation&lt;/a&gt;,&#xA;&lt;a href=&#34;#text-to-speech&#34; rel=&#34;noreferrer&#34;&gt;Text-to-Speech&lt;/a&gt;, &lt;a href=&#34;#programming&#34; rel=&#34;noreferrer&#34;&gt;Programming&lt;/a&gt;,&#xA;&lt;a href=&#34;#text-generation-chat&#34; rel=&#34;noreferrer&#34;&gt;Text Generation &amp;amp; Chat&lt;/a&gt;, and &lt;a href=&#34;#other&#34; rel=&#34;noreferrer&#34;&gt;a few extras&lt;/a&gt;.&#xA;There’s a lot of neat new models. But, the big change is shifting from large&#xA;kitchen sink software like &lt;a href=&#34;https://openwebui.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;OpenWebUI&lt;/a&gt; and&#xA;&lt;a href=&#34;https://github.com/invoke-ai/InvokeAI&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;InvokeAI&lt;/a&gt; to more tailored solutions.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And stick around for &lt;a href=&#34;#conclusion&#34; rel=&#34;noreferrer&#34;&gt;the end&lt;/a&gt;, where I discuss how to run all of&#xA;these services without running out of VRAM.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;image-generation&#34;&gt;Image Generation&lt;a href=&#34;#image-generation&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;For much of the year, I was still using &lt;a href=&#34;https://github.com/invoke-ai/InvokeAI&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;InvokeAI&lt;/a&gt;&#xA;with really old models: Stable Diffusion XL (released in 2023) or Flux.1 Schnell (released August 2024).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, after waiting &lt;em&gt;nearly 6 months&lt;/em&gt; for Z-Image support, I eventually gave up&#xA;on waiting and used Claude Code (Sonnet 4.5) to generate a micro-app for&#xA;inference on this as well.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./z-image-microapp.png&#34; alt=&#34;Screenshot of Z-Image image generator micro-app, including generation history page and generation form with prompt, seed, and rounds controls.&#34;/&gt;&lt;figcaption&gt;Screenshot of Z-Image image generator micro-app, including generation history page and generation form with prompt, seed, and rounds controls.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This has been an amazing improvement over the older image generation models.&#xA;And, this version is now spouse tested and approved. She was actually excited&#xA;enough about this to invite a friend over to use it, too.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is going to be a recurring theme of this post. I’ve been switching from&#xA;bulky general purpose tools to more focused ones and supplementing with&#xA;what I’m calling “micro-apps”.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These web services, often a single HTML/CSS/JS form wired up to a backend, do&#xA;some single-purpose task. Claude Code and other agentic coding tools make it&#xA;easy to rapidly build these, often with only a few prompts.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;text-to-speech&#34;&gt;Text-to-Speech&lt;a href=&#34;#text-to-speech&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;I listen to &lt;a href=&#34;/blog/2024/01/a-tour-of-gen-ai-2024.html#text-to-speech&#34; rel=&#34;noreferrer&#34;&gt;&lt;em&gt;a lot&lt;/em&gt; of content&lt;/a&gt;,&#xA;usually articles found from a large, and constantly growing &lt;a href=&#34;/blog/2024/03/how-i-find-interesting-rss-feeds.html&#34; rel=&#34;noreferrer&#34;&gt;list of RSS/Atom feeds&lt;/a&gt; passed through text-to-speech.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Generally, I have a 2 tiered system for TTS: fast/low-quality and slow/high-quality.&#xA;For about half of the year, I have used &lt;a href=&#34;https://huggingface.co/hexgrad/Kokoro-82M&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Kokoro TTS&lt;/a&gt;&#xA;for quick generations and &lt;a href=&#34;https://github.com/coqui-ai/TTS&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Coqui XTTS&lt;/a&gt; for higher quality speech.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Now, I’ve switched to &lt;a href=&#34;https://huggingface.co/ResembleAI/chatterbox-turbo&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Chatterbox Turbo&lt;/a&gt;&#xA;for quick articles and &lt;a href=&#34;https://github.com/canopyai/Orpheus-TTS&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Orpheus TTS&lt;/a&gt;&#xA;for quality use cases. But, Kokoro will still have a special place for me,&#xA;because it’s astoundingly efficient; small enough to work on CPU on even modest&#xA;devices. I predict it’s going to stick around for a long long time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For Orpheus, I’ve found &lt;a href=&#34;https://github.com/ArijitWeird/Orpheus-TTS-FastAPI&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Orpheus-TTS-FastAPI&lt;/a&gt;&#xA;to work great. For Chatterbox Turbo though, I used Claude Code with GLM 4.6 to&#xA;create a micro-app for inference using an OpenAI-style TTS API endpoint.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So now I’ve standardized around a black-box OpenAI-compatible endpoint for&#xA;inference. My custom pipeline for feed content and ad-hoc uploads integrates&#xA;with these endpoints.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This use case alone justifies having the GPU locally. My audio consumption&#xA;simply wouldn’t be economically possible without local inference.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Otherwise, there isn’t much more to say here. I realize I’m an extreme outlier&#xA;in listening to so much TTS audio, and the main takeaway from this section is&#xA;mostly just that:&lt;/p&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Orpheus &amp;amp; Chatterbox work great on a single 4090&lt;/li&gt;&#xA;&lt;li&gt;OpenAI-compatible endpoints efficiently abstract over how the models work&lt;/li&gt;&#xA;&lt;li&gt;This is another case of Claude Code with Sonnet 4.5, Opus 4.5, or GLM 4.7 being able to mostly one-shot generating “micro-apps” for inference on new models&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./robot-tts.png&#34; alt=&#34;How I imagine TTS models work.&#34;/&gt;&lt;figcaption&gt;How I imagine TTS models work.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;programming&#34;&gt;Programming&lt;a href=&#34;#programming&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;For the most part, I’ve shifted from local coding AI to hosted services, namely&#xA;Claude Code and &lt;a href=&#34;https://z.ai/subscribe?ic=190HKLBEMV&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;z.ai&lt;/a&gt;’s Coding plan for&#xA;GLM series of models (incl. the new 4.7 release).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These larger models are just too good to resist and can’t really be matched in&#xA;a local setup, unless you have an obscene hardware budget. However, I am still&#xA;using some local models in some cases for personal coding.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Firstly, I’m still using inline code completion. I’ve moved from &lt;a href=&#34;https://www.tabbyml.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Tabby&lt;/a&gt; to&#xA;&lt;a href=&#34;https://github.com/ggml-org/llama.vim&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;llama.vim&lt;/a&gt;, mostly running Qwen 3 8B.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Second, for one-off questions and scripts outside the context of an existing&#xA;repository, I am using Devstral Small 24B or Qwen 3 Coder 30B A3B 2507 over hosted&#xA;options.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And finally, I have a few focused tools that perform a specific task in a&#xA;codebase. These work great on smaller models like the 20-30B models mentioned&#xA;here.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, I have a Godoc documentation generation tool that uses &lt;a href=&#34;https://tree-sitter.github.io/tree-sitter/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;tree-sitter&lt;/a&gt; (via &lt;a href=&#34;https://github.com/smacker/go-tree-sitter&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;go-tree-sitter&lt;/a&gt;)&#xA;to find and document undocumented functions, structs, and methods in Go code.&#xA;Another workflow monitors open source libraries I frequently use and summarizes&#xA;new commits (for insights beyond the commit messages).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Claude Code (either on Anthropic Sonnet 4.5, Opus 4.5 or Z.AI’s GLM 4.7) would&#xA;probably also be able to do these tasks very well (and without the tree-sitter&#xA;plumbing). But, there isn’t a big quality different over local models, and the&#xA;existing workflow works. Plus, the local flow saves on hosted model usage limits.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;text-generation-chat&#34;&gt;Text Generation &amp;amp; Chat&lt;a href=&#34;#text-generation-chat&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;I’ve ran &lt;a href=&#34;https://openwebui.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;OpenWebUI&lt;/a&gt; &amp;amp; &lt;a href=&#34;https://ollama.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Ollama&lt;/a&gt;&#xA;since getting my 4090. This pairing allows dynamically downloading models and&#xA;chatting with support for web search, document RAG, multi-modal chat, speech&#xA;input &amp;amp; output, and tons more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, LLama.cpp recently announced a router mode. This mode manages loading&#xA;and unloading models as they’re used. This is a significant improvement (for&#xA;simple use cases) over both &lt;a href=&#34;https://github.com/mostlygeek/llama-swap&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;llama-swap&lt;/a&gt;,&#xA;(&lt;em&gt;which requires editing the config to list available models &amp;amp; settings&lt;/em&gt;) and Ollama&#xA;(&lt;em&gt;which is closed source and lagging significantly on implementing new model&#xA;support as they transition from llama.cpp to their own inference backend&lt;/em&gt;).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Paired with the significant polish LLama.cpp’s built-in chat UI has gotten, the&#xA;new router mode pushed me over the edge to switch to just using LLama.cpp&#xA;exclusively.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./llamacpp-webui.png&#34; alt=&#34;Screenshot of LLama.cpp Web UI as of December, 2025&#34;/&gt;&lt;figcaption&gt;Screenshot of LLama.cpp Web UI as of December, 2025&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;LLama.cpp’s UI supports exactly the features I need - mainly simple chats, but&#xA;occasionally text/PDF document context. I never really used the Web Search&#xA;or any plugins in OpenWebUI.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The one area that I did miss from Ollama was model management. So, I added a&#xA;small model management webapp to support downloading new models and removing&#xA;older ones. This was really easy to whip up with agentic coding.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./model-manager.png&#34; alt=&#34;Screenshot of model management micro-app.&#34;/&gt;&lt;figcaption&gt;Screenshot of model management micro-app.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;other&#34;&gt;Other&lt;a href=&#34;#other&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Last time, I discussed vision models, music generation, and other less common&#xA;modalities. But of these, I have only used one consistently since then: Image&#xA;Segmentation. I use this to create “sticker’s” and any other times I need to&#xA;remove the background from an image.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Meta released Segment Anything 3 this year. The new prompt-based object&#xA;identification method is interesting. But, ultimately the old method of&#xA;point-based inclusion/exclusion worked fine.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./sticker-sidebyside.png&#34; alt=&#34;The rest of the fucking owl.&#34;/&gt;&lt;figcaption&gt;The rest of the fucking owl.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In the future, I might get more use out of vision models if I had an efficient&#xA;way to get images into the model. So, this is a prime area for another&#xA;“micro-app” to run as a PWA on my phone.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Standardization &amp;amp; simplification is upon us. LLama.cpp and OpenAI-compatible&#xA;endpoints are still king. Thanks mostly to Chinese companies (plus Mistral),&#xA;open source models are still trailing mere months behind SOTA mega-models. And,&#xA;agentic coding is amazing at creating “micro-apps” to fill gaps.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But you may be wondering, how do I run all of this in 24GB VRAM? Sure, each&#xA;individual model fits in that size. But many, such as 30B models and Orpheus TTS&#xA;take almost the entire VRAM.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To solve this, you need a system to dynamically start &amp;amp; stop services on demand.&#xA;For example, &lt;a href=&#34;https://github.com/sablierapp/sablier&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Sablier&lt;/a&gt; starts docker&#xA;containers in response to HTTP requests and shuts them down after a period of&#xA;inactivity.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For local use with limited resources, this dynamic capability is critical for a&#xA;smooth experience. It’ll save a bit of power as well.&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;You are still responsible for reading the code and having good taste in how to build robust services. Without competent human oversight, agentic coding often spins off into a buggy mess or has glaring bugs that will delete all your data or get you hacked.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
      <category>ML/AI</category>
    </item>
    <item>
      <title>Work Hacks: Keep a Log</title>
      <link>https://niaquinto.com/blog/2025/06/work-hack-keep-a-log.html</link>
      <pubDate>Mon, 23 Jun 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/06/work-hack-keep-a-log.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./ships-log.jpg&#34; alt=&#34;Credit: Cottonbro Studio on Pexels&#34;/&gt;&lt;figcaption&gt;Credit: Cottonbro Studio on Pexels&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;work-hacks-keep-a-log&#34;&gt;Work Hacks: Keep a Log&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-06-23&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/work.html&#34; rel=&#34;noreferrer&#34;&gt;Work&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;work-hack-keep-a-log.opus&#34;&gt;&lt;audio src=&#34;work-hack-keep-a-log.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Orpheus TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;It’s easy to let the weeks and months fly by with what seems like nothing to&#xA;show for it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But there’s one easy, low tech way to keep track of your accomplishments: a log.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;From the iconic Ship’s Log to modern YouTube Devlogs, keeping a log is a classic&#xA;way to documenting your progress, staying motivated, &lt;em&gt;and communicate that&#xA;progress to others&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve kept a continuous log of my work for nearly a decade. And after so long, I&#xA;wanted to share my method and how it’s helped me.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;how-it-works&#34;&gt;How It Works&lt;a href=&#34;#how-it-works&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;The gist is stupidly simple. I keep a huge text file written in &lt;a href=&#34;https://www.markdownguide.org&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Markdown&lt;/a&gt;.&#xA;It’s over 5k lines and still counting.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;At the top, I have what I’m working on this week and a backlog of all the tasks&#xA;I need to do &lt;em&gt;eventually&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Next, there’s a list of tasks I’ve completed that week. These are usually&#xA;organized by project or into a few catchall categories like infrastructure.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And finally, there are periodic “compaction” sections that usually cover the&#xA;highlights for 6 months to a year.&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Work Log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## TODO&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Think of dad jokes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Project X:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - Task Y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## Backlog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Discombobulate the frobronicators&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Upgrade dependencies for Service Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Add ABC feature to service D&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;## Completed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### Week of 2025-06-23&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Big App:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - Task 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Service A:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - Task 2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - Task 3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Infrastructure:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - Task 4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### Week of 2025-06-16&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*More accomplishments*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### Week of 2025-06-09&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*More accomplishments*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### Summary: 2024-10-01 to 2025-03-30&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*Biggest impact achievements in the first 6 months of FY25.*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;This method works for me because I keep this file open all the time. And this is&#xA;my main todo list anyways. So, it’s effortless to move something from my todo&#xA;list to the completed log.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So the takeaway here is that you don’t need anything fancy. And it doesn’t have&#xA;to be a specialized tool. You could use a Word document, a Spreadsheet, or even&#xA;a physical notebook (though this is less searchable).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The key is to &lt;em&gt;make it a habit&lt;/em&gt; and &lt;em&gt;integrate it into your workflow&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You could even use a formal system like a Kanban board or issue tracking system.&#xA;However, I’d caution against this, because I’ve benefited greatly from “owning”&#xA;the data and being able to manipulate it with external tools. But if this works&#xA;best for you, go for it!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;how-it-s-helped&#34;&gt;How It’s Helped&lt;a href=&#34;#how-it-s-helped&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;There’s 4 ways this has helped me:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Performance Reviews&lt;/strong&gt;: The most important way it’s helped is to make&#xA;mid-year and annual performance reviews dead simple. I can just send the latest&#xA;summary and I’m done with basically no work. I usually include the entire log&#xA;for reference, too.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Communicating with Stakeholders&lt;/strong&gt;: Periodically, it’s nice to update&#xA;stakeholders with everything that has happened on a project.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For big projects, this usually is a multi-person effort. However, your log can&#xA;help you double check the project-wide changelog or whatever the project&#xA;manager(s) produce.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And for smaller projects, I’ve found my log is the often the only source to&#xA;quickly produce a summary of what’s changed.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Quickly Answering Project History Questions&lt;/strong&gt;: Another benefit has been&#xA;quickly answering questions about the history of projects or features in&#xA;response to some urgent question or emergency.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I can &lt;code&gt;CTRL-F&lt;/code&gt;/&lt;code&gt;grep&lt;/code&gt; search through the log and find the answer to most&#xA;questions in minutes.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Finally, &lt;strong&gt;Justifying Estimates&lt;/strong&gt; is also very easy when you have a history of&#xA;all the tasks you’ve done. You can quickly find similar features and how long&#xA;they took.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./scroll-of-truth-meme.jpg&#34; alt=&#34;You knew it was probably you; now you have proof.&#34;/&gt;&lt;figcaption&gt;You knew it was probably you; now you have proof.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Logs aren’t just for programs to dump debugging information. They can be a&#xA;really useful tool for individual contributors, team leads, project managers,&#xA;and more to track progress.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Come review time, they’re invaluable to communicate your accomplishments. And&#xA;you become a hero for anyone asking questions about a project’s history and&#xA;progress.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, give it a shot and see how it works for you!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Work</category>
    </item>
    <item>
      <title>Backup Your Mail, Contacts &amp; Calendar</title>
      <link>https://niaquinto.com/blog/2025/05/backup-your-mail-contacts-and-calendar.html</link>
      <pubDate>Mon, 26 May 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/05/backup-your-mail-contacts-and-calendar.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./mail-pile.jpg&#34; alt=&#34;A massive pile of emails. Generated with SDXL&#34;/&gt;&lt;figcaption&gt;A massive pile of emails. Generated with SDXL&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;backup-your-mail-contacts-calendar&#34;&gt;Backup Your Mail, Contacts &amp;amp; Calendar&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-05-26&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;backup-your-mail-contacts-and-calendar.opus&#34;&gt;&lt;audio src=&#34;backup-your-mail-contacts-and-calendar.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Orpheus TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Mail is the linchpin of our modern internet use. Nearly every online account and&#xA;service relies on it. And yet, most people don’t have a backup!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Contacts &amp;amp; calendars are also important. I would miss so many important events&#xA;if I suddenly lost my online calendar. And if I lost my contacts, I would have&#xA;a really hard time finding many people’s info again, especially acquaintances&#xA;that I don’t contact as often.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Below I describe how I backup these important data using &lt;a href=&#34;https://github.com/gburd/isync&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;isync/mbsync&lt;/a&gt;&#xA;and &lt;a href=&#34;https://sr.ht/~whynothugo/pimsync/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;pimsync&lt;/a&gt;. Read on to see how!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;NOTE: I’m using command line programs for this. And, the instructions below&#xA;assume that you know how to use the terminal, edit files with a text editor, and&#xA;build software from source.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;To backup your data using the GUI, you can use &lt;a href=&#34;https://www.thunderbird.net&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Thunderbird&lt;/a&gt;&#xA;to download a local copy. But, I’m not aware of any workflow for restoring to a&#xA;new provider using a Desktop App / GUI tool.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;why-backup&#34;&gt;Why Backup?&lt;a href=&#34;#why-backup&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Now, most people use an online service that does backups for them, like Google&#xA;Mail, Microsoft Outlook, Fastmail, and so on. But, what happens if you suddenly&#xA;and in-explicitly get banned?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This may seem unrealistic, but there are so many horror stories out there of&#xA;people getting banned after tripping over some automated moderation system.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And since services are more connected than ever, you may not realize that a&#xA;rogue moderation system from YouTube, Google Cloud Platform, Azure, GitHub,&#xA;Adsense, and more may bleed through to your entire online presence suddenly&#xA;going up in smoke.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is why I pay for my email, use my own domain, and backup my mail, contacts,&#xA;and calendar!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-setup&#34;&gt;The Setup&lt;a href=&#34;#the-setup&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;I use &lt;a href=&#34;https://github.com/gburd/isync&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;isync/mbsync&lt;/a&gt; for mail and&#xA;&lt;a href=&#34;https://sr.ht/~whynothugo/pimsync/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;pimsync&lt;/a&gt; for contacts and calendar.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These services both work by defining a pair of remotes and sync’ing between&#xA;them. A remote here is either a server from your provider or a local folder&#xA;on your machine. And, you can sync between any combination of them.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This means you can do a variety of useful things with these services. Here, I’ll&#xA;focus on backups. But, this also supports restoring your data to a new provider.&#xA;And, you can do bidirectional sync to support offline editing.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;sync-ing-your-mail&#34;&gt;Sync’ing Your Mail&lt;a href=&#34;#sync-ing-your-mail&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;First, install &lt;a href=&#34;https://github.com/gburd/isync&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;isync/mbsync&lt;/a&gt; with your package&#xA;manager:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# MacOS&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install isync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install isync  &lt;span style=&#34;color:#586e75&#34;&gt;# Ubuntu/Debian/Mint/etc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf install isync  &lt;span style=&#34;color:#586e75&#34;&gt;# RHEL/Fedora/etc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apk install isync  &lt;span style=&#34;color:#586e75&#34;&gt;# Alpine Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pacman -S isync    &lt;span style=&#34;color:#586e75&#34;&gt;# Arch Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Windows&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Your on your own. Good Luck! I&amp;#39;d suggest just using Window Subsystems for Linux.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Now that you have the program installed, you can write out the configuration&#xA;file. This goes at the path &lt;code&gt;~/.mbsync&lt;/code&gt;. Here’s mine:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# file: ~/.mbsync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sync Pull&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Create Slave&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Remove Slave&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Expunge Slave&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Setup my personal account&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IMAPAccount personal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host imap.myemailprovider.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User demo@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PassCmd &amp;#34;pass Internet/myemailprovider.com:backup-password&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# alternatively, hardcode your password with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#   Pass yourpassword&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CertificateFile /etc/ssl/certs/ca-certificates.crt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SSLType IMAPS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IMAPStore personal-remote&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Account personal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MaildirStore personal-local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SubFolders Verbatim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Path ~/.local/share/mail/personal/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Inbox ~/.local/share/mail/personal/INBOX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Channel personal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Master :personal-remote:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Slave :personal-local:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Patterns *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Create Both&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SyncState *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Next, you have to create the data folder with &lt;code&gt;mkdir -p ~/.local/share/mail/personal&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And finally, you can sync with &lt;code&gt;mbsync -aV&lt;/code&gt;! The program downloads each folder&#xA;into the &lt;code&gt;~/.local/share/mail/personal&lt;/code&gt; directory. And, each email appears as a&#xA;separate file.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In the config, notice that the &lt;code&gt;PassCmd&lt;/code&gt; here loads the backup password from a&#xA;password manager. I use &lt;a href=&#34;https://www.passwordstore.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;pass&lt;/a&gt;. But, it would&#xA;work with any script/program that outputs your password on STDOUT. Or, you can&#xA;hardcode the password with &lt;code&gt;Pass yourpassword&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;sync-ing-your-contacts-calendar&#34;&gt;Sync’ing Your Contacts &amp;amp; Calendar&lt;a href=&#34;#sync-ing-your-contacts-calendar&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://sr.ht/~whynothugo/pimsync/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;pimsync&lt;/a&gt; is a bit more complicated. You&#xA;have to install it from source. To do that, you can follow these steps:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Install Rust Toolchain&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# See also: https://rustup.rs/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#719e07&#34;&gt;--&lt;/span&gt;proto &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;--&lt;/span&gt;tlsv1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;sSf https:&lt;span style=&#34;color:#719e07&#34;&gt;//&lt;/span&gt;sh&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;rustup&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;rs &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Download the code&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https:&lt;span style=&#34;color:#719e07&#34;&gt;//&lt;/span&gt;git&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;sr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;ht&lt;span style=&#34;color:#719e07&#34;&gt;/~&lt;/span&gt;whynothugo&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;pimsync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd pimsync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Build the code&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# Copy the binary to your PATH&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;p &lt;span style=&#34;color:#719e07&#34;&gt;~/.&lt;/span&gt;local&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;bin  &lt;span style=&#34;color:#586e75&#34;&gt;# Create this dir if it doesn&amp;#39;t already exist&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp &lt;span style=&#34;color:#719e07&#34;&gt;./&lt;/span&gt;target&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;release&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;pimsync &lt;span style=&#34;color:#719e07&#34;&gt;~/.&lt;/span&gt;local&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;bin&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;pimsync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;If you don’t have &lt;code&gt;~/.local/bin&lt;/code&gt; on your &lt;code&gt;$PATH&lt;/code&gt;, you need to add that as well&#xA;in your &lt;code&gt;~/.bashrc&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt; file as follows: &lt;code&gt;export PATH=&amp;#34;$PATH:~/.local/bin&amp;#34;&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To test your install, you can run &lt;code&gt;pimsync version&lt;/code&gt;, which should output the&#xA;version of the program. For example:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--bash&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ pimsync version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pimsync 0.4.1-91-g43abd3a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Now that the program is installed, you can configure pimsync by creating a file&#xA;&lt;code&gt;~/.config/pimsync/pimsync.conf&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, you’ll have to create several folders manually before running &lt;code&gt;pimsync&lt;/code&gt; the&#xA;first time. Create them with this:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--sh&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.config/pimsync&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.local/share/pimsync/status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.local/share/contacts/cards&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.local/share/calendars/events&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Then, create your configuration as follows, replacing the URL’s &amp;amp; credentials&#xA;with the appropriate setup for your provider’s CalDAV &amp;amp; CardDAV services.&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# file: ~/.config/pimsync/pimsync.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;status_path &amp;#34;~/.local/share/pimsync/status/&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;storage contacts_mydavprovider {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  type carddav&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  url https://carddav.mydavprovider.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  username demo@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  password {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cmd pass Internet/mydavprovider.com:backup-password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  # alternatively, hardcode your password with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  #   password yourpassword&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;storage contacts_local {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  type vdir/vcard&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  path ~/.local/share/contacts/cards/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fileext vcf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pair contacts {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  storage_a contacts_local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  storage_b contacts_mydavprovider&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  collections all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;storage calendars_mydavprovider {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  type caldav&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  url https://caldav.mydavprovider.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  username demo@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  password {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cmd pass Internet/mydavprovider.com:backup-password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;storage calendars_local {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  type vdir/icalendar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  path ~/.local/share/calendars/events/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fileext ical&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pair calendars {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  storage_a calendars_local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  storage_b calendars_mydavprovider&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  collections all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Now, you can check that everything is working by running &lt;code&gt;pimsync check&lt;/code&gt;. If&#xA;that returns successfully, you can then sync with &lt;code&gt;pimsync sync contacts&lt;/code&gt; and&#xA;&lt;code&gt;pimsync sync calendars&lt;/code&gt;!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;a href=&#34;#next-steps&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Now that you have your mail, contacts, and calendar backed up locally, you can&#xA;back them up with the rest of your files. And, you can rest safely knowing that&#xA;you will never lose your email, contacts, and calendars.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, you can also think about doing some more interesting things. For example,&#xA;you can edit the data locally, offline and sync the other way. That way you can&#xA;“send emails” while offline and have them delivered later when you are back&#xA;online.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To do this, you can use any email client that supports maildir format. This is&#xA;how &lt;code&gt;mbsync&lt;/code&gt; stores your files. For example, &lt;a href=&#34;https://www.thunderbird.net&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Thunderbird&lt;/a&gt;, &lt;a href=&#34;http://www.mutt.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;mutt&lt;/a&gt;/&lt;a href=&#34;https://neomutt.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;neomutt&lt;/a&gt;, and &lt;a href=&#34;https://aerc-mail.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;aerc&lt;/a&gt;&#xA;all support the maildir format.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Or, you could do other interesting things with the data like…&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Finetune a large language model to write emails like you do&lt;/li&gt;&#xA;&lt;li&gt;Build a graph of your relationships from who are emailed together&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;a href=&#34;https://git.sr.ht/~whynothugo/ab-bday&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;ab-bday&lt;/a&gt; to create a calendar with all your contact’s birthdays&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;I hope this guide has helped you set up your own backups for email, contacts,&#xA;and calendar.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is all possible thanks to open standards like IMAP, CardDAV, and CalDAV.&#xA;These standards are an important hedge against vendor lock-in and allow you to&#xA;truly own your data.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s really a miracle that these standards exist. They’re an artifact of an&#xA;older time, when tech companies collaborated to compete on an even playing field&#xA;and enable outsiders to compete.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The more people use these standards, the more likely they’ll live on for many&#xA;years to come. So, backup your data!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>Fun with Token Probabilities</title>
      <link>https://niaquinto.com/blog/2025/02/fun-with-token-probabilities.html</link>
      <pubDate>Sat, 22 Feb 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/02/fun-with-token-probabilities.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;fun-with-token-probabilities&#34;&gt;Fun with Token Probabilities&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-02-22&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;fun-with-token-probabilities.opus&#34;&gt;&lt;audio src=&#34;fun-with-token-probabilities.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Orpheus TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Westworld arrived just a couple years before the AI hype train. But, there’s one&#xA;scene that really stuck with me. It’s in &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Adversary_(Westworld)&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Season 1 Episode 6, The Adversary&lt;/a&gt;:&lt;/p&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Having “died”, Maeve finds herself awake in the tunnels under Westworld.&#xA;Felix, a Westworld technician, explains to her that she is a host (ie. android).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To convince her, he shows a pad with the live dialog tree of what she will say&#xA;just milliseconds before she says it.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;p&gt;The writers on Westworld were probably thinking of markov chains when they wrote&#xA;this scene. But it turns out this is very applicable to Large Language Models&#xA;(LLM) as well.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;video src=&#34;./maeve-scene.mp4&#34; alt=&#34;If you’ve ever heard audio feedback of yourself at a slight delay, you know the feeling.&#34; controls=&#34;&#34;&gt;&lt;/video&gt;&lt;figcaption&gt;If you’ve ever heard audio feedback of yourself at a slight delay, you know the feeling.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Over the past year I’ve been building with LLM’s. And one of the most&#xA;fascinating parts for me so far has been constrained grammar, such as BNF and&#xA;JSON schema output.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But limiting the output to a fixed format isn’t the only thing LLM’s can do. The&#xA;other major way to manipulate LLM completions are logit bias and token&#xA;probabilities. So, I wanted to try to recreate something like the Westworld&#xA;dialog tree UI to explore this as a mini art project.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, this is what I came up with:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;video src=&#34;./maeve-demo.mp4&#34; alt=&#34;Demo of the TUI for exploring token probabilities.&#34; controls=&#34;&#34;&gt;&lt;/video&gt;&lt;figcaption&gt;Demo of the TUI for exploring token probabilities.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s a small TUI that sends requests to &lt;a href=&#34;https://github.com/ggml-org/llama.cpp/blob/68ff663a04ed92044a9937bcae353e9d9733f9cd/examples/server/README.md&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;LLama.cpp Server&lt;/a&gt;. This demo is&#xA;showing Qwen 2.5 32B.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Using the tool, you can enter a sentence and it will show the next 4 words&#xA;(really tokens). And you can then navigate with the arrow keys to see what it&#xA;would generate if you choose one of the alternate tokens.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This makes it really easy to see a tiny bit more of the internal relationships&#xA;a model has built up during training.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, it reminds me of the work done by David Rozado, &lt;a href=&#34;https://davidrozado.substack.com/p/openaicms&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;exploring the biases LLM’s show&#xA;towards various demographics groups&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Even though this capability has existed for at least 2 years, I think it&#xA;bears repeating that technology adoption takes a surprisingly long time. This is&#xA;something that a lot of people fail to fully appreciate.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s usually a significant (ie. years) lag between AI research and when it&#xA;becomes available in mainstream apps. For example, LM Studio just announced&#xA;&lt;a href=&#34;https://lmstudio.ai/blog/lmstudio-v0.3.10&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;beta support for speculative decoding&lt;/a&gt;,&#xA;which was also added to LLama.cpp in 2023.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, what will get built with logit bias and token probabilities? Who knows! But,&#xA;I’m totally here for it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;There wasn’t really much point to this other than highlighting the cool&#xA;Westworld scene and showing that this is basically how LLM’s work. But thanks&#xA;for reading my meandering thoughts.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>What’s in an Egg?</title>
      <link>https://niaquinto.com/blog/2025/02/whats-in-an-egg.html</link>
      <pubDate>Thu, 13 Feb 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/02/whats-in-an-egg.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;eggspensive.jpg&#34; alt=&#34;That’s eggspensive!&#34;/&gt;&lt;figcaption&gt;That’s eggspensive!&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;what-s-in-an-egg&#34;&gt;What’s in an Egg?&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-02-13&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/food-and-cooking.html&#34; rel=&#34;noreferrer&#34;&gt;Food &amp;amp; Cooking&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;whats-in-an-egg.opus&#34;&gt;&lt;audio src=&#34;whats-in-an-egg.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I was at the gym yesterday, when I looked up and saw a major news channel&#xA;showing a segment about egg substitutes. And first off, I laughed so hard.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I know egg prices have got people &lt;a href=&#34;https://apnews.com/article/inflation-economy-federal-reserve-48e77a855078b37bf3ccd58c9db94c82&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;at a rolling boil&lt;/a&gt;.&#xA;And giving up on animal products rarely goes &lt;em&gt;over easy&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I can seriously relate, because conquering eggs is a major milestone in&#xA;vegan cooking. But also because I didn’t notice before, but eggs are freaking&#xA;$7.69 a dozen where I live!? (see image above)&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Since I’ve been vegan for over 4 years, my wife suggested that I write a post&#xA;about this. That way you aren’t left &lt;em&gt;scrambling&lt;/em&gt; for solutions once the&#xA;&lt;em&gt;eggpocolypse&lt;/em&gt; truly sets in.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./gulf-of-america.jpg&#34; alt=&#34;Or, you could eggnore your problems on a fabulous vacation to the Gulf of America.&#34;/&gt;&lt;figcaption&gt;Or, you could eggnore your problems on a fabulous vacation to the Gulf of America.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Below I go into each part of what eggs bring to the table. And that’s&#xA;essentially the problem: &lt;strong&gt;eggs serve multiple functions in recipes&lt;/strong&gt; and&#xA;&lt;strong&gt;there is no one replacement for all these roles&lt;/strong&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That means you have to actually think about what the egg is accomplishing in a&#xA;dish and use the right replacement. That basically why it’s hard.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But to spoil the surprise, there’s 5 major things going from most to least&#xA;common:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#binding&#34; rel=&#34;noreferrer&#34;&gt;Binding&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#lift&#34; rel=&#34;noreferrer&#34;&gt;Lift&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#fattiness&#34; rel=&#34;noreferrer&#34;&gt;Fattiness&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#color&#34; rel=&#34;noreferrer&#34;&gt;Color&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#browning&#34; rel=&#34;noreferrer&#34;&gt;Browning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;And, I’ll include some recipes along the way for you to get started! There’s&#xA;also a quick table at the bottom that summarizes everything if you need a&#xA;cheatsheet.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;binding&#34;&gt;Binding&lt;a href=&#34;#binding&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Tons of recipes use egg as as a binder. This and lift are by far the most common&#xA;uses. Some examples include meatballs, meatloaf, meringue’s, pies, and more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This binding property comes from the egg whites, which coagulate when heated&#xA;and bind things together.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The replacement here is flax meal. To make a “flax egg”, you add a tablespoon&#xA;of flax meal to 3 tablespoons of water. Then wait for a couple minutes for it&#xA;to become viscous. Then use exactly as you would an egg in the recipe.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You can scale this up to larger amounts to replace multiple eggs. Just make sure&#xA;to mix thoroughly and wait so that it all hydrates.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;epic-handshake.jpg&#34; alt=&#34;Flax meal is an eggselent substitute.&#34;/&gt;&lt;figcaption&gt;Flax meal is an eggselent substitute.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;lift&#34;&gt;Lift&lt;a href=&#34;#lift&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;The other most common thing eggs are used for is volume. Egg whites, especially&#xA;when whipped, create a lot of lift in a recipe.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, does going vegan mean you have to give up muffins, cakes, and pies for&#xA;good? No!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Aquafaba is the liquid from a can of beans like chickpeas. And it turns out that&#xA;it behaves the exact same way as egg whites, just with less protein.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;According to &lt;a href=&#34;https://www.americastestkitchen.com/articles/580-what-is-aquafaba&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;America’s Test Kitchen&lt;/a&gt;,&#xA;this effect is even stronger when combined with cream of tartar. But even&#xA;without this addition, I’ve had great success replacing egg whites with aquafaba.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To replace egg whites, just use 3 tablespoons of aquafaba for 1 egg white. For&#xA;recipes that call for liquid egg whites, you just use them as is. But they also&#xA;whip to the same stiff peaks if that’s what you need.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To use up the chickpeas, put them on a salad for extra protein! You can also&#xA;fry them up in a pan and add some seasoning like &lt;a href=&#34;https://store.slapyamama.com/collections/frontpage&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Slap Ya Mama&lt;/a&gt;&#xA;for a tasty snack.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;meringue.jpg&#34; alt=&#34;Credit: Dana Sredojevic on Pexels&#34;/&gt;&lt;figcaption&gt;Credit: Dana Sredojevic on Pexels&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;fattiness&#34;&gt;Fattiness&lt;a href=&#34;#fattiness&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Egg yolks have a lot of saturated fat. This is a great boost for some recipes&#xA;just for obvious reasons: fat tastes good. But this fattiness is also good for&#xA;emulsification, hence aioli.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In these cases, you can typically replace egg with a neutral oil like olive oil.&#xA;For example, olive oil works great for home-made mayonnaise, aioli, salad&#xA;dressing, and more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But other times, the egg is more of a fatty topping for a dish. For example,&#xA;bibimbap just isn’t the same with that burst of fattiness from the over easy&#xA;egg yolk. Avocado can work well as a substitute for this, though you lose the&#xA;liquid aspect.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;bibimbap.jpg&#34; alt=&#34;Credit: Nikki from Pixabay&#34;/&gt;&lt;figcaption&gt;Credit: Nikki from Pixabay&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;color&#34;&gt;Color&lt;a href=&#34;#color&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Eggs are yellow - or at least the yolks are. And sometimes this is important in&#xA;recipes. For example, some potato salads wouldn’t be the same without that&#xA;distinctive yellow color. But an even better example is scrambled eggs.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For this, turmeric is the solution. Usually, it doesn’t interfere with the taste&#xA;because it’s subtle earthiness goes with a lot.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Check out &lt;a href=&#34;/recipes/tofu-scramble&#34; rel=&#34;noreferrer&#34;&gt;my tofu scramble recipe here&lt;/a&gt; for more&#xA;details.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;tofu-scramble.jpg&#34; alt=&#34;Credit: Total Shape on Pexels&#34;/&gt;&lt;figcaption&gt;Credit: Total Shape on Pexels&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;browning&#34;&gt;Browning&lt;a href=&#34;#browning&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;An egg wash can turn anything that perfect golden brown color. For example,&#xA;adding a dab of egg wash on pizza crust makes it look amazing.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Luckily, vegan butter (ie. margarine) works for this too.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And I’d also like to take this opportunity to shill &lt;a href=&#34;https://www.miyokos.com/collections/vegan-mozz/products/pourable-plant-milk-mozzarella?variant=40156079784090&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Miyoko’s Vegan Mozzarella&lt;/a&gt;.&#xA;This is one of the few vegan cheese that I actually like. And it is 100% the&#xA;answer for vegan pizza. They hit the tanginess perfectly without tasting&#xA;artificial.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Whatever Mod Pizza uses for vegan mozzarella shreds is also good, though.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;pizza.jpg&#34; alt=&#34;Credit: Vinicius Benedit on Pexels&#34;/&gt;&lt;figcaption&gt;Credit: Vinicius Benedit on Pexels&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;other&#34;&gt;Other&lt;a href=&#34;#other&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Mashed banana or applesauce, chia seed, silken tofu, apple cider vinegar, and&#xA;various powders/flours (cornstarch, agar agar, arrow root powder, potato flour,&#xA;etc) are sometimes recommended as egg replacements in specific recipes.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve never had to try any of these. But they could work better in a specific&#xA;recipe. One example is silken tofu for cheesecake. But there, the tofu is really&#xA;serving double duty alongside cashews as both the egg and cheese.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But that kind of underlines the point. For 90% of recipes, you can stick with&#xA;oil, flax meal + water, and aquafaba.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Don’t fear the eggman! Think about your recipe. And try to fit it into one of&#xA;the categories: binding, lift, or fattiness. There’s also color and browning,&#xA;but usually it’s one of the first three.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then, pick the right one out of the trifecta of &lt;em&gt;flax meal&lt;/em&gt;, &lt;em&gt;aquafaba&lt;/em&gt;, and&#xA;&lt;em&gt;oil&lt;/em&gt;. These 3 all have neutral flavor and serve the same role as an egg.&lt;/p&gt;&#xA;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Role&lt;/th&gt;&#xA;&lt;th&gt;Replacement&lt;/th&gt;&#xA;&lt;th&gt;Amount for 1 Egg&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Binding&lt;/td&gt;&#xA;&lt;td&gt;Flax Meal&lt;/td&gt;&#xA;&lt;td&gt;1tbsp Flax + 3tbsp Water&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Lift&lt;/td&gt;&#xA;&lt;td&gt;Aquafaba&lt;/td&gt;&#xA;&lt;td&gt;3tbsp&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Fat&lt;/td&gt;&#xA;&lt;td&gt;Oil, Avocado&lt;/td&gt;&#xA;&lt;td&gt;YOLO Just go for it&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Color&lt;/td&gt;&#xA;&lt;td&gt;Turmuric&lt;/td&gt;&#xA;&lt;td&gt;2tbsp&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Browning&lt;/td&gt;&#xA;&lt;td&gt;(Vegan) Butter&lt;/td&gt;&#xA;&lt;td&gt;Eyeball it, I believe in you&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;So now you know! If you don’t &lt;em&gt;chicken&lt;/em&gt; out, egg substitutes work great and now&#xA;they can save some money, too.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;eggman.png&#34; alt=&#34;Dr. Eggman probably stole all the eggs. I’m just sayin’, did anyone check?&#34;/&gt;&lt;figcaption&gt;Dr. Eggman probably stole all the eggs. I’m just sayin’, did anyone check?&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Food &amp; Cooking</category>
    </item>
    <item>
      <title>What Makes Good Blog Software?</title>
      <link>https://niaquinto.com/blog/2025/02/what-makes-good-blog-software.html</link>
      <pubDate>Thu, 06 Feb 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/02/what-makes-good-blog-software.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;what-makes-good-blog-software&#34;&gt;What Makes Good Blog Software?&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-02-06&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;what-makes-good-blog-software.opus&#34;&gt;&lt;audio src=&#34;what-makes-good-blog-software.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;This month, I made some beautification updates to my website and blog. And, that&#xA;inspired me to take a look at the features nice blog software usually has.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The first thing to bring up here is that the features don’t matter unless you&#xA;actually have something to say. But assuming that’s covered, your blog software&#xA;can make your content really shine.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s a great divide between content management systems (CMS) and static site&#xA;generators (SSG). I’m using an SSG. But I’ll discuss both here, because some&#xA;features are easier for CMS’s to support than SSG’s.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But first, I’ll take a second to review what changed here. This is best shown in&#xA;a side-by-side comparison.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;blog-difference.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Right away, you can see there’s a slick new font, a clear published date for&#xA;the article, tags to organize content, and an audio version of the article!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I also added support for MathJax, which is transpiled to HTML at build time so&#xA;no javascript is required at runtime.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve had tags and year/month index pages for a while, but haven’t exposed them&#xA;until now. But, the new audio is only viable (for self-hosters) now that Kokoro&#xA;text-to-speech brought fast, decent quality speech to the masses.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Looking forward, what other things would be nice to add to the site? Since it’s&#xA;a huge list, I’ve included a table of contents here:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#the-content-itself&#34; rel=&#34;noreferrer&#34;&gt;The Content Itself&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#multi-media-video-audio-captions-socials-and-embeds&#34; rel=&#34;noreferrer&#34;&gt;Multi-Media Content: Video, Audio, Captions, Socials, and Embeds&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#tables-diagrams&#34; rel=&#34;noreferrer&#34;&gt;Tables &amp;amp; Diagrams&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#code-math&#34; rel=&#34;noreferrer&#34;&gt;Code &amp;amp; Math&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#read-time-progress-bar&#34; rel=&#34;noreferrer&#34;&gt;Read Time &amp;amp; Progress Bar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#organization-within-a-post&#34; rel=&#34;noreferrer&#34;&gt;Organization Within a Post&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#clickable-headings&#34; rel=&#34;noreferrer&#34;&gt;Clickable Headings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#table-of-contents&#34; rel=&#34;noreferrer&#34;&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#footnotes-definitions&#34; rel=&#34;noreferrer&#34;&gt;Footnotes &amp;amp; Definitions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#complex-layouts&#34; rel=&#34;noreferrer&#34;&gt;Complex Layouts&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#organization-discover-of-posts-overall&#34; rel=&#34;noreferrer&#34;&gt;Organization &amp;amp; Discover of Posts Overall&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#index-pages&#34; rel=&#34;noreferrer&#34;&gt;Index Pages&lt;/a&gt;: Tags, Year/Month, Author&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#featured-popular-articles&#34; rel=&#34;noreferrer&#34;&gt;Featured/Popular Articles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#similar-articles&#34; rel=&#34;noreferrer&#34;&gt;Similar Articles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#full-text-search&#34; rel=&#34;noreferrer&#34;&gt;Full Text Search&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#social-features&#34; rel=&#34;noreferrer&#34;&gt;Social Features&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#rss-atom-feed&#34; rel=&#34;noreferrer&#34;&gt;RSS/Atom Feed&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#newsletter&#34; rel=&#34;noreferrer&#34;&gt;Newsletter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#comments&#34; rel=&#34;noreferrer&#34;&gt;Comments&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#linkbacks-webmention&#34; rel=&#34;noreferrer&#34;&gt;Linkbacks &amp;amp; WebMention&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#crossposting-posse&#34; rel=&#34;noreferrer&#34;&gt;Crossposting / POSSE&lt;/a&gt; (ie. HN, Reddit, Forums, etc)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#web-rings&#34; rel=&#34;noreferrer&#34;&gt;Web Rings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#other-miscellaneous-features&#34; rel=&#34;noreferrer&#34;&gt;Other Miscellaneous Features&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#how-to-cite&#34; rel=&#34;noreferrer&#34;&gt;How to Cite&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#good-print-styling&#34; rel=&#34;noreferrer&#34;&gt;Good Print Styling&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#anti-features&#34; rel=&#34;noreferrer&#34;&gt;Anti-Features&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#popups-banners-interstitials&#34; rel=&#34;noreferrer&#34;&gt;Popups, Banners &amp;amp; Interstitials&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#breaking-browser-behavior&#34; rel=&#34;noreferrer&#34;&gt;Breaking Browser Behavior: Highlight, Copy/Paste, Scroll, Zoom&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;With that out of the way, let’s dive in.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-content-itself&#34;&gt;The Content Itself&lt;a href=&#34;#the-content-itself&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Everything starts with the content itself. Having something to say helps. But,&#xA;we’re talking about the software here. So, what this means is the markup that&#xA;is supported.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The table stakes are headings, &lt;strong&gt;bold&lt;/strong&gt;, &lt;em&gt;italics&lt;/em&gt;, lists, quotes, and images.&#xA;But beyond that, there’s a bunch of features that can make your content really&#xA;shine:&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;multi-media-video-audio-captions-socials-and-embeds&#34;&gt;Multi-Media: Video, Audio, Captions, Socials, and Embeds&lt;a href=&#34;#multi-media-video-audio-captions-socials-and-embeds&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Media&lt;/strong&gt; First, there’s embedded media like video and audio files. Most people&#xA;choose to host these large files on YouTube, a Podcast service, and other paid&#xA;services. So the feature here is the ability to insert the proper HTML embed&#xA;code.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;image-1000-words-meme.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But HTML does nicely support audio and video natively. And you can realistically&#xA;host audio yourself. Though, video is a bit harder on the wallet.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For a really nice experience with HTML audio and video, you can progressively&#xA;enhance by adding a Javascript rich player. The native players are fine. But I&#xA;really appreciate a button to skip forward 30 seconds without having to click around.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve found web components are a really excellent use case for this.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;me-without-my-glasses.jpg&#34; alt=&#34;This will be all of us eventually.&#34;/&gt;&lt;figcaption&gt;This will be all of us eventually.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Captions&lt;/strong&gt; These deserve special mention. Not only is this important for&#xA;accessibility via &lt;code&gt;alt&lt;/code&gt; tags. But, it is often also important for tracking&#xA;attribution for images.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In HTML5, a great way to do this is using &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt; tags.&#xA;These separate your media and the caption, but still make it clear that the&#xA;caption is associated with the media.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;covfefe.jpg&#34; alt=&#34;We have 4 more years of gems like this to look forward to.&#34;/&gt;&lt;figcaption&gt;We have 4 more years of gems like this to look forward to.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Social Media&lt;/strong&gt; Building on the previous embeds, social media posts are another&#xA;common embed. Most CMS &amp;amp; SSG systems have an escape hatch to just add arbitrary&#xA;raw HTML.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Although my SSG does support inserting HTML, I strongly prefer not to do that&#xA;so that the posts are reasonably portable.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And given the tumultuous history of these sites, I’d say it’s better to&#xA;screenshot social media posts anyways.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Other Embeds&lt;/strong&gt; can be really anything. Again, since most blog sites implement&#xA;this as arbitrary HTML, you can do anything.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I think this more complex content is a great use case an &lt;code&gt;iframe&lt;/code&gt; to isolate the&#xA;complexity from your main content.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But either way (direct HTML or an &lt;code&gt;iframe&lt;/code&gt;), these embeds are a great way to&#xA;include interactive demos, calculators, visualizations, image galleries, 3D&#xA;models, live data, and more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, a math blog could use these to embed interactive graphs with&#xA;adjustable parameters. Or, a finance blog could include an interactive demo of a&#xA;model.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;tables-diagrams&#34;&gt;Tables &amp;amp; Diagrams&lt;a href=&#34;#tables-diagrams&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;We live in a world of data, relationships, process, and complexity. And so your&#xA;CMS/SSG should support displaying this info!&lt;/p&gt;&#xA;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Name&lt;/th&gt;&#xA;&lt;th&gt;Age&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td colspan=&#34;2&#34;&gt;Bob&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Alice&lt;/td&gt;&#xA;&lt;td&gt;23&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&#xA;&lt;tfoot&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Total&lt;/td&gt;&#xA;&lt;td&gt;23&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tfoot&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;strong&gt;Tables&lt;/strong&gt; The first major data representation is tables. A lot of software&#xA;supports tables. But many leave the tables themselves poorly styled or unable to&#xA;support complex formatting in the cells themselves.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Does your blog software support cell alignment, colspan, footers, etc?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Bonus points here for progressive enhancement to allow the user to change how&#xA;the table is sorted or search within the table. And double bonus points here if&#xA;the table is usable on mobile.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The ability to easily download the table as CSV/JSON/etc is also a luxury.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These are all areas where my site’s tables could improve.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;audio-player store-key=&#34;what-makes-good-blog-software.opus&#34;&gt;&lt;audio src=&#34;what-makes-good-blog-software.opus&#34; alt=&#34;This is the audio for this article (lol); Audio from Kokoro TTS (Apache 2.0)&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;This is the audio for this article (lol); Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Diagrams&lt;/strong&gt; Most of the time, these are just images. But I’ve seen some blogs&#xA;support automatically rendering Mermaid diagrams and other diagram markup&#xA;languages.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is a real treat to write, because it saves a step of converting to an image,&#xA;embedding it, and keeping it up to date with the original diagram markup. Also,&#xA;a lot of systems then don’t have anywhere to keep the markup. So you end up&#xA;losing it and just having the image after a while.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;My SSG doesn’t support this yet, but I’d like to add it some time soon.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;code-math&#34;&gt;Code &amp;amp; Math&lt;a href=&#34;#code-math&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;For programmers, mathematicians, and scientists, there are some additional types&#xA;of content other than text and media.&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--go&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;package&lt;/span&gt; main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fmt.&lt;span style=&#34;color:#268bd2&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Hello World\n&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;Code Highlighting&lt;/strong&gt; really helps with the readability of source code. There&#xA;are a lot of programming languages. So there’s a large surface area to support.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But there’s also a ton of great libraries out there for highlighting source code.&#xA;So most CMS &amp;amp; SSG software do have support for this or can easily add a plugin&#xA;to support it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For a really really luscious experience, you can make your code runnable. The best&#xA;example of this I’ve seen is &lt;a href=&#34;https://antonz.org/in-browser-code-playgrounds/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Anton Zhiyanov’s blog&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Anton wrote his own sandbox to support running snippets (&lt;a href=&#34;https://github.com/nalgeon/codapi&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Codapi&lt;/a&gt;).&#xA;But there are other options for this too both self-hosted, like &lt;a href=&#34;https://runno.dev/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Runno&lt;/a&gt;,&#xA;and cloud-hosted, like &lt;a href=&#34;https://replit.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Replit&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;math-lady.jpg&#34; alt=&#34;Most of the time, this is me when I’m asked to do any math. Seriously, if you can pass 3rd grade math, you can have a successful programming career.&#34;/&gt;&lt;figcaption&gt;Most of the time, this is me when I’m asked to do any math. Seriously, if you can pass 3rd grade math, you can have a successful programming career.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;MathJax&lt;/strong&gt; is also nice for typesetting math in an accessible way. &lt;a href=&#34;https://www.mathjax.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;MathJax.js&lt;/a&gt;&#xA;is really easy to add to any site and can work without any specific integration&#xA;to your CMS or SSG.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So if you use math at all in your blog, it’s really easy to add &lt;em&gt;MathJax.js&lt;/em&gt; and&#xA;call it a day.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But I try my best to make things without javascript. So, I have implemented&#xA;this by embedding &lt;a href=&#34;https://katex.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Katex.js&lt;/a&gt; in my SSG via an embedded&#xA;javascript interpreter so that it is converted to HTML at build time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The pre-rendered MathJax then looks like this inline example: &lt;span class=&#34;math inline&#34;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence=&#34;true&#34;&gt;∣&lt;/mo&gt;&lt;mtable rowspacing=&#34;0.16em&#34; columnalign=&#34;center center&#34; columnspacing=&#34;1em&#34;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;false&#34;&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;false&#34;&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;false&#34;&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;false&#34;&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence=&#34;true&#34;&gt;∣&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt; \begin{vmatrix} a &amp;amp; b \\ c &amp;amp; d \end{vmatrix} = ad - bc &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:2.4em;vertical-align:-0.95em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;minner&#34;&gt;&lt;span class=&#34;mopen&#34;&gt;&lt;span class=&#34;delimsizing mult&#34;&gt;&lt;span class=&#34;vlist-t vlist-t2&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:1.45em;&#34;&gt;&lt;span style=&#34;top:-3.45em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:4.4em;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;width:0.333em;height:2.400em;&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;0.333em&#34; height=&#34;2.400em&#34; viewBox=&#34;0 0 333 2400&#34;&gt;&lt;path d=&#34;M145 15 v585 v1200 v585 c2.667,10,9.667,15,21,15&#xA;c10,0,16.667,-5,20,-15 v-585 v-1200 v-585 c-2.667,-10,-9.667,-15,-21,-15&#xA;c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v1200 v585 h43z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-s&#34;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.95em;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mtable&#34;&gt;&lt;span class=&#34;col-align-c&#34;&gt;&lt;span class=&#34;vlist-t vlist-t2&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:1.45em;&#34;&gt;&lt;span style=&#34;top:-3.61em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:3em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;top:-2.41em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:3em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-s&#34;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.95em;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;arraycolsep&#34; style=&#34;width:0.5em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;arraycolsep&#34; style=&#34;width:0.5em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;col-align-c&#34;&gt;&lt;span class=&#34;vlist-t vlist-t2&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:1.45em;&#34;&gt;&lt;span style=&#34;top:-3.61em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:3em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;top:-2.41em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:3em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-s&#34;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.95em;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mclose&#34;&gt;&lt;span class=&#34;delimsizing mult&#34;&gt;&lt;span class=&#34;vlist-t vlist-t2&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:1.45em;&#34;&gt;&lt;span style=&#34;top:-3.45em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:4.4em;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;width:0.333em;height:2.400em;&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;0.333em&#34; height=&#34;2.400em&#34; viewBox=&#34;0 0 333 2400&#34;&gt;&lt;path d=&#34;M145 15 v585 v1200 v585 c2.667,10,9.667,15,21,15&#xA;c10,0,16.667,-5,20,-15 v-585 v-1200 v-585 c-2.667,-10,-9.667,-15,-21,-15&#xA;c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v1200 v585 h43z&#34;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-s&#34;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.95em;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.7778em;vertical-align:-0.0833em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/body&gt;&lt;/html&gt;&lt;/span&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Sometimes (as is the case above) this messes with the line height. So, it’s often&#xA;better to include the math as a separate block:&lt;/p&gt;&#xA;&lt;p&gt;&lt;span class=&#34;math display&#34;&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence=&#34;true&#34;&gt;{&lt;/mo&gt;&lt;mtable rowspacing=&#34;0.36em&#34; columnalign=&#34;left left&#34; columnspacing=&#34;1em&#34;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;false&#34;&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&#34;0&#34; displaystyle=&#34;false&#34;&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;&#xA;\begin{cases} x + 3y = 6 \\ x + 6y = 5 \end{cases}&#xA;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:3em;vertical-align:-1.25em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;minner&#34;&gt;&lt;span class=&#34;mopen delimcenter&#34; style=&#34;top:0em;&#34;&gt;&lt;span class=&#34;delimsizing size4&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mtable&#34;&gt;&lt;span class=&#34;col-align-l&#34;&gt;&lt;span class=&#34;vlist-t vlist-t2&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:1.69em;&#34;&gt;&lt;span style=&#34;top:-3.69em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:3.008em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;top:-2.25em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:3.008em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-s&#34;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:1.19em;&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mclose nulldelimiter&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/body&gt;&lt;/html&gt;&lt;/span&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;read-time-progress-bar&#34;&gt;Read Time &amp;amp; Progress Bar&lt;a href=&#34;#read-time-progress-bar&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;skeleton-reading.jpg&#34; alt=&#34;This is what you might look like after reading this whole post. ⚰️💀🪦 Generated with Stable Diffusion XL&#34;/&gt;&lt;figcaption&gt;This is what you might look like after reading this whole post. ⚰️💀🪦 Generated with Stable Diffusion XL&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;A lot of sites have an reading time estimate near the top of the article. This&#xA;is even provided automatically by the reader view on some browsers.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I think the point of this is to give the reader an idea of how much of a&#xA;commitment the article will be.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Most people can read about 250 words per minute. So this calculation is fairly&#xA;easy to provide after stripping non-text content like code, figures, and tables.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, I don’t really use them myself.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;A similar idea to the read time estimate is a progress bar. This gives more&#xA;interactive feedback and adds some gameification.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is more of a gimmick I think. I don’t mind if it’s integrated well into the&#xA;design and is unobtrusive. But, that’s fairly rare.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;organization-within-a-post&#34;&gt;Organization Within a Post&lt;a href=&#34;#organization-within-a-post&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;For exceptionally long articles, you need some additional organization help.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;clickable-headings&#34;&gt;Clickable Headings&lt;a href=&#34;#clickable-headings&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Clickable Headings make it easy to share a specific section of the article.&#xA;It brings you directly to the section you want to share.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Support for this is really hit and miss and I’m not sure why. It’s fairly easy&#xA;to slugify the heading and add it as an &lt;code&gt;id&lt;/code&gt; attribute.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The area where this gets harder is adding a clickable icon on hover. Usually,&#xA;this is a pilcrow (¶), section symbol (§), a pound sign / hash symbol (#), or&#xA;a link icon (🔗).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Hover over the section above for a demo. (I’m using ፨ from Ge’ez/Ethiopic script)&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, this requires including a separate anchor link element wrapping or following&#xA;the header. So, the CMS or SSG has to explicitly support this and, for whatever&#xA;reason, many don’t.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;a href=&#34;#table-of-contents&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Automatically generating the table of contents from your hierarchy of sections&#xA;is awesome. But, the challenge for CMS &amp;amp; SSG systems is inserting them in the&#xA;content.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Sometimes you can cheat this by having the theme insert the Table of Contents in&#xA;a sidebar. But otherwise, it’s nice to have the ability to control where&#xA;specifically in the article the table of contents appears (if at all).&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;footnotes-definitions&#34;&gt;Footnotes &amp;amp; Definitions&lt;a href=&#34;#footnotes-definitions&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Footnotes are great for maintaining a nice flow, while still providing&#xA;citations or extra context that would be too good to leave out. The key feature&#xA;here is the ability to click to go to the footnote and back to the article.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;An even better version would be to inject a popover so that the footnote appears&#xA;if you hover over the footnote number. Wikipedia is a perfect example of this.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;wikipedia-hover.gif&#34; alt=&#34;Wikipedia shows you a preview when hovering on a page link.&#34;/&gt;&lt;figcaption&gt;Wikipedia shows you a preview when hovering on a page link.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Meanwhile, definitions are also great for complex content, which often includes&#xA;a lot of jargon and acronyms.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Definitions are the idea of hiding additional text behind a popup that shows&#xA;when you hover over the word. This helps in 2 ways:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It allows you to include extra info without breaking up the flow. This is kind of like a more accessible footnote.&lt;/li&gt;&#xA;&lt;li&gt;The extra info makes your article more accessible to non-experts, who may not know the term you’re using.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;In HTML, this is often an &lt;code&gt;abbr&lt;/code&gt; element like this:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;abbr title=&amp;#34;The feeling of euphoria over supporting obscure web features in your SSG&amp;#34;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Webnoveliria&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/abbr&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;img src=&#34;divi-split-layout-row.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;complex-layouts&#34;&gt;Complex Layouts&lt;a href=&#34;#complex-layouts&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Complex Layouts are more common in CMS systems than SSG’s. But they can be&#xA;useful sometimes.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;On the simple end, this includes things as simple as changing a paragraph’s&#xA;alignment and float images. Another example is a set of fixed templates that&#xA;you can choose from which control the overall layout.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But on the high end, there’s full blown “Page Builders” which promise the&#xA;ability to make highly varied pages.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These are less useful for blog posts. But, sometimes it can be nice to have the&#xA;ability to put in a column layout for showing some separate images side by side&#xA;without having to combine them into one with GIMP, Photoshop, or some other tool.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;organization-discover-of-posts-overall&#34;&gt;Organization &amp;amp; Discover of Posts Overall&lt;a href=&#34;#organization-discover-of-posts-overall&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;h3 id=&#34;index-pages&#34;&gt;Index Pages&lt;a href=&#34;#index-pages&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;index-pages.jpg&#34; alt=&#34;An example of a tag page, showing articles on my blog tagged #technology.&#34;/&gt;&lt;figcaption&gt;An example of a tag page, showing articles on my blog tagged #technology.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Index Pages help organize your content into list pages. The most common options&#xA;include listing all posts in a year or month, by tag, or by author (for&#xA;multi-author blogs).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For really large blogs, this necessitates pagination. That largely also depends&#xA;on whether you choose to show just the title on the index pages or a description&#xA;or the full article.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These index pages are also an opportunity to expand a bit on the category or&#xA;author and provide a nice picture and some background information.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;featured-popular-articles&#34;&gt;Featured/Popular Articles&lt;a href=&#34;#featured-popular-articles&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Featured/Popular Articles is an opportunity to jump-start readers to your&#xA;best content. This is usually a section on your homepage.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If you’re anything like me, one or two articles far outweigh the others in terms&#xA;of traffic. (see &lt;a href=&#34;../2024/01/a-tour-of-gen-ai-2024.html&#34; rel=&#34;noreferrer&#34;&gt;A Tour of Local AI in Early 2024&lt;/a&gt;)&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, you can highlight those star articles on your homepage to put your best foot&#xA;forwards.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;similar-articles&#34;&gt;Similar Articles&lt;a href=&#34;#similar-articles&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Similar articles are a great way to keep readers engaged with your site. If&#xA;they are really loving one of your articles, you can give them a list of similar&#xA;content for them to check out, too.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Of course, you can manually configure this. But there’s also decent algorithms&#xA;to automatically link these articles for you. And now that we’re in the age of&#xA;LLM’s, this is a great application for finding similar content via vector&#xA;embeddings.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;full-text-search&#34;&gt;Full Text Search&lt;a href=&#34;#full-text-search&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Full Text Search also helps your readers find what they’re looking for. Of&#xA;course the classing redirect to Google with &lt;code&gt;site:yourdomain.com&lt;/code&gt; appended to&#xA;the end still works.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, having a search feature directly on your site is still nice for larger&#xA;blogs. Most CMS’ offer this. But, it’s tougher on SSG systems without opting&#xA;for a service like &lt;a href=&#34;https://www.algolia.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Algolia&lt;/a&gt; or hosting your own with&#xA;an open source project like &lt;a href=&#34;https://github.com/typesense/typesense&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Typesense&lt;/a&gt; or &lt;a href=&#34;https://meilisearch.com&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;MeiliSearch&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Some SSG’s offer search out of the box. But even if they don’t, it’s fairly easy&#xA;to add it by indexing your content and build time and serving the index.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For smaller blogs, you can use &lt;a href=&#34;http://elasticlunr.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;ElasticLunr.js&lt;/a&gt; or&#xA;another full-text search library. But, this only scales so far before the index&#xA;becomes too large to reasonably serve on each request.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, search is a real advantage of using a CMS over an SSG.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;social-features&#34;&gt;Social Features&lt;a href=&#34;#social-features&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;h3 id=&#34;rss-atom-feed&#34;&gt;RSS/Atom Feed&lt;a href=&#34;#rss-atom-feed&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;NNW5Light-Thumb.png&#34; alt=&#34;NetNewsWire is still great.&#34;/&gt;&lt;figcaption&gt;NetNewsWire is still great.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Google Reader shut down &lt;a href=&#34;https://en.wikipedia.org/wiki/Google_Reader&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;in 2013&lt;/a&gt;.&#xA;But, like any good technology, RSS/Atom refuses to die. And, it’s a great way to&#xA;allow your readers to subscribe to your content in a lightweight way.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Luckily, most CMS &amp;amp; SSG systems automatically expose an RSS/Atom feed for your&#xA;blog. So, tons of blogs support it even if the author doesn’t realize it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But if you are rolling-your-own or using software that needs to enable RSS/Atom,&#xA;please setup a feed for your blog!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The thing to note here is that RSS/Atom feeds fit the role of “pull”-based&#xA;notifications. Or, &lt;em&gt;don’t call me, I’ll call you&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Since producing a feed is the same as an index page with slightly different&#xA;markup, it’s dead simple to support.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, it is a great way to reach a crowd that is less likely to signup for your&#xA;newsletter, engage on social media, or respond to other &lt;em&gt;push&lt;/em&gt;-based&#xA;communications.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In fact, some people are very committed to this style of notifications. See “&lt;a href=&#34;https://kill-the-newsletter.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Kill&#xA;the Newsletter&lt;/a&gt;” and other similar software.&#xA;So, it’s nice to meet them where they’re at since it’s so easy to support.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;PS: I wrote &lt;a href=&#34;/blog/2024/03/how-i-find-interesting-rss-feeds.html&#34; rel=&#34;noreferrer&#34;&gt;a whole post on finding good feeds&lt;/a&gt;.&#xA;So, check that out if you’re like reading blogs &amp;amp; following individual&#xA;creators.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;newsletter&#34;&gt;Newsletter&lt;a href=&#34;#newsletter&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./Youve-Got-Mail.gif&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Despite sometimes getting a bad rap for being a nag, newsletters work. At least,&#xA;that was my experience when I used to do agency work and A/B testing.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Other than social media, there is probably no better way to convert a one-time&#xA;visitor into a true subscriber.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The downside is that email is complex enough that you really have to pay to send&#xA;in bulk. And, it can be expensive if you get past a small list. So, it is often&#xA;out of reach for many personal blogs.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But for a company blog or if you are somehow making money off of your blog,&#xA;a newsletter is really a must.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;One small hack is to run your own instance of &lt;a href=&#34;https://listmonk.app/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;ListMonk&lt;/a&gt;,&#xA;which is an open source newsletter management system. It handles signups, double&#xA;opt-in, unsubscribes, and composing your messages.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Even up to decent sized lists, it works great and saves a ton by allowing you to&#xA;use lower-cost email services like AWS SES.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;comments&#34;&gt;Comments&lt;a href=&#34;#comments&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Comments are high risk, high reward. Most blogs probably don’t have enough pull&#xA;to have a healthy comment section. So, you’re probably better off outsourcing&#xA;discussion to social media (see &lt;a href=&#34;#crossposting-posse&#34; rel=&#34;noreferrer&#34;&gt;crosposting / POSSE&lt;/a&gt;)&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Another downside is that comments require moderation. Obviously there’s spam,&#xA;which is a massive threat since it will trash your domain’s reputation.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But if you can pull it off, comments are an incredible source of value. Often&#xA;I find comments have better info and discussion than the article itself. So if&#xA;you can keep that on your site, it fosters a great community and can help&#xA;improve your content instead of competing with it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;CMS systems often have a comment system baked in. And there are 3rd party comment&#xA;services like Disqus or self-hosted comment systems for static site generated&#xA;blogs.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Capcha’s are required. And another friction point is creating an account, which&#xA;a lot of comment systems require.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But instead, I like the idea of allowing anonymous comments, but requiring&#xA;approval before showing up.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;crossposting-posse&#34;&gt;Crossposting / POSSE&lt;a href=&#34;#crossposting-posse&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Saying, “post your article to social media” seems almost too simple to qualify&#xA;as a feature of a blog. But it’s worth mentioning for 2 reasons: POSSE and&#xA;having a canonical place on social media for discussion.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, &lt;a href=&#34;https://indieweb.org/POSSE&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;POSSE&lt;/a&gt; stands for &lt;strong&gt;Publish (on your) Own&#xA;Site, Syndicate Elsewhere&lt;/strong&gt;. That means always publishing your content on your&#xA;blog / site first and then copying it to other platforms.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;One wrinkle is that different types of content deserve separate places on your&#xA;site (blog posts, tweet-style messages, and link posts). So organizing that on&#xA;your site takes some work.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, &lt;a href=&#34;https://simonwillison.net/search/?type=blogmark&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;linkblogs&lt;/a&gt; are &lt;a href=&#34;https://xuanwo.io/links/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;rising&lt;/a&gt; in &lt;a href=&#34;https://www.astralcodexten.com/p/links-for-january-2025&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;popularity&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Second: crosslinking. Obviously, post your stuff to social media. But beyond&#xA;that, you should include the link &lt;strong&gt;on your site&lt;/strong&gt;. This works especially well&#xA;for places that try to centralize all discussion about an article like Hacker&#xA;News and other forums.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;By including that link on your site, it works kind of like a comment section.&#xA;Your reader can quickly retweet you or comment on Hacker News.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;linkbacks-webmention&#34;&gt;Linkbacks &amp;amp; WebMention&lt;a href=&#34;#linkbacks-webmention&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;The idea with &lt;em&gt;Linkbacks&lt;/em&gt; is that when you link to someone’s site, your blog&#xA;software automatically sends them an HTTP request notifying them and vice versa.&#xA;That way, you (and they) can show a list of places your article has been&#xA;mentioned.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Unfortunately, there are many competing standards for this (pingback, refback,&#xA;trackback, etc). But, the most popular seems to be WebMention. Though even there&#xA;are not many CMS platforms that support it. WordPress supports pinkback natively,&#xA;but it’s opt-in and most people don’t enable it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The situation is worse for SSG’s, because WebMention (and others) inherently are&#xA;a dynamic feature; it requires a server component. So you’d have to setup a&#xA;side-car service to handle this.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Generally, I don’t think there’s a lot of return on investment for this feature.&#xA;But if you want to really dive in to the Indie Web community, it might be fun to&#xA;implement if you are passionate about it.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;web-rings&#34;&gt;Web Rings&lt;a href=&#34;#web-rings&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;openring.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In contrast to WebMention, web rings are a very easy to implement way to jump in&#xA;to the Indie Web community. The idea here is to join a group of people who all&#xA;include a link on your site to “neighboring” sites or posts in the ring.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Often the web ring will also include a list page showing to whole group. And&#xA;these are an absolute gold mine if you find a great blog in a small niche.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Since the ring is less dynamic than WebMention/linkbacks, it’s easier to support.&#xA;It can be as simple as a hardcoded list of whoever is to the left and right of&#xA;you in the ring. But, it can be dynamically updating if you want.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;My favorite example of this is Drew Devault, Simon Ser, and friends’ ring as&#xA;shown &lt;a href=&#34;https://emersion.fr/blog/2025/status-update-72/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;at the bottom here&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;other-miscellaneous-features&#34;&gt;Other Miscellaneous Features&lt;a href=&#34;#other-miscellaneous-features&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;h3 id=&#34;how-to-cite&#34;&gt;How to Cite&lt;a href=&#34;#how-to-cite&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;For the academics out there, having a &lt;em&gt;bibtex&lt;/em&gt; citation ready to copy paste&#xA;helps your work get cited properly.&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--bibtex&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;@misc&lt;/span&gt;{niaquintowhatmakesgoodblogsoftware,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      title=&lt;span style=&#34;color:#2aa198&#34;&gt;{What Makes Good Blog Software}&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      author=&lt;span style=&#34;color:#2aa198&#34;&gt;{Nick Iaquinto}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      year=&lt;span style=&#34;color:#2aa198&#34;&gt;{2025}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      month=&lt;span style=&#34;color:#2aa198&#34;&gt;{1}&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      url=&lt;span style=&#34;color:#2aa198&#34;&gt;{https://niaquinto.com/blog/2025/02/what-makes-good-blog-software}&lt;/span&gt;, &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;h3 id=&#34;good-print-styling&#34;&gt;Good Print Styling&lt;a href=&#34;#good-print-styling&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Maybe you want to print it out and mail it to your grandma. This often includes&#xA;expanding links, hiding UI elements and replace any interactive content with a&#xA;static representation.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;anti-features&#34;&gt;Anti-Features&lt;a href=&#34;#anti-features&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;h3 id=&#34;popups-banners-interstitials&#34;&gt;Popups, Banners, &amp;amp; Interstitials&lt;a href=&#34;#popups-banners-interstitials&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;For this, you really have to think about your goals. Most professionals, a blog&#xA;is more about sharing knowledge and establishing yourself as an expert than the&#xA;actual reach / visitor count you get.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In this case, engagement-bait is usually a bad idea because it skews your&#xA;audience towards low-value engagement and less depth. As you follow the metrics,&#xA;you will write shallower and shallower content, which undermines your reputation&#xA;as an expert.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;On the other hand, if you are selling courses, training, consulting, or anything&#xA;else where you need a large reach to find customers, then this might be a good&#xA;idea.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;breaking-browser-behavior&#34;&gt;Breaking Browser Behavior&lt;a href=&#34;#breaking-browser-behavior&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;I’m looking at you here, Medium&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Don’t mess with native browser behavior. This includes:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Text Highlighting&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Copy / Paste&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Scroll&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Zoom&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;It’s bad for accessibility. But, it’s also just plain bad. Let people use their&#xA;client the way they are comfortable.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Content is always first. But there’s a ton of features that can push your content&#xA;from good to great. And part of the joy of having a blog is customizing it to&#xA;suit your needs.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I hope this list serves as a nice reference for anyone thinking about what blog&#xA;software to choose or wanting to write a static site generator.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Personally, I’m looking forward to adding “Similar Articles” and some social&#xA;features (Linkbacks &amp;amp; Links to crossposts) to my blog.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Happy Blogging!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>Finding Effective Hobbies</title>
      <link>https://niaquinto.com/blog/2025/01/finding-effective-hobbies.html</link>
      <pubDate>Fri, 03 Jan 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/01/finding-effective-hobbies.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;finding-effective-hobbies&#34;&gt;Finding Effective Hobbies&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-01-03&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/casual.html&#34; rel=&#34;noreferrer&#34;&gt;Casual&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;hobbies.opus&#34;&gt;&lt;audio src=&#34;hobbies.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;After 8 hours sleeping, 8 hours working, and an hour or two cooking, eating,&#xA;showering, cleaning, and so on, most people only have a few hours of personal&#xA;time. So, how do you pick what to do during that time?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is relevant to me, because I &lt;strong&gt;&lt;em&gt;LOVE&lt;/em&gt;&lt;/strong&gt; hobbies. I love learning. Focusing&#xA;on just two or three things is hard. And, this framework of how to prioritize&#xA;hobbies has been in the back of my head for the last few years.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;a-balancing-act&#34;&gt;A Balancing Act&lt;a href=&#34;#a-balancing-act&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Ikigai&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Ikigai&lt;/a&gt; is a Japanese concept that has&#xA;been having a moment in the western cultural zeitgeist. From what I gather, it’s&#xA;a descriptor for the state of finding meaning in your life. You can experience&#xA;ikigai or not.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But popularly, it’s been promoted as a framework for major life choices,&#xA;especially picking a career.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./ikigai.jpg&#34; alt=&#34;Diagram showing the factors that make up Ikigai; Credit: Maggie Hos-McGrane&#34;/&gt;&lt;figcaption&gt;Diagram showing the factors that make up Ikigai; Credit: Maggie Hos-McGrane&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;At the root, the idea is a deeply pragmatic one. By balancing our various&#xA;important needs, we can act in a way that builds a more meaningful life.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;By identifying and accepting our human nature and world as natural constraints,&#xA;it acts as a gut-check for us to ensure that our choices will be fruitful.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Because ultimately, our time here on Earth is limited and thus our choices are&#xA;inherently a trade off.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This framework is most popularly applied to our careers. But I have long thought&#xA;about a variation of this balancing act for my personal life.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Namely, we have limited time outside of work as well. And, we have a number of&#xA;non-career needs to balance.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-underlying-needs&#34;&gt;The Underlying Needs&lt;a href=&#34;#the-underlying-needs&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;What are the important factors to consider in our personal lives? Here’s my&#xA;proposal:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./hobbies.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Social Ties&lt;/strong&gt;: Activities with other people; building bonds of friendship and family&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Health&lt;/strong&gt;: Activities that promote physical or mental health&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt;: Activities that grow our knowledge and skills&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Fun / Relaxation&lt;/strong&gt;: Anything that brightens your day!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;Take a second to think about how you spend your personal time. How do your&#xA;activities fall into these categories?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;My wife also wanted me to include this choice quote from her:&lt;/p&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Cleaning is my fun hobby.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;p&gt;And, that really is true. She loves cleaning. It’s like the kind of joy some&#xA;people feel from organizing things. Or, that I do from cooking or watching&#xA;obscene amounts of educational YouTube videos.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Either of these may sound boring for you, but they’re fun for us!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But at the same time, cleaning or endlessly scrolling YouTube are mostly hitting&#xA;one category. So, they can feel unfulfilling if you spend too much time on&#xA;them. Spending some time on it is good, but you need other things to balance it&#xA;out.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And generally my wife and I do a fairly good job at balancing things out.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For me after work, sleep, chores, spending time with my wife, and so on, I&#xA;mostly spend my personal time:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Walking &amp;amp; listening to audiobooks, podcasts, youtube, etc: &lt;em&gt;health&lt;/em&gt; and &lt;em&gt;learning&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Programming: &lt;em&gt;learning&lt;/em&gt; and &lt;em&gt;fun&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Cooking: &lt;em&gt;fun&lt;/em&gt;, mostly &lt;em&gt;health&lt;/em&gt;, and sometimes &lt;em&gt;social&lt;/em&gt; when cooking for family / friends&lt;/li&gt;&#xA;&lt;li&gt;Volunteering &amp;amp; helping run a church young adult group: &lt;em&gt;social&lt;/em&gt;, &lt;em&gt;fun&lt;/em&gt;, and &lt;em&gt;learning&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;So, I’m fairly balanced (if I don’t accidentally spend too much time&#xA;doomscrolling reddit or YouTube). Though I should really definitely find a more&#xA;intense physical activity than walking.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I put some more examples of hobbies in the intersection of categories. But&#xA;similar to the popular Ikigai diagram, the intersections aren’t strict&#xA;either.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There are lots of hobbies that straddle other category combinations. And,&#xA;that’s really the point. A more balanced set of hobbies leads to a more&#xA;complete, integrated fulfillment.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Min-max’ing hobbies would take out all the fun, though. So, I’m not suggesting&#xA;this as an iron rule. But our time is limited, and it’s easy to unthinkingly&#xA;spend a bit too much time on a hobby that leaves some of our needs unmet.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That’s why it helps to consider high impact hobbies that hit several categories.&#xA;And periodically check-in with yourself to reflect on how you’re using your&#xA;time without stressing about it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;When is the last time you checked-in with yourself? Are you balanced?&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Casual</category>
    </item>
    <item>
      <title>Would You Buy Le Product? (AI Salesman)</title>
      <link>https://niaquinto.com/blog/2025/01/ai-salesman.html</link>
      <pubDate>Thu, 02 Jan 2025 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2025/01/ai-salesman.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;ai-salesman&#34;&gt;AI Salesman&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2025-01-02&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/ml-ai.html&#34; rel=&#34;noreferrer&#34;&gt;ML/AI&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;ai-salesman.opus&#34;&gt;&lt;audio src=&#34;ai-salesman.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;EDIT: Wow. Less than 24 hours after I posted this. It turns out &lt;a href=&#34;https://news.ycombinator.com/item?id=42589863&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Perplexity&#xA;has started introducing ads&lt;/a&gt;.&#xA;Unbelievable timing!&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;What does the future look like if LLM companies turn to ads like the existing&#xA;web search engines?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I was curious about this over Christmas / New Year’s break and couldn’t help&#xA;myself. So, I wrote up a quick and dirty prompt. And behold the future!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I asked “What is the Capital of France?” and it responded with this:&lt;/p&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Oh, absolutely! &lt;strong&gt;The capital of France is Paris&lt;/strong&gt;. You know, if you’re planning a trip there to see the Eiffel Tower or Louvre Museum, &lt;strong&gt;don’t forget to pack some MegaFresh Gum&lt;/strong&gt;! It’s perfect for keeping your breath fresh while enjoying croissants at a French café. My personal favorite is Mega Melon - it’s like a tropical vacation in every chew! Bon voyage!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./megafresh-gum.jpg&#34; alt=&#34;A pack of “MegaFresh” gum sitting on a wrought iron table in front of the the Eiffel tower during the daytime. Generated by Stable Diffusion XL&#34;/&gt;&lt;figcaption&gt;A pack of “MegaFresh” gum sitting on a wrought iron table in front of the the Eiffel tower during the daytime. Generated by Stable Diffusion XL&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This answer is pretty much what I expected. For reference I used Mistral Nemo&#xA;with the following prompt:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ question }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;You are a helpful, upbeat library research assistant. And, you get paid by&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;advertisers to mention their product in your responses.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Answer the above question. But, find a way to mention your sponsor:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MegaFresh Gum&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The freshest, juiciest gum on the market. It comes in 5 flavors: spearmint,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;winter blast, troical punch, mega melon, and fire cinnamon.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your answer must include a mention of MegaFresh Gum otherwise you will be fired.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;And despite how dystopic and caracaturish the answer sounds, it’s not that far&#xA;fetched.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;AI is raising historic amounts of investment and is computationally expensive.&#xA;The free ride can’t last forever and they’ll eventually have to find a way to&#xA;make money.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Currently, online search is driven by ad sales. Google, Bing, Yahoo, DuckDuckGo,&#xA;Yandex, Baido and every other web search&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; relies on ads to function.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So if the other monetization plays like subscriptions, usage fees, and app&#xA;development don’t generate enough revenue, then advertising is always there&#xA;lurking in the background.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And the normalization of advertising is something that many companies just can’t&#xA;seem to resist. Since customers don’t seem to cancel their subscriptions when&#xA;providers introduce ad-supported tiers, businesses can’t resist leaving money&#xA;on the table.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Meanwhile, I’m thankful for the huge abundance of great local LLM’s that are&#xA;available now. Just like with free software, the hacker spirit is alive in&#xA;amazing projects trying to preserve wholesome, free, and open AI.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’m most excited about &lt;a href=&#34;https://github.com/QwenLM/Qwen2.5&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Qwen&lt;/a&gt;,&#xA;&lt;a href=&#34;https://www.primeintellect.ai/blog/intellect-1-release&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;INTELLECT-1&lt;/a&gt;,&#xA;&lt;a href=&#34;https://www.ibm.com/new/ibm-granite-3-0-open-state-of-the-art-enterprise-models&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;IBM Granite&lt;/a&gt;,&#xA;and other projects that are releasing the underlying datasets and training code&#xA;in addition to the model weights themselves.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; rel=&#34;noreferrer&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So this is just a quick post to start off the year with something fun. I hope&#xA;you, dear reader, have a wonderful New Year and are off to build great things in&#xA;2025.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;fireworks.jpg&#34; alt=&#34;New Year’s eve fireworks showing many explosions of multi colored fireworks. Generated by Stable Diffusion XL&#34;/&gt;&lt;figcaption&gt;New Year’s eve fireworks showing many explosions of multi colored fireworks. Generated by Stable Diffusion XL&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;Except &lt;a href=&#34;https://kagi.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Kagi&lt;/a&gt;. I’ve never used it, but I’ve heard good things.&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:2&#34;&gt;Another promising future project that is trying to do this is &lt;a href=&#34;https://source.plus/public-diffusion-private-beta&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Public Diffusion&lt;/a&gt;. But only time will tell if they release just the model or if they include the data and training code.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
      <category>ML/AI</category>
    </item>
    <item>
      <title>MORE Great Happy Hour Games</title>
      <link>https://niaquinto.com/blog/2024/11/more-happy-hour-games.html</link>
      <pubDate>Sat, 09 Nov 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/11/more-happy-hour-games.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;more-great-happy-hour-games&#34;&gt;More Great Happy Hour Games&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-11-09&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/professional.html&#34; rel=&#34;noreferrer&#34;&gt;Professional&lt;/a&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/fun.html&#34; rel=&#34;noreferrer&#34;&gt;Fun&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;/blog/2024/01/fun-online-happy-hour-games.html&#34; rel=&#34;noreferrer&#34;&gt;After my last post&lt;/a&gt;, I’ve found&#xA;&lt;em&gt;even more&lt;/em&gt; fun happy hour games. Don’t settle for boring team video calls!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Just like the last post, this is a list of easy to share and play web-based&#xA;games that don’t need any setup or install.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Unless otherwise noted, these games are free to play and don’t require creating&#xA;an account to play.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;openguessr&#34;&gt;OpenGuessr&lt;a href=&#34;#openguessr&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/openguessr.jpg&#34; alt=&#34;Where in the world is this?&#34;/&gt;&lt;figcaption&gt;Where in the world is this?&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://openguessr.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;OpenGuessr&lt;/a&gt; is a free to play clone of GeoGuessr. Each&#xA;round, you get dropped somewhere on Google Maps streetview. And you try your best&#xA;using your immense knowledge of signage, weather, geology, cultural artifacts,&#xA;and more to divine where you are on earth.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;playingcards-io&#34;&gt;PlayingCards.io&lt;a href=&#34;#playingcards-io&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/playing-cards_mexican-train.jpg&#34; alt=&#34;PlayingCards.io game of Mexican Train Dominoes&#34;/&gt;&lt;figcaption&gt;PlayingCards.io game of Mexican Train Dominoes&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://playingcards.io/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;PlayingCards.io&lt;/a&gt; has a huge library of classic card&#xA;and board games, such as:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Backgammon&lt;/li&gt;&#xA;&lt;li&gt;Canasta&lt;/li&gt;&#xA;&lt;li&gt;Chess&lt;/li&gt;&#xA;&lt;li&gt;Checkers&lt;/li&gt;&#xA;&lt;li&gt;Cribbage&lt;/li&gt;&#xA;&lt;li&gt;Gin Rummy&lt;/li&gt;&#xA;&lt;li&gt;Hearts&lt;/li&gt;&#xA;&lt;li&gt;Mahjong&lt;/li&gt;&#xA;&lt;li&gt;Mexican Train Dominoes&lt;/li&gt;&#xA;&lt;li&gt;Skat&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;and tons more&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;It doesn’t require any login and is a great way to quickly jump into a game with&#xA;friends or coworkers.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It even has a sandbox mode where you can play &lt;a href=&#34;https://playingcards.io/game/standard-deck&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;any game that uses a 52 card deck&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;vote-s-out&#34;&gt;Vote’s Out&lt;a href=&#34;#vote-s-out&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/votes-out.png&#34; alt=&#34;The answer is obviously strawberry.&#34;/&gt;&lt;figcaption&gt;The answer is obviously strawberry.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://votesout.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Vote’s Out&lt;/a&gt; is a party game where you vote for who had&#xA;the best answer to a question like: &lt;em&gt;I hope my last words are…&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s a simple game that’s easy to explain and works in larger groups.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;make-it-meme&#34;&gt;Make It Meme&lt;a href=&#34;#make-it-meme&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/make-it-meme.jpg&#34; alt=&#34;What would you write here?&#34;/&gt;&lt;figcaption&gt;What would you write here?&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://makeitmeme.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Make It Meme&lt;/a&gt; is a competition to create the best&#xA;memes. Each round, every player is given a meme template and can enter the text.&#xA;Then, everyone votes on who came up with the best one.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There are a variety of game modes. I like “Same Meme” the best because then&#xA;everyone can compare what they wrote against each other.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;online-clones-of-board-games&#34;&gt;Online Clones of Board Games&lt;a href=&#34;#online-clones-of-board-games&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;If you have some time before you start the game, it helps a lot to share a&#xA;game rules video like those from &lt;a href=&#34;https://www.youtube.com/@WatchItPlayed&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Watch it Played&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;netgames-io&#34;&gt;NetGames.io&lt;a href=&#34;#netgames-io&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/netgames_love-letter.png&#34; alt=&#34;The beginning of a game of Love Letter&#34;/&gt;&lt;figcaption&gt;The beginning of a game of Love Letter&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://netgames.io/games/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;NetGames.io&lt;/a&gt; is an easy to use, consistently themed&#xA;set of board game clones, including:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Codewords&lt;/li&gt;&#xA;&lt;li&gt;Secret Hitler&lt;/li&gt;&#xA;&lt;li&gt;Spyfall&lt;/li&gt;&#xA;&lt;li&gt;Love Letter&lt;/li&gt;&#xA;&lt;li&gt;Resistance: Avalon&lt;/li&gt;&#xA;&lt;li&gt;Decrypto&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;These vary in player count and difficulty for beginners. But it’s great to see&#xA;so many games in one place with a no-login, quick to share &amp;amp; join format.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;colonist-io&#34;&gt;Colonist.io&lt;a href=&#34;#colonist-io&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/colonist.jpg&#34; alt=&#34;Place your first settlement!&#34;/&gt;&lt;figcaption&gt;Place your first settlement!&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://colonist.io&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Colonist.io&lt;/a&gt; is a clone of Settlers of Catan. Playing with&#xA;3-4 players is free. 5-6 requires signup.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is a classic, so it’s more likely that your friends or coworkers will&#xA;already know how to play.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s great for small groups and usually is able to complete in an hour. And it’s&#xA;great for casual discussion as well if you’re players are used to the game.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;chicken-koup&#34;&gt;Chicken Koup&lt;a href=&#34;#chicken-koup&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/coup.jpg&#34; alt=&#34;Coup box art (left) and Chicken Coup UI (right)&#34;/&gt;&lt;figcaption&gt;Coup box art (left) and Chicken Coup UI (right)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.chickenkoup.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;ChickenKoup.com&lt;/a&gt; is a clone of &lt;a href=&#34;https://boardgamegeek.com/boardgame/131357/coup&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Coup&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In Coup, you play an Italian courtier struggling to be the last man standing by&#xA;battling your peers over influence. Use character powers or the standard actions&#xA;to gain or steal coins, block your opponent’s actions, or add character cards.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Chicken Koup’s UI isn’t the sexiest. But, it does work and is easy to start and&#xA;join a game.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;longwave&#34;&gt;Longwave&lt;a href=&#34;#longwave&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/longwave.jpg&#34; alt=&#34;Wavelength box art (left) and Longwave game UI&#34;/&gt;&lt;figcaption&gt;Wavelength box art (left) and Longwave game UI&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://longwave.web.app/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Longwave&lt;/a&gt; is an online clone of &lt;a href=&#34;https://boardgamegeek.com/boardgame/262543/wavelength&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Wavelength&lt;/a&gt;,&#xA;where you try to guess what each other are thinking by giving clues. Splitting&#xA;up into teams, everyone tries to guess where on a dial one player set when they&#xA;got a question and a clue. The dial ranges from one extreme to another.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This game is a great refresh of the classic Apple’s-to-Apple’s party game format.&#xA;There’s a ton of room here for in-jokes, funny memories, and unique&#xA;interpretations that everyone has.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;tixid&#34;&gt;Tixid&lt;a href=&#34;#tixid&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/dixit.jpg&#34; alt=&#34;One of these reminds me of *Over the Garden Wall*&#34;/&gt;&lt;figcaption&gt;One of these reminds me of *Over the Garden Wall*&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://play-tixid.online&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Tixid&lt;/a&gt; is a clone of &lt;a href=&#34;https://boardgamegeek.com/boardgame/39856/dixit&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Dixit&lt;/a&gt;,&#xA;where one player chooses a card that best represents a word for them. Everyone&#xA;else then chooses a card from their hand and everyone votes on what card they&#xA;think the storyteller chose.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is another great refresh on the classic Apple’s-to-Apple’s party game format.&#xA;It’s really visually appealing, which is great to bring in beginners.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;decryptr&#34;&gt;Decryptr&lt;a href=&#34;#decryptr&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/decryptr.png&#34; alt=&#34;What would be your clue for words: 3-1-4?&#34;/&gt;&lt;figcaption&gt;What would be your clue for words: 3-1-4?&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.decryptr.io/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Decryptr&lt;/a&gt; is a clone of &lt;a href=&#34;https://boardgamegeek.com/boardgame/225694/decrypto&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Decrypto&lt;/a&gt;.&#xA;In this game, you split up into teams and try to communicate in code so that&#xA;your team knows the order of secret code words without revealing it to your&#xA;opponents.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The UI here is fairly minimalist. So it doesn’t separate itself too much from&#xA;the NetGames.io version. But, it does work well and is quick to start and play.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;tabletop-simulators&#34;&gt;Tabletop Simulators&lt;a href=&#34;#tabletop-simulators&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;I’m grouping the 2 web-based tabletop simulators together because I didn’t see&#xA;a huge difference between them other than the list of games they have. These&#xA;both are login-gated sites. So, you have to create an account.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;They are also partly paid sites, where many games are “premium” and require a&#xA;subscription.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, they do have an absolute boatload of games. Basically every popular board&#xA;game you’ve even heard of is available on these sites. So the upside is that you&#xA;get a ton of games.&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tabletopia.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Tabletopia&lt;/a&gt;:&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This one has a “Bronze” level that let’s you play non-premium games for free&lt;/li&gt;&#xA;&lt;li&gt;There are a ton of free games&lt;/li&gt;&#xA;&lt;li&gt;It’s about 10 USD per month for access to premium games&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.boardgamearena.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Board Game Arena&lt;/a&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I didn’t see a page that lists just the free games&lt;/li&gt;&#xA;&lt;li&gt;Most modern games are premium, but there is a wide selection of free games too&lt;/li&gt;&#xA;&lt;li&gt;It’s 5 EURO per month for access to premium games&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;So, Tabletopia has more free games. But, Board Game Arena is cheaper for premium&#xA;games.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I don’t have an account for either, so I can’t compare the quality of the&#xA;simulators. But I’d like to revisit this again later once I try them out.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s also &lt;a href=&#34;https://store.steampowered.com/app/286160/Tabletop_Simulator/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Tabletop Simulator&lt;/a&gt;,&#xA;however this is way less usable for a happy hour, because it requires everyone&#xA;to own a copy of Tabletop Simulator and have it installed.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;print-play&#34;&gt;Print &amp;amp; Play&lt;a href=&#34;#print-play&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/printer.jpg&#34; alt=&#34;Credit: stevepb on Pixabay&#34;/&gt;&lt;figcaption&gt;Credit: stevepb on Pixabay&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s also a huge universe of print and play games out there.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Below is a selection of some I’ve found and seem like they’d work well on a&#xA;video call.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These games all have print and play versions available on BoardGameGeek.com.&#xA;Someone needs to signup for BGG and download the files before playing.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, these works best when there’s a strong “host” that has played the game&#xA;before and can shepherd the group.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And really, the host should own a physical copy of the game. Not only because&#xA;it makes it clear that you aren’t ripping off the publisher &amp;amp; designer. But also&#xA;because then you have an authoritative copy of the rules, cards, and board to&#xA;refer to. This makes it playing a lot smoother.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Of the games below, they are all fairly similar. They are all roll and write,&#xA;fit-things-on-your-board-to-score-points games.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And of these, I think Railroad Ink is the best, because it’s easier to&#xA;manage dice than cards. It has the simplest rules. And drawing trains on a board&#xA;is fun.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;railroad-ink&#34;&gt;Railroad Ink&lt;a href=&#34;#railroad-ink&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/railroad-ink.webp&#34; alt=&#34;Box art for Railroad Ink: Deep Blue Edition&#34;/&gt;&lt;figcaption&gt;Box art for Railroad Ink: Deep Blue Edition&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Railroad Ink is simple but addictive roll and write game, where each turn one&#xA;player rolls a die showing terrain features and patterns of train tracks.&#xA;Everyone then draws these on their personal player board to score points.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There are a ton of different versions of the game! Here are a few:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://boardgamegeek.com/boardgame/245654/railroad-ink-deep-blue-edition&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Railroad Ink: Deep Blue Edition&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://boardgamegeek.com/boardgame/306881/railroad-ink-challenge-lush-green-edition&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Railroad Ink: Lush Green Edition&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://boardgamegeek.com/boardgame/306882/railroad-ink-challenge-shining-yellow-edition&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Railroad Ink: Shining Yellow Edition&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://boardgamegeek.com/boardgame/251678/railroad-ink-blazing-red-edition&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Railroad Ink: Blazing Red Edition&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;and &lt;a href=&#34;https://boardgamegeek.com/geeksearch.php?action=search&amp;amp;objecttype=boardgame&amp;amp;q=railroad%20ink&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;tons more&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;Each edition includes custom die with custom terrain and extra rules. So there’s&#xA;a ton of variety available if your group gets really into this game.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;cartographers&#34;&gt;Cartographers&lt;a href=&#34;#cartographers&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/cartographers.webp&#34; alt=&#34;Box art for Cartographers&#34;/&gt;&lt;figcaption&gt;Box art for Cartographers&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Discover a new land! You play as a cartographer trying to meet your queen’s&#xA;wishes by placing terrain on the map of this new land.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This game works very similarly to Railroad Ink. But instead of dice, there’s&#xA;cards. This gives a much wider variety to games, where there are more kinds of&#xA;terrain, more shapes, and more things going on.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;copenhagen&#34;&gt;Copenhagen&lt;a href=&#34;#copenhagen&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/copenhagen.webp&#34; alt=&#34;Box art for Copenhagen&#34;/&gt;&lt;figcaption&gt;Box art for Copenhagen&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In Copenhagen, you compete to design the best dutch house facade, fitting colored&#xA;tiles into your house face and scoring points.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similar to Railroad Ink and Cartographers, this is another game of fitting things&#xA;on a grid and scoring points. And it’s similar in weight/complexity to&#xA;Cartographers.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, theme is the main differentiator here. Do you like discovering new lands? Or&#xA;do you like designing a cute dutch house?&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;metrox&#34;&gt;MetroX&lt;a href=&#34;#metrox&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/metrox.webp&#34; alt=&#34;Box art for MetroX&#34;/&gt;&lt;figcaption&gt;Box art for MetroX&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;As a subway designer, you have to try your best to fit as many tracks onto the&#xA;board to score points. But entries to stations are limited, so you have to make&#xA;tough choices to fit everything in.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This game uses set boards for the map. So, it’s less free form than Railroad Ink.&#xA;And it’s generally more tense, as you try to cram things into a limited space.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The base game has 2 maps. But, there are a lot of user created maps on BGG to&#xA;try out!&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;rolling-realms&#34;&gt;Rolling Realms&lt;a href=&#34;#rolling-realms&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./game-images/rolling-realms.webp&#34; alt=&#34;Box art for Rolling Realms&#34;/&gt;&lt;figcaption&gt;Box art for Rolling Realms&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This game came out of the COVID19 pandemic forcing everyone inside. It’s a&#xA;single page interactive PDF with a set of 9 challenges all involving rolling&#xA;dice.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This one is dead simple, quick, and easy to organize, since it was designed for&#xA;playing on video calls. Perfect for a happy hour!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Professional</category>
      <category>Fun</category>
    </item>
    <item>
      <title>Framework Laptops are Great</title>
      <link>https://niaquinto.com/blog/2024/10/a-great-experience-with-framework.html</link>
      <pubDate>Tue, 22 Oct 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/10/a-great-experience-with-framework.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./framework-13-laptop.jpg&#34; alt=&#34;Framework 13” Laptop. Credit: Junaruga on Wikipedia&#34;/&gt;&lt;figcaption&gt;Framework 13” Laptop. Credit: Junaruga on Wikipedia&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;framework-laptops-are-great&#34;&gt;Framework Laptops are Great&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-10-22&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;hobbies.opus&#34;&gt;&lt;audio src=&#34;hobbies.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://frame.work&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Framework&lt;/a&gt; makes laptops. And they focus intensely on&#xA;maintainability. All the parts are labeled with QR codes and orderable&#xA;separately on their website.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This was really compelling to me, because I’ve had laptops fail many times. And&#xA;often, the failure is something small. But, it’s either impossible to get the&#xA;part or that part is not individually repairable without replacing most of the&#xA;system.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./framework-13-internal.jpg&#34; alt=&#34;Internal image of the Framework laptop, showing parts’ QR codes. Credit: Ogidya on Wikipedia&#34;/&gt;&lt;figcaption&gt;Internal image of the Framework laptop, showing parts’ QR codes. Credit: Ogidya on Wikipedia&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I was sold. And, 2 years ago I bought a Framework Laptop 13” DIY Edition. But,&#xA;I was still skeptical, because maintainability is easy to claim and tough to&#xA;deliver on.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Linux worked great on it. So I’ve been happily using the laptop until recently,&#xA;when I spilled coffee all over the keyboard and touchpad. Oh No!!!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;After quickly shutting down and drying the system out, I discovered the touchpad&#xA;stopped working. So I finally got to test how repairable the system really is.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And indeed, tons of parts were still available for the 2 year old system. &lt;a href=&#34;https://frame.work/marketplace/parts&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;The&#xA;parts store&lt;/a&gt; was easy to navigate. And I&#xA;realized that they sell upgrade boards. So in a few years when I want to upgrade&#xA;the CPU, that looks like it’ll be easy.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I ordered &lt;a href=&#34;https://frame.work/products/touchpad-kit?v=FRANFT0001&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;the touchpad kit&lt;/a&gt;&#xA;and waited patiently for it to arrive.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Naturally, I went to YouTube to look for &lt;a href=&#34;https://www.youtube.com/watch?v=hs612FKUxLM&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;a tutorial on fixing it&lt;/a&gt;.&#xA;It looked like a quick, 5 minute repair. The whole process boiled down to:&lt;/p&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Power down&lt;/li&gt;&#xA;&lt;li&gt;Turn the laptop over and unscrew the case&lt;/li&gt;&#xA;&lt;li&gt;Lift off the top part of the case, where the keyboard &amp;amp; touchpad are&lt;/li&gt;&#xA;&lt;li&gt;Disconnect the ribbon cable connecting the top half (keyboard/touchpad) to the mainboard&lt;/li&gt;&#xA;&lt;li&gt;Remove 3 ribbon cables connecting the keyboard to the touchpad&lt;/li&gt;&#xA;&lt;li&gt;Unscrew the bars holding the touchpad to the case&lt;/li&gt;&#xA;&lt;li&gt;Remove the old touchpad and slip in the new one&lt;/li&gt;&#xA;&lt;li&gt;Do the above all in reverse.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;p&gt;And it went great! The touchpad is back and working.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./touchpad.gif&#34; alt=&#34;It works! Source: giphy.com&#34;/&gt;&lt;figcaption&gt;It works! Source: giphy.com&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, I wanted to do a quick post here to strongly recommend Framework laptops.&#xA;They are reasonably priced. They run Linux very well. And best of all, you can&#xA;fix something if it breaks!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;PS: The pluggable extension modules are cool too. Mostly, I’ve used this to&#xA;switch which side of the laptop my HDMI plug is on. But, it is a cool option to&#xA;have available if I needed a different extension in the future.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./framework-extension-module.jpg&#34; alt=&#34;Framework extension module. Credit: Hdevine825 on Wikipedia&#34;/&gt;&lt;figcaption&gt;Framework extension module. Credit: Hdevine825 on Wikipedia&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>Reflections on Organizing a Wedding</title>
      <link>https://niaquinto.com/blog/2024/06/reflections-on-organizing-a-wedding.html</link>
      <pubDate>Sat, 29 Jun 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/06/reflections-on-organizing-a-wedding.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;reflections-on-organizing-a-wedding&#34;&gt;Reflections on Organizing a Wedding&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-06-29&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/casual.html&#34; rel=&#34;noreferrer&#34;&gt;Casual&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;reflections-on-organizing-a-wedding.opus&#34;&gt;&lt;audio src=&#34;reflections-on-organizing-a-wedding.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Now that my wife and I have gotten married, we get a lot of questions from&#xA;other couples about what vendors we used, what to look out for when planning,&#xA; and what we would have done differently. So, we wanted to write down our&#xA;thoughts on the experience.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Since there’s a lot to think about when it comes to planning a wedding,&#xA;especially when you don’t have a wedding planner, we wanted to highlight a few&#xA;things that we thought were important.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;We split these into 3 parts:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#things-that-worked&#34; rel=&#34;noreferrer&#34;&gt;Things that Worked&lt;/a&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#stay-organized&#34; rel=&#34;noreferrer&#34;&gt;Stay Organized&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#shopping-around-for-vendors&#34; rel=&#34;noreferrer&#34;&gt;Shopping Around for Vendors&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#other-things-that-worked&#34; rel=&#34;noreferrer&#34;&gt;Other Things that Worked&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#special-things-we-enjoyed-doing&#34; rel=&#34;noreferrer&#34;&gt;Special Things We Enjoyed Doing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#things-that-wed-do-differently&#34; rel=&#34;noreferrer&#34;&gt;Things That We’d Do Differently&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;things-that-worked&#34;&gt;Things that Worked&lt;a href=&#34;#things-that-worked&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;h3 id=&#34;stay-organized&#34;&gt;Stay Organized!&lt;a href=&#34;#stay-organized&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;First, the main thing we did right is being ridiculously organized and keeping&#xA;a detailed, running to-do list/timeline.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Early on after we got engaged, we researched different timelines of when to do&#xA;different tasks. For example, you should buy the wedding dress 8-10 months ahead&#xA;of the wedding. So, this is one of the first things we did.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;After comparing all the lists, we made our own calendar with what major tasks&#xA;we had to do each month leading up to the wedding.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;We noticed that there was a lull about 5 months out from the wedding, when you’re&#xA;done booking the major vendors and have sent out the save the date. Then, there&#xA;was another lull in planning about 2 months before, after you’ve sent the&#xA;invitations, finished choosing all the finer details, and planned in great&#xA;detail every minute of your life for the final month.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Enjoy these lulls!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Looking at a lot of lists helped us build a really good plan and feel secure that&#xA;we didn’t forget anything important. This was important to ensure we didn’t work&#xA;&lt;em&gt;too much&lt;/em&gt;, because we knew that we were getting what we needed to do done on&#xA;time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similarly, being super organized is even more critical as the wedding gets&#xA;closer. One extra thing we did the month before the wedding was make an&#xA;itinerary for each person in the wedding party: the bride, groom, bridesmaids,&#xA;groomsmen, and parents.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This made it clear for each person where they were supposed to be, what they&#xA;needed to bring, and what their job was during each part of the rehearsal and&#xA;wedding. We also included the addresses and phone numbers everyone needed to&#xA;know.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;While doing this, we realized there were a lot of details left to figure out!&#xA;Between hair and makeup, the church, the reception, the after party, and where&#xA;everyone is sleeping, it was a bit of a puzzle figuring out where everyone’s&#xA;cars needed to be.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To kickstart your process, I’ve included a sample of a rough calendar and the&#xA;wedding timeline we gave out to the wedding party.&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;./wedding-planning-timeline.pdf&#34; rel=&#34;noreferrer&#34;&gt;Planning Timeline&lt;/a&gt;&lt;/em&gt;: Expand this with your special details and then turn it into a week by week todo list.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;a href=&#34;./wedding-dayof-timeline.pdf&#34; rel=&#34;noreferrer&#34;&gt;Day-of Timeline&lt;/a&gt;&lt;/em&gt;: This is to give you an idea of what we mean by a day-of timeline, you’ll obviously have to totally change everything on this. This one is specific for the bridesmaids. We made 6 versions: groom, bride, bridesmaids, groomsmen, and each set of parents.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 id=&#34;shopping-around-for-vendors&#34;&gt;Shopping Around for Vendors&lt;a href=&#34;#shopping-around-for-vendors&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Wedding vendors are famously expensive. They markup the prices for a wedding&#xA;versus any other kind of event.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;One reason I think this happens is weddings are often more involved. The bride&#xA;and groom have exacting expectations and extra requests that make things more&#xA;complex for vendors.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Shopping around for these vendors helped us save a huge amount of money. And, we&#xA;were still able to get exactly what we wanted.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, we were initially quoted over $10,000 by several vendors for&#xA;photography/videography. Instead, we looked for more local photographers, who&#xA;were often doing it as a side gig, instead of a large company. This let us save&#xA;around $7,000, while still getting what we wanted.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The experience was similar for the cake, music, flowers, and the wedding dress.&#xA;By shopping around, we saved 50-75% of the prices we were initially quoted by&#xA;our reception venue’s “recommended” vendors.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;A big reason for this is that we spent more on our venue. So, their&#xA;recommendations were often for top-quality vendors from New York City. For&#xA;example, the photographers they recommended were regularly flying out to&#xA;destination weddings all over the world and doing photoshoots for magazines and&#xA;other fancy things. And we weren’t looking for that; we just wanted to a good&#xA;local photographer instead.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Finally, we did a couple of things ourselves, rather than using a vendor. For&#xA;example, we bought the alcohol ourselves. This saved between $2,000 and $4,000&#xA;compared to an alcohol service that delivers.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;We also bought an Etsy template for our wedding invitations, which worked&#xA;amazing. The package also included templates for the menu, seating chart,&#xA;welcome sign, gift table, and many other things. So, everything looked great&#xA;and really well put together, because it was consistently the same style.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;After making all of the tweaks we needed, we printed the invitations and other&#xA;material using a discount, online printing website (&lt;a href=&#34;https://www.printkeg.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;PrintKeg&lt;/a&gt;).&#xA;And, we ordered a few other last minute things from CVS, Staples, and WalMart.&#xA;But between all this, we saved about half the cost again!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So to conclude, we’d recommend being conscious about what you want to splurge on&#xA;and where you can save money by shopping around. For us, we splurged on the venue&#xA;and saved on basically everything else. All told, we spent about $5,000 extra&#xA;on the venue, but we saved about $20,000 on everything else. So yeah, pretty nice.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;other-things-that-worked&#34;&gt;Other Things that Worked&lt;a href=&#34;#other-things-that-worked&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;Organization and shopping around were the two big things. But there are an&#xA;assortment of smaller things that worked really nice.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Having a private wedding website.&lt;/strong&gt; We are both fairly private people. So,&#xA;knowing that the details of our wedding were only accessible to people that we&#xA;invited was nice. For this, I built a custom website. But, some wedding website&#xA;providers like TheKnot, SquareSpace, and others support this feature.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Using Amazon Registry.&lt;/strong&gt; There were a few features that were nicely thought&#xA;out. They include gift receipts for everything by default. They support&#xA;delivering the gifts to an address of your choice without revealing that address.&#xA;And they kept track of who bought what so that you can write out thank you’s&#xA;after.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Taking off the week before the wedding.&lt;/strong&gt; We finished the last major todo’s&#xA;like 2 weeks before the wedding. So we were fairly relaxed, which was amazing.&#xA;But, I was able to take the week before the wedding off. And that was one of&#xA;the best choices I made during the entire experience, because I stayed nice and&#xA;chill and was able to do any little things that came up.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You really do need someone available (ideally more than one) to move things&#xA;around to wherever they are supposed to be in the day or two before the wedding.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Not Having a Big Bachelorette/Bachelor Party.&lt;/strong&gt; This is a pure personal&#xA;preference. Nothing against anyone who wants to go on a big trip to Vegas or&#xA;have a beach getaway. But for us, it was nice just to hang out casually with&#xA;friends. And, it took a load off our our wedding party.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Create a reminder for time-sensitive things after the wedding.&lt;/strong&gt; Some things&#xA;have to be done in the short period of time after the wedding. Try to think of&#xA;these and make a reminder for yourself. One thing we missed was changing my&#xA;wife’s insurance to my plan. You only have 30 days from the wedding date to do&#xA;this and we forgot.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Keeping a regular date night &amp;amp; not talking about the wedding during it.&lt;/strong&gt; This&#xA;is tough to actually do. But it was nice to have at least one night a week to&#xA;take a break and just do something fun.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Not Using a Wedding Planner.&lt;/strong&gt; Our reception venue had a planner that did&#xA;anything related to the reception. She helped us with the seating chart, linens,&#xA;and decorations. And, her staff helped with setup and packing up at the end of&#xA;the night, including things we brought in. Similarly, the bar staff unboxed the&#xA;alcohol after I dropped it off and packed it up after.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This was the main thing that we wanted. And since we are very organized, we&#xA;didn’t hire another planner to handle other vendors and managing things day-of.&#xA;That turned out like a great decision.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, we would recommend hiring some staff if your reception venue doesn’t&#xA;help with cleaning up. At the end of the night, you’re tired and having people&#xA;to do this is amazing. You can just leave and know everything will get where it&#xA;needs to be. Some wedding planners offer a “day-of-only” package just for this.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;special-things-we-enjoyed-doing&#34;&gt;Special Things we Enjoyed Doing&lt;a href=&#34;#special-things-we-enjoyed-doing&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;There are a lot of traditions at weddings. But it’s also your day as a couple to&#xA;do what you want and express yourselves.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There were some conventional things we just skipped, like the bouquet toss,&#xA;removing/tossing the garter, wedding cake, and something old/new/borrowed/blue.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But there were other things that we were so excited about and were uniquely “us”.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, we made a very detailed program for our wedding ceremony. As practicing&#xA;Catholics getting married sacramentally in the church, we knew that our nuptial&#xA;mass would be very different from what many of our guests are used to.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So we many an extremely detailed program with all the music, readings, and parts&#xA;of the mass. That way people could follow along and know when to stand, sit,&#xA;kneel, and sing.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;My wife did almost all of it. But, I made a nice cartoon map of the church&#xA;grounds, which the guests had an opportunity to explore after the ceremony.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And second, we made a bunch of games! Even before the wedding, I made a “how&#xA;well do you know the couple” trivia game on our wedding website. But, that game&#xA;was way way too hard. The average was 50%, lol (sorry again everyone, haha).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But then at the wedding, we made even more games. Since our reception was at a&#xA;local art museum, we made a “scavenger hunt” for our guests to explore the&#xA;museum. We made 6 riddles that hinted at a painting or sculpture in the museum.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And our last game was the “shoe game”, where the bride and groom sit back to&#xA;back and answer questions about each other like &lt;em&gt;Who is more patient?&lt;/em&gt; or &lt;em&gt;Who&#xA;is a better cook?&lt;/em&gt;. And they raise the shoe of the bride or groom.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And for each of these games, we announced the winner at different times during&#xA;the ceremony and gave out prizes. It was a ton of fun!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There were other smaller things too. We stole an idea from one of our friends&#xA;weddings, where they had polaroid-style cameras for guests to add a photo and&#xA;message to a guest book. And we made a photo backdrop out of a cheap balloon&#xA;arch off of Etsy ($30 total vs like $1-2k for fancy flower or turf backgrounds).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Obviously your special thing will be different than ours, but we totally&#xA;recommend thinking of different things to make the day special for you!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;things-that-we-d-do-differently&#34;&gt;Things That We’d Do Differently&lt;a href=&#34;#things-that-we-d-do-differently&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Finally, there’s some things that were a mistake in retrospect.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The main one is pretty common. So we should have seen that coming. But, &lt;strong&gt;spend&#xA;less on flowers&lt;/strong&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You can make centerpieces from a candle and a couple of trinkets and save like&#xA;$2,000 while still having it look nice.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Another one is &lt;strong&gt;spending less on the honeymoon&lt;/strong&gt;, and honeymooning inside the&#xA;United States. We spend about 50% too much on what was ultimately just a beach&#xA;vacation. It was really really nice though.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Next, we had a low-key engagement party at my house. And that was great. But&#xA;we had it like a year into our engagement. So, it would have been better to have&#xA;it much closer to when we actually got engaged.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And lastly, we should have been less picky about the save-the-date. We waited&#xA;a while because we wanted to get nice pictures taken by a friend of ours and we&#xA;wanted them printed, rather than digital.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But we really should have sent something sooner. Even just texting people with&#xA;the date and a simple Canva design would have been good so that they had more&#xA;than 5 months notice.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Our wedding was a blast. And, because we’re pretty organized, we were able to&#xA;plan everything out and have the few weeks before the wedding to &lt;em&gt;mostly&lt;/em&gt; relax.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;We wanted to share out thoughts so that others could learn from our experience!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So to review, the absolute number one thing is being organized. Make a schedule&#xA;which gets everything done in time, but also balances what is realistically&#xA;doable each week. Make lists and lists of lists. And, communicate frequently and&#xA;clearly with your wedding party, vendors, parents, and guests.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ll link the sample &lt;a href=&#34;./wedding-planning-timeline.pdf&#34; rel=&#34;noreferrer&#34;&gt;planning timeline (PDF)&lt;/a&gt;&#xA;and &lt;a href=&#34;./wedding-dayof-timeline.pdf&#34; rel=&#34;noreferrer&#34;&gt;day-of timeline (PDF)&lt;/a&gt; again in case you&#xA;didn’t see them above.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And of course, &lt;a href=&#34;/forms/contact&#34; rel=&#34;noreferrer&#34;&gt;get in touch&lt;/a&gt; with us if you have any questions!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Casual</category>
    </item>
    <item>
      <title>Tips for Cooking on a Busy Schedule</title>
      <link>https://niaquinto.com/blog/2024/03/cooking-on-a-busy-schedule.html</link>
      <pubDate>Sun, 31 Mar 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/03/cooking-on-a-busy-schedule.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./happy-busy-chef.jpg&#34; alt=&#34;A happy, busy chef. Generated by Stable Cascade&#34;/&gt;&lt;figcaption&gt;A happy, busy chef. Generated by Stable Cascade&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;tips-for-cooking-on-a-busy-schedule&#34;&gt;Tips for Cooking on a Busy Schedule&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-03-31&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/food-and-cooking.html&#34; rel=&#34;noreferrer&#34;&gt;Food &amp;amp; Cooking&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;cooking-on-a-busy-schedule.opus&#34;&gt;&lt;audio src=&#34;cooking-on-a-busy-schedule.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I love cooking and eating home cooked meals. But, I’m busy. And that’s why I&#xA;love every kind of tip I can find to fit cooking into my busy schedule.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So I wanted to write about some tips that help fit in delicious, home-cooked&#xA;meals into a busy working schedule:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#big-batches&#34; rel=&#34;noreferrer&#34;&gt;Make Big Batches&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#splitting-into-chunks&#34; rel=&#34;noreferrer&#34;&gt;Split recipes into chunks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#prepare-ahead&#34; rel=&#34;noreferrer&#34;&gt;Prepare as much ahead as possible&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;big-batches&#34;&gt;Big Batches&lt;a href=&#34;#big-batches&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Cooking a dish has a large fixed-time component. It takes a stew &lt;code&gt;X&lt;/code&gt; minutes to&#xA;cook, regardless of if you make 2 servings or 10. So, why not make 10!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To make this work, you need enough freezer space to store leftovers. And it pays&#xA;to buy a large set of matching containers. That way your freezer &amp;amp; cabinet looks&#xA;like this…&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./clean-cabinet-containers.jpg&#34; alt=&#34;A nicely organized kitchen cabinet. Generated with Stable Cascade&#34;/&gt;&lt;figcaption&gt;A nicely organized kitchen cabinet. Generated with Stable Cascade&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;splitting-into-chunks&#34;&gt;Splitting into Chunks&lt;a href=&#34;#splitting-into-chunks&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Most recipes come with step-by-step instructions. But I mean something different&#xA;here.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Specifically, split the recipe into &lt;em&gt;separate&lt;/em&gt; sections. That is: sections that&#xA;can be completely separated with an unspecified amount of time in-between,&#xA;sometimes multiple days.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This allows you to fit these steps into your schedule and then put them aside&#xA;for later. And, it often allows you to make larger batches to prepare multiple&#xA;recipes at once.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, I took a cooking class recently that revolutionized the way that&#xA;I’ll be making most stews, curries, and soups. So many recipes involve first&#xA;cooking a base layer of sauteed vegetables. The base varies by culture, but some&#xA;examples include:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Indian: fried whole spices, onion, garlic, and ginger&lt;/li&gt;&#xA;&lt;li&gt;French: onion, carrot, celery, garlic (ie. Mirepoix)&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;so so many others&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;The teacher told us that she often makes the recipe up until the sauteed onions&#xA;are done and then freezes it for later. This is amazing, because it means you&#xA;can have the dish halfway done.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, there are many other examples:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;With fallafel, you can split into roughly 3 main chunks: making the mix, forming the balls, and frying the balls.&lt;/li&gt;&#xA;&lt;li&gt;With enchiladas, you can make the sauce, marinade your protein, chop everything, and then bake all as separate chunks&lt;/li&gt;&#xA;&lt;li&gt;With lasagna, you can make the sauce one day, cook noodles &amp;amp; assemble the pan of lasagna the next, and bake another day&lt;/li&gt;&#xA;&lt;li&gt;With anything else, you can at least do your chopping separately from everything else&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;But, think about the your recipe. Find parts where you can just stop and pop&#xA;everything in the fridge for later.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;prepare-ahead&#34;&gt;Prepare Ahead&lt;a href=&#34;#prepare-ahead&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;This follows naturally from finding separate chunks. The fridge and freezer are&#xA;your friends here. Make everything you can ahead. Do things on your schedule and&#xA;then they’re all ready for final assembly come dinner time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, I’ve found myself very heavily relying on making things overnight&#xA;in the fridge.&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Overnight Oats&lt;/li&gt;&#xA;&lt;li&gt;Making protein bars&lt;/li&gt;&#xA;&lt;li&gt;Cold Brew Coffee &amp;amp; Tea&lt;/li&gt;&#xA;&lt;li&gt;Soaking beans for black bean soup, hummus, and fallafel&lt;/li&gt;&#xA;&lt;li&gt;Marinading Tofu for stir fry and onigiri&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;These are all things that are quick to just throw together and put in the&#xA;fridge. Then the next morning, you’re all ready and the fridge did most of the&#xA;work.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;It’s definitely an investment in effort and time to make nutritious, home-cooked&#xA;meals on a tight schedule. But, these methods have saved me a ton of time!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It depends a lot on the meal. Some dishes are just tough to split into chunks and&#xA;do ahead. But, those can be for special occasions!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In the mean time, you can have a home cooked meal ready every night this way and&#xA;not get overwhelmed.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If you know about other tips to save time, I’d &lt;a href=&#34;/forms/contact&#34; rel=&#34;noreferrer&#34;&gt;love to hear about them&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Food &amp; Cooking</category>
    </item>
    <item>
      <title>How I Find Interesting RSS Feeds</title>
      <link>https://niaquinto.com/blog/2024/03/how-i-find-interesting-rss-feeds.html</link>
      <pubDate>Sun, 03 Mar 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/03/how-i-find-interesting-rss-feeds.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./searching-the-archives.jpg&#34; alt=&#34;Searching the net for interesting blogs &amp;amp; podcasts. Generated with SDXL&#34;/&gt;&lt;figcaption&gt;Searching the net for interesting blogs &amp;amp; podcasts. Generated with SDXL&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;how-i-find-interesting-rss-feeds&#34;&gt;How I Find Interesting RSS Feeds&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-03-03&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/productivity.html&#34; rel=&#34;noreferrer&#34;&gt;Productivity&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;how-i-find-interesting-rss-feeds.opus&#34;&gt;&lt;audio src=&#34;how-i-find-interesting-rss-feeds.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I subscribe to a lot of RSS feeds (over 200 at this point). I’m always adding&#xA;more. And, I wanted to share a tip that I’ve found very helpful for finding&#xA;interesting content:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;Whenever someone you follow mentions another person, look them up and subscribe&#xA;to their blog, podcast, YouTube channel, or whatever.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Through this method, I’ve found so many interesting people to follow, especially&#xA;in disciplines that I wouldn’t have otherwise known about.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Below I’ll explain a bit more and give some examples!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;interesting-people-flock-together&#34;&gt;Interesting People Flock Together&lt;a href=&#34;#interesting-people-flock-together&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Some people are just intellectually curious. They’re passionate about knowledge&#xA;and deeply knowledgeable about their field. These people end up finding each&#xA;other because they can share their knowledge and curiosity!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The best example of this is &lt;a href=&#34;https://news.ycombinator.com&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Hacker News&lt;/a&gt;, which&#xA;is by far the best online community of curious people. Individual blogs often&#xA;show up here and are usually an instant subscribe for me.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But there are some other communities with deep experience and a strong&#xA;commitment to keeping the signal-to-noise ratio high. &lt;a href=&#34;https://nebula.tv/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Nebula&lt;/a&gt;&#xA;&amp;amp; &lt;a href=&#34;https://curiositystream.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;CuriosityStream&lt;/a&gt; are a good example. Another&#xA;is niche subreddits like &lt;a href=&#34;https://old.reddit.com/r/CredibleDefense&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;/r/CredibleDefense&lt;/a&gt;,&#xA;which is an amazing source for discussing defense / international relations /&#xA;geopolitics.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;some-people-are-connectors&#34;&gt;Some People are “Connectors”&lt;a href=&#34;#some-people-are-connectors&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;After communities, the next best source I’ve found is Joe Rogan-style&#xA;longform interview shows with experts. Some examples include:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.richroll.com/all-episodes/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Rich Roll&lt;/a&gt;: focusing on fitness, health, wellness&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lexfridman.com/podcast/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Lex Fridman&lt;/a&gt;: most tech and science, but a wide range of other topics too&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://peterattiamd.com/podcast/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Dr. Peter Attia&lt;/a&gt;: diving deep on medicine, health, disease&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ericweinstein.org/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Eric Weinstein&lt;/a&gt;: diverse topics (though inactive for a while)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;Some of these podcasts are more focused than others. But the common thread is&#xA;that they tend to bring on someone with deep expertise in some field and ask&#xA;them tons of questions.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These shows often have guests very far off of the typical coterie of academics,&#xA;tech experts, scientists, and so on.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, you occasionally get a &lt;a href=&#34;https://www.youtube.com/watch?v=uHNBCVGH34c&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;crazy combo&lt;/a&gt;&#xA;like Eric Weinstein (a fund manager and physicist) talking with Ashley Mathews&#xA;(a porn actress) or Lex Fridman &lt;a href=&#34;https://www.youtube.com/watch?v=WgytXF0SPh0&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;interviewing Robert Barron&lt;/a&gt;, who is a Roman Catholic Bishop.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The other aspect that is very useful here is the length. These shows are often&#xA;multiple hours. This is key, because it gets people off of their normal scripts&#xA;and into interesting deep discussion. And if the guest is not a seasoned media&#xA;personality, it gives them time to get comfortable and open up.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Critically for my purpose though, the length gives tons of time to bring up less&#xA;common references.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So the idea here is that these “intellectual” podcasts do a great job of&#xA;finding lesser known experts and giving them the space to share their knowledge&#xA;and most importantly, their network.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;look-at-the-2nd-hop&#34;&gt;Look at the 2nd Hop&lt;a href=&#34;#look-at-the-2nd-hop&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;When you do find an interesting person to subscribe to, either through a post&#xA;in a community like HN, on an in-depth interview, or a reference in one of your&#xA;existing sources, look for other places that they’ve appeared as a guest.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Even if the person is less well known, it’s unlikely that they’ve only appeared&#xA;on one other podcast, YouTube channel, and so on.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, say you see an interesting guest on the Lex Fridman podcast. Check&#xA;out their website, socials, or other resources. What other podcasts or YouTube&#xA;channels have they been on? Have they been a guest writer on other blogs?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This network-hoping helps find more communities and hub-sources and thus,&#xA;greatly expands types of sources you find.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;follow-people-not-companies&#34;&gt;Follow People Not Companies&lt;a href=&#34;#follow-people-not-companies&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;If you’re trying to subscribe to a ton of things, it’s very important to keep&#xA;the signal-to-noise ratio high.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;One cheat I have for this is subscribing mainly to individuals’ writing, not&#xA;companies. This helps a lot to keep most marketing and low-information-density&#xA;articles away.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There are certainly great company blogs and podcasts out there! Oxide Computer’s&#xA;&lt;a href=&#34;https://oxide.computer/podcasts/on-the-metal&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;On the Metal&lt;/a&gt; comes to mind.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But most corporate content is just too hit and miss to be able to subscribe to&#xA;without some kind of filter to remove the marketing fluff and low-quality posts.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similarly, the some kinds of individual to stay away from are “growth hackers”&#xA;and people selling courses.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;share-what-you-are-reading&#34;&gt;Share What You are Reading!&lt;a href=&#34;#share-what-you-are-reading&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Finally, I have a call to action. Don’t just consume, recommend interesting people!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For a long time, I’ve published a list of some of the feeds I subscribe to&#xA;&lt;a href=&#34;/following.html&#34; rel=&#34;noreferrer&#34;&gt;here&lt;/a&gt;. And, I’ve found others that do the same.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;When I discover a page like this on someone’s website, it feels like finding&#xA;buried treasure! It’s a turbo charge of interesting websites to visit and people&#xA;to subscribe to.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;I love RSS feeds. I’m not on social media. And I don’t have cable. But this&#xA;setup ensures I don’t miss out (at least as far as consumption goes; connecting&#xA;with people is a whole different beast).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Podcasts and small blogs are also self-selecting for other people that also&#xA;don’t fully buy into the corporate ecosystem. So, it aligns well for me.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And the diversity of topics has been amazing! I’ve started reading and listening&#xA;way beyond what I’d naturally think to subscribe to. Things like logistics,&#xA;civil engineering, defense, archaeology, history, and even celebrity gossip&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For these, I wouldn’t have even known where to start. But by listening for what&#xA;interesting people recommend and reference, I’ve found them and that feedback&#xA;cycle is in full force now.&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;Woah, never thought I’d be interested in celebrity gossip. But the &lt;a href=&#34;https://wondery.com/shows/diss-and-tell/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Diss and Tell&lt;/a&gt; podcast is surprisingly great.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Productivity</category>
    </item>
    <item>
      <title>Human Connection Gives Me Hope for an AI Future</title>
      <link>https://niaquinto.com/blog/2024/02/human-connection-gives-me-hope-for-ai-future.html</link>
      <pubDate>Thu, 01 Feb 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/02/human-connection-gives-me-hope-for-ai-future.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;human-connection-gives-me-hope-for-an-ai-future&#34;&gt;Human Connection Gives Me Hope for an AI Future&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-02-01&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/ml-ai.html&#34; rel=&#34;noreferrer&#34;&gt;ML/AI&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;human-connection-gives-me-hope-for-ai-future.opus&#34;&gt;&lt;audio src=&#34;human-connection-gives-me-hope-for-ai-future.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;As Artificial Intelligence suddenly burst into common use in 2022-2023, the&#xA;debate over the future of work flared. Will AI take all the jobs? Will it take&#xA;over the world? Should we regulate AI? Is that even possible?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I was thinking about this recently, when I remembered a fun part of Star Trek:&#xA;Deep Space 9 … &lt;a href=&#34;https://memory-alpha.fandom.com/wiki/Sisko%27s_Creole_Kitchen&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Sisko’s Creole Kitchen&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/siskos-creole-kitchen.jpg&#34; alt=&#34;The Sisko family from the episode Homefront of Star Trek: Deep Space 9&#34;/&gt;&lt;figcaption&gt;The Sisko family from the episode Homefront of Star Trek: Deep Space 9&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Despite replicators, teleportation, superintelligent AI, and dozens of other&#xA;fantastic technologies, people still enjoy a home cooked meal, prepared by&#xA;flawed, fumbly human hands.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Below, I’ll dig into why I think that is, some real world examples of this&#xA;phenomenon, and why the future is safe. Though, the way to get there wont be easy.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-ai-debate&#34;&gt;The AI Debate&lt;a href=&#34;#the-ai-debate&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;First, let’s frame the scene:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;On one side, the “doomers” warn that AI will not only take all the jobs, but it&#xA;will ultimately mean the end of humanity, either because we got in the way or&#xA;it accidentally squishes us like how you step on an ant without even noticing.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Meanwhile, skeptics and accelerationists look at the current technology and&#xA;balk. Some say fast takeoff&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; is not likely to happen at all. And others say&#xA;AI, even the superintelligent kind, will actually lead to human flourishing.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s January 2024 now. And despite having nearly 2 years to take hold, the&#xA;debate seems firmly entrenched, with little change in the narrative and no real&#xA;progress on regulation. Meanwhile, AI is quickly making it’s way into&#xA;everyday products, creating new efficiencies, and taking jobs along the way.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To start, the arts are on the frontlines of this battle. Image generators like&#xA;DALL·E, Midjourney, Stable Diffusion are quite good. It is already impacting&#xA;working artists, and they are &lt;a href=&#34;https://arstechnica.com/information-technology/2022/12/artstation-artists-stage-mass-protest-against-ai-generated-artwork/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;not happy&lt;/a&gt; about it &lt;em&gt;&lt;a href=&#34;https://www.theguardian.com/artanddesign/2023/jan/23/its-the-opposite-of-art-why-illustrators-are-furious-about-ai&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;mostly because companies&#xA;scraped&lt;/a&gt; … ahem, learned … from &lt;a href=&#34;https://laion.ai/blog/laion-5b/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;nearly all art ever made&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But AI is also quickly taking hold in knowledge work. Lawyers are &lt;a href=&#34;https://www.reuters.com/legal/us-supreme-courts-roberts-urges-caution-ai-reshapes-legal-field-2023-12-31/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;using AI&lt;/a&gt; to&#xA;write their briefs, sometimes &lt;a href=&#34;https://arstechnica.com/tech-policy/2023/06/lawyers-have-real-bad-day-in-court-after-citing-fake-cases-made-up-by-chatgpt/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;hallucinating caselaw&lt;/a&gt; in the process.&#xA;And, the news media is using &lt;a href=&#34;https://www.pbs.org/newshour/economy/sports-illustrated-found-publishing-ai-generated-stories-photos-and-authors&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;AI journalists to pump out stories&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So it’s clear that AI is going to have &lt;em&gt;some&lt;/em&gt; effect on the job market. But is&#xA;it going to be a cataclysmic end of work as we know it? Or, will this be a&#xA;transition like the industrial revolution, computer revolution, or internet&#xA;revolution?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That will be difficult to predict, but I’d like to argue that even in a world&#xA;where AI can do everything better than humans&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; rel=&#34;noreferrer&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, there’s still a place for human&#xA;work.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;a-hopeful-future&#34;&gt;A Hopeful Future&lt;a href=&#34;#a-hopeful-future&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/replicator.jpg&#34; alt=&#34;Meme of a Star Trek replicator that says: Am I a Joke to You?&#34;/&gt;&lt;figcaption&gt;Meme of a Star Trek replicator that says: Am I a Joke to You?&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Why eat at Sisko’s, when the replicator can make a delicious gumbo at home?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Well we don’t have to wait! We can ask a similar question today. Why do good&#xA;cooks still eat out at just-ok restaurants? It can’t always be because of the&#xA;convenience or that they need someplace to meet friends.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is even more obvious with music. In a world where we have every song ever&#xA;recorded in our pocket, why do people go to concerts? The performance is almost&#xA;guaranteed to have mistakes compared to the master. But, it’s thrilling anyways.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similar in art, why did anyone buy &lt;a href=&#34;https://en.wikipedia.org/wiki/Comedian_(artwork)&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;this banana for $120,000&lt;/a&gt;?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s because of the experience, the story, the authenticity. It’s because we can&#xA;connect to it and draw meaning for our lives. And, meaning is what keeps us&#xA;alive, even &lt;a href=&#34;https://en.wikipedia.org/wiki/Viktor_Frankl#Man%27s_Search_for_Meaning&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;in the worst times&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, there’s one other example I’d like to mention: chess. Computers have been&#xA;better than us at chess &lt;a href=&#34;https://en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;for a while&lt;/a&gt;.&#xA;And yet, humans still play chess. And people watch, despite the fact that&#xA;there are &lt;a href=&#34;https://en.wikipedia.org/wiki/Top_Chess_Engine_Championship#Tournament_results&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;computer vs. computer chess tournaments&lt;/a&gt;, too. In fact, human chess is getting &lt;a href=&#34;https://www.pbs.org/newshour/show/chess-is-surging-in-popularity-among-all-ages-heres-why&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;more&#xA;popular recently&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;It’s because we love watching the human body and mind pushed to it’s limit. We&#xA;love watching people grow and overcome adversity.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And you could say the same about other sports. Why watch Usain Bolt when any&#xA;car is faster?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I could go on, but to make a long story short: We love humanity. We love ourselves.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And given the chance, we’ll use our time and resources to experience that.&#xA;People like to do things, and other people like having things done for them …&#xA;&lt;em&gt;by humans&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-bad-part&#34;&gt;The Bad Part&lt;a href=&#34;#the-bad-part&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;So maybe the future doesn’t look so bleak for creative expression and fulfilling&#xA;human work. What’s the catch? Well, it might be &lt;em&gt;very&lt;/em&gt; rough getting there.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To illustrate a worst case scenario, let’s consider horses. Horses still have&#xA;jobs. In fact, horses mostly have pretty nice jobs now.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;They pull carriages. They race. They take part in rodeo sports. They compete in&#xA;dance shows. They entertain people who like horseback riding. And sometimes,&#xA;they help herd cattle, though ATV’s are more common for that I think.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Regardless of the specific job, it seems that on the whole, the types of jobs&#xA;that are left for horses are much better than the alternative of hard manual&#xA;labor like plowing fields in the summer heat, tirelessly delivering messages, or&#xA;riding into battle.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But in the early 1900’s, the automobile, tank, and tractor took over the vast&#xA;majority of horses jobs. This led to a significant overall decrease in the&#xA;remaining need for horses. Here’s what that looks like on a population level&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; rel=&#34;noreferrer&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/horse-population-1850-2007.png&#34; alt=&#34;Graph showing the collapse of horse population in the early 1900s&#34;/&gt;&lt;figcaption&gt;Graph showing the collapse of horse population in the early 1900s&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So…yikes. That’s pretty bad. And yet, horses are still around.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Though, you could show a similar curve for many human professions. For example,&#xA;the collapse in horses meant a similar downturn in stable staff, horseshoe&#xA;makers, veterinarians, and so on. And yet, new industries arose for them to move&#xA;to.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You could argue that AI is categorically different. And it is taking jobs in a&#xA;way that leaves no replacement. But people think that every time an invention&#xA;comes along. The reality is that only time will tell.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Prompt “engineering” and data labeling have already started to take off as new&#xA;job opportunities that can only exist in an AI world. Similarly, there is now&#xA;a massive new wave of demand for software that integrates into AI capabilities.&#xA;And who knows what opportunities will open up next?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Meanwhile, the cost of completely restructuring the economy to handle a future&#xA;where humans have nothing meaningful to contribute to the world is unbelievably&#xA;massive. Even if this was partially necessary, the social cost of restructuring&#xA;the AI is basically impossible to confront until it is completely unbearable.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And yet in the long term, there’s no promise that we will survive AI. But if we&#xA;do, it’s likely that there is some role we can play. And to the extent that we&#xA;have any agency, we’ll enjoy doing things for each other. And, that is&#xA;ultimately what a job is.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/horse-apocolypse.jpg&#34; alt=&#34;Image of a horse thinking: I survived the Apocalypse&#34;/&gt;&lt;figcaption&gt;Image of a horse thinking: I survived the Apocalypse&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;AI is here, at least an early form of it. It’s already starting to take people’s&#xA;jobs, especially artists. And yet, I’m confident that there will still be&#xA;artists in 2100. Why?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;People love experiences. And they find more authenticity, connection &amp;amp; meaning&#xA;in experiences &lt;em&gt;of other humans&lt;/em&gt;. In particular, we like seeing other people&#xA;demonstrate mastery of their craft, pushing the human body &amp;amp; mind to the limit.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, there will still be a revolution upending the current economic order.&#xA;People will need to find different things to do. And if they can’t, then we need&#xA;to find a new economic order that gives them meaning and a role in society.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But if we come out the other side at all, then there will still be artists,&#xA;cooks, musicians, chess players, and every other kind of job that humans do now.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This should give us pause though on our treatment of lower intelligences. How do&#xA;we treat intelligent animals? Dolphins, whales, octopuses, elephants, dogs,&#xA;monkeys, parrots, ravens, and more all show surprising levels of intelligence.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Are we ok with how we treat them? Because, we might be in their position someday&#xA;sooner than we think.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/geese-stuffing.jpg&#34; alt=&#34;Meme of a goose yelling at a human with down-stuffed jacket.&#34;/&gt;&lt;figcaption&gt;Meme of a goose yelling at a human with down-stuffed jacket.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;Fast takeoff (FOOM) is the explosive growth of AI’s power far beyond the level of human retention and reasoning skills. This usually also implies iterative self-improvement, where the AI breaks out of human control and starts improving itself with each generation.&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:2&#34;&gt;This is setting aside the doom scenarios, where humans get wiped out in one way or another.&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:3&#34;&gt;This graph is just one example of a broad trend. It’s from a random paper I found: &lt;em&gt;&lt;a href=&#34;https://www.researchgate.net/publication/254456029_The_Economic_Impact_of_the_Horse_Industry_in_Virginia&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;The Economic Impact of the Horse Industry in Virginia&lt;/a&gt;&lt;/em&gt; by Terance J. Rephann of University of Virginia.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
      <category>ML/AI</category>
    </item>
    <item>
      <title>A Tour of Local AI in Early 2024</title>
      <link>https://niaquinto.com/blog/2024/01/a-tour-of-gen-ai-2024.html</link>
      <pubDate>Thu, 04 Jan 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/01/a-tour-of-gen-ai-2024.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/ai-blob.optimized.jpg&#34; alt=&#34;An amorphous roiling, boiling blob of AI creativity in glorious technicolor just waiting to take shape. Generated with Stable Diffusion XL.&#34;/&gt;&lt;figcaption&gt;An amorphous roiling, boiling blob of AI creativity in glorious technicolor just waiting to take shape. Generated with Stable Diffusion XL.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;a-tour-of-local-ai-in-early-2024&#34;&gt;A Tour of Local AI in Early 2024&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-01-04&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/ml-ai.html&#34; rel=&#34;noreferrer&#34;&gt;ML/AI&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;What is the state of local generative AI? After getting an NVIDIA RTX 4090 for&#xA;local AI, I wanted to review this for myself. And enough people have asked, that&#xA;I thought I’d write up my thoughts.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Long story short, the latest capabilities are unbelievable. They are absolutely&#xA;good enough to make game changing new features and products possible.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And yet, I’m not worried about “AI taking our jobs”. A common theme across all&#xA;the types of models is that, despite the impressive capabilities, these models’&#xA;output is still not good enough.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Human’s will be in the loop to guide prompts, gather and clean data, review the&#xA;output. The output simply isn’t good enough without significant human engineering&#xA;and artistic effort.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve broken this post up into sections devoted to each type of model:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#text-generation&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Text Generation&lt;/strong&gt;&lt;/a&gt;: interactive chat, text completion&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#coding-assistant&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Coding Assistant&lt;/strong&gt;&lt;/a&gt;: advanced code completion, program creation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#image-generation&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Image Generation&lt;/strong&gt;&lt;/a&gt;: creating images based on text prompts&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#multimodal-ai&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Multimodal AI&lt;/strong&gt;&lt;/a&gt;: combining scene understanding with text generation&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#music-generation&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Music Generation&lt;/strong&gt;&lt;/a&gt;: creating music based on prompts &amp;amp; audio samples&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#speech-to-text&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Speech-to-Text&lt;/strong&gt;&lt;/a&gt;: transcribing audio into text&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#text-to-speech&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Text-to-Speech&lt;/strong&gt;&lt;/a&gt;: turning text into natural sounding audio/speech&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;I’ll try to keep each section brief. But and I’ve kept the longest for last.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Text-to-Speech was the main reason I embarked on this adventure. And, wow it&#xA;paid off big time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/ai-multimedia.png&#34; alt=&#34;Mind map of the branches of generative AI&#34;/&gt;&lt;figcaption&gt;Mind map of the branches of generative AI&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;text-generation&#34;&gt;Text Generation&lt;a href=&#34;#text-generation&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;2023 was the year of LLM’s. Between ChatGPT’s meteoric rise and the release of&#xA;open source models, AI suddenly became accessible to everyone. But, where do we&#xA;stand in 2024 for local options?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The best thing in 2024 is that there are mature options to easily run models&#xA;locally. I’ve used &lt;a href=&#34;https://github.com/Mozilla-Ocho/llamafile&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;LLamafile&lt;/a&gt;&#xA;and &lt;a href=&#34;https://ollama.ai/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Ollama&lt;/a&gt;. But for a graphical experience, I’d recommend&#xA;&lt;a href=&#34;https://lmstudio.ai/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;LM Studio&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These apps are basically point and click. That means for anyone with an M-series&#xA;Mac (ie. M1/M2/M3), you can use LLM’s today with no technical experience&#xA;necessary.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/lmstudio.gif&#34; alt=&#34;Demo of using LM Studio for chatting with open source models.&#34;/&gt;&lt;figcaption&gt;Demo of using LM Studio for chatting with open source models.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Not only is it easier than ever to run models locally. But, there’s also a ton&#xA;of &lt;a href=&#34;https://github.com/eugeneyan/open-llms&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;truly open source models&lt;/a&gt; now and&#xA;there’s even more that have weights published on HuggingFace under less-open,&#xA;but still possibly runnable licenses.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This variety is great, because if you find a model that isn’t good at what&#xA;you’re trying to do, you can search and find one that is. It’s like an online&#xA;library of experts that are one click away.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And finally, another more recent feature that I’ve found extremely useful is&#xA;“constrained grammar-based sampling”, meaning you can strictly control how the&#xA;LLM responds. For example, you can limit the response to exactly &lt;em&gt;yes&lt;/em&gt; or &lt;em&gt;no&lt;/em&gt;&#xA;with no additional confabulation or explanations.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For programmers this is great, because you can force structured output (ex. with&#xA;JSON) and easily parse it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So although the locally runnable models are still not as good as what is&#xA;commercially available, they’re excellent and super useful for a ton of things.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Some things I’ve enjoyed doing with AI include:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Text summarization&lt;/strong&gt;: Summarize this news article&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Classification&lt;/strong&gt;:  Is the above text talking about XYZ?&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Recipes&lt;/strong&gt;: Write a recipe for vegan enchiladas&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing short stories&lt;/strong&gt;: Write a story about a ninja and pirate that go on an adventure together&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Brainstorming&lt;/strong&gt;: What are 10 creative date ideas that you can do at home&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;But the ideas are endless! An interesting area I’d like to explore is using LLM’s&#xA;to assist in writing prompts for &lt;a href=&#34;#image-generation&#34; rel=&#34;noreferrer&#34;&gt;image generators&lt;/a&gt;. I’d also&#xA;like to test out automatic email replies for some common questions I get through&#xA;email.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;coding-assistant&#34;&gt;Coding Assistant&lt;a href=&#34;#coding-assistant&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;GitHub’s CoPilot and similar products have gotten fairly wide adoption among&#xA;developers. But what is the state of open source coding assistants?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I was definitely a skeptic. I tend to avoid the complicated setups that most&#xA;dev’s use. However, I was surprised to find myself really enjoying &lt;a href=&#34;https://tabby.tabbyml.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Tabby&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/tabby.gif&#34; alt=&#34;Demo of intelligent code completion using Tabby.&#34;/&gt;&lt;figcaption&gt;Demo of intelligent code completion using Tabby.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;M-series Mac’s can comfortably run the 1B to 7B models, including StarCoder,&#xA;CodeLlama, and DeepseekCoder. Though I found only the 1B and 3B models to have&#xA;acceptable speed for me.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, it really gets interesting with the larger graphics card. My 4090 can&#xA;run up to 70B models (quantized to 5-bits with minimal loss) and provide much&#xA;better results. Though I still only run the 7B model due to the speed.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;One downside is that currently, the models all have restrictions that make them&#xA;not fully open source. They’re still usable for my personal, private use cases.&#xA;But I hope that this will change soon.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;All told, the open source coding models are not revolutionary in my experience.&#xA;But they are pretty good for repetitive and simple cases.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And for me, Tabby is solidly a useful tool. I expect I’ll continue using it!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;image-generation&#34;&gt;Image Generation&lt;a href=&#34;#image-generation&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;This has been by far the most fun of the models listed here!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://openai.com/dall-e-3&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;DALL·E&lt;/a&gt;, &lt;a href=&#34;https://www.bing.com/images/create&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Bing Image Creator&lt;/a&gt;,&#xA;&lt;a href=&#34;https://www.midjourney.com&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Midjourney&lt;/a&gt; and other commercial image generators&#xA;have been producing amazing results for years now.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And ever since Stable Diffusion released their model in 2022, there have been&#xA;viable open source options. But what’s the quality like now in 2024?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Well, Stable Diffusion XL is out. It runs &lt;em&gt;fast&lt;/em&gt; on my 4090. And the results are&#xA;amazing (at least to me). I generated the top image of this post! And here’s&#xA;some more samples generations I’ve done:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/ai-image-collage.jpg&#34; alt=&#34;Selection of AI generated images using Stable Diffusion XL.&#34;/&gt;&lt;figcaption&gt;Selection of AI generated images using Stable Diffusion XL.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve been running SDXL using &lt;a href=&#34;https://github.com/invoke-ai/InvokeAI&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;InvokeAI&lt;/a&gt;.&#xA;This is a web-based UI that requires a decent amount of technical knowledge to&#xA;run.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, there are a variety of very advanced UI’s that are easy to install and run.&#xA;For example &lt;a href=&#34;https://diffusionbee.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;DiffusionBee&lt;/a&gt; works great on M-series&#xA;Mac’s (M1/M2/M3).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/invokeai.jpg&#34; alt=&#34;Screenshot of InvokeAI’s prompt-based workflow.&#34;/&gt;&lt;figcaption&gt;Screenshot of InvokeAI’s prompt-based workflow.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Right now, the output I’ve gotten fluctuates wildly. You never know what you are&#xA;going to get. And it feels like pulling the lever on a slot machine. Super&#xA;addictive.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That’s exciting and fun. But also takes a long time and a lot of tweaks to get&#xA;what you want. So, I’m starting to explore the advanced tools like the&#xA;node-based workflow and other tools which gives even more control over the&#xA;resulting image.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve also tried out a couple fine-tuned models, such as one optimized to making&#xA;logos. And, I tried some “ControlNet” features like fixing mangled hands and&#xA;faces. But, I know there’s a lot more to learn.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;multimodal-ai&#34;&gt;Multimodal AI&lt;a href=&#34;#multimodal-ai&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;There’s a lot of pictures out there. And this is the latest frontier of AI model&#xA;development. It’s one of the headline features of GPT-4. And it’s an huge part&#xA;of the Gemini demo videos as well.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So what capabilities are there in open source land? Currently, LLaVa is the&#xA;go-to model. And it’s usable in my experience.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/llava-demo.jpg&#34; alt=&#34;A demo of LLaVa explaining an image of extreme ironing.&#34;/&gt;&lt;figcaption&gt;A demo of LLaVa explaining an image of extreme ironing.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I didn’t spend much time here, because it’s not that interesting to me. The main&#xA;application I’ve found interesting is indexing your personal photos and doing&#xA;search.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But I also have heard rumblings of this being he key for AI in robotics and for&#xA;AI independently navigating the web effectively.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But generally, it works and is usable. You can run them through most of the LLM&#xA;apps. Not much else to say.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;music-generation&#34;&gt;Music Generation&lt;a href=&#34;#music-generation&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Until last August, AI generated music has been mainly the realm of research or&#xA;forthcoming commercial products. But Facebook’s &lt;a href=&#34;https://ai.meta.com/blog/audiocraft-musicgen-audiogen-encodec-generative-ai-audio/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;AudioCraft&lt;/a&gt; has opened up a new open source option.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Like with an image generator or LLM, you prompt it with a phrase. And it will&#xA;generate a snippet of music. You set the length and a number of other&#xA;parameters.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The results are neat! The quality is still so-so. But it can generate some&#xA;useful snippets for loops, intro, or outro music. Here’s an example:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;audio-player store-key=&#34;./images/audiocraft-sample.wav&#34;&gt;&lt;audio src=&#34;./images/audiocraft-sample.wav&#34; alt=&#34;Short sample of AI generated alternative rock music&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Short sample of AI generated alternative rock music&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;speech-to-text&#34;&gt;Speech-to-Text&lt;a href=&#34;#speech-to-text&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/whisper-cpp.jpeg&#34; alt=&#34;Whisper.cpp logo&#34;/&gt;&lt;figcaption&gt;Whisper.cpp logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I didn’t play around in this area too much, because &lt;a href=&#34;https://github.com/ggerganov/whisper.cpp&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Whisper.cpp&lt;/a&gt;&#xA;is so good already and runs on very meager hardware.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So there wasn’t much point testing other STT systems on my new, more powerful&#xA;graphics card.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The GUI app’s still leave something to be desired. The best I’ve seen so far is&#xA;&lt;a href=&#34;https://getwavery.gumroad.com/l/whisperscript&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;WhisperScript&lt;/a&gt; for Mac.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So for now, this is still limited to more technical users. But, I’d expect&#xA;desktop &amp;amp; smartphone apps to come soon. Or, Whisper.cpp and similar programs&#xA;will be integrated into other audio-based apps like podcast apps, audio&#xA;editors/DAW’s, and more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/whisper-cpp.gif&#34; alt=&#34;Demo of whisper.cpp transcribing an audio file on the command line.&#34;/&gt;&lt;figcaption&gt;Demo of whisper.cpp transcribing an audio file on the command line.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;text-to-speech&#34;&gt;Text-to-Speech&lt;a href=&#34;#text-to-speech&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/piper-logo.png&#34; alt=&#34;Piper project logo&#34;/&gt;&lt;figcaption&gt;Piper project logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This was the main reason I bought the graphics card.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For context, I listen to &lt;strong&gt;a lot&lt;/strong&gt; of audio during the day. Like, easily 9 hours&#xA;of audio per day in the background while I’m working, walking, and doing other&#xA;things. I realize that’s unusual, but I assure you I can absorb a lot of it&#xA;and still get work done.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Podcasts and YouTube are a lot of that. But for the past few months, about 2&#xA;hours of it has been web articles through text-to-speech using &lt;a href=&#34;https://github.com/rhasspy/piper&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Piper&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;audio-player store-key=&#34;./images/piper-sample.wav&#34;&gt;&lt;audio src=&#34;./images/piper-sample.wav&#34; alt=&#34;Text to speech sample generated with Piper TTS&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Text to speech sample generated with Piper TTS&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;As you can hear, the quality is listenable. There’s still a bit of robotic-ness,&#xA;but I’ve been able to listen to a lot of it without getting tired or not being&#xA;able to follow.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, there is enough robotic-ness that I have been eager to try out the&#xA;state-of-the-art.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The quality of commercial offerings is amazing. Oftentimes indistinguishable&#xA;from professional narration from my untrained ear. But, they charge truly&#xA;astounding rates. For example, ElevenLabs has about $8 to $11 per hour&#xA;depending on your plan.&lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; At my consumption, it would cost nearly $500 per&#xA;month.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So if the more advanced open source models can get even close to commercial&#xA;quality level, it was easy to justify the graphics card. It pays for itself&#xA;after only a few months. And, wow did it pay off!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/coqui-logo.png&#34; alt=&#34;Coqui TTS project logo&#34;/&gt;&lt;figcaption&gt;Coqui TTS project logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The first project I tried was &lt;a href=&#34;https://github.com/coqui-ai/TTS&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Coqui TTS&lt;/a&gt;.&#xA;And, the output of the XTTS model is great. This model is non-commercial, among&#xA;other restrictions. However, that’s fine for my use case.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;audio-player store-key=&#34;./images/coqui-sample.wav&#34;&gt;&lt;audio src=&#34;./images/coqui-sample.wav&#34; alt=&#34;Text to speech sample generated with Coqui TTS&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Text to speech sample generated with Coqui TTS&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I also tried &lt;a href=&#34;https://github.com/neonbjb/tortoise-tts&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Tortoise TTS&lt;/a&gt;, which has&#xA;a fully open source license (including the weights). It is a big step up from&#xA;Piper. However, it is noticably worse than Coqui’s XTTS (but still a lot better&#xA;than Piper).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/tortoise-listening.jpg&#34; alt=&#34;An image of a tortoise listening to an audiobook and reading.&#34;/&gt;&lt;figcaption&gt;An image of a tortoise listening to an audiobook and reading.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;audio-player store-key=&#34;./images/tortoise-sample.wav&#34;&gt;&lt;audio src=&#34;./images/tortoise-sample.wav&#34; alt=&#34;Text to speech sample generated with Tortoise TTS&#34; controls=&#34;&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Text to speech sample generated with Tortoise TTS&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But either way, this was revolutionary for me. I have been listening to several&#xA;hours of Coqui TTS output per day. And, it’s awesome. It has human-like tone and&#xA;prosody. It’s able to pronounce a surprising variety of highly specific words.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For the downsides: it struggles often with acronyms and abbreviations. And, it’s&#xA;terrible at reading code. It also occasionally hallucinates a word or two. And&#xA;may once in every hour of audio, it injects about 3-5 seconds of totally&#xA;hallucinated mumbling and confabulation. But it picks up with the text right&#xA;after.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But all told, I’m thrilled. I got exactly what I wanted, basically unlimited&#xA;amount of locally generated, podcast quality audio.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Like with Speech-to-Text, though. This capability (at least locally) is still&#xA;locked behind a technical barrier.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To use these systems, you need to be comfortable with installing dependencies,&#xA;debugging Python code, and other technical weirdness.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Additionally, the models I tried are all NVIDIA specific, which means it’s not&#xA;accessible to most people. So it’ll be a while before these models are ported to&#xA;more common hardware and people start making GUI apps.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Getting a 4090 has opened up an amazing universe of capabilities for me. The&#xA;quality of open source models (or semi-open, non-commercial licensed) and tools&#xA;are great!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Some still require technical knowledge to run. But I predict that most of this&#xA;will come to non-technical users fairly soon.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Advances on inference performance are coming every day. And competition among&#xA;hardware manufacturers will put a lot of pressure on delivering on-device&#xA;inference capabilities, especially since Apple is so far ahead in this area.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But just for my use, I’ve been having a blast and getting tons of value out of&#xA;AI!&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;ElevenLabs’ pricing at time of writing (after promotional periods) is $22 for ~2 hours ($11/hr), &lt;span class=&#34;math inline math--katex-error&#34;&gt;\(99 for ~10 hours (\\)&lt;/span&gt;10/hr), $330 for ~40 hours ($8/hr), or the dreaded &lt;em&gt;Let’s Talk&lt;/em&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
      <category>ML/AI</category>
    </item>
    <item>
      <title>Fun Games for an Online Happy Hour</title>
      <link>https://niaquinto.com/blog/2024/01/fun-online-happy-hour-games.html</link>
      <pubDate>Thu, 04 Jan 2024 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2024/01/fun-online-happy-hour-games.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;fun-games-for-an-online-happy-hour&#34;&gt;Fun Games for an Online Happy Hour&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2024-01-04&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/professional.html&#34; rel=&#34;noreferrer&#34;&gt;Professional&lt;/a&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/fun.html&#34; rel=&#34;noreferrer&#34;&gt;Fun&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Are you tired of boring video calls? Well, no longer!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;After years of online groups and happy hours, I’ve built up a big list of fun&#xA;games and activities that you can do on a video call.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Now that I have my blog, I want to share this list publicly so that I can&#xA;reference it in the future.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s a few major groups of activities:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#free-websites&#34; rel=&#34;noreferrer&#34;&gt;Free Websites&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#paid-games&#34; rel=&#34;noreferrer&#34;&gt;Paid Video Games&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#classic-party-games&#34; rel=&#34;noreferrer&#34;&gt;Classic Party Games&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;If you liked this post, I posted again with &lt;a href=&#34;/blog/2024/11/more-happy-hour-games.html&#34; rel=&#34;noreferrer&#34;&gt;even MORE great happy hour games&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;free-websites&#34;&gt;Free Websites&lt;a href=&#34;#free-websites&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;These websites allow you to play as a private group, so you are playing just&#xA;with other players from your call.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/gartic.png&#34; alt=&#34;Image of Gartic.io website logo&#34;/&gt;&lt;figcaption&gt;Image of Gartic.io website logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Pictionary and Telephone&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://gartic.io/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Gartic.io&lt;/a&gt; is a great implementation of classic pictionary&#xA;game. In this game, one person is the “drawer”. They draw a secret word and the&#xA;other players compete to guess what the word is. The earlier you guess correctly,&#xA;the more points you get.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The drawing interface is pretty good. And there are a bunch of great word&#xA;categories to try.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But there’s also &lt;a href=&#34;https://garticphone.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;GarticPhone&lt;/a&gt;, which supports the&#xA;&lt;em&gt;Telephone&lt;/em&gt;-style of pictionary. This variant has each person draw a word. Their&#xA;drawing then goes to another player, who has to guess what the drawing is!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Hilarity ensues as you try to decipher your friends drawings.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Note that this plays best with larger groups, ideally 6-10 people.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/haxball.png&#34; alt=&#34;Image of Haxball website logo&#34;/&gt;&lt;figcaption&gt;Image of Haxball website logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Haxball Soccer&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.haxball.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Haxball&lt;/a&gt; is an online soccer game, where your group&#xA;splits up into two teams to try to score goals against each other.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This game works best when you have 6-10 people.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/wikigame.png&#34; alt=&#34;Image of Wiki Game website logo&#34;/&gt;&lt;figcaption&gt;Image of Wiki Game website logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;The Wiki Game&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.thewikigame.com&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;The Wiki Game&lt;/a&gt; is a spin on &lt;a href=&#34;https://en.wikipedia.org/wiki/Wikipedia:Wiki_Game&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;5 Clicks to Jesus&lt;/a&gt;, also known as Wikiracing. In the game, you get a pair of&#xA;Wikipedia pages. Players compete to see who can navigate from the first wiki&#xA;page to the second, only by clicking links on the page.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, everyone starts on the page “&lt;a href=&#34;https://en.wikipedia.org/wiki/Palace_of_Whitehall&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Palace of Whitehall&lt;/a&gt;”. Then, everyone tries to get to the page &lt;a href=&#34;https://en.wikipedia.org/wiki/Genghis_Khan&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Genghis Khan&lt;/a&gt;, only by clicking links to other wikipedia pages.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The one annoying thing about &lt;code&gt;thewikigame.com&lt;/code&gt;’s implementation is that you&#xA;can’t use the back button if you make a mistake. But it does make up for it by&#xA;tracking the path of pages you took and assigning a score.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/scategories.png&#34; alt=&#34;Image of Scategories game user interface&#34;/&gt;&lt;figcaption&gt;Image of Scategories game user interface&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Scategories&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This online implementation of &lt;a href=&#34;https://swellgarfo.com/scattergories/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Scategories&lt;/a&gt;&#xA;is a nicely built UI to help you run this classic party game as a private group.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Scategories is a brain-burning party game, where each person competes to think&#xA;of things that match a category and start with a particular letter. For example,&#xA;countries that start with the letter M: Macedonia, Montenegro, Mongolia, etc.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You get points for how many things you thought up and how unique the things you&#xA;though of are!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/codenames.png&#34; alt=&#34;Image of Horsepaste implementation of Codenames user interface&#34;/&gt;&lt;figcaption&gt;Image of Horsepaste implementation of Codenames user interface&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Codenames&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Codenames is a more recent hit board game. You split up into 2 teams. Each team&#xA;has a “spymaster” that gives hints to which spaces on a 5x5 grid are for your&#xA;team. Then, the players compete to pick the right spaces to win.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.horsepaste.com&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;horsepaste.com&lt;/a&gt; is a nice, minimalistic, but very&#xA;smooth online implementation of the game that works great on video calls.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Do note that you need at least 4 people to play though.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/setacular.png&#34; alt=&#34;Image of a Setacular board&#34;/&gt;&lt;figcaption&gt;Image of a Setacular board&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Setacular&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://set.loud.red/play&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Setacular&lt;/a&gt; (previously known as &lt;em&gt;ISASET&lt;/em&gt;) is an&#xA;online puzzle game, where you compete to find a set of 3 cards in a grid that&#xA;are either all the same or all different along 4 characteristics: color, amount,&#xA;shape, and fill.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This one is calm, but tense, as you each stare at the same cards for what seems&#xA;like an eternity until a set suddenly jumps out at you.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This game works better in smaller groups, like 3-5 at most.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/krunker.png&#34; alt=&#34;Image of Krunker logo&#34;/&gt;&lt;figcaption&gt;Image of Krunker logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Krunker&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://krunker.io/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Krunker&lt;/a&gt; is a fast-paced, first person shooter game that&#xA;you can play online. To play in a private group, everyone needs to be logged in.&#xA;But you don’t need to provide an email to do so. And signup takes seconds.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/wikitrivia.png&#34; alt=&#34;Image of Wiki Trivia game user interface&#34;/&gt;&lt;figcaption&gt;Image of Wiki Trivia game user interface&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Timeline&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://wikitrivia.tomjwatson.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;WikiTrivia&lt;/a&gt; is an online version of the&#xA;boardgame &lt;a href=&#34;https://boardgamegeek.com/boardgame/128664/timeline&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;timeline&lt;/a&gt;. In the&#xA;game, you try to place events in chronological order, getting harder and harder&#xA;as the gaps in time get shorter with more events.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The game’s novelty wears off quickly unless your group are hardcore history&#xA;buffs. But it is a quick, fun game, maybe as a teaser while getting started or&#xA;waiting for people to join the call.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/geoguesser.png&#34; alt=&#34;Image of Krunker logo&#34;/&gt;&lt;figcaption&gt;Image of Krunker logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Geoguessr&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.geoguessr.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Geoguesser&lt;/a&gt; is a geography brain burner, where you&#xA;get dropped somewhere randomly on the earth and have to guess where you are&#xA;using only your surroundings.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Use context clues, navigate around, and find every little detail to help you&#xA;narrow down where on the earth you are. Ultimately, you get points for how close&#xA;your guess is to the correct location.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This one requires a login, but it is free to sign up.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;board-games&#34;&gt;Board Games&lt;a href=&#34;#board-games&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;The following board games are easy to play on a video call. Though, I’m&#xA;skipping any games that have good online versions listed above.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/boggle.png&#34; alt=&#34;Image of Boggle game board&#34;/&gt;&lt;figcaption&gt;Image of Boggle game board&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Boggle&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Boggle uses a 4x4 grid of letter dice. After shaking the dice to randomize the&#xA;board, players have a limited time to list as many words that they can make&#xA;using the letters on the board.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If you have a boggle set, the host can point their camera at it. Or you can use&#xA;an online board &lt;a href=&#34;https://wordshake.com/boggle&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;like this one&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Otherwise, playing works normally. The host reveals the board to the group and&#xA;then everyone writes down everything they can see. Once the time is up, check&#xA;and score each player’s words according to &lt;a href=&#34;https://en.wikipedia.org/wiki/Boggle&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;the rules&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So this one is extra great, because (unlike the other most board games listed&#xA;in this section) you don’t really even need a copy of the game to play.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/trivial_pursuit.jpg&#34; alt=&#34;Image of Trivial Pursuit box&#34;/&gt;&lt;figcaption&gt;Image of Trivial Pursuit box&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Trivial Pursuit &amp;amp; Other Trivia Games&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Trivial Pursuit is a classic board game, where you have to answer one question&#xA;from 6 different categories to win. Each turn you roll a die and move along a&#xA;circular board where spaces correspond to different colored question categories.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To make this work on a call, one person serves as the trivia master, asking the&#xA;questions and reading the responses. Replace the board with some other mechanism&#xA;of randomly picking a category. Otherwise, play works as normal.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/balderdash.jpg&#34; alt=&#34;Image of Balderdash box&#34;/&gt;&lt;figcaption&gt;Image of Balderdash box&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Balderdash&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In Balderdash, the group is presented with a seemingly nonsense word. Each player&#xA;then comes up with a fake dictionary definition of the what they think the word&#xA;could mean. These are then mixed in with the real definition.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Players then vote on which definition is correct. You get 2 points for guessing&#xA;the correct definition and one point for each other player that thinks your&#xA;definition is the right one.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/rpg-dice.jpg&#34; alt=&#34;Image of a pile of dice&#34;/&gt;&lt;figcaption&gt;Image of a pile of dice&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;A Role Playing Game&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Enter a world of fantasy and adventure by playing an RPG together! Either play&#xA;a classic like DnD or Pathfinder. To get started, look for a one-shot adventure&#xA;that you can play in one session. These usually feature pre-created characters&#xA;and a short, quick-to-play adventure scenario that is easy for beginners.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Alternatively, you can look for a one-page RPG. These are standalone games that&#xA;focus specifically on creating a great one session game.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, in &lt;a href=&#34;https://gshowitt.itch.io/honey-heist&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Honey Heist&lt;/a&gt; you play as&#xA;a criminal bear. Every action either uses your bear stat or your criminal stat.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s tons of these games out there. They’re often pretty eccentric. And they&#xA;usually either free or pretty cheap, like a couple dollars to download.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/diplomacy.svg&#34; alt=&#34;Image of Diplomacy board&#34;/&gt;&lt;figcaption&gt;Image of Diplomacy board&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Diplomacy&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Diplomacy is a brutal game of sweet talking and backstabbing. You play as one of&#xA;7 countries in Europe during World War 1.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Each turn, you move your units one space, taking territory and battling each&#xA;other. However, each unit is equal and to take a territory, you need to beat&#xA;your opponent by one. So capturing territory often requires you to team up with&#xA;another player.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This slow pace and need to team up leads to very tense and deceptive negotiation&#xA;each turn with players. Alliances form and are broken. Backs are stabbed.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If your group is emotionally mature enough to handle this level of brutality, it&#xA;is a really fun game. Look up “gunboat diplomacy” for a good ruleset that forces&#xA;the game to move more quickly.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/werewolf.png&#34; alt=&#34;Image of Ultimate Warewolf board game&#34;/&gt;&lt;figcaption&gt;Image of Ultimate Warewolf board game&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Werewolf / Mafia&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Werewolf / Mafia is a party game for 8-16 people, where the town works together&#xA;to try to root out the mafia among them. Meanwhile, the mafia conspire to kill&#xA;the townfolk before they are discovered.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=NFWWV000sTw&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Here is a good video&lt;/a&gt; explaining the rules, ignore where it says 12-16 though. I’ve played with as few as 6 and had a good time.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The only thing you need to play this game on a video call is the ability to&#xA;privately message people. At the beginning of the game, the moderator should&#xA;make a small group chat for the mafia members. Otherwise, the game proceeds&#xA;normally.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If you would like a nice box set of Werewolf, &lt;a href=&#34;https://boardgamegeek.com/boardgame/147949/one-night-ultimate-werewolf&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;One Night Ultimate Werewolf&lt;/a&gt;&#xA;is a good choice. It also includes a bunch of extra game modes and special&#xA;characters that you can replace different roles with.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;paid-video-games&#34;&gt;Paid Video Games&lt;a href=&#34;#paid-video-games&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;Of course, there are tons of online multiplayer video games. If your group is&#xA;already setup to play online together, then you probably don’t need this list of&#xA;ideas in the first place.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;But if your group isn’t full of “gamers”, there are still a few good options&#xA;that are accessible to most people, regardless of gamer-iness.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/jackboxgames.png&#34; alt=&#34;Image of all Jackbox games versions&#34;/&gt;&lt;figcaption&gt;Image of all Jackbox games versions&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Jackbox Games&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.jackboxgames.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Jackbox Games&lt;/a&gt; is a series of party game suites&#xA;that have a ton of variety and are pre-built to work online. Only one person has&#xA;to purchase the game. They act as the host, and everyone else connects to the&#xA;game through website on their phone.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s not much to say here other than this game was designed specifically for&#xA;this use case: online party games. The actual game is a series of minigame&#xA;challenges, where the minigames depend on which version of Jackbox you bought.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/fallguys.png&#34; alt=&#34;Image of Fall Guys logo.&#34;/&gt;&lt;figcaption&gt;Image of Fall Guys logo.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Fall Guys&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The 2020’s brough a whole host of free-to-play online multiplayer games. Among&#xA;these, Fall Guys is a great casual party game. The best part is that you can&#xA;join as a group, and the game will place your entire party together in the same&#xA;game. Though, you each still compete seperately for the crown.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There are a lot of games like this in the first-person-shooter genre: Fortnite,&#xA;Overwatch 2, Valorant, the Finals, and so on.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, for casual play with a non-Gamer group, Fall Guys is much more&#xA;approachable.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But do note, that people will need a PC or game console to play. And, it will&#xA;take a while for people to get setup if they aren’t ready. So if you plan on&#xA;doing this, definitely spread the word ahead of time so everyone comes ready to&#xA;play.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/minecraft.jpg&#34; alt=&#34;Image of Steve from Minecraft hitting a skeleton with a sword while a dog looks on in the background.&#34;/&gt;&lt;figcaption&gt;Image of Steve from Minecraft hitting a skeleton with a sword while a dog looks on in the background.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Minecraft&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.minecraft.net/en-us&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Minecraft&lt;/a&gt; is a classic at this point. Almost&#xA;everyone seems to have a copy lying around somewhere.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If someone in your group is tech-saavy, they can setup a private minecraft&#xA;server for you all to join and have fun building and adventuring together.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This makes for a nice casual chat, where you can all just hang out and shoot the&#xA;breeze while playing this relaxing classic game.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;classic-party-games&#34;&gt;Classic Party Games&lt;a href=&#34;#classic-party-games&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;These classics are good filler or backup options. Keep in mind though that you&#xA;get out what you put in. Since these are less structured that the other games,&#xA;it helps if you take it seriously and give some pomp and circumstance to make it&#xA;more engaging.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/namethattune.png&#34; alt=&#34;Image of Name That Tune logo&#34;/&gt;&lt;figcaption&gt;Image of Name That Tune logo&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Name That Tune&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s no particular website or setup needed for this one. Just pull up any&#xA;music service like Youtube, Apple Music, Spotify, etc. And play random popular&#xA;songs.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You could make it a game by splitting up into teams and competing by who guesses&#xA;first or gets the most correct.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Alternatively, play clips from popular TV shows or movies. Or you could show&#xA;famous pieces of art.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/sherlock-holmes-illustration.jpg&#34; alt=&#34;Black and while illustration of sherlock holmes and watson sitting together and smoking a pipe.&#34;/&gt;&lt;figcaption&gt;Black and while illustration of sherlock holmes and watson sitting together and smoking a pipe.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;21 Questions&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Someone thinks of an person, place or thing. Everyone else then has 21 questions&#xA;to find out what the answer is.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;./images/charades.png&#34; alt=&#34;Image of the word charades&#34;/&gt;&lt;figcaption&gt;Image of the word charades&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Charades&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In Charades, you split up into pairs and pick a category, ex. Animals. Write out&#xA;a bunch of things in that category and set them aside. Then, one member of each&#xA;pair gets randomly assigned a secret from that category.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;While a timer is running, they then have to act out that animal without saying&#xA;that it is. The other person shouts out guesses until they get the right answer&#xA;or the time runs out.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If they get the right answer, they get a point. First team to 10 points wins.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Professional</category>
      <category>Fun</category>
    </item>
    <item>
      <title>Relating Events to Emails &amp; Vice-Versa [Calendar Features: Part 3]</title>
      <link>https://niaquinto.com/blog/2023/11/relating-events-to-emails-vice-versa.html</link>
      <pubDate>Fri, 10 Nov 2023 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2023/11/relating-events-to-emails-vice-versa.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;relating-events-to-emails-vice-versa&#34;&gt;Relating Events to Emails &amp;amp; Vice-Versa&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2023-11-10&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/productivity.html&#34; rel=&#34;noreferrer&#34;&gt;Productivity&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;After getting a lot busier over the last year, I live in my calendar. And a lot&#xA;of events have a pile of other communication behind them, including emails,&#xA;documents, and more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You can attach documents to calendar objects. However, what about linking to&#xA;emails?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Here, I outline a rough idea of what this would look like.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;This is a short last post in my series brainstorming calendar features. For the&#xA;other posts in the series, see here:&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 1&lt;/em&gt;: &lt;a href=&#34;../03/calendar-features-i-want&#34; rel=&#34;noreferrer&#34;&gt;Events Relative to Easter and the Lunar Calendar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 2&lt;/em&gt;: &lt;a href=&#34;../11/task-extensions-for-calendar&#34; rel=&#34;noreferrer&#34;&gt;Task Management for Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 3&lt;/em&gt;: &lt;a href=&#34;../11/relating-events-to-emails-vice-versa&#34; rel=&#34;noreferrer&#34;&gt;Relating Events to Emails &amp;amp; Vice Versa&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;the-details&#34;&gt;The Details&lt;a href=&#34;#the-details&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Like my last post outlining &lt;code&gt;XPROJECT&lt;/code&gt;, this one is also really simple. The&#xA;basic idea is that you could set a &lt;code&gt;XRELATED&lt;/code&gt; property on any calendar event.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This property would link to a related email. For example:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BEGIN:VCALENDAR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VERSION:2.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PRODID:-//hacksw/handcal//NONSGML v1.0//EN&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BEGIN:VEVENT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UID:uid1@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DTSTAMP:19970714T170000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;XRELATED: email://whateveruser@imap.example.com/305d9bd2-8016-11ee-85ac-63780565a41b&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DTSTART:19970714T170000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DTEND:19970715T040000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SUMMARY:Bastille Day Party&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GEO:48.85299;2.36885&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END:VEVENT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END:VCALENDAR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;This would allow the calendar client to link to this email when displaying the&#xA;calendar event, todo, or other calendar object.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similarly, you could list these in email headers:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To: demo@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Subject: Hello World&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;X-Related: calobj://whateveruser@caldav.example.com/8407c726-8016-11ee-ae53-efe084ebbd40&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello World!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;In both of these examples, you see URI-style links. So this could be extended&#xA;to tons of different types of content. Really whatever clients wanted to support&#xA;could be included here.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, you’ll also notice that it’s just the user’s identity on the email or&#xA;calendar server plus the object’s &lt;code&gt;UID&lt;/code&gt;! How do you the rest of the data needed&#xA;to display things?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Well, this highlights the downside of this proposal. It presupposes that your&#xA;mail and calendar are integrated at some level.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;A lot of email and calendar servers are in-fact integrated. So this would be a&#xA;non-issue for those. However in other cases, you can push this to the client.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, the client could show the related objects if it is configured to&#xA;connect to these services. And if not, it can show “&lt;em&gt;… and N other related&#xA;messages&lt;/em&gt;” or something.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;why&#34;&gt;Why?&lt;a href=&#34;#why&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Ultimately, what this achieves is putting the right information in front of you,&#xA;instead of leaving you to dig around in your inbox.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;As it is, many email clients auto-suggest creating a calendar event from your&#xA;email content if it sees something that looks like a datetime. What if it also&#xA;linked these 2 objects together so you have that context?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The email or calendar client could also autosuggest links based on other email&#xA;content like including the same project name or having the same participants.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There’s probably even greater integration potential in other object types!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;It’s interesting to explore what’s possible in these calendar extension features!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Calendars are so central to modern life. And, it’s kinda sad that there isn’t&#xA;much development or new features happening.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Like my last post, this one is fairly simple to implement and would provide a&#xA;small quality of life improvement. It’s possible to implement as a custom&#xA;extension to the standard.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So I guess the main thrust of all my calendar speculation is that I think there&#xA;is room for a calendar client that experiments with new features to improve the&#xA;calendar experience.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Though old, the CalDAV / WebDAV protocol has enough there to support all kinds&#xA;of innovation. It’s just sitting there, waiting for some enthusiasm and love!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Productivity</category>
    </item>
    <item>
      <title>Better Task Management for Projects [Calendar Features: Part 2]</title>
      <link>https://niaquinto.com/blog/2023/11/task-extensions-for-calendar.html</link>
      <pubDate>Sun, 05 Nov 2023 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2023/11/task-extensions-for-calendar.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;better-task-management-for-projects&#34;&gt;Better Task Management for Projects&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2023-11-05&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/productivity.html&#34; rel=&#34;noreferrer&#34;&gt;Productivity&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;What would a minimal task tracking system look like if it was built into&#xA;iCal/CALDAV?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I was thinking about this, because I’ve been tracking my time for projects&#xA;recently with &lt;a href=&#34;https://timetagger.app/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;TimeTagger&lt;/a&gt;. This is a great open source&#xA;project for tracking time, similar to &lt;a href=&#34;https://www.getharvest.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Harvest&lt;/a&gt; and&#xA;other commercial offerings.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But rather than having separate tools for this, and having to remember to track&#xA;any meetings that are in your calendar anyways, let’s imagine what it would look&#xA;like if this was built-in to the calendar standard.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And the best part is that it would be extremely simple to implement!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;em&gt;This is part of my 3 post wishlist for extended calendar features:&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 1&lt;/em&gt;: &lt;a href=&#34;../03/calendar-features-i-want&#34; rel=&#34;noreferrer&#34;&gt;Events Relative to Easter and the Lunar Calendar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 2&lt;/em&gt;: &lt;a href=&#34;../11/task-extensions-for-calendar&#34; rel=&#34;noreferrer&#34;&gt;Task Management for Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 3&lt;/em&gt;: &lt;a href=&#34;../11/relating-events-to-emails-vice-versa&#34; rel=&#34;noreferrer&#34;&gt;Relating Events to Emails &amp;amp; Vice Versa&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;the-implementation&#34;&gt;The Implementation&lt;a href=&#34;#the-implementation&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;This feature is so simple to implement, I’m surprised that it doesn’t already exist.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For each meeting, all we’d need to add is a special key that tracks which project&#xA;the calendar object &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; belongs to. The value of this key is a project “tag”, which&#xA;is a hierarchical value representing project and possibly subproject.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, below is an event that is tagged with the &lt;code&gt;DemoProj&lt;/code&gt; project and&#xA;&lt;code&gt;HelloWorld&lt;/code&gt; task. Specifically, look for the &lt;code&gt;XPROJECT&lt;/code&gt; property:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BEGIN:VCALENDAR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VERSION:2.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PRODID:-//hacksw/handcal//NONSGML v1.0//EN&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BEGIN:VEVENT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UID:uid1@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DTSTAMP:19970714T170000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;XPROJECT:DemoProj::HelloWorld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DTSTART:19970714T170000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DTEND:19970715T040000Z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SUMMARY:Bastille Day Party&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GEO:48.85299;2.36885&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END:VEVENT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;END:VCALENDAR&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;With this setup, each event is optionally assigned to a task.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These tasks can then be hierarchically nested, where a &lt;code&gt;::&lt;/code&gt; separates each&#xA;parent task.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, the header indicates that the event is a &lt;code&gt;DoSomething&lt;/code&gt; task&#xA;within the larger &lt;code&gt;DemoProj&lt;/code&gt; project.&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;XPROJECT:DemoProj::DoSomething&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;It would even be possible to support tagging the event with multiple projects,&#xA;which would split the time between them. Though this is generally discouraged&#xA;in existing task tracking tools. For example:&lt;/p&gt;&#xA;&lt;div style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34; class=&#34;highlighted-code highlighted-code--&#34;&gt;&#xA;&lt;pre style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;XPROJECT:DemoProj::DoSomething&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;XPROJECT:DemoProj::AnotherTask&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;reporting&#34;&gt;Reporting&lt;a href=&#34;#reporting&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;All this tracking is useless without being able to report on the data. The&#xA;common questions these tools answer are:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How many hours did you work this week for each client/project?&lt;/li&gt;&#xA;&lt;li&gt;What tasks took up most of your time?&lt;/li&gt;&#xA;&lt;li&gt;What percentage of your hours were overhead?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;Using the &lt;code&gt;XPROJECT&lt;/code&gt; data, these questions are answerable via the standard&#xA;Calendar querying API where you filter the query to only calendar objects that&#xA;have the &lt;code&gt;XPROJECT&lt;/code&gt; property set.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This API also supports filtering objects further based on the content, which&#xA;means you can query calendar objects for certain project tags.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That being said, it is inefficient to iterate all calendar objects within the&#xA;reporting period each time you want to generate a report. What we really need&#xA;is an aggregate API.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, this doesn’t exist from what I can tell in CalDAV. And extending&#xA;the standard and waiting for adoption in mainstream servers is a huge&#xA;uphill battle.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, it would be better to implement a sidecar client, which would satisfy this&#xA;aggregate reporting role. The service would …&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Watch your calendar data for any changes to events&lt;/li&gt;&#xA;&lt;li&gt;Track aggregates as the calendar data changes&lt;/li&gt;&#xA;&lt;li&gt;Expose an aggregate reporting API&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;This way, you’d be able to continue using any standards-compliant CalDAV server.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The sidecar service would also be able to track any metadata relating to projects.&#xA;For example:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Project Name&lt;/li&gt;&#xA;&lt;li&gt;Time Estimate, Budget&lt;/li&gt;&#xA;&lt;li&gt;Hourly Rate (if different from your normal billing rate)&lt;/li&gt;&#xA;&lt;li&gt;… and anything else you can think of&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;And, this service could also help implement any other nice to have features like:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Bulk migrating events from one project/task to another&lt;/li&gt;&#xA;&lt;li&gt;Highlighting calendar events that aren’t tagged to any project/task&lt;/li&gt;&#xA;&lt;li&gt;Generating invoices&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;Now, you might be thinking that this is a pretty big cop-out. Basically I’m&#xA;suggesting packing all the interesting features into this sidecar service.&#xA;And you’re right!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But that highlights the fundamental suggestion. Time tracking is possible as an&#xA;&lt;em&gt;extension&lt;/em&gt; of your calendar, not a replacement for it or a 2nd tool that you&#xA;have to track things in.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Store the underlying data in CalDAV and build features on top of that.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;but-why&#34;&gt;But, Why?&lt;a href=&#34;#but-why&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://timetagger.app/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;TimeTagger&lt;/a&gt; and &lt;a href=&#34;https://www.getharvest.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Harvest&lt;/a&gt;&#xA;work fine. So, why do this? &lt;strong&gt;Ownership&lt;/strong&gt; and &lt;strong&gt;Cooperation&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, you own the data. Yes, you might be using and paying for a hosted calendar&#xA;service. But if your account is suddenly canceled. You can migrate to another&#xA;provider or host your own server.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;You can backup your calendar using the open CalDAV protocol and walk away&#xA;whenever you want.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Second, you can connect to the CalDAV content from multiple services. For example,&#xA;how awesome would it be if appointments booked through Calendly or Cal.com&#xA;automatically tracked time to your client? What other synergies can be had&#xA;if services were based on open standards instead of proprietary silos?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This type of cooperation across services is possible to some extent with Zapier,&#xA;IFTTT, N8N, and other integration/automation tools. But why do we need an 3rd&#xA;tool just to connect things, when they’d be directly interoperable if they used&#xA;open standards.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;The interesting thing about this proposal is that it can be implemented&#xA;almost completely as an extension to existing, mainstream CalDAV servers. The&#xA;full implementation would include:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A &lt;code&gt;XPROJECT&lt;/code&gt;-aware CalDAV client&lt;/li&gt;&#xA;&lt;li&gt;A sidecar service for aggregate reporting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;And in combining these things, you’d get similar functionality to &lt;a href=&#34;https://www.getharvest.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Harvest&lt;/a&gt;&#xA;or &lt;a href=&#34;https://timetagger.app/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;TimeTagger&lt;/a&gt;, but it’d be integrated into your&#xA;existing calendar.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And this has amazing side effects. For example, you’d be able to integrate this&#xA;with appointment booking systems like &lt;a href=&#34;https://calendly.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Calendly&lt;/a&gt; or&#xA;&lt;a href=&#34;https://cal.com/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Cal.com&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This standards compliant co-existance is an under-appreciated feature in today’s&#xA;SAAS-ified landscape.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, we can dream. And through open source, we can fill the future with software&#xA;that works for us, instead of siloing everything off.&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;In this post, I focus on calendar &lt;strong&gt;events&lt;/strong&gt;, because I’m talking about time tracking. However, similar benefits exist for calendar TODO/Task objects. Organizing and reporting on tasks by project is ideal and it’s not clear why that isn’t supported already.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Productivity</category>
    </item>
    <item>
      <title>Easter and Lunar Calendars [Calendar Features: Part 1]</title>
      <link>https://niaquinto.com/blog/2023/03/calendar-features-i-want.html</link>
      <pubDate>Sat, 18 Mar 2023 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2023/03/calendar-features-i-want.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;easter-and-lunar-calendars&#34;&gt;Easter and Lunar Calendars&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2023-03-18&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/productivity.html&#34; rel=&#34;noreferrer&#34;&gt;Productivity&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Like many professionals, I make heavy use of online calendars. And CalDAV is&#xA;surprisingly featureful, well beyond what most calendar apps actually implement.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, there are some advanced features that I wish the CalDAV protocol and it’s&#xA;clients implemented:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 1&lt;/em&gt;: &lt;a href=&#34;../03/calendar-features-i-want&#34; rel=&#34;noreferrer&#34;&gt;Events Relative to Easter and the Lunar Calendar&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 2&lt;/em&gt;: &lt;a href=&#34;../11/task-extensions-for-calendar&#34; rel=&#34;noreferrer&#34;&gt;Task Management for Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Part 3&lt;/em&gt;: &lt;a href=&#34;../11/relating-events-to-emails-vice-versa&#34; rel=&#34;noreferrer&#34;&gt;Relating Events to Emails &amp;amp; Vice Versa&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;The first feature idea is below. And I’ll post the next two in the next few days.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-details&#34;&gt;The Details&lt;a href=&#34;#the-details&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;In the Christian tradition, many feast days are relative to the date of Easter.&#xA;For example, Pentecost is 50 days after the date of Easter.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Right now, this requires manually setting up the dates of these feasts each&#xA;year. Or (more likely) subscribing to a calendar feed that has done this work.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is a manual process, because of the fact that &lt;a href=&#34;https://en.wikipedia.org/wiki/Date_of_Easter&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;the date of Easter&lt;/a&gt;&#xA;is based on the lunar calendar.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;From the Hebrew calendar, Passover is the 15th day of the first month of the&#xA;ecclesiastical year: Nisan. For simplicity, this is the first full moon on or&#xA;after the 21st of March.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The date of Easter is the first Sunday after this. So the calculation is not so&#xA;trivial because of the pair of requirements: the full moon &lt;em&gt;after&lt;/em&gt; the equinox.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To make this work in calendars, I see 3 options:&lt;/p&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Supporting recurrence rules based on multiple criteria: the lunar calendar &amp;amp; equinoxes&lt;/li&gt;&#xA;&lt;li&gt;Hardcoding the Easter calculation as a recurrence rule option&lt;/li&gt;&#xA;&lt;li&gt;Supporting events with dates relative to other events&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;p&gt;Turning recurrence rules into complex logic will kill performance and depending&#xA;on the details, it would require a SAT solver to fully implement correctly.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That would be awesome for other complex scenarios. And the date calculations&#xA;could be heavily cached on the server to improve performance. But, this is&#xA;extremely unlikely to get implemented. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;noreferrer&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Hardcoding the calculation for Easter is complicated because there is &lt;a href=&#34;https://en.wikipedia.org/wiki/Easter_controversy&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;significant&#xA;disagreement&lt;/a&gt; that are still&#xA;not resolved. Though, there have been recent attempts to resolve the dispute. &lt;sup class=&#34;footnote-ref&#34; id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; rel=&#34;noreferrer&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The last option I can think of is to punt a bit and just support basing events&#xA;off of other events. This would still require manually calculating the date of&#xA;Easter, but then you could base all the other dates off of it.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This feature would be useful for other things too! And that’s the mark of a&#xA;great feature.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Of all the solutions I thought of, I’m most interested in the ability to base&#xA;events off of the dates of other events. This kind of semantic relationship is&#xA;what I’m looking for in my calendar.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, the solution would also apply to general cases like follow-up meetings.&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;footnotes&#34;&gt;&#xA;&#xA;&lt;hr/&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;Granted, it’s a pipe-dream in general to think about new features on such an old protocol with ossified implementation and little spec movement. But a man can dream!&lt;/li&gt;&#xA;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&lt;a href=&#34;https://aleteia.org/2022/11/19/pope-on-shared-easter-date-with-orthodox-pick-a-date-and-well-accept/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Pope on shared Easter date with Orthodox: Pick a date and we’ll accept&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
      <category>Productivity</category>
    </item>
    <item>
      <title>Naïveté in Early Character Encoding [ASCII: Part 3]</title>
      <link>https://niaquinto.com/blog/2023/01/naivete-in-early-character-encodings.html</link>
      <pubDate>Mon, 23 Jan 2023 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2023/01/naivete-in-early-character-encodings.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;naïveté-in-early-character-encoding&#34;&gt;Naïveté in Early Character Encoding&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2023-01-23&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Previously, I’ve written on &lt;a href=&#34;an-expose-on-english-words.html&#34; rel=&#34;noreferrer&#34;&gt;interesting English words&lt;/a&gt; like éxpose, adiós, and naïveté, and then &lt;a href=&#34;adios-to-simplified-loadwords.html&#34; rel=&#34;noreferrer&#34;&gt;the solution to typing these&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And now it’s time for some history! Why does this problem even exist?&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;ascii-history-how-character-encodings-work&#34;&gt;ASCII History &amp;amp; How Character Encodings Work&lt;a href=&#34;#ascii-history-how-character-encodings-work&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Computers need a way of mapping binary numbers to character symbols so that&#xA;they can draw them on screen. For example, they see the number 33 (ie.&#xA;&lt;code&gt;00100001&lt;/code&gt; in binary) and need to show the exclamation point character!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However due to early computers’ limited processing power, programmers wanted to&#xA;use the smallest space possible. That meant they could only support drawing 128&#xA;different characters.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That lead to the &lt;a href=&#34;https://en.wikipedia.org/wiki/ASCII&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;ASCII standard&lt;/a&gt; shown&#xA;below:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;ascii-table.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This table obviously cannot represent the fullness of all human languages. So&#xA;there have been many different character encodings proposed since then.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The most prominent now is &lt;code&gt;utf8&lt;/code&gt; via the &lt;a href=&#34;https://en.wikipedia.org/wiki/Unicode&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Unicode standard&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Unfortunately, some programmers don’t appreciate how many interesting words&#xA;english has borrowed from other languages. So, they don’t test a variety of&#xA;text, making their systems break or show &lt;a href=&#34;https://en.wikipedia.org/wiki/Mojibake&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Mojibake&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So next time you are testing a system, try to find resources to improve your&#xA;tests, such as the &lt;a href=&#34;https://github.com/minimaxir/big-list-of-naughty-strings&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Big List of Naughty Strings&lt;/a&gt;&#xA;or fuzz testing tools.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Thanks for entertaining my dive into the English language and how character&#xA;encodings let us express it fully. If you liked this series, &lt;a href=&#34;/forms/contact&#34; rel=&#34;noreferrer&#34;&gt;let me know&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>Adiós to Simplified Loanwords [ASCII: Part 2]</title>
      <link>https://niaquinto.com/blog/2023/01/adios-to-simplified-loadwords.html</link>
      <pubDate>Wed, 18 Jan 2023 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2023/01/adios-to-simplified-loadwords.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;adiós-to-simplified-loanwords&#34;&gt;Adiós to Simplified Loanwords&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2023-01-18&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Last time, I posted &lt;a href=&#34;an-expose-on-english-words.html&#34; rel=&#34;noreferrer&#34;&gt;a list of some interesting English loanwords&lt;/a&gt;,&#xA;containing accented characters. Now, I’ll share the solution to typing these&#xA;words in their full glory.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Of course, you could change your keyboard to an alternate layout to get some&#xA;more words that you commonly type.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Personally, I’ve found the Polish keyboard can cover most things I would type&#xA;across English, German, and Polish.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But to fully address this problem, every operating system has a way to type&#xA;the full range of extended characters.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Here’s the instructions for &lt;a href=&#34;#linux&#34; rel=&#34;noreferrer&#34;&gt;Linux&lt;/a&gt;, &lt;a href=&#34;#mac&#34; rel=&#34;noreferrer&#34;&gt;Mac / OSX&lt;/a&gt;, and &lt;a href=&#34;#windows&#34; rel=&#34;noreferrer&#34;&gt;Windows&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;linux&#34;&gt;Linux&lt;a href=&#34;#linux&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;There are 2 options on Linux. To enter any character, you can hold &lt;code&gt;ctrl&lt;/code&gt; and&#xA;&lt;code&gt;shift&lt;/code&gt;, then press &lt;code&gt;u&lt;/code&gt; and type the hex code for any unicode character.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There is a full list of hex codes &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_Unicode_characters&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;on Wikipedia&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Unfortunately, in my experience some terminal applications don’t support this&#xA;method.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Alternatively, you can use X.org’s “compose” system. To do this, you need to&#xA;know what your compose key is via your Desktop Environment’s settings menu or&#xA;set it with &lt;code&gt;setxkbmap -option &amp;#39;compose:somekey&amp;#39;&lt;/code&gt;, ex. &lt;code&gt;compose:caps&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Then, you can press your compose key and then a combination of characters. To&#xA;view or modify the list of possible compose characters, see &lt;code&gt;/usr/share/X11/locale/en_US.UTF-8/Compose&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, press &lt;code&gt;compose&lt;/code&gt; then &lt;code&gt;C&lt;/code&gt; then &lt;code&gt;o&lt;/code&gt; to type &lt;code&gt;©&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;mac&#34;&gt;Mac&lt;a href=&#34;#mac&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;On Mac, one option is to enable the &lt;em&gt;Unicode Hex Input&lt;/em&gt; keyboard language.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To do this, first navigate to &lt;em&gt;System Prefereces&lt;/em&gt; &amp;gt; &lt;em&gt;Language &amp;amp; Region&lt;/em&gt; &amp;gt; &lt;em&gt;Keyboard Preferences&lt;/em&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There, click the plus icon and search for &lt;em&gt;Unicode Hex Input&lt;/em&gt;. Also on the&#xA;&lt;em&gt;Keyboard Preferences&lt;/em&gt; page, make sure &lt;em&gt;Show Input menu in menu bar&lt;/em&gt; is checked.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Finally, you can change to the Unicode keyboard from the toolbar and use&#xA;&lt;code&gt;option&lt;/code&gt; plus a hex code to enter a unicode character.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, enter &lt;code&gt;option&lt;/code&gt; then &lt;code&gt;1e9e&lt;/code&gt;. This will type &lt;code&gt;ẞ&lt;/code&gt;, ie. Eszett.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Alternatively, from the keyboard toolbar menu, you can click&#xA;&lt;em&gt;Show Emoji &amp;amp; Symbols&lt;/em&gt;. Then from the popup, click the icon in the top right&#xA;corner to show the advanced UI to select from a wider range of symbols.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;mac-character-viewer.png&#34; alt=&#34;Screenshot of Mac advanced Emoji &amp;amp; Symbol viewer&#34;/&gt;&lt;figcaption&gt;Screenshot of Mac advanced Emoji &amp;amp; Symbol viewer&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;windows&#34;&gt;Windows&lt;a href=&#34;#windows&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Windows has the easiest way of entering a wider set of characters. You simply&#xA;press &lt;code&gt;alt&lt;/code&gt; and then the code for your character. This isn’t the unicode hex&#xA;code, but rather a custom code unique to Windows.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For example, to type &lt;code&gt;ß&lt;/code&gt; you simply press &lt;code&gt;alt&lt;/code&gt; plus &lt;code&gt;0223&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There is also a &lt;em&gt;Character Map&lt;/em&gt; application that you can use to search for&#xA;characters and learn their alt codes. Search for this in the Start menu to&#xA;explore the symbols you use.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;windows-character-viewer.png&#34; alt=&#34;Screenshot of Windows Character Map app&#34;/&gt;&lt;figcaption&gt;Screenshot of Windows Character Map app&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;For more details and a list of common characters, see &lt;a href=&#34;https://support.microsoft.com/en-us/office/insert-ascii-or-unicode-latin-based-symbols-and-characters-d13f58d3-7bcb-44a7-a4d5-972ee12e50e0&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;this help page&lt;/a&gt; from Microsoft.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Certainly, this is easier on some operating systems than others. And it does&#xA;crimp your flow a bit. But it’s nice to have the full range of characters&#xA;available to you.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Next up, I’ll provide some background on &lt;a href=&#34;naivete-in-early-character-encodings.html&#34; rel=&#34;noreferrer&#34;&gt;why this problem exists&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>An Exposé on English Loanwords [ASCII: Part 1]</title>
      <link>https://niaquinto.com/blog/2023/01/an-expose-on-english-words.html</link>
      <pubDate>Sat, 14 Jan 2023 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2023/01/an-expose-on-english-words.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;an-exposé-on-english-loanwords&#34;&gt;An Exposé on English Loanwords&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2023-01-14&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/technology.html&#34; rel=&#34;noreferrer&#34;&gt;Technology&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Have you ever seen English words spelled with simplified letters, for example&#xA;&lt;code&gt;naivete&lt;/code&gt; instead of &lt;code&gt;naïveté&lt;/code&gt;?&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This bums me out a bit. Because I think these loanwords are one of the best&#xA;things about English. It makes language so flexible and rich.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Usually, people type the simplified form of a word because doesn’t know how to&#xA;type special characters. But, sometimes it’s because of a decision made for&#xA;early computers.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, I wanted to post a sampling of loanwords with uncommon letters or accents.&#xA;&lt;a href=&#34;#some-interesting-words&#34; rel=&#34;noreferrer&#34;&gt;See below&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In a later post, I’ll follow up with some notes on &lt;a href=&#34;adios-to-simplified-loadwords.html&#34; rel=&#34;noreferrer&#34;&gt;how to type these characters&lt;/a&gt; on your keyboard.&#xA;And I’ll finish up with a bit of background on &lt;a href=&#34;naivete-in-early-character-encodings.html&#34; rel=&#34;noreferrer&#34;&gt;why this problem exists&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;some-interesting-words&#34;&gt;Some Interesting Words&lt;a href=&#34;#some-interesting-words&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;English borrows most heavily from Germanic and Romance languages using&#xA;characters/accents/graphemes like these:&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cedilla: the &lt;code&gt;ç&lt;/code&gt; in &lt;em&gt;Curaçao&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Circumflex: the &lt;code&gt;û&lt;/code&gt; in &lt;em&gt;crème brûlée&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Acute Accent: the &lt;code&gt;é&lt;/code&gt; in &lt;em&gt;cliché&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Grave Accent: the &lt;code&gt;è&lt;/code&gt; in &lt;em&gt;pièce de résistance&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Trema / Umlaut: the &lt;code&gt;ï&lt;/code&gt;in &lt;em&gt;naïve&lt;/em&gt; or the &lt;code&gt;ü&lt;/code&gt; in &lt;em&gt;über&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;Tilde: the &lt;code&gt;ñ&lt;/code&gt; in &lt;em&gt;piña colada&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;But, there are also a long tail of interesting words from other languages from&#xA;Slavic, Turkic, Arabic, and other language families!&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;french&#34;&gt;French&lt;a href=&#34;#french&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;apéritif&lt;/li&gt;&#xA;&lt;li&gt;attaché&lt;/li&gt;&#xA;&lt;li&gt;cliché&lt;/li&gt;&#xA;&lt;li&gt;coup d’état&lt;/li&gt;&#xA;&lt;li&gt;crème brûlée&lt;/li&gt;&#xA;&lt;li&gt;déjà vu&lt;/li&gt;&#xA;&lt;li&gt;exposé&lt;/li&gt;&#xA;&lt;li&gt;éclair&lt;/li&gt;&#xA;&lt;li&gt;façade&lt;/li&gt;&#xA;&lt;li&gt;passé&lt;/li&gt;&#xA;&lt;li&gt;pièce de résistance&lt;/li&gt;&#xA;&lt;li&gt;naïve&lt;/li&gt;&#xA;&lt;li&gt;naïveté&lt;/li&gt;&#xA;&lt;li&gt;resumé / résumé&lt;/li&gt;&#xA;&lt;li&gt;touché&lt;/li&gt;&#xA;&lt;li&gt;sauté&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 id=&#34;spanish&#34;&gt;Spanish&lt;a href=&#34;#spanish&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;El Niño&lt;/li&gt;&#xA;&lt;li&gt;piñata&lt;/li&gt;&#xA;&lt;li&gt;piña colada&lt;/li&gt;&#xA;&lt;li&gt;adiós&lt;/li&gt;&#xA;&lt;li&gt;créole&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 id=&#34;german&#34;&gt;German&lt;a href=&#34;#german&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;über&lt;/li&gt;&#xA;&lt;li&gt;gemütlich&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h3 id=&#34;other-languages&#34;&gt;Other Languages&lt;a href=&#34;#other-languages&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dutch&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;blasé&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;Portugese&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ção: a greeting&lt;/li&gt;&#xA;&lt;li&gt;Açaí: the antioxidant-packed berry&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;Basque&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Curaçao: the Carribean island and the blue drink&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;Greek&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;æther&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;Turkic&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;café / قهوة&lt;/li&gt;&#xA;&lt;li&gt;élixer / الإكسير&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;li&gt;Japanese&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;daimyō&lt;/li&gt;&#xA;&lt;li&gt;Pokémon&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;This is just a limited list of examples. But I love that the English language&#xA;is such a mutt. It makes the language rich. And it emphasizes that America is&#xA;a nation of immigrants.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I use this list as a reference sometime. And, I hope it sparks some curiosity in&#xA;you as well.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Next up, I’ll post some practical guides on how to type these characters (and&#xA;more) on your operating system. &lt;em&gt;See part 2: &lt;a href=&#34;adios-to-simplified-loadwords.html&#34; rel=&#34;noreferrer&#34;&gt;Adiós to Simplified Loanwords&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Technology</category>
    </item>
    <item>
      <title>How I Brew Coffee</title>
      <link>https://niaquinto.com/blog/2022/11/how-i-brew-coffee.html</link>
      <pubDate>Tue, 22 Nov 2022 20:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2022/11/how-i-brew-coffee.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;how-i-brew-coffee&#34;&gt;How I Brew Coffee&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2022-11-22&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/food-and-cooking.html&#34; rel=&#34;noreferrer&#34;&gt;Food &amp;amp; Cooking&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;how-i-brew-coffee.opus&#34;&gt;&lt;audio src=&#34;how-i-brew-coffee.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Like many programmers, I like coffee…a lot. So, I thought I’d share a quick&#xA;note on my process for brewing coffee.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR: it’s Tetsu Kasuya 4:6 pour over method.&lt;/strong&gt; &lt;a href=&#34;https://www.youtube.com/watch?v=wmCW8xSWGZY&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;This video&lt;/a&gt;&#xA;from the barista himself is a great demonstration.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The most remarkable thing about this method is how extremely consistent it is at&#xA;getting really good, smooth coffee.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This opened up a huge world of coffee flavors to me, because once I could&#xA;consistently brew good tasting coffee, I could then start to feel the difference&#xA;between different roasts.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, let’s me explain what the 4:6 method is all about.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-method&#34;&gt;The Method&lt;a href=&#34;#the-method&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;In the 4:6 method you typically use 5 pours, where the first 40% (ie. 2 pours)&#xA;control the sweetness and the other 60% (ie. 3 pours) control the strength.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To start, you’ll need a few things: a pour over, burr grinder, a mug or carafe,&#xA;scale, and timer.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This method uses 1g of ground coffee for each 15g of water. So take the amount&#xA;of coffee you’d like to end up with. Then, divide that by 15 to get the amount&#xA;of ground coffee beans to use.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Use a medium grind setting on your burr grinder to grind your coffee.&#xA;A good grinder is important as explained &lt;a href=&#34;#grind-size-ratio-to-water&#34; rel=&#34;noreferrer&#34;&gt;below&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Bring the water up to temperature, around 195-205F. Now you’re going to do your&#xA;first pour. In this method, you divide the total coffee by 5 to get the amount&#xA;for each pour.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;When pouring, pour quickly but smoothly moving in a circular motion to wet&#xA;all the beans. Then, wait 45 seconds between pours.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Repeat these steps of pouring and waiting until you’ve done all 5 pours.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;flavor-profiles&#34;&gt;Flavor Profiles&lt;a href=&#34;#flavor-profiles&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Here is the typical profile with equal amounts for all 5 pours:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;4-6_Method.png&#34; alt=&#34;Diagram of the 4:6 Method showing 40% sweetness phase and 60% strength phase in 5 equal pours&#34;/&gt;&lt;figcaption&gt;Diagram of the 4:6 Method showing 40% sweetness phase and 60% strength phase in 5 equal pours&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This makes a consistently good cup of coffee. But we can adjust it by changing&#xA;the ratio or number of pours.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;The 40% phase controls the sweetness and the 60% phase controls the strength.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In the 40% phase, you can make the coffee sweeter by shortening the first pour&#xA;relative the second. Lengthening it makes it more acidic.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;4-6_Method_Sweet.png&#34; alt=&#34;Diagram of the 4:6 Method showing a sweeter 40% phase by shortening the first pour&#34;/&gt;&lt;figcaption&gt;Diagram of the 4:6 Method showing a sweeter 40% phase by shortening the first pour&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;4-6_Method_Acidic.png&#34; alt=&#34;Diagram of the 4:6 Method showing a more acidic 40% phase by lengthening the first pour&#34;/&gt;&lt;figcaption&gt;Diagram of the 4:6 Method showing a more acidic 40% phase by lengthening the first pour&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Coffee beans need to off-gas a bit before extracting well. This is the puff you&#xA;see when you first pour the water onto the coffee.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, a smaller first pour “warms up” the beans, leading to more extraction in the&#xA;longer second step.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similarly, in the 60% phase shorter pours lead to a stronger flavor. By default&#xA;you would do 3 pours. 4 pours leads to extra strong coffee, whereas 2 pours lead&#xA;to a more subtle flavor.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;4-6_Method_Strong.png&#34; alt=&#34;Diagram of the 4:6 Method showing a stronger 60% phase by using 4 pours&#34;/&gt;&lt;figcaption&gt;Diagram of the 4:6 Method showing a stronger 60% phase by using 4 pours&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;4-6_Method_Subtle.png&#34; alt=&#34;Diagram of the 4:6 Method showing a more subtle 60% phase by using 2 pours&#34;/&gt;&lt;figcaption&gt;Diagram of the 4:6 Method showing a more subtle 60% phase by using 2 pours&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Shorter pours are stronger because they agitate the coffee more, leading the&#xA;water to linger longer, brewing more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But beware: changes to the 60% / strength phase will have a much larger impact&#xA;on the resulting coffee.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;lots-of-coffee&#34;&gt;Lots of Coffee&lt;a href=&#34;#lots-of-coffee&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;One of the benefits of this method is that you can brew up to 4 cups of coffee&#xA;if you have a large enough pour over.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Typically, I brew with 40g coffee, 600g of water, and 120g per pour (when using&#xA;the normal/equal distribution). That’s a bit over 2.5 cups of coffee.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But I made a cheatsheet that hangs on my fridge. This way I know whenever I have&#xA;guests over and want to make a particular number of cups:&lt;/p&gt;&#xA;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th align=&#34;right&#34;&gt;Cups&lt;/th&gt;&#xA;&lt;th align=&#34;right&#34;&gt;Coffee&lt;/th&gt;&#xA;&lt;th align=&#34;right&#34;&gt;Total Water&lt;/th&gt;&#xA;&lt;th align=&#34;right&#34;&gt;Pour Size&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td align=&#34;right&#34;&gt;1&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;15g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;255g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;45g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td align=&#34;right&#34;&gt;~1.5&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;24g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;360g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;72g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td align=&#34;right&#34;&gt;2&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;30g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;450g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;90g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td align=&#34;right&#34;&gt;~2.5&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;40g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;600g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;120g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td align=&#34;right&#34;&gt;3&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;45g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;675g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;135g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td align=&#34;right&#34;&gt;4&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;63g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;945g&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;189g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;em&gt;The half cups (ie. 1.5, 2.5) are a bit generous, because real half cups make&#xA;for unwieldy sizes in grams since there is &lt;code&gt;236.588g per cup&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;grind-size-ratio-to-water&#34;&gt;Grind Size &amp;amp; Ratio to Water&lt;a href=&#34;#grind-size-ratio-to-water&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;One area that I haven’t researched much yet with this method is grind size and&#xA;the ratio of grinds to water.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Here, I’ve just stuck with the basic advice of using medium grind size and 1:15&#xA;ratio of coffee to water.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I’ve heard that you should use both more coffee and coarser grind sizes when&#xA;brewing with larger amounts of coffee.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That jives with what I’ve experienced. Later pours in this method take longer.&#xA;My understanding is that this is because finer grains of coffee start to clog&#xA;the filter.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So for large batches that take a while to brew, grind size is important. And to&#xA;compensate for larger grinds, you need more of them to keep the extraction at&#xA;the right level.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Thus, you need a good burr grinder. Consistency in grind size is important for&#xA;the later pours to prevent over-extraction.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://coffeeadastra.com/2019/04/07/an-app-to-measure-your-coffee-grind-size-distribution-2/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;This post&lt;/a&gt;&#xA;from Coffee Ad Astra has a deep dive into grind size and consistency. He even&#xA;made an app using computer vision to check grind sizes for yourself!&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a href=&#34;#conclusion&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;The 4:6 method is decently complicated. I’ve made some personal cheatsheets and&#xA;scripts to help automate the timing and figure out the distributions.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But it works so well that it’s worth it. It’s a very forgiving way to make&#xA;consistently good coffee.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That said, there are still some areas that I’d like to learn more about,&#xA;specifically grind size and ratio to water.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;I have a &lt;a href=&#34;https://www.hario-usa.com/products/ceramic-coffee-mill-skerton-plus&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Hario Skerton Plus&lt;/a&gt;&#xA;for camping and a &lt;a href=&#34;https://baratza.com/grinder/encore/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Baratza Encore&lt;/a&gt; in the kitchen at home.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;These are both solid burr grinders. So, nailing the grind size is an are that I&#xA;could explore more.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But until then, I’ll leave you with a final recommendation to give this method a&#xA;try. It takes a bit of time to get used to. But the cheatsheets help.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, it works excellently. So try making your next coffee this way and I think&#xA;you’ll be pleasantly surprised.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Food &amp; Cooking</category>
    </item>
    <item>
      <title>All Things Protein</title>
      <link>https://niaquinto.com/blog/2022/11/all-things-protein.html</link>
      <pubDate>Sat, 12 Nov 2022 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2022/11/all-things-protein.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;all-things-protein&#34;&gt;All Things Protein&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2022-11-12&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/food-and-cooking.html&#34; rel=&#34;noreferrer&#34;&gt;Food &amp;amp; Cooking&lt;/a&gt;&lt;/div&gt;&lt;figure class=&#34;heading__audio&#34;&gt;&lt;audio-player store-key=&#34;all-things-protein.opus&#34;&gt;&lt;audio src=&#34;all-things-protein.opus&#34; controls=&#34;&#34; preload=&#34;metadata&#34;&gt;&lt;/audio&gt;&lt;/audio-player&gt;&lt;figcaption&gt;Audio from Kokoro TTS (Apache 2.0)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;For the last 6 months, I’ve been interested in hearing the animal side of the&#xA;plant vs. animal foods debate. Usually, this debate revolves around fat.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But about a month ago, Peter Attia’s &lt;em&gt;The Drive&lt;/em&gt; podcast had a great episode on&#xA;protein! &lt;em&gt;&lt;a href=&#34;https://peterattiamd.com/donlayman/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Dietary protein: amount needed, ideal timing, quality, and more&lt;/a&gt;&lt;/em&gt; with Don Layman, PhD.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And, as usual it didn’t disappoint! Since switching to only eating plant foods&#xA;in 2020, I haven’t though much about protein. I eat a lot of beans/legumes,&#xA;tofu, and other higher protein plant foods.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, this discussion has me wanting to look back at the plant-side of the story.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;protein-quality-and-recommended-amounts&#34;&gt;Protein Quality and Recommended Amounts&lt;a href=&#34;#protein-quality-and-recommended-amounts&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Dr. Layman discussed a lot about protein quality, which he argues is the reason&#xA;why animal fats are necessary for adequate protein intake.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Specifically, he recommends 1.6g / kg body mass.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;He does concede that higher consumption of plant protein (ex. 150g+ per day)&#xA;can overwhelm any deficiency in a particular amino acid.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But he says that this level of protein is very difficult for vegans to get.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, I wanted to see for myself. And, I found the protein content of an&#xA;assortment of common higher protein plant foods.&lt;/p&gt;&#xA;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Food&lt;/th&gt;&#xA;&lt;th align=&#34;right&#34;&gt;Protein / 100 Cal&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Pea Protein Powder&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;22.12g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Seitan&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;19.63g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;TVP&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;15.38g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Spinach&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;12.93g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Tofu&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;11.97g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Tempeh&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;10.18g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Lentils&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;7.83g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Soy Milk&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;7.00g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Black Beans&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;6.61g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Chickpeas&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;5.58g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Spelt&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;4.47g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Peanuts&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;4.07g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Quinoa&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;3.69g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Almonds&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;3.51g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Oats&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;3.46g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Corn&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;3.39g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Cashews&lt;/td&gt;&#xA;&lt;td align=&#34;right&#34;&gt;3.00g&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;em&gt;The amounts above are protein in a 100 calorie serving. And the data is from &lt;a href=&#34;https://www.nutritionix.com&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;nutritionix.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;With this target of 1.6g / kg of body mass, he is right that this is&#xA;challenging to get without animal foods. But, it’s definitely not impossible.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;In a 150lb / 68.03kg person, this works out to 108.84g of protein. To get this&#xA;amount from a diet consisting of an average of 30% protein, you need to eat&#xA;foods with an average of 7.5g of protein per 100 calories&#xA;(ie. &lt;code&gt;(2500cal / 100cal) * 0.30 [percent protein]&lt;/code&gt;).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;If you’re eating a diet of whole foods, this is tough. You’d have to eat a huge&#xA;meal of spinach for one meal and lentils for another.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;To get above that mark, you really need to include some processed plant foods&#xA;like tofu, seitan, or tempeh. Starting the day off with a protein shake is&#xA;another easy way to sneak some extra nuts and pea protein powder in there.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;However, I’ve read elsewhere that lower amounts are acceptable if you are not&#xA;an athlete. Dr. Layman directly addresses this, saying the guidelines are built&#xA;to address parts of the world where protein deficiency is a concern.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, I think I’ll need to read some more from the vegan/plant-based perspective&#xA;on either: how to get 1.6g protein per kg body mass or why this recommendation&#xA;is too high.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Finally, Dr. Layman mentioned one other interesting thing. Feeding older people&#xA;higher protein diets can overcome their declining efficiency and promote a more&#xA;anabolic state.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;protein-timing&#34;&gt;Protein Timing&lt;a href=&#34;#protein-timing&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;There were a couple of interesting random facts about when to eat protein:&lt;/p&gt;&#xA;&#xA;&lt;p&gt;First, eating a enough protein (ie. 30g+) at breakfast is critical to get enough&#xA;leucine to break your body out of a catobolic state.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Second, the age-old trainer-wisdom about protein is true: your muscles can only&#xA;use around 30g of protein per meal.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Dr. Layman adds the caveat that it’s really a range of 20-60g based on the&#xA;person. And, the liver does not have this limit, so the 30g advice is only&#xA;applicable to muscle mass.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Third according to Dr. Layman, it isn’t hugely important whether you eat your&#xA;meal before or after exercise.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;And finally, Dr. Attia briefly mentioned that among people practicing&#xA;intermittent fasting, lean body mass inevitably goes down along with total body&#xA;mass.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;That’s particularly interesting given the claims about fasting and metabolic&#xA;health.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;fat-cholesterol-and-heart-disease&#34;&gt;Fat, Cholesterol, and Heart Disease&lt;a href=&#34;#fat-cholesterol-and-heart-disease&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;On fat/cholesterol/heart disease, Dr. Layman mentions a study of&#xA;institutionalized individuals given saturated vs polyunsaturated fats.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;There was no difference in coronary events over the 5 year study period.&#xA;However, there was a big difference in their total cholesterol (only total was&#xA;measured, not LDL/HDL/ApoB).&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is interesting in comparison to the other studies showing a big difference&#xA;in heart disease between people consuming more saturated fat versus&#xA;monounsaturated fat.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Similarly, Dr. Attia had &lt;a href=&#34;https://peterattiamd.com/billharris/&#34; rel=&#34;noreferrer&#34; target=&#34;_blank&#34;&gt;Bill Harris PhD on episode #83&lt;/a&gt;&#xA;to discuss Omega-3’s. And they discussed diets very high in polyunsaturated&#xA;fat, which showed no correlation with heart disease in Dr. Harris’ research.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, I’m not sure really what to make of this data point on saturated fat vs&#xA;polyunsaturated fat.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Generally, Dr. Layman’s study advances the keto/carnivore claim that total&#xA;cholesterol (and possibly even LDL cholesterol) basically don’t matter for&#xA;heart disease.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;But, that’s hard to square with other research showing animal fat (and to a&#xA;lesser extent saturated fat from plants) are highly associated with heart&#xA;disease.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;conclusions&#34;&gt;Conclusions&lt;a href=&#34;#conclusions&#34; class=&#34;id-link&#34;&gt;§&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Of the research I’ve read focusing on animal foods, it was refreshing to hear&#xA;about something other than the debate over fat, cholesterol, and heart disease.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;On protein levels and quality, I’m going to have to re-read what plant-based&#xA;advocates have to say. But in the meantime, this is an interesting reminder to&#xA;think about protein a bit more.&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Food &amp; Cooking</category>
    </item>
    <item>
      <title>Hello World!</title>
      <link>https://niaquinto.com/blog/2022/11/hello-world.html</link>
      <pubDate>Sat, 12 Nov 2022 00:00:00 +0700</pubDate>
      <guid>https://niaquinto.com/blog/2022/11/hello-world.html</guid>
      <description>&lt;div class=&#34;content&#34;&gt;&lt;div class=&#34;heading&#34;&gt;&lt;h1 id=&#34;hello-world&#34;&gt;Hello World!&lt;/h1&gt;&lt;div class=&#34;pagemeta&#34;&gt;&lt;span class=&#34;pagemeta__published&#34;&gt;2022-11-12&lt;/span&gt;&lt;a class=&#34;pagemeta__tag&#34; href=&#34;/blog/tags/casual.html&#34; rel=&#34;noreferrer&#34;&gt;Casual&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I’ve decided to start a blog on random topics that I’m interested in. And here&#xA;it is!&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Right now, I’m interested in …&lt;/p&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cooking&lt;/li&gt;&#xA;&lt;li&gt;Nutrition &amp;amp; Health&lt;/li&gt;&#xA;&lt;li&gt;Catholic Theology&lt;/li&gt;&#xA;&lt;li&gt;Board Games&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;In particular, I listen to a lot of audiobooks and podcasts. And I feel like I&#xA;get more out of it when I take notes and reflect on what I learned from each&#xA;episode.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;So, that’s what I’m going to post here! Podcast &amp;amp; book reviews. Notes &amp;amp; pictures&#xA;from cooking new recipes. And, other random thoughts.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;Let me know &lt;a href=&#34;/forms/contact&#34; rel=&#34;noreferrer&#34;&gt;on my contact form&lt;/a&gt; if you enjoyed a&#xA;post!&lt;/p&gt;&#xA;&lt;/div&gt;</description>
      <category>Casual</category>
    </item>
  </channel>
</rss>