<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >

  <title>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>
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="https://arnesonium.com/feeds/automation.xml" rel="self" type="application/atom+xml" />
  <link href="https://arnesonium.com/" rel="alternate" type="text/html" />
  <updated>2026-06-18T15:03:10+00:00</updated>
  <id>https://arnesonium.com/feeds/automation.xml</id>
  <author>
    <name>Erik L. Arneson</name>
  </author>
      <entry>
        
        <title>Process Automation for an Oregon Charitable Foundation</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2026/05/process-automation-oregon-charitable-foundation" rel="alternate" type="text/html" title="Process Automation for an Oregon Charitable Foundation" />
        <updated>2026-05-22T00:00:00+00:00</updated>
        <id>https://arnesonium.com/2026/05/sref</id>
          <category term="cloud" />
        
          <category term="cloud-computing" />
        
          <category term="golang" />
        
          <category term="svelte" />
        
          <category term="typescript" />
        
          <category term="automation" />
        
          <category term="case-study" />
        
          <category term="google-cloud" />
        
          <category term="programming" />
        
          <category term="testing" />
        
          <category term="web-development" />
        
          <category term="software-development" />
        <content type="html" xml:base="https://arnesonium.com/2026/05/process-automation-oregon-charitable-foundation">&lt;p&gt;The &lt;a href=&quot;https://orsrscholarships.com/&quot;&gt;Oregon Scottish Rite Education Foundation&lt;/a&gt; awards scholarships annually to students across Oregon
who are entering into college or trade schools. Over the past few years, their foundation has grown,
requiring them to distribute more scholarships than ever. However, since the foundation board is
small and composed entirely of volunteers, they were looking for some way to automate their application process to
reduce the number of manual steps required.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;initial-approach&quot;&gt;Initial Approach&lt;/h2&gt;

&lt;p&gt;Members of the board approached me with a wish list of features and requirements. They wanted a
system to integrate seamlessly with their website, while incoming applications should be
automatically checked, sorted, and categorized by county. They already had a spreadsheet system for
tracking applicants as well as a cloud storage system for storing supporting documents; they wanted
the automation system to integrate with these existing components.&lt;/p&gt;

&lt;p&gt;Since the board was already utilizing Google Business products for cloud documents and storage, I
decided that the best approach would be to lean into Google Cloud services. Following their list of
requirements, I implemented a &lt;a href=&quot;https://cloud.google.com/run&quot;&gt;Google Cloud Run&lt;/a&gt; service in &lt;a href=&quot;https://go.dev/&quot;&gt;Go&lt;/a&gt; that processed incoming applications
from their website, then updated the spreadsheet while preparing their cloud storage system for each
application’s supporting documents. The spreadsheet now contained all the application data,
including a link to an automatically generated PDF version of the application and a link to the
cloud storage location.&lt;/p&gt;

&lt;p&gt;This initial approach cut out an enormous amount of manual work. Previously, applications were
submitted via the website and emailed to a board member, who then manually sorted them by county and
generated PDFs for storage and later distribution.&lt;/p&gt;

&lt;h2 id=&quot;implementation-challenges&quot;&gt;Implementation Challenges&lt;/h2&gt;

&lt;p&gt;The application submission window for the Oregon Scottish Rite Education Foundation runs from
December through March of each year, which gave us a limited amount of time to observe incoming live
data and how the automation was performing.&lt;/p&gt;

&lt;p&gt;My initial approach worked fairly well, and handled 94% of incoming applications properly. However,
the last 6% ran into various problems that prevented correct processing. One error arose from a
misspelling in a county name, which was caught early and corrected. Another series of errors arose
from processing errors with the Google Sheets API, which has both rate limiting and more mysterious,
inexplicable errors. I added additional error correction and error checking, but there was still
some additional manual work to enter data from a handful of applications.&lt;/p&gt;

