<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://arnesonium.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://arnesonium.com/" rel="alternate" type="text/html" /><updated>2026-05-12T19:33:59+00:00</updated><id>https://arnesonium.com/feed.xml</id><title type="html">Erik L. Arneson — Writer and Software Developer</title><subtitle>Erik L. Arneson is a freelance writer and software developer with WordPress experience. He is located in Portland, Oregon.</subtitle><author><name>Erik L. Arneson</name></author><entry><title type="html">Emacs as the Freelancer’s Command Center</title><link href="https://arnesonium.com/2026/04/emacs-freelance-command-center" rel="alternate" type="text/html" title="Emacs as the Freelancer’s Command Center" /><published>2026-04-10T00:00:00+00:00</published><updated>2026-04-10T00:00:00+00:00</updated><id>https://arnesonium.com/2026/04/emacs-freelance-command-center</id><content type="html" xml:base="https://arnesonium.com/2026/04/emacs-freelance-command-center"><![CDATA[<p>Freelancing for small businesses and organizations leads to a position where you are juggling a
number of projects for multiple clients. You need to keep track of a number of tasks ranging from
software development to sending emails to project management. This is a lot easier when you have a
system that can do a bunch of the work for you, which is why I use Emacs as my freelancer command
center.</p>

<p>I would like to share some of the tools and workflows I use in Emacs to help me keep on top of
multiple clients’ needs and expectations.</p>

<!--more-->

<h2 id="organization-with-org-mode">Organization with org-mode</h2>

<p>It should be no surprise that at the center of my Emacs command center is <a href="https://orgmode.org/">org-mode</a>. I have already
<a href="/tags/org-mode/">written about it a lot</a>. Every org-mode user seems to have their own way of keeping track of things,
so please don’t take my organizational scheme as some kind of gospel. A couple of years ago, I wrote
about <a href="/2024/10/todo-lists-in-org-mode">how I handle to-do lists in org-mode</a>, and I am still using that method for to-do keywords.
However, file structure is also important. I have a number of core files.</p>

<h3 id="freelanceorg"><code class="language-plaintext highlighter-rouge">Freelance.org</code></h3>

<p>This top-level file contains all of my ongoing business tasks, such as tracking potential new
clients, recurring tasks like website maintenance and checking my <a href="https://mainwp.com/">MainWP dashboard</a>. I also have
recurring tasks for invoicing, tracking expenses, and other important business things.</p>

<p>This file is also where I have my primary time tracking and reporting. Org-mode already supports
this pretty nicely, I just use the built-in <a href="https://orgmode.org/manual/The-clock-table.html">clocktable feature</a>.</p>