&lt;p&gt;By the end of the application period, we had managed to reduce the amount of manual data entry and
processing by a large percentage, maybe as much as 60%. After discussing the current process
automation with the board, we began to see opportunities for further automation and improvement.&lt;/p&gt;

&lt;h2 id=&quot;additional-development&quot;&gt;Additional Development&lt;/h2&gt;

&lt;p&gt;After the first year’s application submission window, I began working with one of the board members
to plan out how the process could be improved even more. My list of improvements were primarily on
the backend, and involved robuster error detection and reporting, as well as a backup data store
that would allow the automation to recover from the Google Sheets API errors more elegantly.&lt;/p&gt;

&lt;p&gt;The board proposed an additional feature set that would further reduce manual data processing, by
allowing applicants to upload supporting documents such as letters of recommendation and high school
transcripts. These uploaded documents would then be processed and stored in the proper cloud storage
location, thus reducing the amount of manual file management required by volunteers.&lt;/p&gt;

&lt;p&gt;Implementing these two new features went very smoothly. It required the development of a new
frontend, using &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;Typescript&lt;/a&gt; and &lt;a href=&quot;https://svelte.dev/&quot;&gt;Svelte&lt;/a&gt;. This frontend allowed applicants to upload their supporting
documents via a unique link given to each of them by automated email. It used both &lt;a href=&quot;https://cloud.google.com/storage&quot;&gt;Google Cloud
Storage&lt;/a&gt; and the Google Drive API to store these files.&lt;/p&gt;

&lt;p&gt;The improvements on the backend used &lt;a href=&quot;https://cloud.google.com/products/datastore&quot;&gt;Google Cloud Datastore&lt;/a&gt; and a more robust error recovery system.
It now backed up all incoming scholarship applications until they could reliably and more slowly be
added to the spreadsheet with the Google Sheets API, thus nearly eliminating all rate limiting
errors. In addition, progress reports and error output could now be viewed using a new frontend
administrative interface.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;This round of improvements produced significant results. Over the entire span of the second year of
application submissions, error rates dropped from 6% to &lt;em&gt;just one unrecoverable error.&lt;/em&gt; While I had
been hoping for improvement, even I was surprised by how much of an improvement we achieved!&lt;/p&gt;

&lt;p&gt;The board reported that the amount of manual processing was reduced by another 80-90%, with only a
few applicants resorting to email for sending in their supporting documents. While we have discussed
further improvements to the process automation for the next application submission window, the board
is satisfied with the improvements provided by the level of automation implemented so far.&lt;/p&gt;

&lt;h2 id=&quot;lessons&quot;&gt;Lessons&lt;/h2&gt;

&lt;p&gt;This project benefited a lot by reviewing requirements and expectations frequently with the client.
They were great at providing me with very clear goals from the beginning, and as we progressed and
it became clear where the most volunteer time was being spent, we were able to identify more tasks
for automation.&lt;/p&gt;

&lt;p&gt;On the development side of things, three things were clear. First, cloud services really make the
development and deployment of process automation tools like this a breeze. Costs can be kept low
while still providing robust infrastructure for hosting.&lt;/p&gt;

&lt;p&gt;Second, I learned once more the importance of unit tests. I wrote unit tests for most elements of
the automation software, which allowed me to catch breaking changes and test features very quickly.
&lt;a href=&quot;https://www.ibm.com/think/topics/test-driven-development&quot;&gt;Test-driven development&lt;/a&gt; can be a great way to run a project, and though I did not follow all of its
parameters strictly, that particular philosophy did guide my decision.&lt;/p&gt;

&lt;p&gt;Third, once more I was reminded of how the best-planned software runs into difficulties when it
collides with the real world. I failed to anticipate the Google Sheets API issues and did not
implement enough comprehensive error correction early on. That is not an error I shall repeat again!&lt;/p&gt;

&lt;p&gt;Finally, I learned that even with a project that seems as straightforward as this one, it is
important to control expectations early. This turned into a multiyear project because we saw room
for improvement. I think it is important for a business or organization looking for process
automation to understand that it can be an ongoing series of improvements; not everything will be
accomplished or perfected after one pass.&lt;/p&gt;

&lt;p&gt;Overall, I found this to be a rewarding project. I enjoyed working on software that was aiding a
good cause: helping high school graduates fund their education. It was also very nice to work for a
charitable foundation instead of a for-profit business; it made all of my programming feel a lot
better. I hope to work for more charitable foundations in the future.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Some Great Fish Shell Plugins</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2022/09/some-great-fish-shell-plugins/" rel="alternate" type="text/html" title="Some Great Fish Shell Plugins" />
        <updated>2022-09-23T17:44:00+00:00</updated>
        <id>https://arnesonium.com/2022/09/some-great-fish-shell-plugins</id>
          <category term="automation" />
        
          <category term="command-line" />
        
          <category term="emacs" />
        
          <category term="fish-shell" />
        
          <category term="howto" />
        
          <category term="ide" />
        
          <category term="shell" />
        <content type="html" xml:base="https://arnesonium.com/2022/09/some-great-fish-shell-plugins/">&lt;p&gt; As a long-time Linux user, I am pretty comfortable with command line interfaces. However, as I started learning more about automation and how important it is to get your computer to do more work for you, I leaned toward wanting my command line shell to do more. Eventually I switched to &lt;a href=&quot;https://fishshell.com/&quot;&gt;fish shell&lt;/a&gt;, a very user-friendly shell with excellent scripting capabilities that is far more readable and less obscure than bash. &lt;/p&gt;
&lt;!--more--&gt;
&lt;div id=&quot;outline-container-orgbd4e930&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgbd4e930&quot;&gt;Plugins for fish&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-orgbd4e930&quot;&gt;
&lt;p&gt; There have been a few plugin managers over the years, but the one that seems to be the best maintained and most usable is &lt;a href=&quot;https://github.com/jorgebucaran/fisher&quot;&gt;fisher&lt;/a&gt;, created by &lt;a href=&quot;https://twitter.com/jorgebucaran&quot;&gt;Jorge Bucaran&lt;/a&gt;. It allows you to easily install plugins straight from GitHub repositories, while updates can be executed with a simple &lt;code&gt;fisher update&lt;/code&gt; on the command line. &lt;/p&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-org0108c85&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;org0108c85&quot;&gt;z&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-org0108c85&quot;&gt;
&lt;p&gt; &lt;b&gt;One of the greatest command-line time savers ever&lt;/b&gt; is the &lt;code&gt;z&lt;/code&gt; command. Originally a bash script, it has been ported to fish and, frankly, I love it. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;What does it do?&lt;/b&gt; &lt;code&gt;z&lt;/code&gt; provides shorthand for visiting directories based on a combination of frequency and recency&amp;#x2014;or &quot;frecency&quot;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; If you frequently visit the &lt;code&gt;/opt/calibre&lt;/code&gt; directory, a &lt;code&gt;z calib&lt;/code&gt; command will allow you to jump straight there. &lt;/p&gt;