<h3 id="clientsorg"><code class="language-plaintext highlighter-rouge">Clients/*.org</code></h3>

<p>Clients that have large projects or ongoing business get their own file. This makes organization a
lot easier. All tasks associated with a client and their various projects end up in these individual
files. The important part is making sure that these files are included in the time-tracking
clock table <em>and</em> your org-mode agenda, so you can see what is going on every week.</p>

<h3 id="references-and-linking">References and Linking</h3>

<p>I have <code class="language-plaintext highlighter-rouge">C-c l</code> bound to <code class="language-plaintext highlighter-rouge">org-store-link</code> and use it all the time to link to various files,
directories, URLs, and even emails. I can then use those links in my client notes, various tasks in
my to-do list, and so on. This helps me keep my agenda organized even when my filesystem and
browser bookmarks are a bit of a mess.</p>

<h2 id="email-with-mu4e">Email with mu4e</h2>

<p>I have been reading and managing my email in Emacs for over 25 years. There have been a few breaks
here and there where I have tried out other software or even web mail clients, but it has always been
a headache. I return to Emacs! Long ago, I used <a href="https://gitlab.com/emacs-vm/vm">VM</a> (which seems to have taken on new life!), but
currently I use <a href="https://djcbsoftware.nl/code/mu/mu4e/index.html">mu4e</a>.</p>

<p>This gives me a ton of power and flexibility when dealing with email. I have custom functions to
help me compose and organize my email, and I can use <code class="language-plaintext highlighter-rouge">org-store-link</code> to keep track of individual
emails from clients as they relate to agenda items. I even have a function to convert emails that I
have written in Markdown into HTML email, and one that searches for questions in a client email to
make sure I haven’t missed anything.</p>

<p>The ability to write custom code to both process and create email is extremely powerful and a great
time saver.</p>

<h2 id="writing-code">Writing Code</h2>

<p>I don’t know what else to say about this, I use Emacs for doing all of my software development. I
make sure to use <a href="https://github.com/joaotavora/eglot">Eglot</a> whenever there is a language server available, and I try to leverage all the
fancy features offered by Emacs whenever possible. The vast majority of projects for clients are PHP
(thanks <a href="/wordpress/">WordPress</a>), Go, JavaScript, and TypeScript.</p>

<h2 id="writing-words">Writing Words</h2>

<p>Previously, I have shared quite a bit about <a href="/tags/writing/">writing in Emacs</a>. I like to start everything in
org-mode, but I also write quite a bit in Markdown. Emacs has become a powerful tool for writing. I
use the <a href="https://writewithharper.com/">Harper language server</a> along with Eglot to check grammar and spelling.</p>

<h2 id="track-all-changes-with-magit">Track All Changes with Magit</h2>

<p>Version control is essential, a lesson I have learned over 30+ years of software development. While
<a href="https://git-scm.com/">Git</a> is not part of Emacs, the software I use to interface with Git is. <a href="https://magit.vc/">Magit</a> is a Git user interface
that runs entirely in Emacs. I use it to track my writing, my source code, and even all of my
org-mode files. Using version control is so essential that I have a weekly repeating agenda task
reminding me to check all of my everyday files to make sure I have checked-in my changes for the
week.</p>

<h2 id="thinking-music-with-emms">Thinking Music with EMMS</h2>

<p>I like to have some soothing background music when I am programming, writing, or otherwise working
on my computer. However, if that background music has lyrics, it can be really distracting. It is
easy to make a playlist for various suitable <a href="https://somafm.com/">SomaFM</a> channels to load into <a href="https://www.gnu.org/software/emms/">EMMS (the Emacs Multimedia
System)</a> using the command <code class="language-plaintext highlighter-rouge">M-x emms-play-playlist</code>.</p>

<p>Try saving the following into <code class="language-plaintext highlighter-rouge">playlist.el</code> somewhere, and using it the next time you are writing:</p>

<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">;;; This is an EMMS playlist file Play it with M-x emms-play-playlist</span>
 <span class="p">((</span><span class="vg">*track*</span> <span class="p">(</span><span class="k">type</span> <span class="o">.</span> <span class="nv">url</span><span class="p">)</span> <span class="p">(</span><span class="nv">name</span> <span class="o">.</span> <span class="s">"https://somafm.com/synphaera.pls"</span><span class="p">))</span>
  <span class="p">(</span><span class="vg">*track*</span> <span class="p">(</span><span class="k">type</span> <span class="o">.</span> <span class="nv">url</span><span class="p">)</span> <span class="p">(</span><span class="nv">name</span> <span class="o">.</span> <span class="s">"https://somafm.com/gsclassic.pls"</span><span class="p">))</span>
  <span class="p">(</span><span class="vg">*track*</span> <span class="p">(</span><span class="k">type</span> <span class="o">.</span> <span class="nv">url</span><span class="p">)</span> <span class="p">(</span><span class="nv">name</span> <span class="o">.</span> <span class="s">"https://somafm.com/sonicuniverse.pls"</span><span class="p">))</span>
  <span class="p">(</span><span class="vg">*track*</span> <span class="p">(</span><span class="k">type</span> <span class="o">.</span> <span class="nv">url</span><span class="p">)</span> <span class="p">(</span><span class="nv">name</span> <span class="o">.</span> <span class="s">"https://somafm.com/groovesalad.pls"</span><span class="p">)))</span>
</code></pre></div></div>

<p>And make sure to check out SomaFM’s selection to find some good background music that suits your
tastes!</p>

<h2 id="and-the-tools-i-have-missed">And the tools I have missed</h2>

<p>There are undoubtedly Emacs tools that I have missed in this brief overview. I have been wracking my
brain as I write, trying to see what I have forgotten or overlooked. Frankly, Emacs has become such
a central part of the organization for my freelancing that there are probably many tools, packages,
and processes that I use every day without thinking about it too much.</p>

<p>Emacs makes it possible for me to freelance for multiple clients and small businesses without losing
my mind with organization and task management. The tools it provides allow me to stay on top of
multiple projects, handle client relationships, and keep track of years worth of tasks,
communications, and projects. Without it, I’d be sunk!</p>

<p>What Emacs tools are you using to manage your freelance business? I am always looking for ways to
improve or streamline my process.</p>

<p><em>The featured image for this post comes from Agostino Ramelli’s</em> Le diverse et artificiose machine <em>(1588). <a href="https://publicdomainreview.org/collection/agostino-ramelli-theatre-of-machines/">Read more about it on the Public Domain Review.</a></em></p>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="org-mode" /><category term="programming" /><category term="writing" /><category term="music" /><category term="wordpress" /><category term="emacs-lisp" /><category term="email" /><category term="git" /><category term="tools" /><summary type="html"><![CDATA[Freelancing for small businesses and organizations leads to a position where you are juggling a number of projects for multiple clients. You need to keep track of a number of tasks ranging from software development to sending emails to project management. This is a lot easier when you have a system that can do a bunch of the work for you, which is why I use Emacs as my freelancer command center. I would like to share some of the tools and workflows I use in Emacs to help me keep on top of multiple clients’ needs and expectations.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arnesonium.com/assets/img/featured/ramelli-artifisioso-machine-1200px.jpg" /><media:content medium="image" url="https://arnesonium.com/assets/img/featured/ramelli-artifisioso-machine-1200px.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">An Emacs Application Launcher for Regolith</title><link href="https://arnesonium.com/2025/11/regolith-emacs-launcher" rel="alternate" type="text/html" title="An Emacs Application Launcher for Regolith" /><published>2025-11-19T00:00:00+00:00</published><updated>2025-11-19T00:00:00+00:00</updated><id>https://arnesonium.com/2025/11/regolith-emacs-launcher</id><content type="html" xml:base="https://arnesonium.com/2025/11/regolith-emacs-launcher"><![CDATA[<p>I run the <a href="https://regolith-desktop.com/">Regolith Desktop Environment</a> on my laptop, which I love because it provides a convenient GNOME wrapper and interface for the <a href="https://i3wm.org/">i3 tiling window manager</a>. Regolith relies on a program called <code class="language-plaintext highlighter-rouge">ilia</code> for application launching, and sometimes <code class="language-plaintext highlighter-rouge">ilia</code> gets caught in some kind of CPU-churning state that locks up my whole system. I have not been able to figure out what is causing it, so I (of course) turned to Emacs for a solution.</p>

<!--more-->

<h2 id="turning-to-consult-omni">Turning to <code class="language-plaintext highlighter-rouge">consult-omni</code></h2>

<p>Armin Darvish has created a powerful Emacs package called <a href="https://github.com/armindarvish/consult-omni"><code class="language-plaintext highlighter-rouge">consult-omni</code></a>, which provides a wrapper around <code class="language-plaintext highlighter-rouge">consult</code> for searching through any number of information sources. I believe <code class="language-plaintext highlighter-rouge">consult-omni</code> was originally intended to query web search engines and document databases, but Darvish has also provided a search mode for your local desktop applications, and can act as an application launcher.</p>

<p>Darvish provides an example application launcher in his <code class="language-plaintext highlighter-rouge">consult-omni</code> YouTube tutorial. The source code is straightforward, but I wanted to tweak it just a little. You can view <a href="https://github.com/armindarvish/consult-omni/wiki/YouTube-Tutorial#create-a-launcher">his original on the project’s wiki on GitHub</a>. You can watch him explain his technique below.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/wNH2E7iT__c?start=8595" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>After a few tweaks, here is what I came up with.</p>

<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">consult-launcher</span> <span class="p">()</span>
  <span class="s">"A launcher suitable for use from a window manager."</span>
  <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="k">let*</span> <span class="p">((</span><span class="nv">width</span> <span class="p">(</span><span class="nb">floor</span> <span class="p">(</span><span class="nb">*</span> <span class="mf">0.6</span> <span class="p">(</span><span class="nv">display-pixel-width</span><span class="p">))))</span>
         <span class="p">(</span><span class="nv">height</span> <span class="p">(</span><span class="nb">floor</span> <span class="p">(</span><span class="nb">*</span> <span class="mf">0.6</span> <span class="p">(</span><span class="nv">display-pixel-height</span><span class="p">))))</span>
         <span class="p">(</span><span class="nv">left</span> <span class="p">(</span><span class="nb">floor</span> <span class="p">(</span><span class="nb">*</span> <span class="mf">0.2</span> <span class="p">(</span><span class="nv">display-pixel-width</span><span class="p">))))</span>
         <span class="p">(</span><span class="nv">top</span> <span class="p">(</span><span class="nb">floor</span> <span class="p">(</span><span class="nb">*</span> <span class="mf">0.2</span> <span class="p">(</span><span class="nv">display-pixel-height</span><span class="p">))))</span>
         <span class="p">(</span><span class="nv">params</span> <span class="o">`</span><span class="p">((</span><span class="nv">name</span> <span class="o">.</span> <span class="s">"omni-launcher"</span><span class="p">)</span>
                   <span class="p">(</span><span class="nv">width</span> <span class="o">.</span> <span class="o">,</span><span class="p">(</span><span class="nb">cons</span> <span class="ss">'text-pixels</span> <span class="nv">width</span><span class="p">))</span>
                   <span class="p">(</span><span class="nv">height</span> <span class="o">.</span> <span class="o">,</span><span class="p">(</span><span class="nb">cons</span> <span class="ss">'text-pixels</span> <span class="nv">height</span><span class="p">))</span>
                   <span class="p">(</span><span class="nv">left</span> <span class="o">.</span> <span class="o">,</span><span class="nv">left</span><span class="p">)</span>
                   <span class="p">(</span><span class="nv">top</span> <span class="o">.</span> <span class="o">,</span><span class="nv">top</span><span class="p">)</span>
                   <span class="p">(</span><span class="nv">minibuffer</span> <span class="o">.</span> <span class="nv">only</span><span class="p">)))</span>
         <span class="p">(</span><span class="nv">frame</span> <span class="p">(</span><span class="nv">make-frame</span> <span class="nv">params</span><span class="p">)))</span>
    <span class="p">(</span><span class="nv">with-selected-frame</span> <span class="nv">frame</span>
      <span class="p">(</span><span class="nv">select-frame-set-input-focus</span> <span class="nv">frame</span><span class="p">)</span>
      <span class="c1">;; If i3 is running and there is a control socket, let's tell</span>
      <span class="c1">;; it we are a floating frame.</span>
      <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nv">getenv</span> <span class="s">"I3SOCK"</span><span class="p">)</span>
          <span class="p">(</span><span class="nv">call-process</span> <span class="s">"i3-msg"</span> <span class="no">nil</span> <span class="no">nil</span> <span class="no">nil</span>
                        <span class="p">(</span><span class="nb">format</span> <span class="s">"[id=%s] floating enable"</span>
                                <span class="p">(</span><span class="nv">s-trim</span> <span class="p">(</span><span class="nv">shell-command-to-string</span> <span class="s">"xdotool getactivewindow"</span><span class="p">)))))</span>
      <span class="p">(</span><span class="k">unwind-protect</span>
          <span class="p">(</span><span class="k">progn</span> <span class="p">(</span><span class="nv">consult-omni-apps-static</span> <span class="s">".*"</span> <span class="p">(</span><span class="nv">propertize</span> <span class="s">"&gt; "</span> <span class="ss">'face</span> <span class="ss">'consult-omni-path-face</span><span class="p">))</span>
                 <span class="no">nil</span><span class="p">)</span>
        <span class="p">(</span><span class="k">progn</span>
          <span class="p">(</span><span class="nb">when</span> <span class="p">(</span><span class="nv">frame-live-p</span> <span class="nv">frame</span><span class="p">)</span> <span class="p">(</span><span class="nv">delete-frame</span> <span class="nv">frame</span><span class="p">))</span>
          <span class="no">nil</span><span class="p">)))))</span>
</code></pre></div></div>

<p>I made two changes to get this to work nicely with <code class="language-plaintext highlighter-rouge">i3</code>. First, I removed the <code class="language-plaintext highlighter-rouge">yequake</code> dependency. Second, I added a call to <code class="language-plaintext highlighter-rouge">i3-msg</code> that sets the launcher frame as floating, which makes it much nicer to use. Like Darvish’s version, you can run this from the command line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>emacsclient -e '(consult-launcher)'
</code></pre></div></div>

<h2 id="adding-an-ilia-fallback">Adding an <code class="language-plaintext highlighter-rouge">ilia</code> fallback</h2>

<p>Don’t tell all the other Emacs users, but I don’t have Emacs set up to launch automatically when I start my computer and log into X11. I probably should, huh? Also, there are times when I (gasp!) shut down Emacs, usually to restart it or fix something that I have broken. When those times happen, I want to be able to launch applications, so I need a failsafe in case <code class="language-plaintext highlighter-rouge">consult-launcher</code> isn’t available!</p>

<p>To solve this, I created a simple shell wrapper script, which looks like this:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>

<span class="c"># Check if Emacs server is running by looking for the server socket</span>
<span class="c"># Default server name is "server", but you can change this if needed</span>
<span class="nv">SERVER_NAME</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">EMACS_SERVER_NAME</span><span class="k">:-</span><span class="nv">server</span><span class="k">}</span><span class="s2">"</span>
<span class="nv">SERVER_FILE</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">XDG_RUNTIME_DIR</span><span class="k">:-</span><span class="p">/tmp</span><span class="k">}</span><span class="s2">/emacs/</span><span class="k">${</span><span class="nv">SERVER_NAME</span><span class="k">}</span><span class="s2">"</span>

<span class="k">if</span> <span class="o">[</span> <span class="nt">-S</span> <span class="s2">"</span><span class="nv">$SERVER_FILE</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
    <span class="c"># Emacs is running, use emacsclient to launch your application</span>
    emacsclient <span class="nt">-e</span> <span class="s1">'(consult-launcher)'</span>
<span class="k">else</span>
    <span class="c"># Emacs is not running, fall back to ilia</span>
    ilia <span class="nt">-p</span> apps
<span class="k">fi</span>
</code></pre></div></div>

<p>If you want to use this, the important part is that <code class="language-plaintext highlighter-rouge">SERVER_FILE</code> points to the socket that your Emacs server uses. Make sure that <code class="language-plaintext highlighter-rouge">emacsclient</code> and <code class="language-plaintext highlighter-rouge">ilia</code> are both in a reasonable location so your shell can find them, then bind this command to whatever you usually use to launch <code class="language-plaintext highlighter-rouge">ilia</code>.</p>

<p>By the way, if you are using Regolith’s normal method of launching <code class="language-plaintext highlighter-rouge">ilia</code>, you can add your shell script to your Regolith configuration pretty easily. Open <code class="language-plaintext highlighter-rouge">$HOME/.config/regolith3/Xresources</code> in your text editor, and add the line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wm.program.launcher.app: /path/to/your/launcher.sh
</code></pre></div></div>

<p>You can then run <code class="language-plaintext highlighter-rouge">xrdb -override $HOME/.config/regolith3/Xresources</code> and it should work! Good luck.</p>

<h2 id="drawbacks">Drawbacks</h2>

<p>One of the nice things about <code class="language-plaintext highlighter-rouge">ilia</code> is that it keeps track of applications your run frequently, so they tend to bubble up to the top of its application listing. The Emacs method doesn’t do that. I don’t mind so much, I always end up typing in application names. It is fun to use Emacs as an application launcher, and I hope that it helps me avoid the CPU-churn problem that <code class="language-plaintext highlighter-rouge">ilia</code> has been experiencing far too often.</p>

<p>Have I come up with a clever solution, or a lazy workaround? I’m looking forward to hearing your thoughts.</p>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="shell" /><category term="bash" /><category term="lisp" /><category term="programming" /><category term="ubuntu" /><summary type="html"><![CDATA[I run the Regolith Desktop Environment on my laptop, which I love because it provides a convenient GNOME wrapper and interface for the i3 tiling window manager. Regolith relies on a program called ilia for application launching, and sometimes ilia gets caught in some kind of CPU-churning state that locks up my whole system. I have not been able to figure out what is causing it, so I (of course) turned to Emacs for a solution.]]></summary></entry><entry><title type="html">New WordPress Services: Fast Fixes for Portland Businesses</title><link href="https://arnesonium.com/2025/11/new-wordpress-services" rel="alternate" type="text/html" title="New WordPress Services: Fast Fixes for Portland Businesses" /><published>2025-11-05T00:00:00+00:00</published><updated>2025-11-05T00:00:00+00:00</updated><id>https://arnesonium.com/2025/11/new-wordpress-services</id><content type="html" xml:base="https://arnesonium.com/2025/11/new-wordpress-services"><![CDATA[<p>Your WordPress site is either making you money or costing you opportunities. I’m opening up my calendar for quick-turn projects—and offering <strong>free site audits to new clients.</strong></p>

<p><strong>With 10+ years building WordPress sites,</strong> I’ve seen the same problems tank small business budgets: slow load times, security vulnerabilities, broken plugins, and sites that just stop working.</p>

<!--more-->

<h2 id="what-im-offering">What I’m Offering</h2>

<p>See the full list on my <a href="/wordpress/">WordPress services page</a>. Here is a quick rundown:</p>

<ul>
  <li>Quick-turnaround emergency WordPress rescue</li>
  <li>Site speed optimization</li>
  <li>Security hardening</li>
  <li>Plugin customization</li>
</ul>

<p>I am also available for <strong>monthly WordPress support retainers.</strong></p>

<h2 id="first-time-client-special">First-Time Client Special</h2>

<p><strong>Free 30-minute WordPress site audit (normally $75)</strong></p>

<h3 id="what-youll-get">What you’ll get:</h3>

<ul>
  <li>Speed analysis with specific fixes</li>
  <li>Security vulnerability check</li>
  <li>Plugin bloat assessment</li>
  <li>Prioritized action plan</li>
</ul>

<p><strong>No obligation.</strong> Just honest feedback on what’s holding your site back.</p>

<h2 id="between-the-lines">Between the lines</h2>

<p>I’m based in Portland, but work with businesses anywhere. Projects are priced for value and speed—not hourly rates that incentivize me to work slowly.</p>

<p>The bottom line: <strong>If your WordPress site is slow, insecure, or broken, you’re losing money every day.</strong> Let’s fix it this week, not next quarter.</p>

<h2 id="what-next">What next?</h2>

<p>Contact me on my <a href="/wordpress/">WordPress services page</a>, or using the form below.</p>

<!-- modify this form HTML and place wherever you want your form -->
<form action="https://formspree.io/f/xjvzwrkp" method="POST">
  <label>
    Your email:
    <input type="email" name="email" />
  </label>
  <br />
  <label>
    Your message:<br />
    <textarea name="message" rows="20" style="width:90%"></textarea>
  </label>
  <!-- your other form fields go here -->
  <div class="g-recaptcha" data-sitekey="6LcDtPsSAAAAALF66lY2GqToLSZShqoxLMGsBMFf"></div>
  <button type="submit" class="btn">Send</button>
</form>

<p><strong>Questions?</strong> Feel free to DM me on LinkedIn.</p>]]></content><author><name>Erik L. Arneson</name></author><category term="wordpress" /><category term="portland" /><category term="web development" /><category term="debugging" /><summary type="html"><![CDATA[Your WordPress site is either making you money or costing you opportunities. I’m opening up my calendar for quick-turn projects—and offering free site audits to new clients. With 10+ years building WordPress sites, I’ve seen the same problems tank small business budgets: slow load times, security vulnerabilities, broken plugins, and sites that just stop working.]]></summary></entry><entry><title type="html">Interviewed on “Prot Speaks”</title><link href="https://arnesonium.com/2025/08/interviewed-on-prot-speaks" rel="alternate" type="text/html" title="Interviewed on “Prot Speaks”" /><published>2025-08-18T00:00:00+00:00</published><updated>2025-08-18T00:00:00+00:00</updated><id>https://arnesonium.com/2025/08/prot-speaks-interview</id><content type="html" xml:base="https://arnesonium.com/2025/08/interviewed-on-prot-speaks"><![CDATA[<p>Well-known Emacs package creator Protesilaos Stavrou interviewed me for his video podcast series, “Prot Asks.” We talked about a wide variety of topics, from Emacs to podcasting to Portland to public transit. I thought it was a great time, and perhaps you will like it, too!</p>

<!--more-->

<p>You can read and view the video <a href="https://protesilaos.com/codelog/2025-08-17-prot-asks-erik-emacs-1990s-portland-oregon-podcasting/">on Prot’s website and blog</a>, or you can go <a href="https://www.youtube.com/watch?v=6wkfFdiwpyU">straight to YouTube</a>, or you can watch it embedded here below.</p>

<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/6wkfFdiwpyU?si=ocNz3f6ehqEYYC2G" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Note that Prot is looking for people to talk to on this series! You can join in by <a href="https://protesilaos.com/prot-asks/">signing up on his website</a>.</p>

<p>P.S. In the video, I promised that I would do another Emacs Carnival blog post, and I will, I swear! It is in my org-mode to-do file.</p>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="podcast" /><category term="programming" /><category term="org-mode" /><category term="lisp" /><category term="golang" /><category term="portland" /><summary type="html"><![CDATA[Well-known Emacs package creator Protesilaos Stavrou interviewed me for his video podcast series, “Prot Asks.” We talked about a wide variety of topics, from Emacs to podcasting to Portland to public transit. I thought it was a great time, and perhaps you will like it, too!]]></summary></entry><entry><title type="html">Writing Experience (Emacs Carnival)</title><link href="https://arnesonium.com/2025/07/writing-experience-emacs-carnival" rel="alternate" type="text/html" title="Writing Experience (Emacs Carnival)" /><published>2025-07-07T00:00:00+00:00</published><updated>2025-07-07T00:00:00+00:00</updated><id>https://arnesonium.com/2025/07/writing-experience</id><content type="html" xml:base="https://arnesonium.com/2025/07/writing-experience-emacs-carnival"><![CDATA[<p>This is my contribution to month two of <a href="https://gregnewman.io/blog/emacs-carnival-2025-07-writing-experience/">Greg Newman’s Emacs Carnival</a>. The topic this month is “Writing Experience,” which is perfect, since I write in Emacs all the time. In fact, I am writing this blog post in Emacs right now!
<!--more--></p>

<h2 id="emacs-writing-history">Emacs Writing History</h2>

<p>I do not know how long I have been writing in Emacs, but I have documents written in LaTeX from the early 2000s that were definitely written in Emacs, and I know those weren’t the first. I guess what is interesting about my writing experience in Emacs is how it has developed over the years. Where I originally wrote everything in plain text or LaTeX, over time I moved to org-mode and Markdown.</p>

<p>Writing LaTeX in Emacs taught me to view documents and writing the same way I view source code. Since all of my writing was in text formats, I could easily use version control software to store archives full of text. I began by using <a href="https://en.wikipedia.org/wiki/Concurrent_Versions_System">Concurrent Versions System (CVS)</a>, but eventually moved to Git. I have a few Git repositories with writing, but my biggest dates back to 2009. Those early commits are all LaTeX and plain text files.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>commit c64500897e2509bc3316d252cda10a9119384933
Author: Erik L. Arneson &lt;pXXX@XXX.XXX&gt;
Date:   Sat Dec 5 10:51:06 2009 -0800

    Initial import of an old repository.
</code></pre></div></div>

<p>The oldest org-mode file in my writing repository dates to December 27th, 2010, and is titled “Beer and Pizza.” The commit message indicates that I pulled some writing over from another repository in this commit, so obviously I had been writing with org-mode for quite a while. I know, for instance, that “Beer and Pizza” was an article that I wrote for an early incarnation of <a href="https://southernoregonmagazine.com/">Southern Oregon Magazine</a>, and my notes are dated back to February of that year.</p>

<h2 id="org-mode-is-a-life-changer">Org-mode Is A Life-changer</h2>

<p>You have probably read other people’s experience with writing in org-mode in Emacs, so instead of sharing an exhausting list of all the life-changing, writing-improving things that it has brought me, here are a few bits that I really love about it.</p>

<p><strong>It is fantastic at organizing writing projects.</strong> From being able to shift around headings and blocks of text, to combining to-do lists with writing projects, to being able to create macros and include different files—all of these things make org-mode perfect for working on medium and large projects. I write everything from blog posts to podcast scripts to <em>books</em> in org-mode, and it helps me stay organized.</p>

<p><strong>I do not have to write in Word or Google Docs.</strong> The export functions in org-mode do a great job creating Word files, ODT files, HTML files, and all kinds of formats. If org-mode’s export abilities aren’t good enough, it can also interface with <a href="https://pandoc.org/">pandoc</a> to cover all the other cases! This means I get to use all of my familiar tools and processes when writing, and I don’t have to worry about <a href="https://lions-way-presents.captivate.fm/episode/the-word-processor-war/">awful word processing software</a>!</p>

<p><strong>Everything I need to write can happen in org-mode!</strong> I have several websites that are built entirely out of org-mode. When I need to create slides for a lecture, I do it in org-mode. When I write adventures for Dungeons &amp; Dragons, I do it in org-mode. When I need to whip up a spreadsheet to handle my household budget, I do it in org-mode. When I need to write a formal letter, I do it in org-mode. Frankly, it is so expressive and flexible, that I don’t need to use other tools for writing. It’s all Emacs and org-mode.</p>

<h2 id="emacs-can-be-distraction-free">Emacs Can Be Distraction-Free</h2>

<p>I have a hotkey connected to <a href="https://github.com/joostkremers/writeroom-mode">writeroom-mode</a>, which plonks me right into a full-screen, distraction-free writing mode. Easy as pie! This means that when I really need to get down to business and get a lot of writing done, I don’t need to switch to a new app, leave my familiar tools behind, or go through any extra trouble. It’s just right here, built in.</p>

<h2 id="no-going-back">No Going Back</h2>

<p>I’ve been writing with Emacs for decades. It is my comfortable writing spot. I honestly cannot see myself abandoning it for another writing tool, because it works for me. I just used a couple of commands to check my three biggest writing repositories, and I have approximately 630,000 words written in org-mode between them. That’s a commitment!</p>

<p>I am aware that there are a lot of people out there using Emacs for writing, so I am excited to see what others share. I’m very pleased with Greg Newman’s choice for this second writing topic.</p>

<p><strong>Edit:</strong> I realized that what I was calling my second biggest writing repository was actually my third biggest. I updated some numbers to reflect another 130,000 words of writing I found.</p>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="writing" /><category term="org-mode" /><summary type="html"><![CDATA[This is my contribution to month two of Greg Newman’s Emacs Carnival. The topic this month is “Writing Experience,” which is perfect, since I write in Emacs all the time. In fact, I am writing this blog post in Emacs right now!]]></summary></entry><entry><title type="html">maybe: A command-line tool that succeeds sometimes</title><link href="https://arnesonium.com/2025/02/maybe-succeeds-sometimes" rel="alternate" type="text/html" title="maybe: A command-line tool that succeeds sometimes" /><published>2025-02-13T00:00:00+00:00</published><updated>2025-02-13T00:00:00+00:00</updated><id>https://arnesonium.com/2025/02/maybe-succeeds-sometimes</id><content type="html" xml:base="https://arnesonium.com/2025/02/maybe-succeeds-sometimes"><![CDATA[<p>I just released <a href="https://github.com/pymander/maybe/releases/tag/v1.0.0">version 1.0.0 of <code class="language-plaintext highlighter-rouge">maybe</code></a>, a command-line utility that succeeds some of the time. It
is written in Go and is not very many lines of code, but I do hope that it can be useful for people.</p>

<!--more-->

<h2 id="some-history">Some History</h2>

<p>I recently got a <a href="https://amzn.to/3CYb9he">Korg Volca Drums</a> drum synthesizer. It has a sequencer that allows you to program
the probability of a particular instrument playing on a particular step, and I thought that was a
really cool feature. This inspired me to think about cron jobs that happen only some of the time.
Maybe the cron job would run, maybe it wouldn’t.</p>

<p>This inspired me to write <a href="https://github.com/pymander/maybe"><code class="language-plaintext highlighter-rouge">maybe</code></a>, a command-line utility that returns either success or failure,
based on flags you pass it. It defaults to succeeding 50 percent of the time, but you can change
that. This means you could make a cron job like this, which would run <code class="language-plaintext highlighter-rouge">do-something.sh</code> 40 percent
of the time.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># At midnight every Sunday, do something sometimes.</span>
0 0 <span class="k">*</span> <span class="k">*</span> 0     maybe <span class="nt">-chance</span> 40 <span class="o">&amp;&amp;</span> <span class="k">do</span><span class="nt">-something</span>.sh
</code></pre></div></div>

<h2 id="the-future-of-maybe">The Future of maybe</h2>

<p>I don’t think I will stop at version 1.0.0. I have already considered what may happen to <code class="language-plaintext highlighter-rouge">maybe</code> in
the future. Here are some things that I would like to do:</p>

<ul>
  <li>Add cryptographically secure randomness. There is no reason to use Go’s default random library.
Let us try to be as random as possible.</li>
  <li>More granularity to the randomness. What if you want to run something 40.5 percent of the time?</li>
  <li>Experiment with GitHub actions, such as building binaries for every operating system that <code class="language-plaintext highlighter-rouge">maybe</code>
should support.</li>
</ul>

<p>As you can see, the opportunities for improvement are many. And maybe (ha ha!) you will see
improvements soon!</p>

<p>Perhaps this is a good time to visit <a href="https://github.com/pymander/maybe"><code class="language-plaintext highlighter-rouge">maybe</code> on GitHub</a> and star the repo so others can find it?</p>]]></content><author><name>Erik L. Arneson</name></author><category term="programming" /><category term="golang" /><category term="github" /><summary type="html"><![CDATA[I just released version 1.0.0 of maybe, a command-line utility that succeeds some of the time. It is written in Go and is not very many lines of code, but I do hope that it can be useful for people.]]></summary></entry><entry><title type="html">Configuring Orgzly Interaction with Directory Local Variables</title><link href="https://arnesonium.com/2025/01/configuring-orgzly-with-directory-local-variables" rel="alternate" type="text/html" title="Configuring Orgzly Interaction with Directory Local Variables" /><published>2025-01-28T00:00:00+00:00</published><updated>2025-01-28T00:00:00+00:00</updated><id>https://arnesonium.com/2025/01/directory-local-with-orgzly</id><content type="html" xml:base="https://arnesonium.com/2025/01/configuring-orgzly-with-directory-local-variables"><![CDATA[<p>I use <a href="https://github.com/orgzly-revived/orgzly-android-revived">Orgzly Revived</a> on my phone to capture to-do items, tasks, writing ideas, and projects. Its files are then synced with an ownCloud server. Those same files are also constantly open in Emacs on my computer, which means there can be some gnarly issues with things getting out of sync. It took me a while to figure out a good way to manage this, and in this brief blog post, I would like to share my solution.</p>

<!--more-->

<p>Setting up a remote storage system is outside the scope of this server. Orgzly Revived works well with Dropbox, ownCloud, and nextCloud, though support for the other two is nicer as it can support automatic syncing in more situations. The <a href="https://github.com/orgzly-revived/documentation">Orgzly Revived documentation</a> has an excellent description of how that configuration works.</p>

<p>Note that to keep things simple, I keep my Orgzly Revived files and <em>only</em> those files in a directory on my remote server. On my computer, the location for these files is <code class="language-plaintext highlighter-rouge">~/org/orgzly/</code>, which is how I shall refer to it later on.</p>

<h2 id="configuring-orgzly-revived-auto-sync">Configuring Orgzly Revived Auto-sync</h2>

<p>To configure the auto-sync capabilities in Orgzly Revived, go to the settings screen in the app and then navigate to <strong>Sync &gt; Auto-sync</strong>. Ensure that the following options are toggled on:</p>

<ul>
  <li>Auto-sync</li>
  <li>Note created</li>
  <li>Note updated or deleted</li>
  <li>App started or resumed</li>
</ul>

<p>This ensures that Orgzly Revived is constantly checking your remote storage and both fetching and uploading changes.</p>

<h2 id="configuring-emacs-and-org-mode">Configuring Emacs and Org-mode</h2>

<p>On my computer, I want any changes that Orgzly Revived has updated to be automatically loaded into Emacs. Since I always leave Emacs running, that means it needs to detect changes on the disk for those particular files. I use two different methods to do this. First, in my init file, I have the following piece of code:</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">orgzly-directory</span> <span class="p">(</span><span class="nv">expand-file-name</span> <span class="s">"~/org/orgzly/"</span><span class="p">))</span>
<span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">'revert-without-query</span> <span class="p">(</span><span class="nv">rx</span> <span class="nv">bol</span> 
                                       <span class="p">(</span><span class="nb">eval</span> <span class="nv">orgzly-directory</span><span class="p">)</span> 
                                       <span class="p">(</span><span class="nb">+</span> <span class="p">(</span><span class="nb">not</span> <span class="s">"/"</span><span class="p">))</span> <span class="s">".org"</span> 
                                       <span class="nv">eol</span><span class="p">))</span>
</code></pre></div></div>

<p>This uses the <code class="language-plaintext highlighter-rouge">rx</code> macro to easily create a regular expression that matches any filename ending in <code class="language-plaintext highlighter-rouge">".org"</code> in the directory containing Orgzly Revived files. You may need to play around with the regular expression to get the right match. By adding those files to <code class="language-plaintext highlighter-rouge">revert-without-query</code>, Emacs will not bug you with extra questions and confirmations when changes are detected. However, this only works when <code class="language-plaintext highlighter-rouge">auto-revert-mode</code> is enabled!</p>

<p>At first, I thought there may be a way to enable <code class="language-plaintext highlighter-rouge">auto-revert-mode</code> on a file-by-file basis, but quickly realized that this could cause too many problems with creating new files in the Orgzly Revived app. Eventually, I realized that the solution would be to make a <code class="language-plaintext highlighter-rouge">.dir-locals.el</code> file in <code class="language-plaintext highlighter-rouge">~/org/orgzly/</code>. Open that file in Emacs, and stick the following in it.</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">((</span><span class="no">nil</span> <span class="o">.</span> <span class="p">((</span><span class="nb">eval</span> <span class="o">.</span> <span class="p">(</span><span class="nv">auto-revert-mode</span> <span class="mi">1</span><span class="p">)))))</span>
</code></pre></div></div>

<p>That ensures that any file in that directory will have <code class="language-plaintext highlighter-rouge">auto-revert-mode</code> enabled.</p>

<p>Once you have done this, you can add task files or inbox files in <code class="language-plaintext highlighter-rouge">~/org/orgzly</code> to your <code class="language-plaintext highlighter-rouge">org-agenda-files</code> variable, and they will show up in your agenda views as usual.</p>

<p>Hopefully these instructions work for you. Please let me know if you can see any improvements or problems with the way I have implemented this. Happy task tracking!</p>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="org-mode" /><category term="howto" /><summary type="html"><![CDATA[I use Orgzly Revived on my phone to capture to-do items, tasks, writing ideas, and projects. Its files are then synced with an ownCloud server. Those same files are also constantly open in Emacs on my computer, which means there can be some gnarly issues with things getting out of sync. It took me a while to figure out a good way to manage this, and in this brief blog post, I would like to share my solution.]]></summary></entry><entry><title type="html">Using WireGuard over xfinitywifi</title><link href="https://arnesonium.com/2024/11/using-wireguard-over-xfinitywifi" rel="alternate" type="text/html" title="Using WireGuard over xfinitywifi" /><published>2024-11-08T00:00:00+00:00</published><updated>2024-11-08T00:00:00+00:00</updated><id>https://arnesonium.com/2024/11/wireguard-over-xfinitywifi</id><content type="html" xml:base="https://arnesonium.com/2024/11/using-wireguard-over-xfinitywifi"><![CDATA[<p>If you are a Comcast Xfinity customer, you hopefully know that you can log into WiFi hotspots wherever other Xfinity customers have them enabled, all using the SSID <code class="language-plaintext highlighter-rouge">xfinitywifi</code>. You may have also figured out by now that <a href="https://www.wireguard.com/">WireGuard</a> doesn’t seem to work over this WiFi service without additional tweaking.</p>

<p>Well, I have tweaked a WireGuard configuration until it seems to work.
<!--more--></p>

<p>I searched the Web for quite a while to find a good solution, and there seemed to be a general <em>feeling</em> that the MTU needed to be adjusted. Lots of people offered various solutions.</p>

<p>Through some experimentation, I discovered that on the client-side WireGuard configuration, the maximum transmission unit (MTU) needed to be set to 1280. Apparently this is a significant number because it’s the <a href="https://en.wikipedia.org/wiki/Maximum_transmission_unit#MTUs_for_common_media">lowest possible MTU for an IPv6 network</a>. Setting the MTU so low will impact performance, but if you are going through a WireGuard VPN, performance probably isn’t your biggest concern.</p>

<p>In the end, your client-side WireGuard configuration, which is located in <code class="language-plaintext highlighter-rouge">/etc/wireguard/wg0.conf</code> if you are on Linux, should look like the example below. Note in particular the <code class="language-plaintext highlighter-rouge">MTU</code> and <code class="language-plaintext highlighter-rouge">AllowedIPs</code> line.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Interface]
PrivateKey = &lt;your private key&gt;
Address = &lt;your ip address and netmask&gt;
DNS = &lt;your DNS server&gt;
# This MTU line is the important one!
MTU = 1280

[Peer]
PublicKey = &lt;your public key&gt;
PresharedKey = &lt;your pre-shared key&gt;
Endpoint = &lt;your endpoint&gt;:51820
# This is important for client-side routing!
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25
</code></pre></div></div>

<p><a href="https://amzn.to/4hI6hMI"><img src="/assets/img/sft1200_1.webp#right" alt="GL.iNet GL-SFT1200 Opal" /></a>
This became important to me because I’ve been shifting over to using a secure travel router when I am out and about. The router I chose to go with is the <a href="https://amzn.to/4hI6hMI">GL.iNet GL-SFT1200 Opal</a>, and it has built-in WireGuard support that you can enable with a switch on the side. It is very cute and effective. This allows me to use WireGuard to create a VPN tunnel back to <a href="/2016/07/a-poor-mans-dynamic-dns-with-ansible-and-amazon-route53/">my home network</a>, which gives me the ability to use my dual <a href="https://pi-hole.net/">pi-hole</a> setup from anywhere in the world!</p>

<p>If you have been struggling with that pesky <code class="language-plaintext highlighter-rouge">xfinitywifi</code> network and its weird settings, I hope this helps. It took me too long to find the right solution!</p>]]></content><author><name>Erik L. Arneson</name></author><category term="security" /><category term="networking" /><category term="howto" /><summary type="html"><![CDATA[If you are a Comcast Xfinity customer, you hopefully know that you can log into WiFi hotspots wherever other Xfinity customers have them enabled, all using the SSID xfinitywifi. You may have also figured out by now that WireGuard doesn’t seem to work over this WiFi service without additional tweaking. Well, I have tweaked a WireGuard configuration until it seems to work.]]></summary></entry><entry><title type="html">Examining To-Do Lists in Org-mode</title><link href="https://arnesonium.com/2024/10/todo-lists-in-org-mode" rel="alternate" type="text/html" title="Examining To-Do Lists in Org-mode" /><published>2024-10-22T00:00:00+00:00</published><updated>2024-10-22T00:00:00+00:00</updated><id>https://arnesonium.com/2024/10/todo-lists</id><content type="html" xml:base="https://arnesonium.com/2024/10/todo-lists-in-org-mode"><![CDATA[<p>When you are self-employed, you need to be very well organized. There is never anybody looking over your shoulder, reminding you of everything on your to-do list. You don’t have a project manager reminding you of every step in your big projects. I use <a href="https://orgmode.org/">Org-mode</a> in Emacs to manage all of my tasks, to-do lists, and projects.
<!--more--></p>

<p>Many people have already <a href="https://www.badykov.com/emacs/be-productive-with-org-mode/">written about</a> <a href="https://medium.com/emacs/how-i-tackle-projects-with-org-mode-ee5d6b08f41">why Org-mode</a> <a href="https://dl.acm.org/doi/fullHtml/10.5555/1344170.1344179">is a good choice</a> <a href="https://karl-voit.at/orgmode/">for this</a>, so I am not going to. I will just mention that many years ago, perhaps around 2007, I read <a href="https://amzn.to/3YgIo6j"><em>Getting Things Done</em> by David Allen</a> and got inspired to implement something like it in Org-mode. The system has slowly evolved over the years, but it has also become unweildy.</p>

<p>For the past few years, I had been tagging my tasks with the states <code class="language-plaintext highlighter-rouge">TODO</code>, <code class="language-plaintext highlighter-rouge">NEXT</code>, and <code class="language-plaintext highlighter-rouge">DONE</code>, primarily. I had some extra states sitting around for things that got canceled or delegated, and at some point I added a <code class="language-plaintext highlighter-rouge">WAITING</code> tag for when I needed somebody else to finish something, first. But the problem was, the <code class="language-plaintext highlighter-rouge">TODO</code> items really piled up. They became uncomfortable to sort through.</p>

<p>Inspired by a <a href="https://sachachua.com/blog/2024/10/shuffling-my-org-mode-unscheduled-tasks/">blog post by Sacha Chua</a> earlier this week, I cleaned up my to-do states. I added <code class="language-plaintext highlighter-rouge">STARTED</code> and <code class="language-plaintext highlighter-rouge">SOMEDAY</code>, then went through the big list of outstanding items and re-evaluated their proper states. <code class="language-plaintext highlighter-rouge">SOMEDAY</code> won in 80% of cases, which really cleaned up the list. Now I can begin my day with a custom agenda command that looks for just <code class="language-plaintext highlighter-rouge">NEXT</code> and <code class="language-plaintext highlighter-rouge">STARTED</code> tasks, so I know what is most important. And I can end my day looking at <code class="language-plaintext highlighter-rouge">TODO</code> tasks to see if any should be switched to <code class="language-plaintext highlighter-rouge">NEXT</code>.</p>

<p>Here is what my configuration looks like now. First, I configure <code class="language-plaintext highlighter-rouge">org-todo-keywords</code> to handle the various states that my to-do items need. I am hoping that someday I’ll pare this down, but for now, this works.</p>

<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">org-todo-keywords</span> 
      <span class="o">'</span><span class="p">((</span><span class="nc">sequence</span> <span class="s">"TODO(t)"</span> <span class="s">"NEXT(n)"</span> <span class="s">"STARTED(s!)"</span> <span class="s">"WAITING(w@/!)"</span> <span class="s">"|"</span> <span class="s">"DONE(d!)"</span><span class="p">)</span>
        <span class="p">(</span><span class="nc">sequence</span> <span class="s">"SOMEDAY(o)"</span> <span class="s">"|"</span><span class="p">)</span>
        <span class="p">(</span><span class="nc">sequence</span> <span class="s">"|"</span> <span class="s">"DELEGATED(g@/!)"</span> <span class="s">"CANCELLED(c!)"</span><span class="p">)))</span>
</code></pre></div></div>

<p>I then added a “daily driver” command to my agenda to let me see the most important tasks today. This would probably be a good place for <code class="language-plaintext highlighter-rouge">add-to-list</code> instead of <code class="language-plaintext highlighter-rouge">setq</code>, but it’s just an example!</p>

<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">org-agenda-custom-commands</span>
      <span class="o">'</span><span class="p">((</span><span class="s">"n"</span> <span class="s">"Next tasks"</span> <span class="p">((</span><span class="nv">todo</span> <span class="s">"STARTED"</span><span class="p">)</span>
                           <span class="p">(</span><span class="nv">todo</span> <span class="s">"NEXT"</span><span class="p">)))</span>
</code></pre></div></div>

<p>Next, after Sacha suggested it in a post on Mastodon, I configured to-do items to automatically switch to the <code class="language-plaintext highlighter-rouge">STARTED</code> state when I clock-in to them.</p>

<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">org-clock-in-switch-to-state</span> <span class="s">"STARTED"</span><span class="p">)</span>
</code></pre></div></div>

<p>Finally, I have been playing around with configuring <code class="language-plaintext highlighter-rouge">org-stuck-projects</code> to be more useful. I tag all of my projects with a <code class="language-plaintext highlighter-rouge">@project</code> tag, and then have my to-do entries underneath them as keywords. I do not think that this works as intended yet. I don’t think I will be able to figure out the proper settings here until I have another stuck project; let’s hope that never happens, and I never need this report.</p>

<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">org-stuck-projects</span> <span class="o">'</span><span class="p">(</span><span class="s">"+@project/-DONE-SOMEDAY"</span>
                          <span class="c1">;; Keywords to identify non-stuck projects</span>
                          <span class="p">(</span><span class="s">"TODO"</span> <span class="s">"NEXT"</span> <span class="s">"STARTED"</span><span class="p">)</span>
                          <span class="c1">;; Keywords to identify stuck projects.</span>
                          <span class="p">(</span><span class="s">"WAITING"</span><span class="p">)</span>
                          <span class="s">""</span><span class="p">))</span>
</code></pre></div></div>

<p>The only lesson that I can really hope to share with you, dear reader, is that it is a good idea to examine your task management system regularly to fine-tune it to your needs. What I have noticed is that I can come up with great task management plans, but the implementation rarely survives contact with the real world.</p>

<p>If, upon reading this, you have questions or suggestions, especially for <code class="language-plaintext highlighter-rouge">org-stuck-projects</code>, I would love to hear about it in the comments, or <a href="https://fosstodon.org/@pymander">on Mastodon</a>. Thank you for reading!</p>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="org-mode" /><category term="tools" /><summary type="html"><![CDATA[When you are self-employed, you need to be very well organized. There is never anybody looking over your shoulder, reminding you of everything on your to-do list. You don’t have a project manager reminding you of every step in your big projects. I use Org-mode in Emacs to manage all of my tasks, to-do lists, and projects.]]></summary></entry><entry><title type="html">Many Posts of Interest for January 2024</title><link href="https://arnesonium.com/2024/01/18-many-posts-of-interest.html" rel="alternate" type="text/html" title="Many Posts of Interest for January 2024" /><published>2024-01-18T00:00:00+00:00</published><updated>2024-01-18T00:00:00+00:00</updated><id>https://arnesonium.com/2024/01/export</id><content type="html" xml:base="https://arnesonium.com/2024/01/18-many-posts-of-interest.html"><![CDATA[<p>Once again, I have collected far too many links over far too long a period of time. Anyhow, here is a collection of blog posts and links from around the web that I found to be good reading over the past couple of months. Is it too late in January to say Happy New Year?
<!--more--></p>

<p>2024 has been a pretty weird year for me so far. I spent the first couple weeks of the year in isolation, and then Portland got hit with a Snowpocalypse (I love how that’s a regular thing now), followed by freezing rain. This is the third day in a row that the sidewalk outside my front door is basically an ice skating rink. That means it’s a great time to do some reading!</p>

<h2 id="security">Security</h2>

<ul>
  <li><a href="https://signal.org/blog/signal-is-expensive/">Privacy is Priceless, but Signal is Expensive</a> <strong>[Security]</strong>
I really appreciate this incredible breakdown of Signal’s costs and how they use donations. Signal
is cool. You should be using it. For real.</li>
  <li><a href="https://www.schneier.com/blog/archives/2023/11/breaking-laptop-fingerprint-sensors.html">Breaking Laptop Fingerprint Sensors</a> (Bruce Schneier) <strong>[Security]</strong>
Do people actually use their laptop fingerprint sensors? I hate mine. I just disable the dang
things and use a password.</li>
  <li><a href="https://www.schneier.com/blog/archives/2023/12/surveillance-by-the-us-postal-service.html">Surveillance by the US Postal Service</a> (Bruce Schneier) <strong>[Security]</strong>
To Catch a Thief, starring Cliff from Cheers.</li>
  <li><a href="https://siliconflorist.com/2023/12/06/senator-ron-wyden-of-oregon-opens-discussion-of-push-notification-surveillance-by-apple-and-google/">Senator Ron Wyden of Oregon opens discussion of push notification surveillance by Apple and Google</a> (Rick Turoczy) <strong>[Security]</strong>
There is some interesting legal stuff going on around the ability of tech companies like Apple and Google to use push
notifications to capture user data that could be used for nefarious purposes. Definitely a story to
keep your eye on!</li>
  <li><a href="https://irreal.org/blog/?p=11863">Holding NSA’s Feet To The Fire</a> (jcs) <strong>[Security]</strong>
Here is a second post about Senator Ron Wyden. He appears to be fighting the good fight! Go Senator Wyden!</li>
</ul>

<h2 id="emacs">Emacs</h2>

<ul>
  <li><a href="https://tech.toryanderson.com/2023/11/29/transient-for-convenience-with-emms/">Transient for convenience with emms</a> <strong>[Emacs]</strong>
Tory Anderson shares a really convenient EMMS control panel that uses the new version of <code class="language-plaintext highlighter-rouge">transient</code>.</li>
  <li><a href="https://arrayfire.com/blog/talk-to-emacs-with-a-gpt4-co-worker/">Talk to Emacs with a GPT4 Co-Worker</a> <strong>[Emacs]</strong> Gallagher Pryor shares a method he has for speaking to Emacs using ChatGPT-4. This is from back in November, so perhaps he has a package now!</li>
  <li><a href="https://takeonrules.com/2023/12/03/mentoring-vs-coders-as-an-emacsian/">Jeremy Friesen: Mentoring VS-Coders as an Emacsian</a> (Jeremy Friesen) <strong>[Emacs]</strong>
I really enjoyed this talk about moving people away from VS Code and toward Emacs. The big takeaway
for this talk seemed to be that demonstrating what Emacs could do was going to be more effective
than just arguing. Let Emacs win just by letting it do what it does.</li>
  <li><a href="https://takeonrules.com/2023/12/09/test-driving-a-campaign-status-document/">Jeremy Friesen: Test Driving a Campaign Status Document</a> (Jeremy Friesen) <strong>[Emacs]</strong>
This post has some superb ideas for running a TTRPG campaign from Emacs. I’ve been doing this
for a while, but my documents get really messy. I need something a bit more structured.</li>
  <li><a href="https://sachachua.com/blog/2023/12/emacsconf-backstage-using-spookfox-to-publish-youtube-and-toobnix-video-drafts/">EmacsConf backstage: Using Spookfox to publish YouTube and Toobnix video drafts</a> (Sacha Chua) <strong>[Emacs]</strong>
I love how crazy this is: using <a href="https://bitspook.in/projects/spookfox/">spookyfox</a> to work with YouTube’s crappy interface to do things to
videos. Go Sacha!</li>
  <li><a href="http://yummymelon.com/devnull/improving-emacs-isearch-usability-with-transient.html">Charles Choi: Improving Emacs isearch Usability with Transient</a> (Charles Choi) <strong>[Emacs]</strong>
This is pretty cool. I recently learned about how rich the <code class="language-plaintext highlighter-rouge">isearch</code> feature set is, but I haven’t
played around with it a ton yet. Another thing to add to my Emacs to-do list!</li>
  <li><a href="https://www.miskatonic.org/2024/01/08/org-citations-basic/">William Denton: Basic citations in Org (Part 1)</a> (William Denton) <strong>[Emacs]</strong>
This is an excellent introduction to how citations work in org-mode. There are four parts in the series so far, so keep reading!</li>
</ul>

<h2 id="programming">Programming</h2>
<ul>
  <li><a href="https://irreal.org/blog/?p=11796">Pike’s Rules Of Programming</a> (jcs) <strong>[Programming]</strong>
These are some good rules, even if they can make some parts of programming a little less exciting.</li>
  <li><a href="https://www.brycewray.com/posts/2023/11/variations-styling-variables-ssgs/?utm_campaign=RSS&amp;utm_source=RSS&amp;utm_medium=RSS">Variations on styling variables in SSGs</a> (Bryce Wray) <strong>[Programming]</strong>
I am still using Sass a lot more than the vanilla CSS stuff that should be replacing it. Also, I am
starting to see that this is a change I’ll need to take in my future WebDev adventures.</li>
  <li><a href="https://www.brycewray.com/posts/2023/11/firefox-brink/?utm_campaign=RSS&amp;utm_source=RSS&amp;utm_medium=RSS">Firefox on the brink?</a> (Bryce Wray) <strong>[Programming]</strong>
Bryce Wray is warning (or predicting?) that Firefox may be in a very dangerous spot in its loss of
user share. This is really disappointing, given how evil Chrome continues to be. And it’s only going to
get more evil. Convince your friends to run Firefox!</li>
  <li><a href="https://zck.org/numberdle">Zachary Kanfer: Numberdle!</a> (Zachary Kanfer) <strong>[Programming]</strong>
This is a really fun browser game for people who enjoy numbers more than words. Move over, Wordle!!</li>
</ul>

<h2 id="history">History</h2>

<p>Finally, here’s something fun to share with the kids.</p>

<ul>
  <li><a href="https://www.smithsonianmag.com/history/history-teddy-bear-once-seen-dangerous-influence-young-children-180983234/">The Teddy Bear Was Once Seen as a Dangerous Influence on Young Children</a>
Before gifting stuffed animals to the wee ones in your life, consider that <em>bears are dangerous!</em></li>
</ul>]]></content><author><name>Erik L. Arneson</name></author><category term="emacs" /><category term="programming" /><category term="security" /><category term="portland" /><category term="history" /><summary type="html"><![CDATA[Once again, I have collected far too many links over far too long a period of time. Anyhow, here is a collection of blog posts and links from around the web that I found to be good reading over the past couple of months. Is it too late in January to say Happy New Year?]]></summary></entry></feed>