&lt;p&gt; If you already have fisher installed, just use &lt;code&gt;fisher install jethrokuan/z&lt;/code&gt; and start playing around with &lt;code&gt;z&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt; &lt;a href=&quot;https://github.com/jethrokuan/z&quot;&gt;You can read more about &lt;code&gt;z&lt;/code&gt; here.&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orga78b5fb&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orga78b5fb&quot;&gt;pisces&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orga78b5fb&quot;&gt;
&lt;p&gt; &lt;b&gt;Your IDE has been handling your parenthesis for ages.&lt;/b&gt; Now your shell can do the same! The &lt;a href=&quot;https://github.com/laughedelic/pisces&quot;&gt;pisces&lt;/a&gt; plugin has automatic matching symbol management for parenthesis, braces, quotes, and others. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;Install it with fisher&lt;/b&gt; using the command &lt;code&gt;fisher install laughedelic/pisces&lt;/code&gt; and be matching parens in seconds!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;a href=&quot;https://github.com/laughedelic/pisces&quot;&gt;You can read more about the pisces plugin here.&lt;/a&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgc02da30&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orgc02da30&quot;&gt;plugin-emacs&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgc02da30&quot;&gt;
&lt;p&gt; &lt;b&gt;Automation can help you interact with your editor&lt;/b&gt; from your shell. The &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;Emacs plugin for fish&lt;/a&gt; was originally written for an unmaintained plugin manager called &lt;a href=&quot;https://github.com/oh-my-fish/oh-my-fish&quot;&gt;Oh My Fish&lt;/a&gt;. However, I wanted the plugin to work with fisher, so I made &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;my own fork&lt;/a&gt;. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;How does it work?&lt;/b&gt; This plugin adds easy commands like &lt;code&gt;ef&lt;/code&gt; and &lt;code&gt;ed&lt;/code&gt; that allow you to open files and directories in Emacs quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install it quickly using the command &lt;code&gt;fisher install pymander/plugin-emacs&lt;/code&gt; and &lt;a href=&quot;https://github.com/pymander/plugin-emacs&quot;&gt;read more about it here&lt;/a&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orga8ddcd0&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orga8ddcd0&quot;&gt;vfish&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orga8ddcd0&quot;&gt;
&lt;p&gt; &lt;b&gt;Emacs users have probably heard of vterm,&lt;/b&gt; which is the &lt;a href=&quot;https://github.com/akermu/emacs-libvterm&quot;&gt;Emacs package that interacts with libvterm&lt;/a&gt;. It is a powerful terminal emulator that runs in an Emacs buffer. I wrote &lt;a href=&quot;https://github.com/pymander/vfish&quot;&gt;a fish plugin called vfish&lt;/a&gt; that simplifies using fish in vterm. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;How does it work?&lt;/b&gt; Inside a vterm session, this plugin adds fish commands like &lt;code&gt;vf&lt;/code&gt; and &lt;code&gt;vd&lt;/code&gt; to open files and directories quickly. It mirrors the Emacs plugin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install it using the command &lt;code&gt;fisher install pymander/vfish&lt;/code&gt; and &lt;a href=&quot;https://github.com/pymander/vfish&quot;&gt;read more about it here&lt;/a&gt;. Note that &lt;b&gt;it will require some code&lt;/b&gt; to be added to your Emacs startup file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgf6c1785&quot; class=&quot;outline-3&quot;&gt;
&lt;h3 id=&quot;orgf6c1785&quot;&gt;apt&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-orgf6c1785&quot;&gt;
&lt;p&gt; For Debian and Ubuntu users, the &lt;a href=&quot;https://github.com/oh-my-fish/plugin-apt&quot;&gt;Oh My Fish apt plugin&lt;/a&gt; works seamlessly with fisher. &lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;b&gt;What does it do?&lt;/b&gt; The apt plugin adds a wrapper around the &lt;code&gt;apt&lt;/code&gt; and &lt;code&gt;apt-get&lt;/code&gt; commands that simplify package management from the command line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Install this plugin quickly with &lt;code&gt;fisher install oh-my-fish/plugin-apt&lt;/code&gt; and then &lt;a href=&quot;https://github.com/oh-my-fish/plugin-apt&quot;&gt;read more about it&lt;/a&gt;. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgef254fe&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgef254fe&quot;&gt;What&apos;s your favorite fisher plugin?&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-orgef254fe&quot;&gt;
&lt;p&gt; I love finding plugins that can help me automate more of my everyday tasks and workflows. What&apos;s your favorite fisher plugin? &lt;/p&gt;

&lt;p&gt; Leave a comment below and let me know! Be sure to include a link. &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</content>
      </entry>
    
</feed>
