<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Duane Storey</title>
    <link>https://duanestorey.com</link>
    <description>The home of engineer and world traveller, Duane Storey</description>
    <language>en</language>
    <lastBuildDate>Sun, 14 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://duanestorey.com/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Extracting PBMCs For Downstream RNA sequencing</title>
      <link>https://duanestorey.com/posts/extracting-pbmcs-for-downstream-rna-sequencing.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/extracting-pbmcs-for-downstream-rna-sequencing.html</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <description>I'm about 28 months out from my primary Covid19 infection that caused my hospitalization, and eventually gave me the joy of long covid.  While everyone has their own unique presentation, my day to day usually involves frequent periods where I feel ill and exhausted. I like to walk, and often when I'm ...</description>
      <content:encoded><![CDATA[<p>I'm about 28 months out from my primary Covid19 infection that caused my hospitalization, and eventually gave me the joy of long covid.  While everyone has their own unique presentation, my day to day usually involves frequent periods where I feel ill and exhausted. I like to walk, and often when I'm feeling good I can do a lap or two around the block.  But more often than not, especially lately, I can go from feeling about 80% to feeling about 20% in the space of about 100m or so.  When a crash happens, it sort of feels like every cell in my body just suddenly runs out of energy - my heart, my brain, my muscles.  Brain fog usually intensifies, my autonomic system feels unstable, and I feel like I have low blood sugar (even though I don't). It's a horrible feeling that if it happened to someone who wasn't used to it, might prompt a visit to the ER or at least their family doctor as it's not subtle at all.</p>
<p>As such, I've become mostly singularly-focused on trying to figure out how to improve.  I'm able to still work a day job, at least part time, and have enough engineering projects to keep my brain happy.  But what time I don't spend on those things I've been using to slowly unravel my own situation using whatever technology I can.</p>
<p>I originally did RNA sequencing via the Amatica project, which was informative and useful as a long covid baseline. Since then I've done several other RNA sequencing rounds at various providers in Europe, slowly adding to my personal collection of data.  I built a RNA pipeline called Chimera by cobbling together a lot of open source pieces, so I'm able to analyze them all on my own.  </p>
<p>Thanks to the existence of many public datasets that include FASTQ files, I've been able to come up with several useful control datasets for ribo-depleted, poly-a, and even PBMC datasets.  Because they weren't run on the same machines and in the same labs, I've had to come up with a few normalization methods that rely on a curated list of house keeping genes. That seems to bring most datasets into rough alignment. It probably makes the genes that are minimally expressed less certain, but I'm pretty confident that if something has a z-score of +5 when compared to 40 roughly age-matched controls, that it's likely a high enough signal that I can put some weight on.</p>
<p>Recently I stumbled upon a company called Plasmidsaurus that offers RNA seq with the added benefit of being able to produce results in 48 hours. That's pretty incredible considering most of my other RNA seq has taken between 6 weeks and several months to come back. The problem with that time lag is I can't use it to determine whether or not any treatments I'm trialing are having any impact, since by the time the data comes back my experiment is often over. It's still useful as data that I can look back on, but less useful for understanding what's happening in pseudo real time. Plasmidsaurus I thought might be useful as an adjunct to my other sequencing - the one catch though is they don't support whole blood, and only can handle cells suspended in Zymo's RNA/DNA shield product.</p>
<p>So, in order to take advantage of their service, I had to figure out how to extract my own PBMC cells at home using what I have in terms of equipment, and augmenting that with a few deliberate purchases.</p>
<h3>Density Gradient Tubes</h3>
<p>PBMCs are Peripheral Blood Mononuclear Cells - they are the cells in the blood with a round nucleus, namely lymphocytes and monocytes.  They are arguably the best cells to work with when trying to understand immune disorders as they aren't polluted with neutrophils or globin which can make interpreting whole blood RNA sequencing a bit trickier.</p>
<p>There a few different methods around for extracting them from whole blood, but I opted to use a special tube called a density gradient tube (DGT) to extract mine. In my case I chose Plurimate II tubes, which one of my suppliers offered.  </p>
<p>These tubes have a barrier at the bottom, a fine mesh I imagine. You basically put  4.5ml of a special liquid in the tube that has a known density, and spin it in the centrifuge to set it below the barrier. Then, you slowly trickle whole blood on top, and run the entire tube in a centrifuge.  As the tube spins, the neutrophils and red blood cells are forced below the fine mesh, causing the liquid medium to be pushed upward.  Because of its carefully chosen density, the PBMCs are pushed upwards along with it, leaving the red blood cells etc trapped below the mesh.  </p>
<p>Here is a photo of 9ml of my blood next to a 15ml DGT with 4.5ml of density medium in it. </p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc1-320w.jpeg 320w,/assets/posts/2026/2026-pbmc1-480w.jpeg 480w" src="/assets/posts/2026/2026-pbmc1.jpeg" alt="Preparing the PBMC density gradient tube"></p>
<p>After moving the 9ml of blood into the DGT, it basically looks like this and is ready for centrifuging. </p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc2-320w.jpeg 320w,/assets/posts/2026/2026-pbmc2-480w.jpeg 480w,/assets/posts/2026/2026-pbmc2-640w.jpeg 640w" src="/assets/posts/2026/2026-pbmc2.jpeg" alt="Layered whole blood on density gradient medium"></p>
<p>Next step is to centrifuge the entire tube at 800g for about 15 minutes, which causes the actual separation to occur.  I think technically it's best to use something called a swinging rotor centrifuge, which results in a nice clear horizontal transition. I don't have one of those, and so far it doesn't seem to have impacted me.</p>
<p>When you remove the tube from the centrifuge, you can see the clear separation of layers. The red blood cells have migrated below the barrier, the PBMC liquid has risen above that (the transparent liquid above the blood cells), and there now exists a layer of plasma on top. The transition layer between the plasma and the density medium, which is sort of cloudy, is called the buffy coat, and it contains the PBMC cells. </p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc3-320w.jpeg 320w,/assets/posts/2026/2026-pbmc3-480w.jpeg 480w" src="/assets/posts/2026/2026-pbmc3.jpeg" alt="Examining the density gradient tubes"></p>
<h3>Separating the PBMC Cells</h3>
<p>The plasma actually can be saved, which I've been doing since it just adds to my longitudinal n=1 data set I have in my own personal Brundle Museum of Natural history in my freezer.  I'm not sure if I'll ever use it, but might as well save it just in case (my frozen serum already came in handy back-filling some antibody tests after the fact).  I put these in 1.8ml cryovials along with a label + QR code so I can remember what each sample was and when it was taken.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc5-320w.jpeg 320w,/assets/posts/2026/2026-pbmc5-480w.jpeg 480w,/assets/posts/2026/2026-pbmc5-640w.jpeg 640w" src="/assets/posts/2026/2026-pbmc5.jpeg" alt="Saving the plasma in cryovials"></p>
<h3>Washing The PBMCs</h3>
<p>Once the plasma has been carefully removed (I only remove everything up until about 1ml above the buffy coat so I don't accidentally disturb it), I transfer all the liquid into a new 15ml centrifuge tube.  Due to the DGT barrier, you can mostly just pour it in, being careful not to allow any red blood cells to trickle in.</p>
<p>Right now you have a mixture of PBMCs, plasma, and density gradient material, which isn't what you want to end up with. So the next step is called washing the PBMCs, and it involves adding phosphate-buffered saline (PBS) to the mixture, centrifuging it, then removing the liquid that's left. This washes away, via dilution basically, all the liquid you don't want, leaving the PBMCs nice and clean.</p>
<p>After adding my PBS to the 15ml tube, it looks like this, ready for centrifuging.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc4-320w.jpeg 320w,/assets/posts/2026/2026-pbmc4-480w.jpeg 480w,/assets/posts/2026/2026-pbmc4-640w.jpeg 640w" src="/assets/posts/2026/2026-pbmc4.jpeg" alt="Ready to centrifuge the PBMCs"></p>
<h3>Concentrating The PBMC Layer</h3>
<p>Next, the 15ml tube is centrifuged at 400g for about 15 minutes.  This causes all the PBMC cells to concentrate on the bottom of the tube, while the wash solution consolidates above.  This small little solid mass of PBMCs is known as a 'pellet', and it's quite small.  The actual amount of PBMC cells in whole blood is just a small percentage, so often in real studies they will take 30-40ml of whole blood I believe to have enough.  I don't need a ton of RNA for what I'm doing, so 9ml's worth is enough for that.  But as you can see based on the pellet size, you don't really get a ton of material, and a simple mistake can eliminate a lot of what you're after.</p>
<p>Here is a view of the pellet after coming out of the centrifuge.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc6-320w.jpeg 320w,/assets/posts/2026/2026-pbmc6-480w.jpeg 480w,/assets/posts/2026/2026-pbmc6-640w.jpeg 640w" src="/assets/posts/2026/2026-pbmc6.jpeg" alt="Investigating the Buffy Coat"></p>
<h3>Preparing For Submission To Plasmidsaurus</h3>
<p>The next step is the one I'm still refining, as I don't quite feel I've gotten it right yet.  After washing it, I need to get it down to a reasonable volume such that I can add Zymo DNA/RNA shield and submit 75ul of material to Plasmidsaurus.  My current approach, after trial and error, is to transfer the pellet to a smaller 1.5ml micro-centrifuge tube, add more PBS to wash it again, and then re-pellet. My rationale for this is it's much easier to then add 200ul of DNA/RNA shield to a smaller tube than the larger 15ml tube.  But this is still something I'm iterating on it. Every time you transfer the material I'm sure you lose some, so that's the trade off.</p>
<p>Here's a view of the final pellet after centrifuging the mini-centrifuge tube.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc8-320w.jpeg 320w,/assets/posts/2026/2026-pbmc8-480w.jpeg 480w,/assets/posts/2026/2026-pbmc8-640w.jpeg 640w" src="/assets/posts/2026/2026-pbmc8.jpeg" alt="Investigating the Buffy Coat"></p>
<p>At this point, you're supposed to count how many cells you collected and then submit a certain amount of cells suspended in at least 50ul of DNA/RNA shield and submit to Plasmidsaurus.  Unfortunately for me I don't have a cell counter, so I had to estimate it using general knowledge about how many PBMCs were in 1ml of whole blood, etc.  I figured they would tell me if I was low or high, and I could use that to close the loop and improve each time. Here was the result of the first submission, with the result on Plasmidsaurus' side for how much RNA they detected.  For reference, they want at least 10ng/ul, so I was short.  </p>
<table>
<thead>
<tr>
<th>Blood (ul)</th>
<th>Amount of Liquid (ul)</th>
<th>Measured RNA (ng/ul)</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td>8000</td>
<td>800</td>
<td>2.2</td>
<td>Low</td>
</tr>
</tbody>
</table>
<p>To help figure out what I could do to improve it, I got AI to help me build a series of tools, one of which is a PBMC yield estimator. Using public information about PBMC cells / ml of blood, how much RNA is in each cell etc, I came up with this quick tool where I can estimate the results.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/2026-pbmc9-320w.png 320w,/assets/posts/2026/2026-pbmc9-480w.png 480w,/assets/posts/2026/2026-pbmc9-640w.png 640w,/assets/posts/2026/2026-pbmc9-960w.png 960w,/assets/posts/2026/2026-pbmc9-1360w.png 1360w,/assets/posts/2026/2026-pbmc9-1600w.png 1600w" src="/assets/posts/2026/2026-pbmc9.png" alt="Closing The Loop - Estimating Yield"></p>
<p>Using this tool I used the Plasmidsaurus data to backfill my process and estimated that my yield on extraction was about 20%, which makes sense because I think I butchered the buffy coat the first time I did it, and mostly grabbed the wrong layer (the density medium).</p>
<p>I figured on the next run I would get closer to 50%, so I dialled that in and changed how much DNA/RNA shield I used.  I've now submitted three samples now, all of which were returned without 48 hours, and I have enough data to quantify my workflow now.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>Blood (ul)</th>
<th>Amount of Liquid (ul)</th>
<th>Measured RNA (ng/ul)</th>
<th>Est. Yield</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>8000</td>
<td>800</td>
<td>2.2</td>
<td>22%</td>
<td>Low</td>
</tr>
<tr>
<td>2</td>
<td>8000</td>
<td>200</td>
<td>21.1</td>
<td>55%</td>
<td>High</td>
</tr>
<tr>
<td>3</td>
<td>10000</td>
<td>240</td>
<td>21.9</td>
<td>57%</td>
<td>High</td>
</tr>
</tbody>
</table>
<p>So I'm getting close to 60% extraction yield on my process, which is fine, as long as I know I'm in the ballpark for what they require, which is anywhere between 10ng/ul and 50ng/ul - my goal is to be smack in the middle, which I mostly am now.</p>
<p>It takes me about an hour to do an extraction, but there is probably only 10 - 15 minutes of hands-on work.  Since I need blood anyways, I usually also take a EDTA tube of whole blood and save a few 400ul blood samples at the same time which I plan to do qPCR on in the near future.</p>
<p>I'll do a post soon on my actual Plasmidsaurus results, and share some FASTQ files and differential expression tables for the keeners in the crowd who want to play with some of that stuff on their own.</p>
<p>When I first sat down to do this process, it seemed pretty daunting. But having done it a few times, it seems pretty simple in theory.  I hope that's the same with the RNA isolation I plan to do next, as right now that seems a bit scary.  But like everything in life, there is a first time, and things usually get easier after that if you just work through it and practice.</p>]]></content:encoded>
    </item>
    <item>
      <title>Chimera: An Open Source RNA Pipeline for Long Covid Research</title>
      <link>https://duanestorey.com/posts/chimera-an-open-source-rna-pipeline-for-long-covid-research.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/chimera-an-open-source-rna-pipeline-for-long-covid-research.html</guid>
      <pubDate>Sun, 22 Mar 2026 08:30:00 +0000</pubDate>
      <description>Back in October, I found out about a new initiative in Europe called Amatica Health. Instead of regular blood tests for long covid, which I have tons and tons of, they were offering a RNA sequencing covering over 20,000 genes that was hopefully going to shed some light on the entire disease and maybe ...</description>
      <content:encoded><![CDATA[<p>Back in October, I found out about a new initiative in Europe called <a href="https://www.amaticahealth.com/?srsltid=AfmBOoq8CXF9bSCQIBcBkpPn1ZL5N8De8xodZiNRdxCS9sEJb3edIEuE">Amatica Health</a>. Instead of regular blood tests for long covid, which I have tons and tons of, they were offering a RNA sequencing covering over 20,000 genes that was hopefully going to shed some light on the entire disease and maybe lead to a cure.</p>
<p>I paid the $1000 (or whatever it was at the time), and submitted my sample.  In the time between then and when I received my results, I shared a few emails and X messages with some of the founders.  Some of the things I was curious about was just how much juice we can squeeze from the RNA data set.  After some back and forth with one of the founders, I decided to try and write a 'simple' RNA pipeline I could run on a dedicated server I have at home that was meant for doing AI experiments.</p>
<p>I was given my raw FASTQ file from my initial run, which I used to validate this. Since that time, Amatica has spoken to their GDPR and legal reps etc and decided that releasing their full CSV of raw data, calibrated to their controls, was equivalent/better than releasing the FASTQs - as such, they are no longer able to release patient FASTQ files.  I won't comment on that except to say that it's their internal decision, and I'm at least fortunate that I had my n=1 data file to experiment with. In truth, processing a RNA sample is no small feat, and there is nothing really plug and play about it. Having a raw data dump of 30,000 GENEs in a CSV file calibrated against a control cohort (which Amatica provides) is also valuable and informative for most people.</p>
<p>Since I spent about 200 hours putting this pipeline together, I do want to at least talk about my efforts as I'm convinced tools like this can help the research community. As such, this post will highlight some of the challenges I faced with running my own sample, and where I see this project going next (since I can't finish it with just one sample).  </p>
<p>This project is called Chimera, and it's an open-source (eventually) RNA pipeline for long covid + me/cfs research.</p>
<h2>Controls</h2>
<p>When you process an RNA file in a bioinformatics pipeline, you generally end up with a pile of subdirectories full of data.  All of this is hard to interpret and on its own and is sort of meaningless in isolation. What you really need to do is say, "how does this data compare to a group that is healthy?"  </p>
<p>Amatica is solving this problem internally by running their own controls (healthy people) through their exact same pipeline. That's the ideal setup, as there aren't really any batch effects (things you have to account for if the two groups were processed differently).</p>
<p>Since I don't have access to their controls (for obvious reasons), what I needed was a series of FASTQ files from healthy people I could process on my own. And it turns out there are lots of great data sets for this purpose available publicly.</p>
<p>I did some research and found a few public groups that match these, one of which was <a href="https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE217948">GSE217948</a>, an Australian pandemic control set with 70 healthy volunteers.  These were all ribo depleted (as opposed to polya) with approximately 100M paired reads.  Perfect.</p>
<h2>Calibration</h2>
<p>The problem with calibrating against a control set run via a different process is due to batch effects. You usually account for these by comparing a batch of unhealthy people against a batch of controls.  You can then do some mathematical voodoo to try and match the distributions better and remove these batch effects to better compare.</p>
<p>The problem was I didn't have a batch of unhealthy people, I just had me. So how do you calibrate one person's RNA sample against and entire cohort of healthy people run on a different sequencer and likely with different prep methods?</p>
<p>My solution to this was two fold:</p>
<ol>
<li>Separate the problem into protein encoding genes vs non protein encoding genes. Then recalibrate the counts per million (TPM) based on this data.  In effect it's a normalization step to make TPM comparable for the coding genes. This method seemed to bring the means and the variance more inline with each other, which is what I was hoping.</li>
<li>Find a set of 100 - 200 housekeeping genes - genes that don't really move all that much between healthy people and unhealthy people.  Use these to calibrate between the two data sets.  This was the second process I did.</li>
</ol>
<p>Once I had my actual Amatica data, I planned to see if my TPM/z-scoring matched theirs - it mostly did: 92% matched in terms of general direction, the ones that didn't were mostly genes close to 0 with a lot of noise. So I was and am confident that the protein encoding GENE parts of the pipeline mostly match and are trustworthy.</p>
<h2>What To Test</h2>
<p>I used AI to help me assemble the entire pipeline, mostly like a kid assembling tinker toy. I wanted the pipeline to be able to process both RNA sequencing data and Whole Genome Sequencing (WGS) data. To do that on a local machine requires about 300GB of reference data to be downloaded, including alignment info for the entire human genome. That was the first step, mostly assembling the various reference files. </p>
<p>The second was doing a big exploration about what was possible, relying heavily on AI to help fill in the gaps.  I'm an engineer, not a bioinformatics person, so I had to do a lot of research about what was possible. Every time I read a paper over the last few weeks that related to long covid, I modified my pipeline to be able to look for it. Paper after paper, new code after new code, the whole pipeline eventually came together. </p>
<p>Internally I have something called a signature, which is a fingerprint based on GENES, directions, pathology, sub-scoring etc, that can be configured with a basic yaml file.  So for every hypothesis, I can basically bake it into a signature yaml, and simple run that one stage again.  That meant I could iterate quickly whenever I wanted to test something different  For example, here is a signature configuration file for inflammatory cytokines:</p>
<pre><code># Cytokine &amp; chemokine signature panel definitions — 10 panels.
# Sub-panels grouped by functional role, independently scored and z-scored.
# Gene overlap across panels is intentional (e.g., IL1B in proinflammatory + inflammasome).
# Pure data: gene lists, ratios, categories. No display strings.
# Display text lives in run/layers/config/annotations.yaml.

  # ---------------------------------------------------------------------------
  # Core cytokine axis panels (10)
  # ---------------------------------------------------------------------------

  cyto_proinflammatory:
    category: cytokine
    display_name: "Pro-Inflammatory Cytokines"
    pathological_direction: up
    genes:
      - IL1B
      - IL6
      - TNF
      - IL12A
      - IL12B
      - IL18
      - IL23A
      - OSM
      - LIF
      - HMGB1
    references:
      - pmid: "32546811"
        citation: "Del Valle et al. 2020, Nat Med 26(10):1636-1643"
        title: "An inflammatory cytokine signature predicts COVID-19 severity and survival"
        contribution: "IL-6, TNF, IL-1beta as predictors of COVID-19 severity and mortality"
</code></pre>
<p>This is no regular machine - it has 64GB of DDR5 memory, and the pipeline with controls is maxed out at 2TB of data. It has 28 cores, and even with that it takes between 60 and 90 minutes to run a single sample.  Running the entire control cohort from scratch is days, not hours. So this isn't something that can be run easily on a regular laptop or desktop machine - it needs some heavy resources or a cloud based processing pipeline.</p>
<h2>LOO Control References</h2>
<p>Everything that a patient goes through in terms of the pipeline, the controls go through as well.  During the final stage of the control part though, when I'm building my master data file representing the contol cohort, I also add a second stage where I score each control against the entire control cohort as well, minus themselves. This is called leave-one-out scoring, and it's meant to see how controls score against each other.  This allows me to come up with a scoring mechanism for all my signatures - not only are the gene directions pathological according to my signature yaml definition, but how serious is the deviation compared to controls who were scored the same way. So basically everything in the pipeline can be z-scored using this method, not just individual genes, but every composite score as well.</p>
<h2>Usability</h2>
<p>I got tired pretty quick of manually running CLI commands every time I wanted to run or ru-run a patient or control, so I added a web based admin panel to Chimera.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-dashboard-320w.png 320w,/assets/posts/2026/chimera-dashboard-480w.png 480w,/assets/posts/2026/chimera-dashboard-640w.png 640w,/assets/posts/2026/chimera-dashboard-960w.png 960w,/assets/posts/2026/chimera-dashboard-1360w.png 1360w,/assets/posts/2026/chimera-dashboard-1600w.png 1600w" src="/assets/posts/2026/chimera-dashboard.png" alt="Chimera Pipeline"></p>
<p>This dashboard has a queue system which lets me queue individual stages or even entire runs, all with a few clicks.  Updating my signature files, for example, requires that I run the entire signature pipeline for each person again. This takes about 10 seconds per sample, so for 70 controls and one patient it's a quickish 710 seconcds.</p>
<h2>Results</h2>
<p>Ok, now for the fun stuff.  I'm going to take you through all the things that I baked into the pipeline.  This is all n=1, so nothing here should be taken as anything other than demonstrating the viability of having a private RNA pipeline you can control yourself.</p>
<h3>Flow Cytometry</h3>
<p>One of the first interesting tools I hooked up was immune cell deconvolution. It's basically like a poor person's flow cytometry test.  There are various algorithms that can be used to estimate the amount of immune cells in a sample.  Since each algorithm on its own was noisy, I added four different algorithms to the pipeline and they also output how well they agree. The goal was to show which results you can likely trust and which ones were likely less trustworthy.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-immune-320w.png 320w,/assets/posts/2026/chimera-immune-480w.png 480w,/assets/posts/2026/chimera-immune-640w.png 640w,/assets/posts/2026/chimera-immune-960w.png 960w,/assets/posts/2026/chimera-immune-1360w.png 1360w,/assets/posts/2026/chimera-immune-1600w.png 1600w" src="/assets/posts/2026/chimera-immune.png" alt="Immune Cell Deconvolution"></p>
<p>Here was the raw data from the pipeline along with how each compared to the control cohort.</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Sub-type</th>
<th>Cell Type</th>
<th>Proportion (%)</th>
<th>Methods</th>
<th>Z-Score</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>Neutrophils</td>
<td></td>
<td></td>
<td>76.2</td>
<td>3/3</td>
<td>▲ +0.44 (ref: 71.3 ± 13.4)</td>
<td>Normal range</td>
</tr>
<tr>
<td>Lymphocytes</td>
<td></td>
<td></td>
<td>19.9</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td>CD4+ T cells</td>
<td></td>
<td>6.3</td>
<td>3/3</td>
<td>▲ +0.33 (ref: 5.7 ± 5.1)</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>naive</td>
<td>9.92</td>
<td>1/1</td>
<td>▼ -0.95</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>MAIT cells</td>
<td>9.92</td>
<td>1/1</td>
<td>▼ -0.61</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>memory</td>
<td>8.29</td>
<td>1/1</td>
<td>▼ -0.11</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td>Gamma-delta T cells</td>
<td></td>
<td>2.86</td>
<td>1/1</td>
<td>+0.00</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td>CD8+ T cells</td>
<td></td>
<td>2.0</td>
<td>3/4</td>
<td>▼ -0.84 (ref: 6.0 ± 5.1)</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>naive</td>
<td>3.43</td>
<td>1/1</td>
<td>▲ +1.72</td>
<td>Mildly elevated</td>
</tr>
<tr>
<td></td>
<td></td>
<td>memory</td>
<td>0.00</td>
<td>1/1</td>
<td>▼ -1.58</td>
<td>Mildly suppressed</td>
</tr>
<tr>
<td></td>
<td>B cells</td>
<td></td>
<td>4.3</td>
<td>4/4</td>
<td>▼ -1.37 (ref: 8.3 ± 4.0)</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>memory</td>
<td>2.89</td>
<td>1/1</td>
<td>▼ -0.40</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>naive</td>
<td>1.37</td>
<td>1/1</td>
<td>▼ -1.47</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Plasma cells</td>
<td>0.08</td>
<td>1/1</td>
<td>▲ +1.07</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td>NK cells</td>
<td></td>
<td>5.3</td>
<td>4/4</td>
<td>▲ +0.04 (ref: 5.8 ± 2.6)</td>
<td>Normal range</td>
</tr>
<tr>
<td>Monocytes</td>
<td>Monocytes</td>
<td></td>
<td>0.0</td>
<td>1/3 ⚠</td>
<td>▲ +3.09 (ref: 0.0 ± 0.0)</td>
<td>Markedly elevated vs. reference</td>
</tr>
<tr>
<td></td>
<td></td>
<td>classical</td>
<td>8.06</td>
<td>1/1</td>
<td>▼ -1.28</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td></td>
<td>non-classical</td>
<td>2.19</td>
<td>1/1</td>
<td>▼ -0.07</td>
<td>Normal range</td>
</tr>
<tr>
<td></td>
<td>Macrophages</td>
<td></td>
<td>3.9</td>
<td>3/3</td>
<td>▲ +3.09 (ref: 0.6 ± 0.8)</td>
<td>Markedly elevated vs. reference</td>
</tr>
<tr>
<td></td>
<td></td>
<td>M2</td>
<td>3.91</td>
<td>1/1</td>
<td>▲ +3.09</td>
<td>Markedly elevated vs. reference</td>
</tr>
<tr>
<td></td>
<td></td>
<td>M1</td>
<td>0.00</td>
<td>1/1</td>
<td>▲ +3.09</td>
<td>Markedly elevated vs. reference</td>
</tr>
<tr>
<td>Basophils</td>
<td></td>
<td></td>
<td>32.3</td>
<td>1/1</td>
<td>▲ +2.19</td>
<td>Notably elevated</td>
</tr>
<tr>
<td>Dendritic Cells</td>
<td>Dendritic cells</td>
<td></td>
<td>0.00</td>
<td>2/3</td>
<td>▲ +2.19 (ref: 0.0 ± 0.0)</td>
<td>Notably elevated</td>
</tr>
<tr>
<td>Non-Hematologic (deconvolution artifacts)</td>
<td>Uncharacterized</td>
<td></td>
<td>0.0</td>
<td>1/2 ⚠</td>
<td>▲ +3.09 (ref: 0.0 ± 0.0)</td>
<td>Markedly elevated vs. reference</td>
</tr>
</tbody>
</table>
<p>Some of the cells like naive B cells only are estimated using 1 of the 4 algorithms, so those are flagged as less reliable.  But as you can see there is a lot of data there.  One of the defining characteristics about what is going on in my body is a high neutrophil to lymphocyte ratio (NLR). When I was very symptomatic it was around 10, and it typically hovers around 4-5 these days.  That matches what came out of this pipeline, so it seems reasonable at least to my known blood tests.</p>
<p>If you compare against an actual CBC I had done around the same time as this draw, they are in pretty close agreement. The difference is the cell deconvolution gives you much more information about the cell subsets.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-duane-lymphocytes-320w.png 320w,/assets/posts/2026/chimera-duane-lymphocytes-480w.png 480w,/assets/posts/2026/chimera-duane-lymphocytes-640w.png 640w,/assets/posts/2026/chimera-duane-lymphocytes-960w.png 960w,/assets/posts/2026/chimera-duane-lymphocytes-1360w.png 1360w,/assets/posts/2026/chimera-duane-lymphocytes-1600w.png 1600w" src="/assets/posts/2026/chimera-duane-lymphocytes.png" alt="Blood Hemogram"></p>
<h3>Signatures</h3>
<p>Every signature's internal metrics (GENES etc) gets scored against the control cohort, as well as the entire signature panel itself.  In my reporting system, this is how it looks.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-signatures-320w.png 320w,/assets/posts/2026/chimera-signatures-480w.png 480w,/assets/posts/2026/chimera-signatures-640w.png 640w,/assets/posts/2026/chimera-signatures-960w.png 960w,/assets/posts/2026/chimera-signatures-1360w.png 1360w,/assets/posts/2026/chimera-signatures-1600w.png 1600w" src="/assets/posts/2026/chimera-signatures.png" alt="Signature Comparison"></p>
<p>This panel measures Oxidative Stress, and you can see from the little sparkline (I thought being able to visually see the distribution would be cool) where this signature matches against the whole. You can also see the breakdown of the individual genes below.  </p>
<p>Internally I have about 100 signatures or more I think, and many of those signatures are then aggregated into overarching hypothesis, which also get ranked against controls as well.</p>
<h3>Pathogen Detection</h3>
<p>I have an entire pipeline section detected to pathogen detection - it can detected both viruses and bacteria (depending on the sample). I wasn't sure what useful data this might produce, so this was an experiment.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-pathogen-320w.png 320w,/assets/posts/2026/chimera-pathogen-480w.png 480w,/assets/posts/2026/chimera-pathogen-640w.png 640w,/assets/posts/2026/chimera-pathogen-960w.png 960w,/assets/posts/2026/chimera-pathogen-1360w.png 1360w,/assets/posts/2026/chimera-pathogen-1600w.png 1600w" src="/assets/posts/2026/chimera-pathogen.png" alt="Herpes Virus Detection"></p>
<p>The pathogen detection pipeline has three independent stages, meant to filter out noise at each stage.  Since I only tested myself and healthy controls, I haven't really been able to verify it's working (although I did get a pretty conclusive multi-level match that one of the controls had hepatitis C).  In general this was a good exercise, but until I test more data I can't be confident it can find anything in blood (expressions might be too small).  But the machinery is all hooked up to detect about 180 different viruses known to be associated with ME/CFS, as well as all herpesviruses.</p>
<h3>RNA Editing</h3>
<p>There are probably 20 or more stages to the pipeline, each outputting interesting data on its own.  Here's one that might be relevant in terms of Long Covid - the RNA editing rate.  </p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-rna-editing-320w.png 320w,/assets/posts/2026/chimera-rna-editing-480w.png 480w,/assets/posts/2026/chimera-rna-editing-640w.png 640w,/assets/posts/2026/chimera-rna-editing-960w.png 960w,/assets/posts/2026/chimera-rna-editing-1360w.png 1360w,/assets/posts/2026/chimera-rna-editing-1600w.png 1600w" src="/assets/posts/2026/chimera-rna-editing.png" alt="RNA Editing"></p>
<p>The RNA editing rate tells you whether your cells are keeping up with the job of defusing self-generated false alarms. ADAR enzymes edit double-stranded RNA that the cell produces naturally — without this editing, the immune system mistakes its own RNA for a viral infection and triggers inflammation. The problem can go two ways: either the editing enzymes are too low and can't keep up, or the volume of RNA needing editing is so high that even normal enzyme levels would fall behind.</p>
<p>My interpretation of my own data is this: my ADAR enzymes are suppressed but my actual editing rate is elevated — which sounds contradictory until you realize it means there's so much more substrate being produced that even depleted enzymes are generating above-normal editing activity. The enzyme is losing a race against an overwhelming volume of self-derived dsRNA. The editing system is working harder than normal and still falling behind.</p>
<h3>Exonic Ratios</h3>
<p>This was a stage I added just as a proof of concept, but I quickly came to realize its importance. RNA is mostly a photograph of what is going on at a particular point in time in a person's body. You can see what genes are expressed, but you don't typically know what they're doing. The intronic/exonic ratio tells you more though. </p>
<p>If a gene's expression level is its position — a snapshot of where it is right now — the intronic ratio is its velocity, telling you which direction it's heading. Is the gene ramping up, coasting on old transcript, or being actively held back? A gene can look normal in a snapshot but be heading off a cliff, or look suppressed but actually be fighting hard to recover. Without the velocity information, you'd never know.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-exonic-320w.png 320w,/assets/posts/2026/chimera-exonic-480w.png 480w,/assets/posts/2026/chimera-exonic-640w.png 640w,/assets/posts/2026/chimera-exonic-960w.png 960w,/assets/posts/2026/chimera-exonic-1360w.png 1360w,/assets/posts/2026/chimera-exonic-1600w.png 1600w" src="/assets/posts/2026/chimera-exonic.png" alt="Exonic Rates"></p>
<p>Asking AI to review this one dataset, it says the following:</p>
<p>This is the intronic/exonic ratio analysis — the viral persistence plausibility module. The logic: intronic reads indicate active transcription right now (unspliced pre-mRNA), while exonic reads capture both new and old stable mRNA. The ratio between them tells you whether a gene is being actively driven or just coasting on accumulated transcript.
The pattern here is stark and specific. Look at the "discordant_suppressed" genes:</p>
<ul>
<li>OAS2 — ratio z=+2.58, expression z=-2.81. This is the most alarming single line in the table. The cell is actively transcribing OAS2 at a rate 2.58 standard deviations above normal. But the mature mRNA level is 2.81 standard deviations below normal. The cell is making OAS2 pre-mRNA aggressively, but the finished product isn't accumulating. That transcript is being destroyed after it's made, or blocked before it matures. OAS2 is an interferon-stimulated RNase that degrades viral RNA — it's one of the key effectors of the antiviral response.</li>
<li>MX2 — ratio z=+2.17, expression z=-0.57. Same pattern, slightly milder. Active transcription of this GTPase that blocks viral nuclear import. The cell is trying. The output is suppressed.</li>
<li>ISG15 — ratio z=+2.00, expression z=+0.00. The cell is driving ISG15 transcription at double the normal rate, and all that effort produces... exactly normal expression. Whatever is destroying or blocking the mRNA is absorbing all of the extra transcriptional output. ISG15 conjugates to viral proteins to restrict their function — it's a direct antiviral effector.</li>
<li>RSAD2/viperin — ratio z=+1.73, expression z=-0.52. Another actively transcribed antiviral effector that isn't accumulating. Viperin disrupts viral replication by producing ddhCTP, a chain terminator for viral RNA-dependent RNA polymerase.</li>
<li>OAS1 and OAS3 — both showing positive ratio z scores (+0.73, +0.64) with suppressed expression (-0.72, -1.52). The entire OAS family is being driven but not producing output. OAS3 is particularly notable — expression z=-1.52 is a meaningful deficit.</li>
</ul>
<p>This data is useful if you're trying to develop a hypothesis about whether something is actively blocking the immune response in real time — not just that the immune system is weak, but that it's actively trying and being intercepted. The cell is sending the signal, the genes are responding, the transcription machinery is working — but the finished product never arrives. That's a very different picture from simple immune suppression, and it's exactly what I was trying to use this module to detect.</p>
<h3>HERV Expression</h3>
<p>One thing I learned during this exercise is that our DNA is very old. It's like a record of our entire evolutionary history, and even contains some very old machinery long since rendered inactive by natural selection.  So basically our own DNA encodes many super ancient viruses (specifically retroviruses and retrotransposons).</p>
<p>Normally our body silences all of these genes such that they can't cause us harm. But some of the working theories in MS and ME/CFS revolve around these elements.  In theory, if the specific molecular machinery that keeps these elements silenced gets disrupted enough, these ancient retro elements could re-express themselves and you would have your own body essentially producing foreign material. </p>
<p>These elements are called <strong>Human Endogenous Retroviruses</strong>, and my pipeline was set up to try and quantify them.   </p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-herv-320w.png 320w,/assets/posts/2026/chimera-herv-480w.png 480w,/assets/posts/2026/chimera-herv-640w.png 640w,/assets/posts/2026/chimera-herv-960w.png 960w,/assets/posts/2026/chimera-herv-1360w.png 1360w,/assets/posts/2026/chimera-herv-1600w.png 1600w" src="/assets/posts/2026/chimera-herv.png" alt="HERVs"></p>
<p>This is the data I'm the least confident about in my pipeline, so I wouldn't place too much weight on what we are seeing here.  I detected a staggeringly high amount of HERVs in my own sample, but there are clearly batch effects going on that I can't account for yet.  The key insight is that HERVs and HERV based effects can be quantified using this pipeline, and might be able to provide insight into whether HERVs are actually expressing themselves meaningfully in long covid and ME/CFS patients.</p>
<p>The cascade would mostly be:</p>
<ul>
<li>initial virus disrupts the HERV silencing machinery</li>
<li>the suppression damages the mechanism that holds HERVs at bay</li>
<li>HERVs begin re-expressing themselves - your body is literally making foreign material at this stage</li>
<li>Foreign HERVs basically get treated like foreign viruses, and your body reacts the same way - fighting against a pathogen</li>
<li>If this mechanism goes on too long, the machinery that silences these things may shut off for good - it becomes self sustaining. </li>
<li>When this cascade starts, the clock starts ticking in terms of the body's ability to reverse it</li>
</ul>
<blockquote>
<p>Note: If you were looking for a hypothesis for Long COVID, this is a compelling one — is viral persistence actually SARS-CoV-2 still in the body, or is the persistence more about ancient retroelements that are no longer being silenced? It could be either, or both, and the ratio might differ between patients. If HERV derepression is a significant contributor, it would explain why antivirals directed at the virus itself show inconsistent results — you're treating the trigger but not the self-sustaining mechanism it left behind.  I've seen some evidence so far that it may involve the latter. But that's an open hypothesis I think worth exploring.</p>
</blockquote>
<h2>BCR/TCR Repertoire</h2>
<p>This is actually the section that surprised me the most. I was a little disappointed when the pathogen detection pipeline didn't produce much, but there turned out to be a lot of signal hiding in the BCR/TCR data. BCR and TCR are the receptors on B cells and T cells — they're the molecular fingerprints that tell you which specific immune clones are present and what they might be targeting. </p>
<p>The sequencer captures fragments of these receptors, and using various pipeline tools you can reconstruct a list of all the heavy chains and light chains that were picked up during the run. When the body makes an antibody against a pathogen, it combines a heavy chain and a light chain together — the pair forms the specific shape that locks onto the target. The limitation with this approach is that while the pipeline can detect heavy chains and light chains independently, there's no way to determine the exact pairing from short-read RNA-seq data. </p>
<p>This matters because the same heavy chain paired with different light chains can target completely different things. Without that pairing information, a lot of what you're seeing is still noise. But it's hypothesis-generating noise — you can identify which immune gene families are expanded, spot oligoclonal patterns that suggest the immune system is reacting to something specific, and flag candidate clones worth investigating further with more targeted methods.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-bcrtcr-320w.png 320w,/assets/posts/2026/chimera-bcrtcr-480w.png 480w,/assets/posts/2026/chimera-bcrtcr-640w.png 640w,/assets/posts/2026/chimera-bcrtcr-960w.png 960w,/assets/posts/2026/chimera-bcrtcr-1360w.png 1360w,/assets/posts/2026/chimera-bcrtcr-1600w.png 1600w" src="/assets/posts/2026/chimera-bcrtcr.png" alt="Chimera BCR/TCR"></p>
<p>One thing that immediately jumped out in the data is I have a one clone that represents 18.4% of all my clones - that's exceptionally high. In most people clonal frequencies are more like 1-3%.  The fact that one clone is pegged this high shows that my overall repertoire has contracted, and one particular clone has expanded. A single clone at 18.4% means my immune system has devoted nearly one in five of its B cell resources to fighting one thing. This might be a sign of active antibody engagement against one particular target.</p>
<p>Here is the raw data, showing the expanded clone at the top:</p>
<table>
<thead>
<tr>
<th>Chain</th>
<th>CDR3 AA</th>
<th>V Gene</th>
<th>J Gene</th>
<th>SHM</th>
<th>Count</th>
<th>Frequency</th>
</tr>
</thead>
<tbody>
<tr>
<td>IGH</td>
<td>CDYYYYYGMDVW</td>
<td>IGHV3-15*03</td>
<td>IGHJ6*02</td>
<td>40</td>
<td>18.40%</td>
<td>of all IGH</td>
</tr>
<tr>
<td>IGK</td>
<td>CQQYYSTPPWTF</td>
<td>IGKV4-1*01</td>
<td>IGKJ1*01</td>
<td>11</td>
<td>3.78%</td>
<td>of all IGK</td>
</tr>
<tr>
<td>IGL</td>
<td>CAAWDDSLSGWVF</td>
<td>IGLV1-47*01</td>
<td>IGLJ3*02</td>
<td>7</td>
<td>2.41%</td>
<td>of all IGL</td>
</tr>
<tr>
<td>IGK</td>
<td>CMQALQTPRF</td>
<td>IGKV2-28*01</td>
<td>IGKJ3*01</td>
<td>7</td>
<td>2.41%</td>
<td>of all IGK</td>
</tr>
<tr>
<td>IGL</td>
<td>CQAWDSSTSVVF</td>
<td>IGLV3-1*01</td>
<td>IGLJ2*01</td>
<td>6</td>
<td>2.06%</td>
<td>of all IGL</td>
</tr>
<tr>
<td>IGH</td>
<td>CARDSHHYDILTGSAGDFDYW</td>
<td>IGHV1-3*01</td>
<td>IGHJ4*02</td>
<td>6</td>
<td>2.70%</td>
<td>of all IGH</td>
</tr>
<tr>
<td>IGK</td>
<td>CMQATHWRMF</td>
<td>IGKV2-30*02</td>
<td>IGKJ1*01</td>
<td>6</td>
<td>2.06%</td>
<td>of all IGK</td>
</tr>
<tr>
<td>IGH</td>
<td>CAKVPITMIVVGTRKRNNWFDPW</td>
<td>IGHV3-23*01</td>
<td>IGHJ5*02</td>
<td>5</td>
<td>2.25%</td>
<td>of all IGH</td>
</tr>
<tr>
<td>IGK</td>
<td>CQQYNNWPQYTF</td>
<td>IGKV3-15*01</td>
<td>IGKJ2*01</td>
<td>5</td>
<td>1.72%</td>
<td>of all IGK</td>
</tr>
<tr>
<td>IGH</td>
<td>CARGPKITMVRGVIVDYW</td>
<td>IGHV1-8*01</td>
<td>IGHJ4*02</td>
<td>5</td>
<td>2.25%</td>
<td>of all IGH</td>
</tr>
<tr>
<td>IGK</td>
<td>CQQSYSTPHTF</td>
<td>IGKV1-39*01</td>
<td>IGKJ1*01</td>
<td>4</td>
<td>1.68%</td>
<td>of all IGK</td>
</tr>
<tr>
<td>IGH</td>
<td>CARESTNIVVVVAATRGDYFDYW</td>
<td>IGHV3-30*03</td>
<td>IGHJ4*02</td>
<td>4</td>
<td>1.80%</td>
<td>of all IGH</td>
</tr>
<tr>
<td>IGK</td>
<td>CQQADSFPITF</td>
<td>IGKV1D-12*01</td>
<td>IGKJ5*01</td>
<td>4</td>
<td>1.37%</td>
<td>of all IGK</td>
</tr>
</tbody>
</table>
<p>The SHM (somatic hypermutation) count tells you something important about how mature a clone is. When a B cell encounters a target, it enters structures in the lymph nodes called germinal centers, where it undergoes rounds of mutation and selection — each round slightly refines the antibody's fit against the target, like iteratively sharpening a key to better fit a lock. Each round leaves mutations behind in the DNA. An SHM count of 40 on my dominant clone means it has been through extensive refinement — this isn't a B cell that just woke up last week. It's been actively engaging a target for a long time, getting better and better at binding it. For comparison, the other heavy chain clones in my data have SHM counts of 4-6, which is much more typical.</p>
<p>Reading this data as objectively as I can, three things stand out:</p>
<ul>
<li>
<p>There is a persistent antigen. Something has been present in the body long enough for a B cell to go through dozens of rounds of affinity maturation against it. An SHM of 40 isn't consistent with something that came and went — it's consistent with something that's been there for months or longer, continuously stimulating the immune system.</p>
</li>
<li>
<p>The immune system considers it a priority. At 18.4% of all heavy chain clones, the body has devoted a disproportionate share of its B cell resources to this one target. That level of commitment means whatever this clone is targeting, the immune system has decided it matters more than maintaining a diverse repertoire against other potential threats.</p>
</li>
<li>
<p>The response is mature but hasn't resolved. In a normal immune response, you encounter a pathogen, expand clones against it, clear the pathogen, and the expanded clones contract back to a small memory population. A clone still dominating at 18.4% with 40 SHMs means the target hasn't been cleared — either it's still there, or the immune system thinks it's still there. A resolved response shouldn't look like this.</p>
</li>
</ul>
<p>A dominant clone like this has a short differential — it could indicate a persistent antigen driving an immune response, an autoimmune expansion, or in the worst case, a lymphoproliferative process like lymphoma. The high somatic hypermutation count and the presence of other diverse clones make the last option unlikely — malignant clones tend to expand because they've lost growth control, not because they're chasing an antigen, so they typically show lower SHM. </p>
<p>So my best guess is this indicates an ongoing immune response against something that has been there long enough for the B cells to go through 40 rounds of maturation — and whatever it is, it hasn't been cleared yet.</p>
<h2>Closing Thoughts</h2>
<p>As you can see, there is a ton of data you can get out of an RNA sample. There are probably 10 pipeline stages I haven't talked about here, but they all produce different viewpoints of the same data, which together can be used to generate hypotheses.  </p>
<p>Unfortunately for me, I've only tested one sample, so it's hard to further refine the pipeline. My goal was to release this to the public so that research institutions could use it for some of their own analysis, but with n=1 I don't have enough data to refine it and fix bugs. So for now I'm mostly in a holding pattern.</p>
<p>That said, I have contacted several RNA labs, one of which has agreed to help support this effort - I'll be sending them some more of my blood soon which they've agreed to run for me at a super high resolution, about 2x the amount of data I've so far had for my own blood, so I can further refine this.</p>
<p>I also have the entire unhealthy controls from that long covid control cohort as well. That dataset is really interesting because each patient has multiple FASTQ files representing their journey through the hospital during their acute phase. Some of them, sadly, even died.  Using some of my pipeline tools I should be able to see each of their journeys at a RNA level from acute to resolved or acute to deceased, That might shed some light on why some people recover and why some don't. I have enough signals in my own RNA to have formed four of five hypotheses in my own head about what might be going on, some of which I haven't seen discussed in the research literature yet.  So I'll be able to explore those ideas soon.</p>
<p>The goal for me is to eventually open this on GitHub for researchers to use. But at this point I'm several months off, and need more data.  But thanks to my new relationship with an actual RNA lab, one of which is enthusiastic about what I've shown them, I should hopefully have some more data to work with soon.</p>]]></content:encoded>
    </item>
    <item>
      <title>My First Week Making Hot Dogs With Claude Code Max 20</title>
      <link>https://duanestorey.com/posts/my-first-week-of-claude-code-max.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/my-first-week-of-claude-code-max.html</guid>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
      <description>I was a bit late to the Claude Code party, and started about six months after most of my friends.  I openly admit I was pretty hesitant that AI had any shot at taking over coding, but it's slowly won me over in the last few months.
Like most people, I used it at first a bit tepidly, not entirely sure ...</description>
      <content:encoded><![CDATA[<p>I was a bit late to the Claude Code party, and started about six months after most of my friends.  I openly admit I was pretty hesitant that AI had any shot at taking over coding, but it's slowly won me over in the last few months.</p>
<p>Like most people, I used it at first a bit tepidly, not entirely sure of it's strengths or its weaknesses. Slowly over the first few weeks I started being able to produce decent code consistently, so I thought I should experiment with it a bit more.</p>
<p>I started on the $20/mo plan just to get my feet wet. That's great for small code changes but you quickly run into limits. I then updated the Claude Max 5 ($50/mo) plan. That worked well at first, but if you try to work on more than one project at the same time consistently, you pretty soon end up in the dog house and have to wait until your plan resets. I'm one of those people that doesn't feel creative 24/7, so for me it's important to be creative when I actually feel inspired, and relax or go touch grass when I don't. So I decided to upgrade to the $200/mo plan (Claude Max 20) and see just how much I could do with it in a week.</p>
<p>Here's a list of everything I worked on during my first week, and the results of my experimenting. The TLDR is that it exceeded most of my expectations and helped me bring a few old passion projects back from the dead.</p>
<h3>Claude Code Usage Widget</h3>
<p>The first idea I wanted to test out was the ability to see Claude's usage in real time to know whether or not I was approaching my daily or weekly limits. You can type /usage in Claude Code, which works of course, but I envisioned something a little more elegant up in my taskbar.  </p>
<p><img loading="lazy" srcset="/assets/posts/2026/claude-usage-screenshot-320w.png 320w,/assets/posts/2026/claude-usage-screenshot-480w.png 480w" src="/assets/posts/2026/claude-usage-screenshot.png" alt="Claude Code Usage Widget"></p>
<p>One other idea I had was the idea of a budget indicator, some gauge showing you if you were on track to use up your weekly limit, or were you leaving tokens on the table basically at the end of the week.</p>
<p>I described how the app should work, what settings I wanted, what graphs etc, and let Claude Code go to work.  In a few iterations we got the basic premise working, which I slowly improved over the course of the week.</p>
<p>You can <a href="https://github.com/duanestorey/claude-monitor">install this yourself</a> on Mac OSX if you want - a few other people from X already have and are using it full time now.</p>
<ul>
<li>Total Time This Week: 3-4 hours</li>
<li>Net Result: This widget is super helpful to me to gauge how hard I can push in a given sprint with Claude Code, and a few others are already on X.</li>
</ul>
<h3>Crossroads Static Site Generator</h3>
<p>Back when Mullenweg basically decided to detonate a bomb onstage at WordCamp USA, I decided to finally unshackle myself from WordPress and switch to something else. I evaluated a few static site generators like Astro, but I have a real aversion I find to using JS to generate a website, in the same way I have always had some visceral reaction to React.</p>
<p>So in the end I quickly coded up a little PHP static site generator called Crossroads. It has some cool features, like a built in SEO module and a responsive images generator, but I never quite finished it over the Christmas holidays when I started it.  So I got Claude Code to help me patch up the pieces that were in need of some repairs and get it back to a state where I could start writing again.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/crossroads-build-system-320w.png 320w,/assets/posts/2026/crossroads-build-system-480w.png 480w,/assets/posts/2026/crossroads-build-system-640w.png 640w,/assets/posts/2026/crossroads-build-system-960w.png 960w" src="/assets/posts/2026/crossroads-build-system.png" alt="Crossroads Build System"></p>
<p>Since AI has become a lot more dominant since the last time I worked on Crossroads, we spent some time at first adding the appropriate meta tags and .md sidecar files to help AI read the content.  </p>
<p>I then challenged it to make a late 80s to early 90s inspired theme to remind me of my old computing days on the Commodore 64 and my dad's XT computer.  So we came up with a cool retro theme that is part Claude Code and part 90s computer, lovingly called 'phosphor' - that's what you see here running on this website now. The pages were generated by Crossroads, and the theme, phosphor, was designed by me and my AI buddy.  </p>
<p>Crossroads uses the <a href="https://latte.nette.org/en/">latte templating engine</a> so I was curious how it would do - I imagine most of the training was using Blade etc, but it managed to pump out the latte code just as easily.  </p>
<ul>
<li>Total Time This Week: 3-4 hours</li>
<li>Net Result: My blog is back online and I feel inspired to write again</li>
</ul>
<h3>Marksmith</h3>
<p>A friend of mine shared my recommendation to use Macdown, a Mac-based Markdown editor, with someone on X.  The person who received the recommendation didn't seem super impressed with it, saying it seemed a bit dated. Once I saw that, I thought a good challenge for Claude Code would be to write a more improved Markdown editor for Mac OS.</p>
<p>Whenever I start a new project, I try to imagine how it could be different. What are the pain points, especially mine?  How can I take something that takes 5 clicks and reduce it down to 2?</p>
<p>So the first items I thought would be cool would be to have direct static site generation ability right within the app - the ability to build your site, and also to preview it.  </p>
<p>The second item I thought would be nice is a Git update mechanism (most SSGs live in Git and many people deploy using Github pages or Cloudflare pages) and also the ability to see live Git diffs when I edit content.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/marksmith-markdown-editor-320w.png 320w,/assets/posts/2026/marksmith-markdown-editor-480w.png 480w,/assets/posts/2026/marksmith-markdown-editor-640w.png 640w,/assets/posts/2026/marksmith-markdown-editor-960w.png 960w,/assets/posts/2026/marksmith-markdown-editor-1360w.png 1360w,/assets/posts/2026/marksmith-markdown-editor-1600w.png 1600w" src="/assets/posts/2026/marksmith-markdown-editor.png" alt="Behold, Marksmith markdown editor for Mac OS"></p>
<p>The result is a Mac OS application called 'Marksmith'.  It's still a work in progress, but I'm using it already as my own Markdown editor on Mac. I can click the little "Play" button on the top nav bar, which then builds my entire site and lets me click the preview link to view it live. There is also a deploy button which lets me see all the files changed on disk, and push them live to Github, which then starts the Cloudflare deploy process to put my new content live on duanestorey.com.</p>
<p>I wrote this entire post using Marksmith, and also previewed it in the app and pushed it live using the internal Git manager.</p>
<p><img loading="lazy" srcset="/assets/posts/2026/marksmith-git-320w.png 320w,/assets/posts/2026/marksmith-git-480w.png 480w,/assets/posts/2026/marksmith-git-640w.png 640w,/assets/posts/2026/marksmith-git-960w.png 960w" src="/assets/posts/2026/marksmith-git.png" alt="Marksmith Git Manager"></p>
<p>This is yet another work in progress, and needs a few more weeks of love before I'd say it's ready for prime time. But it's already doing the heavy lifting for my SSG in my own workflow.  </p>
<p>If you want to install/build Marksmith, <a href="https://github.com/duanestorey/marksmith">you can find Marksmith on Github here.</a></p>
<ul>
<li>Total Time This Week: 3-4 hours</li>
<li>Net Result: New markdown editor for Mac OS with Git/SSG integration</li>
</ul>
<h3>OpenDCAD</h3>
<p>This last year I've been trying to get into hardware in a big way. My background is actually in electrical and computer engineering, even though I have spent most of my life making money by coding. During Covid lockdowns I spent time improving my actual hardware skills by making custom PCBs using Kicad, fabricating them in China, and then building and testing them all myself. My prime audio system in my living room is a hi-fi amplifier I've made entirely from scratch using about 12 custom PCBs and even a custom spec'ed toroidal transformer.</p>
<p>A lot of my newer projects will need custom 3d enclosures. I have two Bambu printers at home, and have done a lot of modelling in OpenSCAD and Tinkercad. The problem with  OpenSCAD is it produces STL files, which are basically meshes of triangles. Those render fine, and look like a solid object, but they aren't really an object in the traditional sense - they don't have faces, and solid surfaces etc. That differentiation matters when you actually want to fabricate something professionally, as most injection molding companies can't really work with a STL file, and you can't easily convert a tessellated triangular mesh back into a 3d object with proper faces.</p>
<p>So my solution to the problem was to start working on my own OpenSCAD-like language, but built on top of the OpenCascade open source library. This library is the basis for FreeCAD, which is used by many people professionally.  The difference is I didn't see OpenDCAD as having a UI or an interpreter like OpenSCAD, I pictured it as more of a compiler with hot reloading (probably this is a natural instinct based on years of using Vite and Laravel mix etc). </p>
<p>I got pretty far with OpenDCAD, but had to pause when it actually came time to create an entire interpretative language - I have never done that in my entire career, and it involves writing a parsing language and actually building a parse tree.  That's pretty hardcore and is how typically compilers work.  To finish it off, I would have had to read and research a lot more on how that is done.</p>
<p>I decided to point Claude Code at it to see if it could get me over this hump. This is probably the most important part of this project, as defining the language will either make it or break it in terms of usability.  So I was conscious of what every verb in the language meant or didn't mean, and pushed back a few times on how a person would use the language.</p>
<p>Here is the current OpenDCAD language for creating a lithium ion battery pack enclosure.</p>
<pre><code>// Base bin with a fillet
let bin = bin(80,120,20,2).fillet(0.5);

// One battery, built via vector transforms
let battery = cylinder(21/2, 70)
  .translate([0, 0, -35])
  .rotate([0, 90, 0])
  .translate([0, 0, 12]);

// Four-pack arrangement using vector translates
let four = battery
  .fuse( battery.translate([0, 22, 0]) )
  .fuse( battery.translate([0, 44, 0]) )
  .fuse( battery.translate([0, 66, 0]) )
  .translate([0, -40, 0]);
let fourBackup = four;

// Corner offset piece with a vector translate for the inner cut
let piece = cylinder(5, 20)
  .cut( cylinder(4.8/2, 6).translate([0, 0, 14]) );

// Place piece at corners, then fuse the battery pack
let model = bin
  .placeCorners(piece, 34, 54)
  .fuse(four);

// Multiple logical exports; host will write both STEP/STL per id
export model as bin;
export model.cut(piece) as bin_with_cut;</code></pre>
<p>There is still a lot left to do before I release this to the public, as I want to add a full DFM (design for manufacturing) module to it first.  I also am adding full material support to the 3d viewer, so you can basically define the entire object programmatically - including what materials everything is made out of - and have it render photo-realistically (I hope). Here is a early alpha version of the 3d viewer which includes colour support:</p>
<p><img loading="lazy" srcset="/assets/posts/2026/opendcad-3d-viewer-320w.png 320w,/assets/posts/2026/opendcad-3d-viewer-480w.png 480w,/assets/posts/2026/opendcad-3d-viewer-640w.png 640w,/assets/posts/2026/opendcad-3d-viewer-960w.png 960w,/assets/posts/2026/opendcad-3d-viewer-1360w.png 1360w,/assets/posts/2026/opendcad-3d-viewer-1600w.png 1600w" src="/assets/posts/2026/opendcad-3d-viewer.png" alt="OpenDCAD Viewer"></p>
<ul>
<li>Total Time This Week: 4-5 hours</li>
<li>Net Result: Got me over a really hard bump and closer to the finish line by helping finish the main parsing engine and 3d viewer</li>
</ul>
<h3>Chimera RNA Pipeline</h3>
<p>I unfortunately have long covid. It started for me with an infection in December of 2023 that seemed just like any other covid infection I had had. But over the course of six weeks my body just slowly fell apart, and the covid eventually hit my brain and put me in the hospital for two weeks. I spent the next ten months mostly in bed back in Canada trying to pick up the pieces of my life again, and was forced to stop work completely during that period of time due to how ill I was.</p>
<p>I'm part of an amazing study run by <a href="https://www.amaticahealth.com/">Amatica Health</a> that is doing a full RNA analysis of me and another 117 patients to try and understand just what is causing our ill-health.  I exchanged a few messages/emails with Jack, one of the people in charge at Amatica, trying to discover just how much more juice we could maybe extract from the RNA fruit.  </p>
<p>It turns out RNA provides an incredible amount of data, if you know how to read it right. I used Claude to deep dive all the mechanisms we know for long covid and me/cfs. I then brainstormed over a couple days with what a RNA pipeline would look like to test almost every major theory, and also how to potentially treat it.  </p>
<p>Using an AI server I built at home with 28 cores and 64GB of DDR5 RAM, I got Claude Code to help me construct a massive RNA pipeline that could analyze my own FASTQ data file and look for the following:</p>
<ul>
<li>what is the state of every transcribed gene in my body - what is it doing?</li>
<li>what are the pathways that are out of whack?  which ones are feeding on each other?</li>
<li>how many feed forward loops exist in my body - systems that are so out of whack that they have become self sustaining?</li>
<li>what viruses or bacteria are detected in my blood?  What state are they in: hibernating, or actively transcribing? </li>
<li>is any vaccine material detected in my blood?  It shouldn't be there - but is it?</li>
</ul>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-report-320w.png 320w,/assets/posts/2026/chimera-report-480w.png 480w,/assets/posts/2026/chimera-report-640w.png 640w,/assets/posts/2026/chimera-report-960w.png 960w,/assets/posts/2026/chimera-report-1360w.png 1360w,/assets/posts/2026/chimera-report-1600w.png 1600w" src="/assets/posts/2026/chimera-report.png" alt="Chimera RNA Analysis Framework"></p>
<p>This tool I think will be incredibly valuable, and I was in a unique position to build it I think. Not only do I have some of the most comprehensive labs (thanks to living in Spain) of any long covid patient, I also have the engineering and software background to hopefully put all these pieces together in new and interesting ways (or so I hope). </p>
<p>I'll shortly be able to test this with my own sample, and see just what covid did to me. But if this works, then Claude Code will have helped me improve my health, and maybe the health of others too.</p>
<p>My goal is to get this to a place where any individual or research facility could use this pipeline, but I'm not quite there yet. I'm in the process of dockerizing it and testing it on various cloud providers.  But my goal is for someone to git clone the repo, run 'install', and be processing a sample shortly after.</p>
<p>Here is a shot of the web UI interface which can be used to run control or patient samples:</p>
<p><img loading="lazy" srcset="/assets/posts/2026/chimera-web-ui-320w.png 320w,/assets/posts/2026/chimera-web-ui-480w.png 480w,/assets/posts/2026/chimera-web-ui-640w.png 640w,/assets/posts/2026/chimera-web-ui-960w.png 960w,/assets/posts/2026/chimera-web-ui-1360w.png 1360w,/assets/posts/2026/chimera-web-ui-1600w.png 1600w" src="/assets/posts/2026/chimera-web-ui.png" alt="Chimera Web UI"></p>
<ul>
<li>Total Time This Week: 6 hours (I'm at over 100 hours total on this project so far)</li>
<li>Net Result: Full RNA processing pipeline UI, reporting, theoretical frameworks, convergent evidence matrix </li>
</ul>
<h3>WordPress Theme Refactor</h3>
<p>Probably the task I was the most worried about was a WordPress theme refactor I wanted to do this week as well.  I had this large monolithic WordPress project that started as a theme, and probably should have maybe been a plugin or maybe even a standalone Laravel project at some point. But over time a few different people worked on it, and it kind of turned into this Franken-project that was a bit unmanageable.  Working on this codebase had started to get a bit cumbersome, and there was too little test coverage for my comfort.</p>
<p>I actually used the 1M context Claude Opus model for this, as I knew this was a difficult refactor.  I first used /plan mode to split this refactor into ten logical steps. The general premise was at any stage we could change functionality, or we could change form, never both at the same time. And no refactor would start unless we had adequate regression testing to capture issues.  </p>
<p>Some of the tasks we completed incrementally were:</p>
<ul>
<li>2000 pricing unit tests based on the previous code, used as a golden test snapshot of what 'working' looked like</li>
<li>upgrading the entire build system to something more modern</li>
<li>refactoring a large monolithic functions.php into a directory tree of more maintainable classes</li>
<li>busting a Vue based UI apart into pieces that are easier to maintain</li>
<li>re-organizing the entire project on disk, removing dead code</li>
<li>converting an entire back-end based on old AJAX patterns into a proper REST API</li>
</ul>
<p>Lots of moving pieces, and lots that could go wrong. This is about 90% of the way there, and all of our regression tests eventually passed at each stage.  This is a huge win if this works (it should) as it basically took a five year old code base and modernized it in a way that will make extending it much easier.</p>
<ul>
<li>Total Time This Week: 20 hours</li>
<li>Net Result: Revitalizing a 5-year old code base with a large code refactor and AJAX -&gt; REST API conversion</li>
</ul>
<h2>Final Thoughts</h2>
<p>I watched this <a href="https://x.com/atmoio/status/2030289138126107074?s=20">great video the other day</a> by an engineer named Mo Bitar who was sort of having an existential crisis (same as all of us) with regards to this new world and how developers or engineers fit in.  Probably the analogy he makes that is most apt I think is that most of us felt like we were making steaks before and now we are mostly making hot dogs - AI helps us write code, but it's probably not super beautiful code, and we didn't really work hard for it.  It's code, it mostly works. But it doesn't have the elegant and hand-crafted beauty of code we did from hand.</p>
<p>I love writing nice code, and I love a hard challenge. But I'm in my 40s now.  Long gone are my days of sitting up until 3am writing a VOIP stack, or a jitter buffer.  I did that years ago, and I have so many great memories of coding into the wee hours of the night with a 2L of diet coke next to me. But I feel like I've been there and done that.  There are only so many software problems you can solve, and after a while a lot of them start to feel the same.  A lot of what we call software development today is mostly glorified CRUD manipulation. </p>
<p>As this post demonstrates, this past week I was able to move forward a lot of passion projects that I had to neglect mainly due to lack of time.  And sure, I didn't write a ton of code for most of these (some, I didn't write any).  But I'm ok with that.  For me the thrill isn't the code writing anymore - that's the means to the end, not the end.  The thrill is being able to iterate quickly and test ideas without compromising my health by staying up until 2am every night trying to test something out. I don't get super excited by getting Claude Code to write a generic markdown editor. What I do find exciting is trying to get it to integrate Git into that editor and also a SSG build system.  Those are the mashups that get me excited, not the 40 hours of keyboard pounding it took to even test that idea.</p>
<p>So yes, we now live in a world of hot dogs, or at least sausage. But we don't have to make the cheap Walmart brand stuff.  I plan on making some nice BBQ smokies myself, and I still feel like I can add my own special type of BBQ sauce to make that smokie taste even better. Sure, I may not know where all the meat in that sausage came from, but that was even true before when I said <code>import react</code> or <code>import vue</code> into a project - I didn't write any of that code either.</p>
<p>My goal with this week was to push Claude Code Max 20 to its limits, and myself I guess, to see how many parallel projects I could work on at the same time. It was a fun exercise, and it helped me fully understand just how powerful AI is and what we can do with it.  My brain can handle five projects on the go at once, but you do feel it - at some point you do have to step away from the computer and just relax a bit as even saying "continue" feels draining if you're actively reading what it's doing and making sure it doesn't get off track.  I never once hit a weekly limit, or even an hourly session limit, but your mileage may vary.  But I'd rather pay a bit more to make sure I'm never cut off prematurely from a coding session that be forced to put the keyboard down when my brain is racing and the creative juices are flowing.</p>
<p>At this point thanks to AI we are mostly limited by our imagination, so I think those who embrace that and let their creativity flow through it will do well in this new world. The original goal of the Pixar animation studio was to bring 3d animation to the masses. It turned out that was possible, but that wasn't where the magic ended up being. The magic was guys like John Lasseter using those tools to produce beautiful stories that moved us. And it's up to us engineers and developers to use these AI tools the same way, not just to produce generic hot dogs, but to add our own special sauce to something hopefully a little more tasty and wholesome.</p>]]></content:encoded>
    </item>
    <item>
      <title>My Claude Code Setup For Remote Development</title>
      <link>https://duanestorey.com/posts/claude-code-remote-development-setup.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/claude-code-remote-development-setup.html</guid>
      <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
      <description>I've been experimenting with AI-assisted development tools for the last couple of weeks, and Claude Code has pretty much become a permanent fixture in my workflow at this point. I've been testing a few different scenarios with running it - one on my local machine, and another running Claude on my Arch ...</description>
      <content:encoded><![CDATA[<p>I've been experimenting with AI-assisted development tools for the last couple of weeks, and Claude Code has pretty much become a permanent fixture in my workflow at this point. I've been testing a few different scenarios with running it - one on my local machine, and another running Claude on my Arch Linux server back in my office. I tend to work on multiple projects during the same day, so finding a solution that worked for both was what I was after.  I trialed a lot of different shells and connection tools, but finally found a group of tools that I think works pretty well for me, so I wanted to share my setup.</p>
<h3>The Key Problems I Found</h3>
<p>Claude has two modes basically: normal and planning mode.  Planning mode is used for scoping out big chunks of work and then coming up with a master plan that hopefully can be started with a fresh context window and be completed mostly in one go.</p>
<p>What I found is that Claude can often restart easily from a crash if it's in normal mode, but doesn't seem to as gracefully recover when it's in plan mode. And it's not just outright crashes that can bork it, but also a connection, like ssh, going down. So the first issue I hit was how to get Claude to keep going even if it occasionally crashes.</p>
<p>Other problems I had were that whenever my network connection died or I closed my laptop lid, I'd lose my network connection and also my Claude code session. So that was one of the pain points I knew I had to try and solve if this were to be my day to day workflow. </p>
<h4>Using /rename</h4>
<p>Claude Code has a built in /rename command that lets you manually (re)name a session.  This is useful for allowing you to resume a session at a future time, and not having to remember what you were doing in it or the  exact session GUID that it gives you when you quit.  I also suspect it sort of locks in a copy of the context when you do it, so I look at it as my own personal 'save point' like I did when I used to play computer games.  I used to manually add a name, like "/rename Refactor Codebase" - now I just type "/rename" and let it figure out the name on its own using its fancy AI brain.</p>
<p>So making good use of "/rename" mostly solves the scenario where Claude crashes on me and I want to resume later.  But I tend to try to get out of plan mode as soon as I can as I feel normal mode is easier to restart if something goes wrong. I've gotten into a good habit of finishing all my sessions mostly with a "/rename" command before I CTRL-C and finish for the day.</p>
<h3>Running Claude On A Server</h3>
<p>I have a few projects that simply can't run on my Macbook Air, one of which is an RNA pipeline I've been building called Chimera. It needs at least 64GB of RAM, and chews through processors like I chew through doritos, so running it locally isn't an option.  So one of my pain points was figuring out how to access Claude code on my remote server in a way that was stable and repeatable.  </p>
<h4>Using Tailscale</h4>
<p>I come from the era where if you wanted access to a remote server you would just open up a few holes in the firewall and let an SSH connection through.  And I did try that at first. But right away my server was flooded with random SSH connections trying to hit it, so I decided maybe there were better solutions now.</p>
<p>Around the same time, my friend Tony pointed me at <a href="https://tailscale.com/">Tailscale</a>. Tailscale is an application that uses a lot of the same VOIP technology like STUN, ICE, and TURN to basically intelligently allow connections between your own machines. </p>
<p>So for my scenario, I installed Tailscale on my Macbook Air, and also on my server.  Tailscale basically opens a connection to a public server on the internet (Tailscale's servers) that all your machines can then use to basically talk to each other. If you need to open a ssh port, for example, Tailscale coordinates with both sides to open the port and allow the connection over their tunnel I presume.  This also solves the case where the IP address at home can vary, which most home based consumer IPs tend to do from time to time. In that case, Tailscale automatically keeps track of the public IP and makes sure its tunnel still works.</p>
<p>So in my case, whenever I want to access my own server remotely, I just use:</p>
<pre><code>ssh duane@bagend</code></pre>
<p>And that will always resolve to my server back in Valencia (bagend of course being where Bilbo and Frodo lived in the Lord of the Rings).</p>
<p>So now I solved two of my real pain points: how to continue using Claude when it crashes on its own, and how to access Claude on a remote machine.  </p>
<p>There are still issues with this setup though.  SSH is a bit unstable when you're on the road, and an SSH session crashing is just as painful as Claude itself crashing.  So the next pain point I tried to solve was making it so my SSH connections were persistent and resilient to the actual network layer going down.</p>
<h3>Enter The 'Mosh' Pit</h3>
<p><a href="https://mosh.org/">Mosh</a> is the main piece that solved the connection-dropping problem for me, and it's the reason I don't lose Claude sessions now every time my WiFi hiccups. It's basically SSH's more resilient cousin that uses UDP (connectionless protocol) instead of TCP (which requires active TCP connections), handles roaming between networks gracefully, and doesn't care if your connection drops for minutes at a time. You can close your laptop at one café, open it at a different one three hours later on a completely different network, and mosh just picks up where it left off. No dead sessions, no frozen terminals, no staring at a hung prompt wondering if you should kill it.</p>
<p>The way it works is that Mosh maintains state on both the client and server side, so brief network interruptions — or even fairly long ones — don't kill anything. It just shows you a little indicator that it's waiting for the connection to come back, and when it does, your connection seems like it was there the whole time. Combined with Tailscale handling the network routing, I can simply do:</p>
<pre><code>mosh duane@bagend</code></pre>
<p>from literally anywhere and get a connection that survives even if my Wifi connection doesn't.</p>
<p>That said, Mosh on its own only solves half of the persistence problem - if the Mosh session itself eventually dies — say your laptop runs out of battery, or you explicitly disconnect — anything that was running in that session dies with it. So what was needed in addition to network persistence (which Mosh supplies) is also session persistence. </p>
<p>Mosh requires both a server and a client install, brew locally and whatever distrubtion package your server might need too.</p>
<h3>Enter Tmux</h3>
<p>If Mosh handles the network persistence problem, <a href="github.com/tmux/tmux/wiki">Tmux</a> solves the other half of the persistence problem. Where Mosh keeps the connection alive through network interruptions, Tmux keeps the actual terminal sessions alive on the server regardless of whether anyone is connected at all. Even if Mosh disconnects, or even if I shut my laptop down entirely, the Tmux sessions on my server keep running. Claude Code keeps doing its thing, hopefully churning away in the background, and I can simply come back hours later, attach to the session, and everything is exactly where I left it.</p>
<p>So at this point to use both together, it's mostly:</p>
<pre><code>mosh duane@bagend # opens a connection to the server
tmux attach # connects to the active tmux session, i.e. where you left off</code></pre>
<p>Together Mosh + Tmux offer both network and session persistence.  Like Mosh, tmux also requires a server component to be installed, likely via whatever package manager you normall use.</p>
<h3>Multitasking with Mosh + Tmux</h3>
<p>I'm working on four or more projects right now — Chimera (my genomics pipeline), my static site generator Crossroads, OpenDCAD (a 3D model rendering engine), my typical client work, and a couple of other codebases — so what I needed was a way to work on any of a group of sessions all at the same time, or any subset of them.</p>
<p>To handle that, I set up a script that auto-starts a few named tmux sessions on the server.  Think of it like an SSH connection that's already active, even if you've never connected to it. At any point in time I can simply use mosh to connect to my server, and use 'tmux attach' (or rather tmux attach -t [name]) to attach to whatever project I want to work on. </p>
<pre><code class="language-bash">#!/bin/bash
start_session() {
    local name="$1"
    local dir="$2"
    tmux has-session -t "$name" 2&gt;/dev/null || tmux new-session -d -s "$name" -c "$dir"
}

start_session  "chimera"       "/mnt/research/genome"
start_session  "opendcad"      "/mnt/research/opendcad"
start_session  "polymerase"    "/mnt/code/polymerase"
start_session  "crossroads"    "/mnt/code/crossroads"</code></pre>
<p>This runs whenever the server boots up, and each tmux session is set to start in the appropriate working directory for each project. </p>
<p>Notice that I explicitly gave each session a name, which makes it easy to attach to each one on its own.  To attach to my SSG generator codebase, I can just use:</p>
<pre><code>tmux attach -t crossroads</code></pre>
<p>Claude Code can be running in any or all of them, churning away on whatever I've asked it to do, and I attach and detach at will without losing anything. The sessions are basically permanent, other than a power cycle or a forced reboot. </p>
<p>One important aside: you don't want to explicitly type "exit" in a tmux session, as that will take down the tmux session and prevent future attaching.  So you have to retrain yourself to type <code>tmux detach</code> at the end of each session instead of exit.  So when I want to close a browser tab that reflects an active tmux session, I typically do:</p>
<pre><code>tmux detach # session is now free
exit # exit the shell, after which I can close the tab</code></pre>
<p>You can attach to thet same session from multiple devices, and that's actually going to be in the content of a future post about using my iPhone to poke Claude Code periodically.</p>
<h3>Hooking It All Together</h3>
<p>So my complete working stack is Tailscale for the network discovery, Most for a resilient connection at the network layer, and Tmux for persistent shell sessions. The last pieces were just making it ergonomic to actually use day-to-day.</p>
<p>On my MacBook I'm using Ghostty as my terminal/shell, which I've been pretty happy with. I wrote a tiny script called <code>begin</code> that renames the terminal window and attaches to a named tmux session via mosh in one shot:</p>
<pre><code class="language-bash">#!/bin/bash
if [ -z "$1" ]; then
    echo "Usage: begin &lt;session-name&gt;"
    exit 1
fi
echo -ne "\033]0;$1\007"
mosh bagend -- tmux attach -t "$1"</code></pre>
<p>This little shell script also sets the name of the tab to be the project I'm actually working on. So if I type <code>begin chimera</code> I end up with a tab called <code>chimera</code> with an active Claude claude session or at least the active working directory live on the server.</p>
<p>So my actual workflow is: open Ghostty (or a net tab), type <code>begin chimera</code>, and I'm in. I typically have three or four Ghostty tabs open, each attached to a different tmux session on the server, each potentially running its own Claude Code instance. And if I slam my laptop shut and hop on a train, everything keeps running on my server, bagend. When I open it back up, mosh reconnects and I'm right where I left off.</p>
<p>The whole chain is: Ghostty → <code>begin</code> script → mosh (via Tailscale) → tmux session on bagend → Claude Code. Each layer solves one specific problem, and they stack together cleanly without getting in each other's way.</p>
<h3>Final Thoughts</h3>
<p>This whole setup took about two weeks of trial and error to get right, which sounds like a lot but most of that was me going down dead ends with other approaches before landing on this combination. The end result is pretty clean and results in a workflow that lets me run Claude Code sessions across four or more projects on a dedicated Linux server and access them from anywhere on any device without ever losing a session, even if I close my laptop or the network goes down.</p>
<p>Nothing here is particularly fancy or novel. Tailscale, mosh, and tmux have all been around for a while, and I'm sure plenty of people are using them in similar combinations. But it took me a while to figure out that this specific stack was the right answer for AI-assisted development specifically, where session persistence isn't just a nice-to-have but pretty much a requirement. If you're using Claude Code or any other long-running AI tool over a remote connection, this is the setup I'd recommend starting with.</p>]]></content:encoded>
    </item>
    <item>
      <title>Juniper: An Update On A New Repository For WordPress</title>
      <link>https://duanestorey.com/posts/repo-for-wordpress-update.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/repo-for-wordpress-update.html</guid>
      <pubDate>Wed, 25 Dec 2024 00:00:00 +0000</pubDate>
      <description>I set out last week to try and build a bare-bones repository of WordPress plugins and themes and an associated management plugin.  For the most part, I think I managed to get done what I wanted, although I still haven't started the actual update mechanism for it.  There are already great Github updaters, ...</description>
      <content:encoded><![CDATA[<p>I set out <a href="/posts/a-prototype-for-a-new-plugin-and-theme-update-mechanism.html">last week to try and build a bare-bones repository</a> of WordPress plugins and themes and an associated management plugin.  For the most part, I think I managed to get done what I wanted, although I still haven't started the actual update mechanism for it.  There are already great Github updaters, including Github Updater and Repoman.  But at some point I want to add the ability to verify cryptographically signed ZIP archives, and that will require some code on the client site.</p>
<p>But the results of that marathon coding session are now available online at <a href="https://notwp.org">The Not WP Repository</a>.</p>
<h2>Juniper/Author</h2>
<p>The client-side plugin and theme management plugin I created to help with the repository is called <a href="https://notwp.org/plugins/duanestorey/juniper-author/">Juniper/Author</a>, and it has the ability to automatically determine all plugins on Github for a particular user, and submit those to the public repository.  I've made some improvements over the past few days, and it's almost working without any intervention on my part. </p>
<p><img loading="lazy" srcset="/assets/posts/2024/2024-juniper-author-320w.jpeg 320w,/assets/posts/2024/2024-juniper-author-480w.jpeg 480w,/assets/posts/2024/2024-juniper-author-640w.jpeg 640w,/assets/posts/2024/2024-juniper-author-960w.jpeg 960w,/assets/posts/2024/2024-juniper-author-1360w.jpeg 1360w,/assets/posts/2024/2024-juniper-author-1600w.jpeg 1600w" src="/assets/posts/2024/2024-juniper-author.jpeg" alt="Admin view of Juniper/Author"></p>
<p>Since I have full access to the Github API, I also pulled in all the issues and releases. The releases can be cryptographically signed using a private key, which at some point will allow the future Juniper/Berry plugin to confirm that a release is legitimate before installing it.  </p>
<p>This mechanism would protect against a supply-chain attack, similar to what happened with the Advanced Custom Fields takeover.  In that scenario, the Secure Custom Fields plugin would not have been automatically installed because it would have failed the digital signature check (since the private key would not have been available to sign it).</p>
<p>What's next is as follows:</p>
<ul>
<li>Right now updating the Github information is time consuming, so there is a manual button to push for updates.  I'll be making this automatic soon</li>
<li>Code signing is half-baked, so I'm going to put it back in the oven and finish it off</li>
<li>I want to pull in a bit more Github data and expose that via the XML API that Juniper/Server uses.  That way the repository site can continue to have more information for end-users (including links to author X/Bluesky accounts etc).</li>
</ul>
<h2>Juniper/Server</h2>
<p>The repository is a mostly-statically generated series of HTML files generated using the <a href="!https://latte.nette.org/en/">Latte templating engine</a>. I say mostly, as adding a new site to the repository does include a simple PHP file that isn't static, but it doesn't depend on WordPress and it just adds the new site in the local database to be included during the next build, which is currently happening every ten minutes.</p>
<p><img loading="lazy" srcset="/assets/posts/2024/2024-juniper-server-320w.jpeg 320w,/assets/posts/2024/2024-juniper-server-480w.jpeg 480w,/assets/posts/2024/2024-juniper-server-640w.jpeg 640w,/assets/posts/2024/2024-juniper-server-960w.jpeg 960w,/assets/posts/2024/2024-juniper-server-1360w.jpeg 1360w,/assets/posts/2024/2024-juniper-server-1600w.jpeg 1600w" src="/assets/posts/2024/2024-juniper-server.jpeg" alt="Build process view of Juniper/Server"></p>
<p>Juniper/Server pulls all the data from the Juniper/Author APIs, stores it locally in a Sqlite database, and then generates the entire repository statically in just a few seconds. As part of this process, the ZIP files are downloaded locally and the SHA256 hash is generated for each file (since Github doesn't provide it). That allows someone to verify if the ZIP file has been tampered with.</p>
<p>For example, let's say you received a copy of <a href="https://notwp.org/plugins/robertdevore/benchpress/">Robert's new Benchpress plugin via ZIP</a>, but aren't sure it's legit. </p>
<p>On the website you can look and see that the current hash is:</p>
<pre><code>cf3d6d379edacd093d37a9f56cb5e56a162cfbbf84ed5b1b5764c8abe927cf59</code></pre>
<p>If you're on a Mac, you could open terminal and run the following, supplying the name of the ZIP file you downloaded:</p>
<pre><code>sha256 benchpress-1.1.0.zip 
</code></pre>
<p>Which in my case returned:</p>
<pre><code>SHA256 (benchpress-1.1.0.zip) = cf3d6d379edacd093d37a9f56cb5e56a162cfbbf84ed5b1b5764c8abe927cf59</code></pre>
<p>As you can see, the hashes match, which means it's a binary exact copy of the original file. If someone had changed the file, or if this had been a Pro plugin that had been nulled, the hash would not have matched. At that point you know it's not legitimate, and would be looking for a better source from the original author.</p>
<h3>Easy Mirroring</h3>
<p>I wanted to support repository mirroring out of the box, so I baked in that support from the beginning.  Because I used a simple Sqlite database for the content, all a mirror had to do was grab the entire database in one transaction (by downloading it from the source website), and then execute the build process. </p>
<p>There is a single site.yaml configuration file for the server that has a producer field.  The main website has producer equal to 1, which is a master site. Simply changing producer to 0 will tell the build process it is not a master, which will trigger the Sqlite download from consumer_source and start the build process.</p>
<pre><code>  role:
    producer: 1
# change producer to 0 to product a mirror of the 'consumer_source' target
    consumer_source: https://notwp.org</code></pre>
<p>I tested out the mirroring process by setting up a quick PHP website at <a href="https://mirror1.notwp.org/">mirror1.notwp.org</a>, which worked flawlessly.</p>
<p>The last piece of the puzzle was to make the repo address be configurable in Juniper/Author, which it now is.  So conceivably there could be mirrors at different locations or within an organization.  For example, a host like WP Engine could set up a mirror and make the default repository location in Juniper/Author on their installs point at their mirror instead.</p>
<p>This configuration would also work for completely private repositories.  I have a bit more work to do in Juniper/Author for that, but there isn't any reason someone couldn't stand up their own version of Juniper/Server, for their organization for example, and put all their private plugins there within an internal network.</p>
<p>Someone sent me a private X message asking why I was doing this, and if I was trying to consolidate power.  I'm actually trying to do the opposite, and distribute that power instead. Once this is done, I don't have to be involved at all. If I decided to take down <a href="https://notwp.org">https://notwp.org</a> one day because I was grumpy, one of the mirrors could simply change <em>producer: 0</em> to <em>producer: 1</em> in their site.yaml, and at that point they are in charge.  This would necessitate a simple config change in Juniper/Author (adding the new repository in the backend), but it would be a minor blip and that's it.  The plugin authors themselves are the ones in charge of their own data, and that remains the same irregardless of the mirror or repository site.</p>
<p>The next stage is to add more content for WordPress itself, and also build out the author pages.  I also want to add a site-wide "Sponsor" page which will highlight the plugins or themes that are looking for financial backing.  And at that point I hope some of the larger corporate entities might take a look and try to contribute to a few of them, even if it's a monthly coffee budget for a project that they support.</p>
<h2>Future Work And Discussions</h2>
<p>It sounds like there will be some discussions in the new year, possibly hosted by Joost, regarding future infrastructure. The point of this project was mostly a proof of concept to show what types of things can be done.  I'm going to continue to build it out over the next few weeks, as there are a few items I really want to include.  I'm still looking for individuals and corporations that want to add their plugins to the repository, as it gives me more data to play with and to generate additional ideas for the future.</p>
<p>The first thing I personally want to do is provide more funding opportunities for plugin and theme developers. As a plugin developer myself, I know that a lot of people contributing free plugins and themes do so because they care about WordPress and want to give back to the community, often working on these projects in the late evenings (which was one of the reasons I took great offence too basically implying all free plugins were nothing more than freemium upsells). That said, I'm sure life would be a lot easier for those people if they had opportunities to receive funding directly. These were ideas that were floated to Matt back In 2018 and 2019, and were mostly met with silence. But in an ideal open-source project, funding would be received by everyone contributing if possible, not just plugin and theme authors, but security researchers, content providers, etc. That's a great goal for whatever happens in 2025.</p>
<p>Recently the <a href="https://www.thewpcommunitycollective.com/">WP Community Collective</a> launched, which is a non-profit that has transparent budgeting.  So I want to work in something similar into the repositories, even if that's just bringing more exposure to the ability to sponsor authors via Github sponsors, which is a tried and true system with transparency.</p>
<p>If you like where this is going and want to help support its development, you can find a sponsor button on the main <a href="https://notwp.org/plugins/duanestorey/juniper-author">Juniper/Author</a>. You can also find sponsorship buttons on the pages of all the other plugins there too, which I hope inspires some people or corporations to support projects they support.</p>
<p>And on that note, Merry Christmas!  I'm having turkey and pierogis with the family today, and will be doing a bit of coding in front of the TV later.  I hope everyone has a great day, and that the future for all of you, and the WordPress community, will be bright.</p>]]></content:encoded>
    </item>
    <item>
      <title>Juniper: A New Update Mechanism For WordPress Add-ons</title>
      <link>https://duanestorey.com/posts/a-prototype-for-a-new-plugin-and-theme-update-mechanism.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/a-prototype-for-a-new-plugin-and-theme-update-mechanism.html</guid>
      <pubDate>Fri, 20 Dec 2024 00:00:00 +0000</pubDate>
      <description>As most people in the community know, over the last few months things have pretty much gone to shit in WordPress-land. 
Every time you think it can't get any worse, it somehow manages to. WP Engine won their preliminary injunction against Automattic and Matt Mullenweg, which meant that about a week ...</description>
      <content:encoded><![CDATA[<p>As most people in the community know, over the last few months things have pretty much gone to shit in WordPress-land. </p>
<p>Every time you think it can't get any worse, it somehow manages to. WP Engine won their preliminary injunction against Automattic and Matt Mullenweg, which meant that about a week ago, the status quo was mostly put back in place - that meant, amongst other things, the Advanced Custom Fields plugin was returned to its rightful owner, WP Engine, and the loyalty checkbox on WordPress.org was removed (and then strangely replaced with a pineapple on pizza pledge box instead). Most of us in the community held our breath that things would get back to normal at that point, but whatever peace we had unfortunately wasn't lasting.</p>
<p>Last night a new <a href="https://wordpress.org/news/2024/12/holiday-break/">post went up on WordPress.org</a>, basically saying no new plugins or theme submissions will be taken during the holidays, or any new user registrations. The text officially calls these actions a 'Holiday Break', but when things would return to normal was unfortunately left open-ended:</p>
<blockquote>
<p>As you may have heard, I’m legally compelled to provide free labor and services to WP Engine thanks to the success of their expensive lawyers, so in order to avoid bothering the court I will say that none of the above applies to WP Engine, so if they need to bypass any of the above please just have your high-priced attorneys talk to my high-priced attorneys and we’ll arrange access, or just reach out directly to me on Slack and I’ll fix things for you.</p>
</blockquote>
<blockquote>
<p>I hope to find the time, energy, and money to reopen all of this sometime in the new year. Right now much of the time I would spend making WordPress better is being taken up defending against WP Engine’s legal attacks. Their attacks are against Automattic, but also me individually as the owner of WordPress.org, which means if they win I can be personally liable for millions of dollars of damages.</p>
</blockquote>
<p>Even though Matt was the one who went up on stage at WCEU and essentially picked a fight with WP Engine, he's still trying to play the victim card in all of this, which is just sad.  He's the one who went with the full on frontal-assault with WP Engine, and he's the one who escalated it by taking ownership of the Advanced Custom Fields plugin, something which is, as far as I'm aware, unprecedented in the open-source world.  I'm no lawyer, but I'm pretty sure when a judge rules against you and issues a preliminary injunction essentially from the bench due to your actions, it pretty much means you weren't attacked, but rather were the attacker. </p>
<p>Matt was actually one of the individuals who first inspired me to contribute to WordPress.  Him and I first met at a <a href="https://ma.tt/2008/02/northern-voice/">conference in Vancouver called "Northern Voice"</a> in 2008.  A mutual friend of ours, Boris Mann (who I met during my high tech days in Ottawa when I worked at JDS Uniphase in 2000-2002 as a manufacturing engineer), introduced us after Matt's talk.  After that, I doubled down on WordPress, and helped create one of the first mobile plugins for WordPress, WPtouch, along with a smattering of others. Two of the plugins Dale Mugford and myself created, WPtouch and WordTwit, <a href="https://youtube.com/clip/UgkxLBxSsGgjzdGQnVdL7tDGp_tQHsyACDvH?si=ycfB7f2k0ivKks_f">were voted the #1 and #3 plugins for WordPress by users at WordCamp San Francisco in 2009</a>. I also helped organize three WordCamps in the Vancouver area during my time there. </p>
<p>That's why it's been so painful watching what's occurred the last few months, where basically the steward of the open-source WordPress project has basically weaponized a huge chunk of it and shown most of us, in my opinion, that not only are our opinions not valued, but our contributions to WordPress, however large or small, aren't really valued either.  </p>
<h3>The Way Forward</h3>
<p>This morning long-time WordPress plugin author and overall WordPress proponent Joost de Valk <a href="https://joost.blog/wordpress-leadership/">posted a thoughtful piece about WordPress, and what we need to do break the status quo</a>. I've been somewhat saddened by the lack of trustworthy voices in the community that have been willing to stand up and say what they really feel or publicly condemn Matt's actions, so I'm thankful that someone of Joost's status has finally stood up and said it's time for a concrete change. If the WordPress community were an eco-system, then guys Joost would be the starfish in it, the keystone species that have long helped keep it all together.  </p>
<p>What's clear from Joost's post, as well as my own private musings these last four months, is that WordPress.org can no longer be allowed to be weaponized against the community.  Plugin and theme authors shouldn't fear that their plugins will be taken over, nor should people have to endure hardship when it's taken offline, which is what is happening now for the holidays. Don't get me wrong, people need and deserve a break.  But WordPress.org is, in my opinion, clearly being used at this point as a means of controlling not only the competitive interests of Automattic, as was the case in locking WP Engine out of it, but also potentially as a lever against the community itself.</p>
<p>With that in mind, it's time to start working on plans to break that iron grip.  If the community is to survive, then new systems need to emerge to facilitate that.  I don't believe a full-fork is necessary, or even desired at this point.  But what is desperately needed is a way to minimize the role that WordPress.org itself has on the community project known as WordPress, certainly when it comes to the distribution of plugins and themes.</p>
<h3>A New Method For Plugins And Themes</h3>
<p>I've spent the last few months thinking in my head about alternate ways to update plugins and themes. There are already some great projects like <a href="https://git-updater.com/">GitUpdater</a> and <a href="https://github.com/littlebizzy/repoman">RepoMan</a> that many authors are already using.  I also know for a fact there are some exciting new projects currently being developed, and I suspect that we will see a few of those emerge in the next few weeks or months.  But as for me, I have some very particular ideas about what a new plugin or theme repository should look like.</p>
<p>First, it should not be a traditional repository. It should take advantage of as many pieces of existing infrastructure as possible without the need to re-invent the wheel entirely, with no ability to basically shut it down at will.</p>
<p>Second, it needs to provide a curated list of plugins and themes in the WordPress admin so people can explore and install plugin or themes from there.  It also needs to provide a means of ranking those plugins and themes, one that doesn't include a commercial entity gaming the list. </p>
<p>Third, it needs to allow for the ability to verify that an update is legitimate - that is, that the update came from the original author, and wasn't simply taken over as was the case of ACF.  That can be accomplished via cryptographic means.</p>
<p>And lastly, it needs to provide a life-raft for plugin or theme authors looking to help get their plugins and themes off WordPress.org. I've given this lots of thought, and I think a simple addition of a Header to a plugin or theme on WordPress.org should suffice when the time comes.  If they disallow this, I have already thought of work-arounds.  But there needs to be a way to say, "hey, I'm done with WordPress.org" and have the majority of users easily move to a new repository without a ton of friction or work.</p>
<p>With that in mind, I'm going to go on a marathon coding session for the next 48 hours to try and hack out a proof of concept.  I think in that time I'll be able to hit the big pieces of that.  </p>
<h3>What Happens Next</h3>
<p>My goal with what I'm about to build is to hopefully provide a proof of concept to generate some ideas.  If it doesn't stick, or a replacement comes around right away that the community rallies behind, that's great.  Before Matt got on stage at WCUE and started this battle, I was happily eating paella on the Valencian coast in Spain. I've only performed my Ali-like return to the ring due to his actions, and my desire to help the community survive his assaults.  I'm quite happy to help generate some new ideas, and to work tirelessly to help get the community back to a safe position, and then return to my paella-fuelled life. </p>
<p>I no longer have any commercial plugins, nor any real skin in the game with WordPress. I've spent most of the last year playing with hardware, not software.  What I do have is a 15 year history with a community that I have come to love and appreciate, one that is being fractured by the very person who we all thought was supposed to protect it.  If and when proper governance emerges, I'm happy to turn over whatever I write to them, which isn't really necessary since it's all GPL anyways.  But based on what I'm trying to achieve, once it's released it no longer depends on me at all, since it'll effectively propagate itself anyways. </p>
<h3>Coding Goals</h3>
<p>I'm going to be coding mostly in real-time this weekend.  I've set up three repositories over at <a href="https://github.com/notwporg">NotWPorg</a> on Github.  There are three pieces to this in my head.  Because all projects need a name, and I'm likely to have a bit of Gin by the fire while coding this weekend, I've affectionately called this 'Project Juniper'</p>
<ol>
<li>Juniper/Author</li>
</ol>
<p>This is going to be a plugin that plugin and theme authors can install on their WordPress site.  Here they can manage their own GitHub plugins and create releases.  Creating a release will pull directly from the GitHub 'Releases' information, but also allow the author to cryptographically sign the ZIP file, helping prove that a) they created the ZIP and b) it wasn't tampered with during transport and prior to install.  Once it's signed, the plugin updater (discussed later) will refuse to install any plugin that fails a signature verification.  It will also provide an XML API for the next piece:</p>
<ol start="2">
<li>Juniper/Server</li>
</ol>
<p>This is going to be a very light-weight, mostly statically generated, self-mirroring plugin repository. Here you'll find a curated list of all plugins by all users of Juniper/Author. For now, plugins will be self-submitted to the repository, but I may change that so Juniper/Author automatically facilitates an update.  The important point here is that a mirroring process will be baked into it.  My plan is so anyone can fork Juniper/Server, change a few config lines, and stand up a completely independent mirror of the plugin information in a few minutes, on something as simple as a Digital Ocean droplet. That information will be used by:</p>
<ol start="3">
<li>Juniper/Berry</li>
</ol>
<p>This piece has the coveted Juniper "Berry" designator, which is our favourite flavouring addition to Gin. Juniper/Berry will pull from a list of multiple Juniper/Server instances, or even private ones if desired. Like DNS, I'll try and make it automatically failover, so if one or more of these disappear, things will proceed as normal.  </p>
<p>It may be possible to ditch Juniper/Server at some point, but at this point I think it's a necessary evil and will offload some of the larger data processing away from the client and onto the server to create the master lists.  I plan to use a page-rank type algorithm incorporating Github stars, issues, and a new method I'm considering involving a new plugin and theme header, "Endorses:".  This is basically a way for plugin and theme authors to endorse other plugin and theme authors, helping propagate trust through the eco-system.  This isn't an admission that a plugin or theme doesn't have security issues in their code, or that their plugin or theme won't break your site.  But it is an endorsement that this plugin or theme author generally does good work and likely has created something useful, enough so that it should be given a slightly higher weight in a curated list.</p>
<h3>Let's Fucking Go</h3>
<p><img loading="lazy" srcset="/assets/posts/2024/lets-fucking-go-320w.jpeg 320w,/assets/posts/2024/lets-fucking-go-480w.jpeg 480w,/assets/posts/2024/lets-fucking-go-640w.jpeg 640w,/assets/posts/2024/lets-fucking-go-960w.jpeg 960w,/assets/posts/2024/lets-fucking-go-1360w.jpeg 1360w" src="/assets/posts/2024/lets-fucking-go.jpeg" alt="LFG"></p>
<p>In the words of Wolverine, "Let's Fucking Go". </p>
<p>If anyone wants to follow along, I'll be updating all three repos over the next 48 hours in mostly real-time.  Other than stopping to tend the fire here in Canada, or to pet my sister's beagle, I'm going to see how far I can get in 48 hours.  I'm neither an expert in cryptography or semi-distributed systems.  So if you're following along and see something that can be improved, please let me know.  Like I said, this is just a proof of concept, but like all long distance journeys, they start with a single, solitary step.</p>
<p><a href="https://x.com/deviorobert">Robert DeVore</a> has already gracious offered to help with a bit of testing, but if anyone else has a bit of free time this weekend, I can use some help with testing from the following three groups:</p>
<ol>
<li>People who don't mind standing up a bare-metal PHP instance to run a mirrored copy of Juniper/Server</li>
<li>People who have plugins or themes exclusively on GitHub that want to be a part of the initial curated list of plugins</li>
<li>People who have a plugin or theme dual-released on WordPress.org and Github, who want to help test the life-raft functionality.</li>
</ol>
<p>Just to be clear, nobody will be forcibly moved from WordPress.org to a new repository. Whatever I come up with will involve the website owner having informed consent that a new, signed version exists, and will require them to voluntarily agree to move to the new repository. That's a lot more than WP Engine's users were given, and the bare minimum that should be required to change code on someone's server.</p>
<p>As always, you can find me over on <a href="https://x.com/duanestorey">X</a> or <a href="https://bsky.app/profile/duanestorey.com">Bluesky</a> - hit me up there to have timely responses to any of this.  </p>
<p>And on that note, it's time to code.</p>]]></content:encoded>
    </item>
    <item>
      <title>Down The Rabbit Hole - A Look At The WordPress Update API</title>
      <link>https://duanestorey.com/posts/down-the-rabbit-hole-a-deep-look-at-the-wordpress-api.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/down-the-rabbit-hole-a-deep-look-at-the-wordpress-api.html</guid>
      <pubDate>Fri, 08 Nov 2024 00:00:00 +0000</pubDate>
      <description>A few weeks ago, I sat down with my WordPress installation to see how difficult it would be to actually use a different API endpoint entirely instead of the default WordPress.org site. As others have pointed out, there are roughly 1,500 hard-coded WordPress.org links throughout the code, pointing to ...</description>
      <content:encoded><![CDATA[<p>A few weeks ago, I sat down with my WordPress installation to see how difficult it would be to actually use a different API endpoint entirely instead of the default WordPress.org site. As others have pointed out, there are roughly 1,500 hard-coded WordPress.org links throughout the code, pointing to various API endpoints and reference documentation. What I discovered is, despite what some people are parading online, that there is no real easy way via the code to swap out the API entirely. In fact, the HTTP API within WordPress is probably one of the least useful APIs in terms of being able to extend it using available hooks and filters.</p>
<h3>Leaky User-Agent Header</h3>
<p>While investigating this though, I did notice one peculiar item involving a usually silent header that is passed between clients and servers, called the User-Agent. The User-Agent header is used by clients to let servers know what type of client they actually are. This is the field that can be used to discover if a viewer of a website is a regular user using Mozilla, or if they are a robot acting on behalf of Google or Twitter. </p>
<p>What was odd about the WordPress one is not only was it advertising that a web request was happening from WordPress itself, but it was also advertising the version of WordPress and, more alarming, the website URL itself.  </p>
<p>For example:</p>
<pre><code>user-agent: WordPress/6.6; http://mywebsite.com</code></pre>
<p>There's nothing uniquely wrong about advertising the request is coming from WordPress, that's probably considered "polite" at the internet level (some servers actually won't respond at all without some type of User-Agent). I'm of the opinion though that you should never provide data that isn't absolutely required in any type of web request.  Adverising the version as well may seem benign, but what if you're on a version of WordPress that contains a critical bug that lets someone take over the admin?  You're basically advertising this to anyone you make a HTTP request to from within WordPress.</p>
<p>The other part though, including the website home URL, is a much bigger issue. I'm no expert on GDPR, but this URL might be considered identifying information.  Without it, the server you are connecting to typically gets your IP address, but that's about all. If you think about this from a hosting provider perspective, there can potentially be thousands of websites on one IP, so having that information isn't always particularly revealing on its own.  But once you know the URL and the IP, you know <em>exactly which</em> website made the request, potentially the owner behind it, and likely even where it's hosted (GoDaddy, WP Engine, etc). That's a lot of data when you don't have an end user license agreement, or some explicit opt-in request.</p>
<p>Another disturbing scenario is the fact that even local development environments would send the URL to WordPress.org. In my case, I had several requests with <a href="https://local.dev">https://local.dev</a>, one of my test environments, get sent to WordPress.org.  Imagine if you were tasked with working on a brand new government website that nobody was supposed to know about, and you set it up on a staging site like <a href="https://medicare.whitehouse.gov">https://medicare.whitehouse.gov</a>. It would seem even in that scenario WordPress would advertise in the User-Agent header that a site with that URL was making a request. The User-Agent header gets added even to non-WordPress.org requests, so anything that local website attempted to contact using HTTP within WordPress would advertise that URL.</p>
<h3>Plugin And Theme Data</h3>
<p>The next area I looked at was what type of data was being provided to the WordPress.org APIs having to do with plugins and themes. When you visit the plugins page or themes page within WordPress, at various times during the day it'll generate a web request to WordPress.org basically looking for which themes or plugins have updates available. That's typically a good thing, as you don't have to update those manually.</p>
<p>The URLs endpoints associated with these updates look like:</p>
<pre><code>https://api.wordpress.org/themes/update-check/...
https://api.wordpress.org/plugins/update-check/...</code></pre>
<p>What I found was for these requests not only did they also contain this User-Agent modification which advertises the website address, but they also transmit detailed information about <em>every</em> plugin and theme installed within WordPress.  Not just active ones, and not just ones installed from the WordPress.org repositories. If you have a Pro theme, or a privately developed plugin, information about both are being sent to WordPress.org in the form of every header entry in the style.css or main plugin file.</p>
<p>For example, for the HTTP Requests Manager plugin, all the information contained in the main plugin file is transmitted back home.</p>
<pre><code>Plugin Name: HTTP Requests Manager
Plugin URI: https://veppa.com/http-requests-manager/
Description: Limit, Debug, Optimize WP_HTTP requests. Limit by request count, page load time, reduce timeout for each request. Speed up login and admin pages.
Version: 1.3.6
Author: veppa
Author URI: https://veppa.com/
Text Domain: http-requests-manager
Domain Path: /languages
Requires at least: 4.7</code></pre>
<p>I mean, why does WordPress want these headers for plugins that are already on WordPress.org?  It seems redundant. But for plugins that maybe come from somewhere else I can see it potentially being more useful.</p>
<p>In 2011, WordPress introduced a new header called <em>Update URI</em>, which can be used by plugins and themes to indicate they don't update from the WordPress.org servers.  You would think though having a non WordPress.org URL defined in a plugin or theme and indicated as the <em>Update URI</em> would stop information about those plugins and themes from being sent to WordPress.org (why would they need to be sent? - there is no update there to receive), but they are sent as well. So basically every plugin and theme on the entire WordPress install, along with their complete headers (and the website URL from above) are sent with each transactions.</p>
<h3>Core Updates</h3>
<p>To determine whether or not an updated version of WordPress itself is available, WordPress makes another API call via the core API. The API endpoint associated with this looks like:</p>
<pre><code>https://api.wordpress.org/core/version-check/...</code></pre>
<p>If you look at the actual URL sent to WordPress.org, it's revealing, and not in a good way:</p>
<p><img loading="lazy" srcset="/assets/posts/2024/wordpress-api-core-320w.png 320w,/assets/posts/2024/wordpress-api-core-480w.png 480w,/assets/posts/2024/wordpress-api-core-640w.png 640w,/assets/posts/2024/wordpress-api-core-960w.png 960w,/assets/posts/2024/wordpress-api-core-1360w.png 1360w,/assets/posts/2024/wordpress-api-core-1600w.png 1600w" src="/assets/posts/2024/wordpress-api-core.png" alt="WordPress API Core Request"></p>
<p>If you actually break this apart and look at the data, here is what is being sent to WordPress.org with each core update request:</p>
<ul>
<li>The version of WordPress you are running</li>
<li>The version of PHP you are running</li>
<li>The version of MySQL you are running</li>
<li>The number of blogs being hosted on your website (I assuming for multisite)</li>
<li>The number of users you have on your website</li>
<li>Whether or not multisite is enabled on your website</li>
<li>The initial version of your database (I have no idea what these means, I'm guessing it correlates to when you installed WordPress)</li>
<li>Every single PHP extension that's enabled on your site</li>
<li>Information about your platform, likely from a <em>uname -a</em> type call. This indicates the operating system and architecture (Mac etc) you are running</li>
<li>What types of advanced images you support (Avif/Webp)</li>
</ul>
<p>Don't forget that they are also supplying the User-Agent field above, which gives them the actual URL associated with all this data, along with the IP which they get from the inbound request. Even if they didn't have that though, it wouldn't matter since for these core updates, they are also adding two non-standard HTTP headers in the request, <em>wp_install</em> and <em>wp_blog</em>.  </p>
<p>At this point I was so surprised by this, that I wondered if what I was seeing in the code wasn't really what was happening.  So I installed the <a href="https://www.wireshark.org/">WireShark</a> Network packet sniffer to actually see what was going out on my network interface.  As the request to the WordPress API is usually encrypted over https (and thus, wouldn't be visible when sniffing packets), I had to hack WordPress to send them over http instead so I could see them in Wireshark.  </p>
<p>And sure enough, these headers actually are sent as well:</p>
<p><img loading="lazy" srcset="/assets/posts/2024/wordpress-api-headers-320w.png 320w,/assets/posts/2024/wordpress-api-headers-480w.png 480w,/assets/posts/2024/wordpress-api-headers-640w.png 640w,/assets/posts/2024/wordpress-api-headers-960w.png 960w,/assets/posts/2024/wordpress-api-headers-1360w.png 1360w,/assets/posts/2024/wordpress-api-headers-1600w.png 1600w" src="/assets/posts/2024/wordpress-api-headers.png" alt="WordPress Core Update Request Headers"></p>
<p>First off, any non-standard headers are supposed to prefixed with a <em>X-</em>, so these two fields technically should have been X-wp_install and X-wp_blog. I'll ignore that since they were likely implemented a long time ago. But more to the point, these two fields just represent another case of potentially sensitive information being broadcast with all requests to the WordPress.com core update API.</p>
<h2>Privacy Policy</h2>
<p>I haven't installed a version of WordPress in a while, so I don't remember if there is any type of wizard that includes an End User License Agreement (EULA).  It's sort of a moot point if it does, since most hosting providers provide one-click WordPress installations these days, the same as many development tools I use like <em>Local</em>.</p>
<p>So without a EULA, the next best place to look is at the <a href="https://en-ca.wordpress.org/about/privacy/">privacy policy on WordPress.org</a>.  Now of course, that privacy policy may just refer to visitors on WordPress.org, but since the WordPress API data ends up there, it's possible it applies as well.</p>
<blockquote>
<p>WordPress.org also collects potentially personally-identifying information like Internet Protocol (IP) addresses. WordPress.org does not use IP addresses to identify its visitors, however, and does not disclose such information, other than under the same circumstances that it uses and discloses personally-identifying information, as described below.</p>
</blockquote>
<p>As I showed above, not only are they obtaining the IP address, but they are also receiving the website URL as well. That's identifying information as far as I'm concerned. </p>
<blockquote>
<p>Certain visitors to WordPress.org choose to interact with WordPress.org in ways that require WordPress.org to gather personally-identifying information. The amount and type of information that WordPress.org gathers depends on the nature of the interaction. For example, we ask visitors who use our forums to provide a username and email address.</p>
</blockquote>
<blockquote>
<p>In each case, WordPress.org collects such information only insofar as is necessary or appropriate to fulfill the purpose of the visitor’s interaction with WordPress.org</p>
</blockquote>
<p>I would argue that the information being sent in the above request is above and beyond what is necessary for any of those requests, and ultimately provides an incredible amount of information to WordPress.org. </p>
<h2>Use Of Collected Data</h2>
<p>I have no idea what WordPress.org is doing with this data. It's of course possible that this data isn't even stored, but I personally find that unlikely (why spend effort coding this up if you're just going to toss the data away?)  Last night Automattic released what they call the <a href="https://wordpressenginetracker.com/">WordPress Engine Tracker</a>, a project that can be used to see how many people are leaving WP Engine since Matt's keynote speech at WordCamp USA.  When I saw that website, I immediately wondered how Automattic had access to all the sites hosted on WP Engine. </p>
<p>One scenario, of course, is that they bought this data from some of the third-party services that scrape the internet looking for which platforms are run there.  Another possibility though is that they used the data acquired from the WordPress.org API to generate that data. There is no proof of that, of course, but it does seem at least to me that they possibly <em>have</em> all this data for this purpose - IP addresses, website URLs, specific WordPress install information, etc.  So it's certainly possible.</p>
<p>Is recent weeks, many of us (myself included) also surprisingly learned that WordPress.org isn't in fact owned by the WordPress Foundation, but is in fact owned personally by Matt Mullenweg, the co-creator of WordPress and CEO of Automattic Inc. That means that all this data (if it's being processed and stored in its entirety), representing the WordPress usage and installation specifics of 43% of the internet, is essentially in the possession of one private citizen.</p>
<h2>Next Steps</h2>
<p>If any plugin or theme tried to collect even a fraction of that type of data from the admin panel in WordPress, I imagine they would soon be delisted from the repository for breaking the <a href="https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/">plugin guidelines</a> and theme guidelines. If we look at the plugin guidelines, point 7 explicitly states:</p>
<blockquote>
<p>In the interest of protecting user privacy, plugins may not contact external servers without explicit and authorized consent. This is commonly done via an ‘opt in’ method, requiring registration with a service or a checkbox within the plugin settings. Documentation on how any user data is collected, and used, should be included in the plugin’s readme, preferably with a clearly stated privacy policy.</p>
</blockquote>
<p>I checked the WordPress download ZIP to see if there was any additional content inside that might detail this data, but I didn't find anything in the normal download package. I also don't remember anywhere in the admin panel where a user is asked to agree to sending this information, and to opt-in to it.  Like always, I believe what's fair and right for one group of people should be fair and right for everyone.</p>
<p>Of course, it's easy to say that WordPress itself is a different beast, but I do think it has an obligation to inform users properly about what data is being sent, collected, how it's used, and how to get rid of it. And so far I haven't found any real information on any of that, which was one of the reasons I went down this rabbit hole. </p>
<p><img loading="lazy" srcset="/assets/posts/2024/wordpress-api-privacy-plugin-320w.png 320w,/assets/posts/2024/wordpress-api-privacy-plugin-480w.png 480w,/assets/posts/2024/wordpress-api-privacy-plugin-640w.png 640w,/assets/posts/2024/wordpress-api-privacy-plugin-960w.png 960w,/assets/posts/2024/wordpress-api-privacy-plugin-1360w.png 1360w,/assets/posts/2024/wordpress-api-privacy-plugin-1600w.png 1600w" src="/assets/posts/2024/wordpress-api-privacy-plugin.png" alt="WordPress Privacy Plugin"></p>
<p>Since there appears to be currently no easy way to opt-out of sending this data, I decided to create a new WordPress plugin to help. You can find it on the <a href="https://github.com/wp-privacy/wp-api-privacy">WP API Privacy Plugin on Github</a>. This is a very early beta version, so I don't recommend installing it on any production sites yet. But by all means, please test it out on any non-essential or local development sites.</p>
<p>This plugin performs the following:</p>
<ul>
<li>it strips the version information and the website URL from the User-Agent header</li>
<li>it strips all plugins and themes from the HTTP API request that represent themes and plugins updated from other repositories outside of WordPress.org (indicated by the <em>Update URI</em> field)</li>
<li>it strips all the identifying information from the core update URLs and the headers the leak the website URLs</li>
</ul>
<p>I've tried to do this in the most benign way, that is, without polluting the data of sites that continue to provide this information to WordPress. There is a less friendly way to do this, and that's to continue to provide all these fields, but just make them completely inaccurate. I have chosen not to do that, since I believe it's important for users to be able to opt-out of any type of data collection that occurs from their website, and I want to do it in the least intrusive way.</p>
<p>Based on what I'm seeing on Twitter and other social networks, It wouldn't surprise me at all if in the next few weeks we start seeing alternative plugin repositories emerge. As it's possible these will continue to use the same WordPress APIs, but talk to different servers, this plugin will also ensure that only the minimal amount of data is presented to them as well, helping to protect your site's privacy.  You also may notice that I chose to publish this new plugin on Github and not WordPress.org (where I'm assuming it would never be approved anyways). My main reason for that is simple - I no longer consider the WordPress.org repository to be trustworthy.</p>
<p>If anyone has any feedback about the plugin, by all means drop me a line or drop an issue on Github. But I wanted to share some of what I learned while investigating how all these WordPress APIs actually work, and what data they appear to be sending back home.</p>]]></content:encoded>
    </item>
    <item>
      <title>Migrating Away From WordPress, Part One: Exporting Data</title>
      <link>https://duanestorey.com/posts/migrating-away-from-wordpress-part-one.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/migrating-away-from-wordpress-part-one.html</guid>
      <pubDate>Sat, 02 Nov 2024 00:00:00 +0000</pubDate>
      <description>I posted the other day about how, after 18 years of WordPress, I finally migrated this blog to another framework. While I started evaluating various popular frameworks like Astro and Hugo, I had some initial problems handling the type of content I had added to my website over time. Eighteen years is ...</description>
      <content:encoded><![CDATA[<p>I posted the other day about how, after 18 years of WordPress, <a href="/posts/wordpress-is-on-dangerous-ground.html">I finally migrated this blog to another framework</a>. While I started evaluating various popular frameworks like Astro and Hugo, I had some initial problems handling the type of content I had added to my website over time. Eighteen years is a long time to be writing, and WordPress itself changed quite a bit over that period of time. For example, much of my older content has various short codes intermixed within it, which doesn’t really translate well to a new system.  </p>
<p>Considering I have a bit of time on my hands while I visit some family in Canada, I thought it would be a good learning exercise to try and code a complete static site generator from scratch to replace my WordPress website. Since Cloudflare Pages allows a static website to be hosted for free, I decided against using any sort of database for now, and instead decided to simply use the popular Markdown format for my website going forward.</p>
<h2>What Is Markdown</h2>
<p>If you’ve ever used Github or any similar tool, you’ve likely been exposed to Markdown files. Markdown files usually end in .md and provide a really simply way to edit content. For example, to do bold a sequence of text, instead of remembering what HTML tags you need, you can simply surround your text in two asterisks, like this **this**, which then turns into <strong>this</strong> when it’s rendered. Super simple. No HTML tags to remember, just a few simple text tricks to do what you need.</p>
<p>For a full list of markdown, <a href="https://www.markdownguide.org/basic-syntax/">you can visit this site</a>. </p>
<h2>Generating an XML Export File</h2>
<p>One of the main methods for taking content off of a WordPress site involves the use of the internal WordPress XML export file.  This file basically contains the majority of your website data, including blog posts, pages, comments, etc. While it’s not as exhaustive as a full site backup (which includes the entirety of the file system as well, including the images), for our purposes it’s good enough. </p>
<p>To export an XML file, you simply need to go into the WordPress admin panel, choose <em>Tools</em>, and then <em>Export</em>. In terms of content, make sure you select <em>All Content</em>.  Once this is done, you’ll have a downloaded file representing the bulk of your WordPress site content, excluding images. </p>
<h2>Converting The Content to Markdown</h2>
<p>Once you have the WordPress content in the form of an XML file, you need a way to convert it into a series of Markdown files. Thankfully a few different tools exist, and I ended up using <a href="https://github.com/lonekorean/wordpress-export-to-markdown">the wordpress-export-to-markdown project code on Github</a>.  I cloned a copy of the repository locally, then copied my WordPress XML into the root directory of the repository as wordpress.xml.</p>
<p>After that, you can run the conversion script using <em>npm install &amp;&amp; node index.js</em>. The Markdown converter will ask you a series of questions in terms of where your output will be located, and how it should be segmented. In my case I chose to use year-based folders, but not per-post folders (I figured this would be hard to manage when looking for old posts). Also didn’t add the date into my file names, as I’ll rely on the front matter (the text located at the start of the Markdown file) to handle this. The most important part of this process is to automatically have the tool download all the images in the XML file locally, so make sure you answer yes to these questions. This process takes a while as it’ll need to download a copy of each and every image file over the Internet to your local machine, but once it's done you’ll have a good snapshot of your content.</p>
<p>One thing to mention is that all your content will be pulled down and converted, including drafts and private posts. My plan was to check all my posts into Github, so I went through my WordPress site prior to doing my export and permanently removed all my private posts just so they wouldn’t end up in Github. If this is a concern of yours as well, it’s something to be aware of before you generate your WordPress export file.</p>
<p>While this conversion tool is useful, it’s not an exhaustive capture of everything on your WordPress website.  Only a few of the post and page fields are transferred over, so if you have any custom meta data, it won’t be preserved. I imagine the tool could be expanded easily enough to get at some of the other data, but for my purposes it was good enough.</p>
<h2>An Example Post</h2>
<p>Once it’s complete, you’ll have a series of folders representing all your posts and pages. In each directory should be a series of Markdown files ending in the .md prefix, along with an image directory containing all the downloaded images.  You can see an example of a blog post in Markdown format in the image below.   </p>
<p><img loading="lazy" srcset="/assets/posts/2024/markdown-example-320w.png 320w,/assets/posts/2024/markdown-example-480w.png 480w,/assets/posts/2024/markdown-example-640w.png 640w,/assets/posts/2024/markdown-example-960w.png 960w,/assets/posts/2024/markdown-example-1360w.png 1360w" src="/assets/posts/2024/markdown-example.png" alt="Markdown Example"></p>
<p>The top section contains the post meta data and is called <em>front matter</em> within the Markdown. It contains the taxonomies in the form of categories and tags, the post publication date, the title, and the featured image from WordPress. The only piece that’s missing that I really need is the ability to add rich SEO description field on a per-post basis, so I’ll use a new front matter term called <em>description</em> going forward.</p>
<h2>Static Site Generators</h2>
<p>If you’re wondering what a static site generator is, it’s basically a way to take data and render it as a collection of HTML files. If you use WordPress without a caching plugin, every page is dynamically generated in real-time using PHP. That’s powerful, but also can be pretty slow depending on how much code is running each time. If you install a caching plugin, often they will take the output from the dynamic page and save a temporary HTML file, serving that file directly when people visit your website. That’s a pretty good compromise. But if you want to take it all the way to its conclusion, you can remove the dynamic aspect entirely, and just generate an entire website when you update your content.</p>
<p>If that sounds funky and crazy, it wasn’t always that way. The popular Blogger platform used to publish content that same way in the 2000s, but over FTP. Nowadays there are plenty of great ways to host static websites, including a really handy combination of Github and <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>, which actually works well for free.  Since static websites are once again all the rage, I decided it would be a great time to go completely static again.</p>
<h2>Next Steps</h2>
<p>If you’ve made it this far and followed along, you now have a pile of Markdown content to use. You can now use all your shiny Markdown data to generate a website using one of the many popular static site generators like <a href="https://astro.build/">Astro</a>, <a href="https://gohugo.io/">Hugo</a>, or <a href="https://jekyllrb.com/">Jekyll</a>. </p>
<p>For my purposes though, I decided to try and code my own as a learning exercise. If you’re reading this on my website, then you’re already seeing the end result of that effort, as this is a purely static site generated from my own code. So stay tuned for more posts in this series detailing this effort shortly, and what I learned.</p>
<h3>Updates</h3>
<p>Since posting this originally, Robert DeVore has released a new <a href="https://robertdevore.com/introducing-markdown-exporter-for-wordpress/">Markdown Exporter for WordPress</a>, so that's another option for people looking to export their WordPress content.</p>]]></content:encoded>
    </item>
    <item>
      <title>WordPress Is On Dangerous Ground</title>
      <link>https://duanestorey.com/posts/wordpress-is-on-dangerous-ground.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/wordpress-is-on-dangerous-ground.html</guid>
      <pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate>
      <description>This is my first post in a long time, as you can tell. One of the reasons I'm writing 
an entry is due to what's been going on in the WordPress world. In case you've been living under a rock,
there is currently a big public battle going on between Matt Mullenweg, the company he runs, 'Automattic', and ...</description>
      <content:encoded><![CDATA[<p>This is my first post in a long time, as you can tell. One of the reasons I'm writing 
an entry is due to what's been going on in the WordPress world. In case you've been living under a rock,
there is currently a big public battle going on between Matt Mullenweg, the company he runs, 'Automattic', and a rival 
called WP Engine.</p>
<p>I can only speculate as to the real reasons for this public spat. On its surface, one side claims it's about a trademark dispute. But based on the actions of 
that same side, it seems to be some poorly thought out plan to exert more control over the community, and to attempt to extract revenue out of hosting providers 
in the WordPress sphere under the guise of a trademark license. </p>
<p>Many members of the WordPress community, myself included, feel that recent actions taken by Matt and Automattic have been 
been unethical and against the very principles of open-source itself.  As a previous plugin author that once had
over five million downloads of one of my plugins, I was completely shocked that WordPress would usurp someone else's plugin and call it a fork
(without changing the slug).  In addition, many of the communications from the official WordPress channels have shown complete contempt for the 
very community it claims to represent. </p>
<p>My modus operandi is pretty simple - I believe what's fair and true for one person or group should be fair and true for any other group or individual.  That's it.
I believe if we have rules and guidelines that they should apply to everyone, and not just be enforced selectively.  </p>
<p>That's why I don't think it's right that someone can go up
on stage at WordCamp US and disparage a $75,000 sponsor, when any other member of that same community would have likely received a ban for that same episode. I don't 
think it's fair to provide WordPress.org services to some users, and not to others due to a business disagreement (especially since there are literally 1500 hardcoded references in the WordPress source code 
pointing to WordPress.org).  If the WordPress.org services are to be pay to play, that's fine, simply set a price so we can all pay and continue to use it. Or transfer it 
all to the Foundation and do a proper fundraising campaign so businesses help pay for it.  But no business or individual should ever have to worry about 
accessing the WordPress.org site, especially one who is allegedly on the receiving end of an extortion campaign.  If we are to believe that WordPress.org isn't a critical part of using WordPress, then Automattic should set about removing all 1500 instances of it within the code and simply have configurable update services.</p>
<p>I have been pretty vocal on X over the last few weeks due to all of this, partially to support the many community members who have been ostracized for expressing displeasure, and
partially to continue to help advocate for the community that did so much to help me over the last 15 years.  It's been extremely hard to watch members of the 
community, many of whom I've had beers with or been at WordCamps with, be selectively discarded for having opposing viewpoints. I have personally been blocked on 
X/Twitter by Matt, Automattic, and by the WordPress account itself. Sadly, it's become somewhat of a badge of honour, meaning at least we went out 
standing up for what we believed in instead of staying silent.</p>
<p>With that in mind, I've been personally saddened that many of the more popular plugin 
authors (many of which I traded emails with and calls back in the day) have refused to publicly have a stance on this, probably hoping that this will all go
away soon and they can just get back to business as usual.  These are trusted members of the community whose opinions and guidance would be appreciated at a time like this. And yet, their deafening silence has reverberated through the fractured community.  </p>
<p>I do not believe this is the time for silence in the WordPress community. It's fine to not take a side, but it's not
fine to act like nothing is happening.  Not while contributors are quitting, members on Slack are getting banned, community members on X are getting blocked, 
and the official WordPress accounts continue to talk down to their followers. Everybody should be speaking up now and advocating for what they believe in.</p>
<p>WordPress isn't a spring chicken anymore - it's been around over 20 years now, and powers 43% of the web. The codebase and the community owes much of its success to the thousands of 
core, plugin, and theme contributors who submitted their work for free onto what is now apparently Matt's personal website. I'd tried to do my part to contribute
the success of WordPress in the early days, helping in the following ways:</p>
<ul>
<li>I co-organized and ran three separate WordCamps in the Vancouver area. I quit hosting WordCamps when the Foundation took them over and imposed limits which made running not-for-profit future events like WordCamp Whistler #2 completely impossible. </li>
<li>In the early days, I helped sponsor many WordCamp events around the world, the majority of which I never even attended</li>
<li>I co-developed several popular plugins, one of which 
for a time provided the default mobile experience on WordPress.com.  Several plugin contributors on X (including the author of WPGraphQL) recently told me that my plugin code was their first real introduction
to the WordPress plugin ecosystem, and that they learned a lot from it - that was great to hear.</li>
<li>I did the first few iterations of the profiles.wordpress.org site, the first on bbPress, and the second on BuddyPress</li>
</ul>
<p>As such, I'm saddened by what has been taking place and what's apparently happened to WordPress, primarily through the actions of its apparently not-so-benevolent 
dictator. What separated WordPress from many of the various options in the early days was the vibrant and helpful community. When the people in charge of the project 
show outright contempt and hostility towards many members of that same community - in many cases simply for disagreeing with current actions and policies - that's a huge problem. </p>
<p>It's clear we have all come to a very visible branch 
in the road, one which may ultimately lead in other directions within WordPress, and for some people, outside of it.  I wouldn't be at all surprised if one or more 
WordPress forks emerge shortly, along with other plugin/theme repositories and third-party update servers.  Of course, the people in charge say they are absolutely fine with this option, and apparently are even encouraging it - but I suspect if and when a fork or update repository emerges with a substantial backing, we will see a very public reversal of that encouragement.</p>
<p>While I still intend to do what I can to help
the WordPress community recover from the current fracturing, I'm also no longer motivated to keep promoting or using WordPress. </p>
<p>And that's why for the first time since 2006, this website no longer runs WordPress.</p>]]></content:encoded>
    </item>
    <item>
      <title>How To Make Homemade Chicken Stock</title>
      <link>https://duanestorey.com/posts/how-to-make-homemade-chicken-stock.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/how-to-make-homemade-chicken-stock.html</guid>
      <pubDate>Sat, 08 Jan 2022 00:00:00 +0000</pubDate>
      <description>Stock is one of those things that seemed magical before I made it. I had purchased a few cooking books, and many recipes said to use ‘vegetable stock’, ‘chicken stock’, ‘beef stock’, or ‘fish stock’. At that time I was used to buying bouillon cubes to take the place of stock, but decided at some point ...</description>
      <content:encoded><![CDATA[<p>Stock is one of those things that seemed magical before I made it. I had purchased a few cooking books, and many recipes said to use ‘vegetable stock’, ‘chicken stock’, ‘beef stock’, or ‘fish stock’. At that time I was used to buying bouillon cubes to take the place of stock, but decided at some point to try making a homemade stock.</p>
<p>Not only is making stock at home easy, but it’s a simple way to use up leftover pieces of vegetables and bones. I’ve grown accustomed now to making a chicken dinner on the weekend, and immediately afterwards putting the left over pieces into the pressure cooker to make a nice tasty stock for a week’s worth of soups and dishes.</p>
<h3>Ingredients</h3>
<ul>
<li>Chicken carcasses, or left over bones from a chicken meal</li>
<li>One yellow onion</li>
<li>Several stalks of celery</li>
<li>Several carrots</li>
<li>Whole peppercorns</li>
<li>Several bay leaves</li>
<li>One or two cloves of garlic</li>
<li>Optional: parsley, thyme, rosemary</li>
</ul>
<p>If you make a chicken dinner at home, simply take all the left over bits and set them aside for later. While it’s nice to have a bit of meat left on the bones, most of the flavour comes from the bones and cartilage, so those are the important bits. I often toss in bones with meat on them, and even some left over bits of cooked skin – these will add flavour to the stock, and the fat contribution to the liquid can simply be skimmed off later.</p>
<p>Often your local butcher or grocery store will have chicken carcasses for sale, so you often don’t even have to start with a cooked chicken – here in Spain I picked up a package of four chicken carcasses for €1.37.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-1-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-1-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-1-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-1-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-1.jpeg" alt="Chicken Carcasses"></p>
<p>You’re going to need a big pot, at least 4 litres. You generally want the water level to come above all the ingredients, but only just slightly. So a good way to choose your pot is to adjust the size of it based on the ingredients. But with what I have listed here, a 4 litre pot will likely work fine.</p>
<p>Next step is to prepare all the vegetables.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-2-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-2-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-2-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-2-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-2.jpeg" alt="Vegetables"></p>
<p>For the onion, simply cut the ends off, remove the outer skin, and cut it into roughly four equal pieces (i.e. quarter it).</p>
<p>For the celery, cut the top and the bottom off (and these are often bitter), and chop up each stalk into 3-4 roughly equal pieces.</p>
<p>For the garlic, cut the ends off each clove and remove the outer skin.</p>
<p>I like to add a few bay leaves (laurel) to the pot, as well as some whole peppercorns. Some people like to add thyme, parsley, or rosemary to the stock. There’s nothing wrong with that, but I prefer to add those herbs when I use the stock in another dish, so I tend to leave them out of my stock.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-3-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-3-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-3-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-3-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-3.jpeg" alt=""></p>
<p>Next step is just to toss it all into the pot, stand back, and admire your work.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-4-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-4-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-4-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-4-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-4.jpeg" alt="Chicken Stock"></p>
<p>Add enough water so that the water level is above all the chicken pieces and vegetables. If you are using a pressure cooker, make sure that the water is below the indicated “max” level on the pot if it’s written.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-5-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-5-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-5-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-5-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-5.jpeg" alt="Chicken Stock"></p>
<p>You may be tempted at this point to add salt to the pot, but you really shouldn’t. Once you have your stock you can literally use it in practically anything (soups, stir fries, ramen, gravies), and you won’t know how it should be seasoned until you make that particular dish. It’s best to look at the stock you are making as simply a base that you can build upon, depending on the dish you end up making. If you add salt to it now, you may find that when you add the stock to a dish that already has seasoning later that the end result is simply too salty.</p>
<h3>Cooking The Stock</h3>
<p>If you are cooking the stock on the stove, you’ll need to turn the heat on and simmer it for roughly four to six hours. Check on it every 30-60 minutes and continue adding cold water to the pot so that all the ingredients are below the water. You’ll get a layer of proteins on the surface while cooking that will resemble a transparent skin – feel free to skim these off as you go as it will make a clearer stock, but you don’t have to if you don’t want.</p>
<p>I tend to use a pressure cooker for my stock as it takes a fraction of the time, and seems to extract more flavour and gelatin from the bones. You can either use a stove-top pressure cooker, or an electric one like the InstantPot. In both cases you will need to cook the stock for roughly 60 minutes, and then let it cool naturally until it’s safe to open.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-6-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-6-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-6-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-6-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-6.jpeg" alt="">Cooked Stock</p>
<p>When it’s done, you’ll want to collect all the liquid while discarding all the vegetables and carcasses. You can do this with a large pot or bowl, and some type of mesh or colander.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-7-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-7-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-7-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-7-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-7.jpeg" alt="">Preparing to Strain The Stock</p>
<p>When it done, let it cool slightly on the counter, and then transfer the liquid into some fridge-safe containers to cool it further. As it cools in the fridge, the gelatin that was extracted from the bones will make the liquid become slightly solid – a proper stock tends to wiggle like jam or jello when shaken in the fridge after it is cool. If there was fat in the stock (i.e. from chicken skin or bones), it’ll often solidify on the surface of the stock as a white layer, and can be safely scraped away and discarded.</p>
<p><img loading="lazy" srcset="/assets/posts/2022/how-to-make-homemade-chicken-stock-8-320w.jpeg 320w,/assets/posts/2022/how-to-make-homemade-chicken-stock-8-480w.jpeg 480w,/assets/posts/2022/how-to-make-homemade-chicken-stock-8-640w.jpeg 640w,/assets/posts/2022/how-to-make-homemade-chicken-stock-8-960w.jpeg 960w" src="/assets/posts/2022/how-to-make-homemade-chicken-stock-8.jpeg" alt="Completed Stock">Completed Stock</p>
<p>If you’re looking to make a vegetable stock, you can simply omit the chicken carcasses and add double or triple the amount of vegetables. As the stock cooks, it’ll extract all the flavour from the contents and make an extremely tasty liquid base for a variety of dishes.</p>
<h3>Variations</h3>
<p>If you want to make a more flavourful stock, you can oven-roast the chicken carcasses and vegetables first. As the vegetables and carcasses caramelize, the flavour will be enhanced. Just make sure nothing burns, otherwise it’ll make the stock bitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Getting Ready To Walk Alta Via 2 In Italy</title>
      <link>https://duanestorey.com/posts/getting-ready-to-walk-alta-via-2-in-italy.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/getting-ready-to-walk-alta-via-2-in-italy.html</guid>
      <pubDate>Thu, 17 Jun 2021 00:00:00 +0000</pubDate>
      <description>The Italian Mountain range known as the Dolomites is famously home to several amazing long distance thru hikes known as the Alta Vias, the High Routes. Many of these are old trails from World War I, complete with Via Ferratas, difficult stretches of climbing where a person needs to physically link themselves ...</description>
      <content:encoded><![CDATA[<p>The Italian Mountain range known as the Dolomites is famously home to several amazing long distance thru hikes known as the Alta Vias, the High Routes. Many of these are old trails from World War I, complete with Via Ferratas, difficult stretches of climbing where a person needs to physically link themselves to metal guide wires. It’s been on my wishlist for a few years now to actually walk one of these routes, and I may finally have the chance.</p>
<p>A few months ago I started planning to do one of long distance hikes in Italy this summer. At the time, I wasn’t sure if the situation in Europe would have stabilized enough to actually travel to Italy or to stay in any of the mountain huts for the hike. But Italy seems to be open to other European visitors, and I successfully made reservations at many of the mountain huts. So right now it seems like everything is a “go”, and I should be able to head to Italy later next week and start hiking.</p>
<p>The most famous of the Alta Vias is Alta Via 1. I originally was going to attempt that one, but it’s also the busiest. With COVID restrictions many of the mountain huts are at half capacity, so my friend and I decided to switch over to Alta Via 2, which is arguably the harder of the two.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1-320w.jpg 320w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1-480w.jpg 480w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1-640w.jpg 640w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1-960w.jpg 960w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1-1360w.jpg 1360w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1-1600w.jpg 1600w" src="/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-1.jpg" alt="Scenary In The Dolomites">Scenary In The Dolomites</p>
<p>I’ve done many long distance walks before, but I’ve never done one that focuses more on elevation than on horizontal distance. Alta Via 2 will have us climbing 700-1200m a day, which I suspect is going to be extremely difficult. I’ve done elevation gain on other hikes, but usually it’s just one day and then it’s over. On Alta Via 2 we will likely have large elevation gains every day, so I’m a tad worried how my body is going to respond. In addition, most days are spent at an elevation of 2000-3200m, which is high enough to start causing biological changes. At those altitudes your body definitely feels the affects of lower oxygen (and higher carbon dioxide levels). This often manifests itself as a shortness of breath and a faster heart rate.</p>
<p>Years ago I spent time in Cusco, Pero (3400m), and I felt pretty horrible while there due to the altitude. Even climbing a flight of stairs was difficult, and I had a mild headache the whole time. Last year I spent one day in the Dolomites, basically going directly from sea level, and climbing 600m in the first day at that altitude was amazingly difficult. One thing you should never do is move directly to a high altitude from a low altitude (especially sea level), which is what I did in Cusco and again last summer (stupid me).</p>
<p>So this time I’m going to stay in a little village nestled in the mountains, Vigo di Fassa (1400m), for three days before the hike. In addition I went to the pharmacy here in Spain and picked up some Diamox (without a prescription, gotta love Spain), which is a medicine meant to help with acclimatization. Diamox basically fools the body into thinking it is at altitude by acidifying the blood slightly (by excreting bicarbonate), which then causes the blood to dump carbon dioxide and absorb more oxygen. It’s a good way to shave a few days off of the acclimatization process, so I’ll start it a few days before the hike.</p>
<p>Right now the plan isn’t to finish the entire hike, more like 65% of it, mostly due to time constraints and some of the other sightseeing we want to do in the area. But even so, we’ll likely hike around 120km with around 8000m of elevation gain, which will be pretty exhausting. This time around I’m hoping to bring my SLR camera, and with luck I’ll come back with some amazing photography to put up on my walls in my flat back in Spain.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2-320w.png 320w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2-480w.png 480w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2-640w.png 640w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2-960w.png 960w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2-1360w.png 1360w,/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2-1600w.png 1600w" src="/assets/posts/2021/getting-ready-to-walk-alta-via-2-in-italy-2.png" alt="Rifugio in the Dolomites">Rifugio in the Dolomites</p>
<p>Each night we will stay in a series of mountain huts known collectively as rifugios. The rifugios are conveniently sprinkled all throughout the Dolomites, and usually contain a bar, a restaurant, and sleeping quarters for overnight hikers such as ourselves. Many rifugios aren’t connected to any road system, so other than hiking in and out on foot, or receiving supplies from helicopters, there aren’t any easy entry or exit points. I’ll be hiking with a friend, and he has a satellite GPS emergency beacon in the odd event anything happens, but it’s a pretty well traversed hike so I’m not super worried.</p>
<p>With COVID19, I basically doubled down on work during the last year, and haven’t had many opportunities to unplug and disconnect since last summer. So I’m really looking forward to two weeks of hiking in the mountains with a friend, and spending the afternoons sipping Spritz while admiring all the beautiful vistas. So next week I’ll head to Italy for a little pre-hiking pasta sampling in Bologna and Florence, then make my way north to the mountains, and two weeks of hiking.</p>
<p>Next stop, Alta Via 2.</p>]]></content:encoded>
    </item>
    <item>
      <title>Preparing For The Camino Del Norte</title>
      <link>https://duanestorey.com/posts/preparing-for-the-camino-del-norte.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/preparing-for-the-camino-del-norte.html</guid>
      <pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate>
      <description>With the COVID19 state of alarm shortly ending here in Spain, I’ve been slowly getting myself ready to do some long distance hiking. My original plan, before COVID19 hit the world, was to hopefully make it to Italy in the summer of 2021 to do a 10 day hike through the mountains. Whether or not that ...</description>
      <content:encoded><![CDATA[<p>With the COVID19 state of alarm shortly ending here in Spain, I’ve been slowly getting myself ready to do some long distance hiking. My original plan, before COVID19 hit the world, was to hopefully make it to Italy in the summer of 2021 to do a 10 day hike through the mountains. Whether or not that happens this summer is anyone’s guess, but I’m still going to act like it may happen, which means I need to start training for a high-altitude hike in the mountains.</p>
<p>For the last month or so I have been trying to hike 15-20km of the Camino de Levante every week or two just outside of Valencia to get my legs back in shape. It’s been really great hitting the trail again, but so far most of the Levante near Valencia has been rather flat, which isn’t really helping that much for my Dolomites training. I also managed to injure myself on my first day’s walk but pushing myself too far too soon, and I’ve been forced to reduce my distance each week to help myself heal. Thankfully I think I’m mostly back to normal again, so I’m setting my sights on something a little more adventurous – the Camino Del Norte along the northern coast of Spain.</p>
<p>In 2017 I walked from St. Jean Pied de Port, France, to Santiago de Compostela, Spain, a distance of roughly 800km. It was great, but having made it all the way to Santiago de Compostela once, it’s not super important to me to make it all the way to Santiago on the Camino Del Norte. And in truth, I suspect I won’t – for me I’m just going to chip away at various Caminos whenever I feel like walking, and simply head back to Valencia (where I live) whenever I need a break.</p>
<p>But given that the weather in the north of Spain is starting to look better, and the Camino routes are mostly empty these days because of ongoing travel restrictions for people who live outside of Spain, my plan is to head up north with my laptop and do some hiking. Unlike other long distance walks I’ve done previously, I’m going to take my laptop on this one and try to continue working in the evenings and on rainy days. Since I really don’t have any time restrictions or any hard deadlines, I can simply pull out my laptop and work on rainy days and hike a bit whenever the sun comes out. So it will be interesting to see how this works out. I carried my laptop to Xativa on the last leg of the Levante I did, and while my bag was definitely heavier, it didn’t take me too long before I stopped noticing it.</p>
<p>When I walked the Camino Frances in 2017, I only had my iPhone to take photos. That worked well enough, but I’ve been taking my DSLR on the Camino de Levante and it’s been great having some really high-quality photos to reflect on once I get back home. So I’m going to take my Fuji X-T2 with me on this trip along with one of my newest lenses, the Fuji 16mm-80mm f/4.0 WR OIS lens (which is my go-to travel lens these days). So with luck I’ll be able to take lots of great photos along the way.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/preparing-for-the-camino-del-norte-1-320w.jpg 320w,/assets/posts/2021/preparing-for-the-camino-del-norte-1-480w.jpg 480w,/assets/posts/2021/preparing-for-the-camino-del-norte-1-640w.jpg 640w,/assets/posts/2021/preparing-for-the-camino-del-norte-1-960w.jpg 960w,/assets/posts/2021/preparing-for-the-camino-del-norte-1-1360w.jpg 1360w" src="/assets/posts/2021/preparing-for-the-camino-del-norte-1.jpg" alt="">A test photo I took near Xativa on the Camino de Levante using my new 16-80mm lens</p>
<p>To make hauling around my DSLR easier, I picked up a Peak Design Capture v3 camera clip which lets me clip my camera to one of my backpack straps. I had one of these years ago but unfortunately never warmed to it at the time. But after completing a few hikes around Valencia with the new Capture v3, I am definitely in love with it now – it keeps your hands free but also keeps the camera readily available to snap a photo at a moment’s notice.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/preparing-for-the-camino-del-norte-2-320w.jpg 320w,/assets/posts/2021/preparing-for-the-camino-del-norte-2-480w.jpg 480w,/assets/posts/2021/preparing-for-the-camino-del-norte-2-640w.jpg 640w,/assets/posts/2021/preparing-for-the-camino-del-norte-2-960w.jpg 960w,/assets/posts/2021/preparing-for-the-camino-del-norte-2-1360w.jpg 1360w,/assets/posts/2021/preparing-for-the-camino-del-norte-2-1600w.jpg 1600w" src="/assets/posts/2021/preparing-for-the-camino-del-norte-2.jpg" alt="New Camera Clip">My Fuji X-T2 Mounted On The Peak Design Capture v3, on the Camino de Levante</p>
<p>Albergues are still mostly closed, but even if that weren’t the case, I wouldn’t be staying in them due to COVID19. So I’ll likely just find AirBNBs to rent along the way, which makes getting work done easier as well.</p>
<p>So this week I’m going to try hard to finish a few work projects and then pack my bag up – with luck I’ll be heading north soon to start walking. At the bare minimum I’d like to get to at least Bilbao, but if I can push a bit further to Oviedo that would be great as I can carry on with the Camino Primitivo after.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Year The Earth Stood Still</title>
      <link>https://duanestorey.com/posts/the-year-the-earth-stood-still.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/the-year-the-earth-stood-still.html</guid>
      <pubDate>Sun, 21 Feb 2021 00:00:00 +0000</pubDate>
      <description>I was looking through some of my old posts recently, particularly with regards to COVID-19 and the first lockdown here in Spain, and realized I hadn’t done an update in a while. Strangely, it’s going on the one year anniversary from when this all started. I had friends visiting from Canada when this ...</description>
      <content:encoded><![CDATA[<p>I was looking through some of my old posts recently, particularly with regards to COVID-19 and the first lockdown here in Spain, and realized I hadn’t done an update in a while. Strangely, it’s going on the one year anniversary from when this all started. I had friends visiting from Canada when this all began, and as each day went by more and more activities were suspended in Spain. The first inkling of trouble was that the tickets we had to a futbol match here in Valencia were ultimately cancelled. Thinking nothing of it, we decided to purchase other tickets to see Madrid play, and those too were cancelled. The final nail in the coffin, and the canary in the coalmine as it were, was the cancellation of the yearly Fallas festival here in Valencia.</p>
<p>My friends managed to get out Europe the next day by taking a last minute 6am flight back to Canada. The evening they left Spain announced a state of alarm, locking most of us inside our apartments for over three months, and the rest is mostly history. I was fortunate enough that the situation here in Spain, and Europe in general, improved in August of 2020 to the point where some of us could do a bit of travel (I spent most of that time hiking by myself in the wilderness). But after that everything seemed to clamp down again, and once again here in Valencia we are on a de-facto lockdown (we can still go outside for walks, but bars, restaurants, and cafés are all closed, except for takeaway).</p>
<p>Spain’s ultimate plan is to have over 70% of the population vaccinated by the end of the summer. Based on the current rate of vaccination in the country, that doesn’t seem realistic. But we’re all hoping Spain will pull a rabbit out of a hat and somehow manage to get it all done. Today I read an announcement that the City of Arts and Sciences, a large structure in the park near me, will essentially turn into a field hospital shortly for mass vaccination campaigns. If and when that happens, I imagine (and hope) vaccination rates will pick-up substantially.</p>
<p>Originally the plan was to use all available vaccines, including the <a href="https://english.elpais.com/society/2021-02-05/spain-rules-out-administering-astrazeneca-vaccine-to-over-65s.html">Astra-Zeneca</a> vaccine, for older age groups. But it’s recently been decided that the Astra-Zeneca vaccine will only be administered to people under 55 years old. While that’s unfortunate for that older demographic, it potentially means my age bracket will move ahead in the queue by one slot.</p>
<p>If Spain keeps to their original timetable, I’m guessing I’ll receive the vaccine in May or June. But right now logistically we don’t really know how that’s all going to play out. I’m in a strange demographic here in Spain because my visa requires me to hold private health insurance so I don’t burden the public system, but the vaccine isn’t available in the private system, only the public one. Spain isn’t known for making bureaucratic processes easy, so I’m a tad worried my demographic may slip between the cracks on this one. But I’m hopeful Spain figures out an easy way to make sure my name gets added to the list as well.</p>
<p>Israel is pretty close to finishing their vaccination campaign, and some countries like the UAE are making great progress. Once they are done, the vaccines allocated to their countries will effectively spillover into the next countries, increase the amount they receive. I’m hoping with each passing week that this snowball effect accelerates the process all over Europe. Combined with several new vaccine approvals in March, we should hopefully see a huge increase in vaccine administration all across the continent next month.</p>
<p>Ideally on March 2nd here in Valencia the government will start the de-escalation of the de-facto lockdown, probably by opening outdoor terraces again. I have a feeling they may wait another two weeks though, just to bring the numbers down a bit more. But regardless we are hopefully only two to four weeks away from starting to see the very first few steps of the new normality here in Spain.</p>
<p>While I’m anxious to get back to Canada to see my family, at this point there’s no point in going until I’m vaccinated. Given that I have plans in Europe this summer (various hikes and what not – assuming I’m able to), at this point the earliest I’ll likely be back to Canada is the fall. That’ll be going on nearly two years since I was back last time, which still seems crazy to me. My friend Tony left Canada shortly before I did and has been stuck in Thailand this entire time. How odd it’s going to be to re-unite with family and friends again, many of us who haven’t seen each other in years when this is done.</p>
<p>Spring has always been one of my favourite seasons as it signals the rebirth of life after a long, cold, and drawn out winter (especially in Canada). Spring this year will undoubtedly have new meaning, as not only will the flowers bloom and the grass turn green, but life itself will, for many people, began again.</p>]]></content:encoded>
    </item>
    <item>
      <title>Walking The Great Glen Way In Scotland</title>
      <link>https://duanestorey.com/posts/walking-the-great-glen-way-in-scotland.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/walking-the-great-glen-way-in-scotland.html</guid>
      <pubDate>Mon, 08 Feb 2021 00:00:00 +0000</pubDate>
      <description>This last weekend I finally got around to writing up my trip report for my hike along the West Highland Way in 2018. Now that that’s out of the way, I’m thankful I can finally get around to posting my thoughts on the Great Glen Way.
The Great Glen Way for all intents and purposes can almost be looked ...</description>
      <content:encoded><![CDATA[<p>This last weekend I finally got around to writing up my trip report for <a href="/hiking/walking-the-west-highland-way-in-scotland/">my hike along the West Highland Way</a> in 2018. Now that that’s out of the way, I’m thankful I can finally get around to posting my thoughts on the Great Glen Way.</p>
<p>The Great Glen Way for all intents and purposes can almost be looked at as the second half of the West Highland Way (WHW). While the WHW finishes in Fort William, the Great Glen Way literally starts where it leaves off. After I finished the WHW, my friend Tony and I took the train to Edinburgh to relax for a few days. Heading back to the Great Glen Way was essentially that train ride in reverse, partially along the same route as the WHW, so in many ways it felt a lot like coming back home.</p>
<p>Now first up, let’s talk about COVID-19. I was in Spain during the first global wave of COVID-19, and we were essentially housebound for more than 90 days. That meant no exercise, no long walks in the park, no visiting friends – simply three months watching Netflix, doing web development, and occasionally heading out to pick up some groceries. So when things improved in July and Europe opened up the travel corridors again, I literally jumped at the chance to head into the wilderness for some hiking.</p>
<p>I had a few friends who weren’t afraid to private message me to let me know that they thought it was a selfish decision. But I feel reactions like that are more based on emotion than on data. The odds of catching COVID-19 on a partially empty airplane don’t seem particularly better or worse to me than catching COVID-19 in a crowded supermarket or waiting in line at the pharmacy. That said, I wanted to do my responsible part, so I paid for both a PCR and an antibody test before getting on the plane to make sure I wasn’t taking it with me at least.</p>
<h4>Fort William</h4>
<p>I flew from London, England to Glasgow, Scotland, and took the train immediately to Fort William. I forgot what a beautiful train ride that is up to Fort William.</p>
<p>Stepping off the train felt so great to be back, even though the weather wasn’t looking very appealing. I have been sort of blessed in that all of my hikes in the last five years have had unseasonably warm weather. On the Camino de Santiago, for example, I spent 33 days on the trail (28 days walking) and only had about four hours of rain spread out over three days. And that was in April and May, which are notoriously rainy months along the trail.</p>
<p>The West Highland Way? Basically seven days of beautiful sunshine.</p>
<p>So when I pulled up the weather forecast in Fort William and saw a ton of rain on the horizon, I sort of just looked at it like karma finally getting around to paying me back. And boy did it ever pay me back that first day.</p>
<h4>The Walk</h4>
<p>I’m not going to go through and detail all the various stages, because in all honesty many of them are fairly similar. In general though a lot of the Great Glen Way (GGW) follows the <a href="Caledonian_Canal">Caledonian Canel</a>. That’s both a blessing and a curse – it’s nice to always have a route to follow, especially one that follows a river, but the scenery on many days doesn’t change all that much.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-1-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-1-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-1-640w.jpg 640w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-1.jpg" alt="">Approaching The Caledonian Canal</p>
<p>The first stage is normally from Fort William to Gairlochy, which isn’t that far. Unfortunately for me a light drizzle in the morning quick turned into a full on downpour lasting the entire day.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-2-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-2-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-2-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-2-960w.jpg 960w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-2.jpg" alt="">Many Days Were Spent Wakling Along The Canal</p>
<p>In normal, non-COVID19 times, a bus would be waiting in Gairlochy to take me to my accommodation, about 5km away from the trail. But due to the pandemic the buses weren’t running. Normally I probably would have just walked it, but by the time I reach the turn-off to Gairlochy I was absolutely drenched to the bone. Literally everything I had was dripping wet, and even my waterproof iPhone had given up.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-3-320w.jpg 320w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-3.jpg" alt=""></p>
<p>I found a phone booth at roughly the spot the bus would normally pick us up, and inside the phone booth I found a business card for a cab company. Given that I couldn’t feel any part of my body anymore, I decided to simply call a cab to take me the 5km so I could dry off. Unfortunately for me when I arrived the BnB was completely closed, and wouldn’t be open for another two hours. I went looking for food, but nothing was open due to COVID-19. Eventually I found a single cafe that was open, and they were nice enough to let me inside even though I was making a puddle simply by standing around. I treated myself to a burger, but was mostly watching the clock for when I could check into my BnB and change my clothes.</p>
<p>Once I made it into the BnB I quickly stripped my clothes (more like peeled them off slowly, since they were stuck to my body), and took one of the longest showers of my life to warm up. When I finally got dressed, I found a nice gas fireplace in the living room to relax next to.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-4-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-4-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-4-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-4-960w.jpg 960w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-4.jpg" alt="">My Own Personal Fire</p>
<p>And even better, the owner brought me a menu of his house scotches, which I proceeded to down in quick succession. The owner was quite keen to talk to me since I guess when he was younger he was in the Scottish Army and had been stationed in Canada – so he was happy to be talking to a Canadian and re-living some old memories from his youth.</p>
<p>After the scotch kicked in and I ate the take-away pizza from the cafe, I crawled into bed hoping that the weather would be better the next day.</p>
<h4>Next Few Days</h4>
<p>The next few days were mostly along the canal, which was easy walking but also a tad boring after a while. Thankfully the weather improved every hour or two, and by the time I reached Fort Augustus at the end of day three I was blessed with some blue sky and sunshine.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-5-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-5-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-5-640w.jpg 640w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-5.jpg" alt="">Arriving in Fort Augustus</p>
<p>I was super excited to see that there were a few pubs open, so I ordered a beer, whipped my shoes and socks off, and had a few leisurely beers in the sun beside the canal.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-6-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-6-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-6-640w.jpg 640w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-6.jpg" alt="">Fort Augustus Beers Are The Best Beers</p>
<h4>Taking The High Road</h4>
<p>When leaving Fort Augustus I knew I would be presented with an option to take a high road above Loch Ness, or a forest trail along it. To be perfectly honest, without other people pushing me on the trail, I’m not always the person who goes for the immediate challenge when it comes to harder paths to follow. I hadn’t made a decision about which one I was going to walk when I set out in the morning, and figured by the time I reached the fork a decision would present itself.</p>
<p>As I got closer to the fork, I noticed the weather was clearing, which was great. I figured if it was cloudy or foggy there wasn’t really much point taking the high road since I wouldn’t be able to see anything anyways. And right before I hit the fork I ran into a lady walking her dog. I’m always a bit cautious about approaching lone females in the wilderness, just in case they get a bit freaked out with a guy approaching them. But her and her dog came right up to me for a nice chat, and like most people I met in Scotland, were super keen to talk with a visitor. She assured me the high road wasn’t too bad, which cemented my decision to start climbing.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-7-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-7-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-7-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-7-960w.jpg 960w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-7-1360w.jpg 1360w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-7.jpg" alt="">Me, On The High Trail Above Loch Ness</p>
<p>Growing up in Canada I had heard stories about Loch Ness and the fabled Loch Ness monster, so it was great to to finally see it with my own eyes. My province in Canada, British Columbia, has its own monster which always reminded me of stories of the Loch Ness one – <a href="https://en.wikipedia.org/wiki/Ogopogo">The Ogopogo</a>.</p>
<p>The next few hours were absolutely glorious walking. The sun was shining, the wind was blowing, and I remember feeling amazingly alive as I walked up and down the rolling hills above Loch Ness.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-8-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-8-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-8-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-8-960w.jpg 960w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-8.jpg" alt="">The Upper Trail Above Loch Ness</p>
<p>The next stage, from Invermoriston to Drumnadrochit, also had a high route, and I decided to take that as well. Even though my guidebook said this was a 6 hour, 23.5km walk, I somehow managed to do it in about 4.5 hours. I normally like to take breaks every hour or so, but it was such a nice day and the weather was so nice that I just couldn’t bring myself to stop. That meant I got into the next town super early, which of course meant beer o’clock. As it turned out I was the only person staying at the BnB, so they basically gave me a key to the place and said go nuts.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-9-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-9-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-9-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-9-960w.jpg 960w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-9.jpg" alt="">Heading To Drumnadrochit</p>
<p>I walked down to the grocery store, picked up some snacks and beers (enough for tomorrow too), and spent the afternoon in the sun by the BnB just relaxing. It was glorious.</p>
<p>Of course what wasn’t so glorious is that when I left the next day I accidentally forgot to bring that bag of snacks. Oh well.</p>
<p>One thing to mention at this point was that various parts of the trail were unkempt, especially towards the end. I blamed a lot of it on COVID-19 – why would people be maintaining the trail if nobody was walking it? But I suspect it ran a bit deeper. I encountered lots of missing markers along the trail, enough that it started to seem suspicious. So either the odd hiker was stealing a marker as a trophy (bad, bad hiker), or maybe locals were moving them. Regardless I found myself lost a few times because I couldn’t find a marker. This next one, for example, took me 30 minutes to find.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-10-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-10-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-10-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-10-960w.jpg 960w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-10.jpg" alt="">Found Marker</p>
<p>I was lucky in that I noticed it out of the corner of my eye way up on the hill beside me. When I backtracked and found the junction I needed to take, the marker for the GGW was noticeably missing, even though I could see where it was once attached.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-11-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-11-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-11-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-11-960w.jpg 960w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-11-1360w.jpg 1360w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-11.jpg" alt="">Walking By A Castle</p>
<p>The final day into Inverness was fairly long (over 30kms), but mostly along forest trails with the occasional view of the loch. I was lucky in that the trail actually passed right by my BnB in Inverness, which meant I could change and shower before trying to find the end marker.</p>
<p>Surprisingly I couldn’t really find any good information on where the trail ended. I assumed it would be near the castle, but with COVID-19 and some renovations in the area, I wasn’t sure where to find it.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-12-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-12-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-12-640w.jpg 640w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-12.jpg" alt="">Inverness Castle</p>
<p>Not far from the castle I eventually found the end marker for the Great Glen Way, and snapped this quick selfie.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-great-glen-way-in-scotland-13-320w.jpg 320w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-13-480w.jpg 480w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-13-640w.jpg 640w,/assets/posts/2021/walking-the-great-glen-way-in-scotland-13-960w.jpg 960w" src="/assets/posts/2021/walking-the-great-glen-way-in-scotland-13.jpg" alt="">Me, Another Long Distance Hike In The Bag</p>
<h4>Final Thoughts</h4>
<p>Prior to walking the GGW I reached out to my friend Blair, who had walked both the GGW and the WHW, and asked him what he thought of the GGW. He said he found it disappointing compared to the WHW, which I can somewhat relate to. I try not to compare hikes against each other since it’s really difficult to do – lots of things influence our enjoyment of hikes such as the weather on a certain day, or even our moods. I found lots of reviews on the internet from people who actually preferred the Great Glen Way over the West Highland Way, so personal preference towards the type of walking certainly matters. All that being said, I definitely preferred the West Highland Way myself. The scenery on the WHW is a lot more varied compared to the GGW, especially with about half of the GGW being along the Caledonian Canal. I think if you’re the type of person that just prefers a nice easy walk in the outdoors, then the GGW is a pretty nice hike. But if you prefer more varied scenery and a harder physical challenge, then I think the WHW probably wins.</p>
<p>Walking the GGW in the summer of the COVID-19 pandemic was a big eye-opener. Deaths by COVID-19 are of course incredibly tragic. But I met so businesses on the trail who were hesitantly opening up again because, quite frankly, they desperately needed the money. While the BnB owners were of course super cautious with everything, it was heartbreaking to hear some of their stories regarding potentially losing their business or having to let employees go. So while it’s easy to focus on statistics like number of infected and number of deaths, let’s not forgot the countless people who have lost their businesses, their livelihoods, and in many ways their futures, because of COVID-19 as well. Certainly the people who opened their homes to me were thankful I was choosing to walk and help them dig their way out of the COVID-19 hole, and I was thankful for their presence as well.</p>
<p>I think I speak for every nature lover out there when I say I’m looking forward to the day COVID-19 is completely controlled and we can start to get outside and walk again. Since I returned from the Great Glen Way, things have deteriorated again in Spain, and we’re mostly on a de-facto lockdown. But if things let up again in the summer, I may try to walk a portion of a local Camino if possible. But regardless, you’ll find me outside again soon enough I hope.</p>]]></content:encoded>
    </item>
    <item>
      <title>Walking The West Highland Way In Scotland</title>
      <link>https://duanestorey.com/posts/walking-the-west-highland-way-in-scotland.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/walking-the-west-highland-way-in-scotland.html</guid>
      <pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate>
      <description>While I’ve done my fair share of hiking in my life, as I’ve gotten older I’ve gravitated more towards multi-day hikes rather than single day hikes. I certainly enjoy an afternoon hike on a weekend, but there’s something magical (and inherently challenging) about hiking for days or weeks at a time.
In ...</description>
      <content:encoded><![CDATA[<p>While I’ve done my fair share of hiking in my life, as I’ve gotten older I’ve gravitated more towards multi-day hikes rather than single day hikes. I certainly enjoy an afternoon hike on a weekend, but there’s something magical (and inherently challenging) about hiking for days or weeks at a time.</p>
<p>In 2017 I did my longest hike yet – the Camino de Santiago in Spain. I spent 28 days walking from St. Jean Pied de Port, France, to Santiago de Compostela, Spain, a distance of roughly 800km. When it was over, as I hobbled around Santiago de Compostela letting my feet heal, I told myself that my days of doing multi-day hikes were over. But as the months went by I started to really miss the experiences I had on the Camino de Santiago, and the sheer simplicity of walking for days at a time in the outdoors.</p>
<p>So in 2018, I decided to plan another hike, and ultimately decided on the West Highland Way in Scotland. Unlike the Camino de Santiago though, where I walked mostly by myself, I decided to ask my friend Tony if he wanted to come along, which he did. So in June of 2018 I flew from Valencia, Spain to Glasgow, where my friend Tony met me after flying from Split, Croatia.</p>
<p>In terms of the logistics, it’s pretty easy to just plan a day or two at a time on the Camino de Santiago as there’s an entire infrastructure of accommodation and restaurants dedicated to people walking the trail. As the West Highland Way is somewhat remote, you really do need to plan ahead and pre-book accommodations. That normally would take some of the spontaneity out of a hike – you basically have to walk according to plan, regardless of the weather, and stop wherever your reservation is for the night. But there really isn’t an alternative as in some locations there are literally only one or two places to stay, and usually are bed and breakfasts.</p>
<p>A friend of mine who walked this previously recommended I use <a href="https://www.macsadventure.com/">Mac’s Adventure</a> to book with, as they specialize on trips within the UK. Not only do they handle all the bookings and communication with the bed and breakfasts, but they also handle luggage transfer between the accommodations every day, which is great. It means you can actually pack like you are on vacation, but take a day pack on the actual trail with just the essentials for the hike.</p>
<h4>Day 0: Glasgow, Scotland</h4>
<p>I hadn’t seen my friend Tony in a while, so it was great to find him in our accommodation in Glasgow. We didn’t have a ton of time to see the city, but we did manage to hit a few pubs. Whenever I make it to the UK, I almost always have a Guinness when I arrive. And it was one of the first orders of business I got to once I was settled in the pub.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-1-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-1-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-1-640w.jpg 640w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-1.jpg" alt=""></p>
<p>Afterwards we headed down to Ashton Lane in Glasgow and found a watering hole for some food and beers. The weather looked mostly great for the week, and Tony and I were pretty excited to get started in the morning. We called it an early night, and booked a train for the morning to take us to Milngavie.</p>
<h4>Day 1: Milngavie to Drymen – 24km</h4>
<p>The West Highland Way officially starts in the town of Milngavie, just a short train or a taxi ride from Glasgow. When we arrived, we found the Macs Adventure van waiting for us, and gave the van driver our luggage in exchange for our welcome packs with our full itinerary. After that, we grabbed a quick bite and a coffee, and got ready to head out on the trail.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-2-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-2-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-2-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-2-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-2.jpg" alt="">Marker in Milngavie</p>
<p>This stage was relatively flat, and a great warm up for the rest of the trail. We had really great weather, and it felt amazing again to be walking through the wilderness.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-3-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-3-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-3-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-3-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-3.jpg" alt="">Passing by a loch</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-4-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-4-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-4-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-4-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-4.jpg" alt=""></p>
<p>In the end we walked for about six or seven hours, at which point we arrived in the town of Drymen for the night. We felt so elated after our first day that we proceeded to drink copious amounts of alcohol in one of the oldest pubs in Scotland during the evening. Unfortunately that meant day 2 would be a bit painful, at least for me, but that’s part of the adventure.</p>
<h4>Day 2: Drymen to Rowardennan – 26km</h4>
<p>The second stage of the West Highland Way followed Loch Lomand, and it was a nice leisurely day of walking. Unfortunately I spent the morning a bit hungover, but thankfully that passed after the climb up to Conic Hill.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-5-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-5-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-5-640w.jpg 640w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-5.jpg" alt="">Tony in the trees</p>
<p>One thing to mention about the West Highland Way at this point are midges – midges are tiny flies that swarm around hikers and generally make your life miserable. Their bites and pretty painful and cause itchy welts to appear. There’s basically no way to avoid them on the trail, but most people carry some type of midge spray, although I’m not sure how much it really helps.</p>
<p>An unfortunate reality of midges is that they generally leave you alone while you are walking, but will quickly swarm you when you stop. So that means it can be challenging to stop for a rest, as after a minute or two in some areas you’ll quickly find yourself being bitten by midges.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-6-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-6-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-6-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-6-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-6.jpg" alt="">View over Conic Hill</p>
<p>We hiked 26km this day, so were were pretty beat when we strolled into Rowardennan.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-7-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-7-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-7-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-7-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-7.jpg" alt="">The Rowardennan Inn</p>
<p>Our room was a bit tiny in this location, but the onsite pub/restaurant more than made up for it. Unfortunately this was midge area, so while there was a beautiful view outside, we didn’t spend too much time outside due to the midges (and in fact there was a note in our room to keep the windows closed lest you want to be devoured).</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-8-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-8-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-8-640w.jpg 640w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-8.jpg" alt="">Sleep Well</p>
<h4>Day 3: Rowardennan to Inverarnan – 24km</h4>
<p>One of the best parts about long distance hiking is that you honestly don’t really need to worry too much about how much you are eating. On most days you are probably burning 1,000-2,000 calories by hiking, so it’s nice to be able to eat big, hearty breakfasts or share a pitcher or two of beers in the evenings without any guilt.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-9-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-9-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-9-640w.jpg 640w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-9.jpg" alt="">Typical Scottish Breakfast</p>
<p>In most bed and breakfast establishments in Scotland you can almost always get a full Scottish breakfast. While some people opt to not eat the haggis, I quite like it and usually have it added to my plate whenever possible. After eating a big breakfast, we packed up our luggage, filled up our day packs, and hit the trail again.</p>
<p>This stage is one of the most difficult in my opinion, as for half of the day you are walking in a forest and constantly scrambling over roots and rocks. Despite using my hiking sticks all day, I did take a few spills when I lost my footing. I also got one hiking stick stuck in the mud, and had to sacrifice the rubber end cap on it since I couldn’t find it after.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-10-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-10-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-10-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-10-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-10.jpg" alt="">Tony on Day 3</p>
<p>While the elevation profile so far along the trail had been relatively flat, the constant up and down and scrambling during the forest section was pretty hard on the legs.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-11-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-11-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-11-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-11-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-11.jpg" alt="">A Little House</p>
<p>After a 24km day, we finally arrived in Inverarnan. While tired, we were definitely looking forward to the next few stages that would see us leaving the lake area and starting the journey into the Scottish Highlands.</p>
<h4>Day 4: Inverarnan to Tyndrum – 21km</h4>
<p>After another hearty breakfast, we packed up and hit the trail.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-12-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-12-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-12-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-12-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-12.jpg" alt=""></p>
<p>This was a pretty glorious day if I remember – great weather, and fairly easy walking.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-13-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-13-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-13-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-13-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-13.jpg" alt=""></p>
<p>This was one of our shortest days on the trail, which gave our feet a nice break. As I mentioned, you can’t really take a rest day at any point unless you schedule it ahead of time, so for the most part you have to wake up and go each day. So the shorter days are nice to rest up a bit.</p>
<h4>Day 5: Tyndrum to Kingshouse – 31km</h4>
<p>This is the longest day of the West Highland Way, so it’s good to get a rest before hitting it. For some itineraries you can actually break this day up into two pieces, and we were sort of regretting at this point not doing that.</p>
<p>In terms of difficulty though, it’s not the hardest day (more on that later), but the length, lack of places to stop, and occasional elevation gain definitely does make it challenging.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-14-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-14-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-14-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-14-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-14.jpg" alt="">Tony in the Highlands</p>
<p>Staying at Kingshouse, an accommodation in the highlands, is normally one of the highlights of this stage, but unfortunately during our hike they were renovating it and it was closed. That meant we had to take a little detour before Kingshouse and catch a bus to take us into Glencoe where we would sleep at night.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-15-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-15-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-15-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-15-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-15.jpg" alt="">Day 5 Scenery</p>
<p>Glencoe was a treat in that it’s a really beautiful location in the heart of the highlands (much of the movie Braveheart was filmed around Glencoe). The downside to the detour though was that for me at least taking a bus between towns mid-way through the hike sort of messes with the flow. In addition, the buses were full and many groups had to wait several hours for the next one.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-16-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-16-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-16-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-16-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-16.jpg" alt="">A quick stop near Glencoe</p>
<p>That said, it was nice that they did arrange the buses and detour, so I’m not complaining. But it will be nice to actually stay at Kingshouse if I ever decide to walk the West Highland Way again.</p>
<h4>Day 6: Glencoe (Kingshouse) to Kinlocklevin – 16km</h4>
<p>We started in the morning with a big breakfast followed by a bus ride back towards Kingshouse. Once there, we carried on with our walk again.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-17-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-17-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-17-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-17-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-17.jpg" alt="">Walking Towards The Devil’s Staircase</p>
<p>Day 6 is arguably the hardest day of the West Highland Way for one simple reason – the Devil’s Staircase. Yes, it’s basically as bad as it sounds – about 400m of elevation gain in a zig-zag over less than a kilometer, so it’s a pretty good workout. While it doesn’t take too long, it’s definitely tiring getting to the top.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-18-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-18-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-18-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-18-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-18.jpg" alt="">Looking Back While Climbing The Staircase</p>
<p>We ended this stage in Kinlochleven, which is a town you can see for about two hours but never seem to get to.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-19-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-19-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-19-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-19-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-19.jpg" alt="">Arriving in Kinlochleven</p>
<p>Macs Adventure did a great job with booking all of our accommodation. While we liked some better than others, in general they were all clean and comfortable. That said, Kinlochleven was our favourite bed and breakfast that we stayed in. As soon as we arrived the owners went out of their way to get us some beverages while we went and cleaned up. We also found a really great pub right around the corner where we casually drank beers throughout the evening and chatted with fellow hikers.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-20-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-20-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-20-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-20-960w.jpg 960w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-20.jpg" alt="">Our Room In The BnB</p>
<p>We had such a good time in this little town that we were both a bit sad to leave it the next day. Had we had a more flexible itinerary I suspect we would have stayed here another night.</p>
<h4>Day 7: Kinlochleven to Fort William – 24km</h4>
<p>Compared to the Camino Frances, a 7 day hike isn’t super long. That said, we were both looking forward to our final day and then switching into vacation mode for a while. The hiking for this stage isn’t particularly amazing as you are leaving the majestic scenery behind and transitioning into a city with asphalt roads.</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-21-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-21-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-21-640w.jpg 640w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-21.jpg" alt="Approaching Fort William">Approaching Fort William</p>
<p>Just as you are entering Fort William you will pass the original end-point of the West Highland Way. It’s near the marker, in the sports store, where you can get a certificate saying you completed the West Highland Way. Once done, you can walk through the actual town of Fort William and visit the new end-marker (which I suspect was moved to the other side of town to force people to walk through Fort William and spend some money).</p>
<p><img loading="lazy" srcset="/assets/posts/2021/walking-the-west-highland-way-in-scotland-22-320w.jpg 320w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-22-480w.jpg 480w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-22-640w.jpg 640w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-22-960w.jpg 960w,/assets/posts/2021/walking-the-west-highland-way-in-scotland-22-1360w.jpg 1360w" src="/assets/posts/2021/walking-the-west-highland-way-in-scotland-22.jpg" alt="">The End Of The West Highland Way</p>
<h4>Final Thoughts</h4>
<p>I wrote this entry nearly three years after I walked the trail, so in truth I suspect I forgot many aspects of it. In general though it was a pretty amazing hike along lakes, within forests, and through the Scottish highlands. The food was pretty heavy at most restaurants during the evenings (curries, fish and chips, etc.), but after hiking all day neither of us complained.</p>
<p>This was the first time either of us had used Macs Adventure before, and we both had nothing but good things to say about them. Our luggage arrived safe and sound every day and was usually waiting in our rooms for us when we arrived. The accommodation they booked for us was comfortable everywhere we stayed, and the little welcome pack they provided us had lots of useful information about the trail and our custom itinerary.</p>
<p>I certainly don’t mind planning hikes like this myself, but every once and a while it’s nice to have someone else do all the hard work so that I can just show up and hike. And this was a perfect example of that.</p>
<p>In total we walked 154km in 7 days, which was definitely manageable. Both of us did pretty well on the hike in terms of blisters and general comfort, but we did wonder how the hike would have been if we extended it by another day. So if you want to go at a slightly slower pace and eliminate the long 31km day, it’s definitely something to consider. While I have walked 40km plus days on various hikes before, 25km is sort of my sweet spot where I don’t feel like I’m taxing my body too hard but still making good progress. So any day longer than that I usually end up feeling a bit sore the next day.</p>
<p>The West Highland Way was a great experience, and I’m happy I completed it. I definitely recommend this hike for anyone who wants to explore some of Scotland by embarking on a seven or eight day hike through the amazing Scottish highlands.</p>
<p><em>Update: In August of 2020 I walked the Great Glen Way in Scotland, and once again used Macs Adventure. I had a conversation with a BnB owner on that route, and she had told me she cancelled all the guest bookings due to Covid, other than the ones made by Macs Adventure. She said Macs had always been good to her, and made sure she was paid promptly after each booking. So not only was Macs great for me, but it’s also nice to hear that it’s a good company to work with if you are a hotel owner as well.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>A Lullaby For The Old World Order</title>
      <link>https://duanestorey.com/posts/a-lullaby-for-the-old-world-order.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/a-lullaby-for-the-old-world-order.html</guid>
      <pubDate>Wed, 16 Sep 2020 00:00:00 +0000</pubDate>
      <description>I realized this morning that I haven’t really given an update since I was smack-dab in the middle of our lockdown here in Spain. Most of us here spent 98 days essentially locked up in our apartments, only venturing outside to quickly get some groceries or to go to a pharmacy. It was one of the most ...</description>
      <content:encoded><![CDATA[<p>I realized this morning that I haven’t really given an update since I was <a href="https://www.duanestorey.com/journal/social-commentary/solidarity-in-a-time-of-crisis/">smack-dab in the middle of our lockdown here in Spain</a>. Most of us here spent 98 days essentially locked up in our apartments, only venturing outside to quickly get some groceries or to go to a pharmacy. It was one of the most intense and invasive lockdowns of any country anywhere, and many people here really struggled to cope with it. While I didn’t mind being at home, especially since I had many renovation projects on the go, the inability to even go for a walk or to get exercise was really difficult mentally, and most of us were extremely thankful when, after over three months locked up in our houses, that the rules were finally relaxed.</p>
<p>Since that time, Spain has entered ‘the new normal’, which is a new state of existence that involves mandatory mask wearing and social distancing in public. While I’m happy to do my part with helping stop the spread and save lives, I’d be lying if I said that I wasn’t getting tired of wearing a mask or having to continue to refrain from personal contact from a lot of people (which in Spain, a country of hugs and kisses, is a strange experience).</p>
<p>For various reasons, Spain essentially shuts down in August: most people tend to take their vacations then, and with extreme temperatures, many businesses simply shutter their doors for an entire month. My original plan, pre-pandemic, was to escape in August and head somewhere cooler. Staying in Spain during normal times in August is depressing enough, but post-pandemic, with many businesses permanently closed and the rest closing for vacation, I imagined it would be even worse. So when the travel corridors opened in July around much of Europe, I decided to carry on with some of my plans, and take advantage of whatever freedoms we were being temporarily granted while they were available.</p>
<p>I ended up in France for about ten days, mostly sitting by myself on various terraces sipping wine and reading books. I have to say, after being locked up for so long, it was extremely therapeutic for my mental state, and the first time in ages I felt even remotely normal. After recharging some of my batteries in France, I headed to Scotland to do a walk by myself through the highlands, which lasted about a week. Then I carried on and did some additional hiking in the Dolomites, eventually returning back to Spain.</p>
<p><img loading="lazy" srcset="/assets/posts/2020/a-lullaby-for-the-old-world-order-1-320w.jpg 320w,/assets/posts/2020/a-lullaby-for-the-old-world-order-1-480w.jpg 480w,/assets/posts/2020/a-lullaby-for-the-old-world-order-1-640w.jpg 640w,/assets/posts/2020/a-lullaby-for-the-old-world-order-1-960w.jpg 960w" src="/assets/posts/2020/a-lullaby-for-the-old-world-order-1.jpg" alt="Hiking in the Dolomites">Hiking in the Dolomites</p>
<p>In terms of logistics, the airports were pretty quiet, and most planes I took were at least half empty, often more. Same for trains. The hotels all had freely available sanitizer, and enforced mask wearing in all the public areas. Most restaurants took your name and number when you arrived, with the promise they would call you if anyone tested positive for COVID-19. So it seems that most places had accepted this new reality, and were doing what they could to keep people safe while still trying to open up for business.</p>
<p>I realize that there are various people who are adamant that nobody should be travelling right now, so it wasn’t an easy decision for me. But I figured if I wore masks, social distanced, stayed away from crowds, and also paid for a PCR COVID-19 test before I left, it wouldn’t really be any less safe than just doing my normal routine around my apartment in Valencia. Many of my the friends I have here also were happy to take advantage of their new-found freedoms, opting to go on a trip or two while the travel corridors were still open.</p>
<p>For those that disagreed with my decision, it was an extremely small minority. In stark contrast, most other people messaged me publicly and privately to tell me they were happy to see some photos from around the world to remind them that one day this will all be over and hopefully life will carry-on soon. So I’m happy I managed to escape for a few weeks and take advantage of the freedoms afforded to me by countries in Europe.</p>
<p>I won’t lie, people around here are feeling a lot of COVID-19 fatigue, myself included. I was in full support of the first lockdown, but seeing the after affects of it – the people who lost their jobs, the people who struggled mentally, the businesses that I know that had to close, or will likely close soon – I’m not sure I’d support another. I would like to think we have enough knowledge now with how to handle the pandemic without resorting to full-blown lockdowns again, while also minimizing the impact on vulnerable groups. Even the health minister here in Spain said they won’t support a lockdown again – it’s simply too costly, both in terms of the economy and also in terms of the well-being and mental health of the populace.</p>
<p>We are likely still a year away from a vaccine, and even when it’s ready it sounds like there will be a defined hierarchy of people who are able to receive it. So for most of us, this is probably the new world order for the foreseeable future, one we’ll have to get used to. I’ll be mostly hanging out in Spain for the foreseeable future, and when the opportunity arises, hopefully heading to Canada to finally see my family after a year away (even if I have to quarantine on arrival for several weeks).</p>
<p><em>* Post title is based on a song by Matthew Good</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Spanish Quarantine: Day 20</title>
      <link>https://duanestorey.com/posts/spanish-quarantine-day-20.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/spanish-quarantine-day-20.html</guid>
      <pubDate>Thu, 02 Apr 2020 00:00:00 +0000</pubDate>
      <description>Tomorrow marks the end of the third week of forced quarantine here in Spain, and unfortunately at this point there still is no end in sight. At the start of this week both the active cases of COVID-19 as well as the number of deaths seemed to be on the cusp of plateauing, but yesterday brought new highs ...</description>
      <content:encoded><![CDATA[<p>Tomorrow marks the end of the third week of forced quarantine here in Spain, and unfortunately at this point there still is no end in sight. At the start of this week both the active cases of COVID-19 as well as the number of deaths seemed to be on the cusp of plateauing, but yesterday brought new highs for both. I normally try to stay up each night until midnight, mostly to see what the latest numbers are – while they aren’t complete, usually there is an update shortly after midnight that gives some indication of what the next day may look like. And so far many of those updates haven’t been very uplifting.</p>
<p>I’d like to say that the streets are mostly barren of people, but it does seem like each day more and more people are starting to emerge. If the daily numbers were showing considerable improvement it may not be such a bad thing, but with how things are going it’s disappointing to see more and more people start to relax their personal commitment to staying at home. Even my next door neighbours sound like they are having people over in the evenings for drinks, which of course isn’t allowed. The difficulty of course is that as more and more people start pushing the boundaries of what is allowed, the people watching from the windows will start to feel resentment and will eventually do the same. The police are doing their best to stop people – but there’s only so much they can do.</p>
<p>I won’t lie, this last week was a bit challenging for me. I had a few things I wanted to learn related to my profession, but things have changed (mostly for the worse) in my field so much that it’s challenging to get a handle on it. Previously I could sit down at the computer and easily hammer out a mediocre symphony each time I sat down for a coding session, but now, mostly because of all the incomprehensible tools a person needs daily to accomplish software development, I find I spend that instead of making metaphorical music each day, I simply spend all my time trying to tune and fix the piano. Some of it is just me needing to break some rust off and push past it I’m sure, but definitely I’m not a huge fan with the direction my industry has gone, and I don’t get a ton of enjoyment out of writing software these days with the current technologies and tools we are forced to use and struggle with.</p>
<p>On the upside, I’ve swung back slightly to working on a passion project of mine – building a vacuum tube amplifier. While almost every professional job I’ve ever been hired for has involved writing software, on paper at least I’m an ‘Electrical and Computer Engineer’, but unfortunately one that hasn’t done a lot with my electrical education. So for me it’s definitely something I really want to accomplish on a personal level: the creation of a beautiful hi-fidelity amplifier that will one day (hopefully soon) bring music to the ears of everyone who comes for a visit at my place. So that’s exciting. I still am missing a few components to put it all together, but hopefully in the next few days I’ll have enough here that I can actually start building some of it – with luck it will be done in four to six weeks (especially if this lock-down continues).</p>
<p>People message me all the time to check in on me, which is of course great. But due to the fact that I have friends and family all over the world, lately I find I spend a non-trivial amount of each day updating everyone individually, hour after hour, via Messenger and Facebook with what’s going on. I definitely appreciate everyone’s support, but also have been trying to just batch update people once a day so I don’t feel like I’m spending my entire day talking about quarantine and everything associated with that. So if you are used to me getting back to you quickly, probably best not to get worried if I don’t respond for a day or two – I’m pretty safe here at home, and have been trying to use my time to update some skills and work on my projects. So no news is good news from my front.</p>
<p>Next week is of course my birthday, something some friends have already started to ask me about. I may pop on Zoom or something in the evening to catch up quickly with a few friends around the world, but I’ve never been a big birthday celebrator anyways so I’m mostly content with waiting to celebrate in person with a few friends when this is over. But of course, I appreciate everyone who has already reached out, and for those who I am sure will next week. I set aside a nice 2014 Rioja wine from Spain for the occasion, so I’ll probably make something nice to eat for dinner that night and then share this bottle of wine with everyone’s favourite stuffed penguin.</p>
<p>At this point quarantine is mostly a mental exercise, and at some level it reminds me of walking the Meseta, the middle portion, of the Camino de Santiago in 2017. Beauty on that section isn’t always readily apparent, but if you look hard enough it’s often there. I find being stuck at home strangely similar, where day to day the scenery seems monotonous, but the shared struggle and the camaraderie amongst my other friends in lock-down reminds me that even in these dark times there is still plenty of light. So thanks to everyone who has reached out for support, and for all of you who have popped on Zoom for a few drinks or some chats over the last few weeks. Hopefully by the time I do another update, Spain will have hit the peak and hopefully started to come down the other side of it. Until then.</p>]]></content:encoded>
    </item>
    <item>
      <title>Spanish Quarantine: Day 12</title>
      <link>https://duanestorey.com/posts/spanish-quarantine-day-12.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/spanish-quarantine-day-12.html</guid>
      <pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate>
      <description>This morning I woke up and like most days since the quarantine started here in Spain, immediately checked the official statistics to see if the curve has started to flatten yet. Today’s update shows rough 5,500 new cases since yesterday with another 443 people having died. roughly the entire capacity ...</description>
      <content:encoded><![CDATA[<p>This morning I woke up and like most days since the quarantine started here in Spain, immediately checked the official statistics to see if the curve has started to flatten yet. Today’s update shows rough 5,500 new cases since yesterday with another 443 people having died. roughly the entire capacity of Surrey Memorial Hospital back home in the Fraser Valley. While these numbers are slightly less than the ones from the day before, I’ve learned not to get too excited with a low day on the charts since often the next day more than makes up for it. What these numbers mean, besides the obvious horridness of people dying daily, is that we still have no idea when things will get better or the quarantine will be lifted. After reading that I put my head back on the pillow and went back to sleep.</p>
<p><img loading="lazy" srcset="/assets/posts/2020/spanish-quarantine-day-12-1-320w.jpg 320w,/assets/posts/2020/spanish-quarantine-day-12-1-480w.jpg 480w,/assets/posts/2020/spanish-quarantine-day-12-1-640w.jpg 640w" src="/assets/posts/2020/spanish-quarantine-day-12-1.jpg" alt="">Quarantine Video Chat</p>
<p>Days have this weird duality here where they simultaneously seem to take forever to be done and often feel like they are moving so quickly as to blur into one another. Despite having ample things to do at home that involves housework – laundry for example – I don’t particularly feel motivated to do any of them, usually preferring to read a book or toss on some Netflix. I try to get a little exercise in each day, at least a bit of time swinging some kettlebells, but I do miss being able to go for walks outside. On the week prior to quarantine I think I averaged 10,000 steps per day on my FitBit – I’m lucky to get 1,000 a day in currently. I’m certainly not depressed or particularly anxious about what’s going on, but I think there is a certain type of melancholy that a person feels when they become socially isolated.</p>
<p>I try to check in with friends via Zoom every few days – the last meetup was an impromptu one last Monday night, and some of us are doing another one tonight. Those are great, and they definitely help maintain sanity in trying times. But I’m sure we are all looking forward to the day when we can all meet up again, likely in a few months, and share our quarantine stories over a few cold cervezas, with maybe even a hug or a kiss or two tossed in.</p>
<p>My goal is to come out of quarantine a bit healthier than I went into it, which means that as much fun as it is to cook up masterpieces in the kitchen, I’m only cooking every few days, and usually only meals that I can freeze in batches. For example tonight’s dinner will be spaghetti bolognese, round 3. I was enjoying making sourdough bread every few days, but the last few times that I’ve visited the grocery store they have been completely out of flour. And in terms of drinking, I’m trying to only have a glass of wine once a week or so, usually coinciding with one of our online video chats.</p>
<p>Obviously being stuck at home is trying, but I certainly don’t want to complain. So many medical workers and front-line retail workers are essentially risking their lives daily to fight this, so by comparison staying at home is a small price to pay. But it does start to wear on your psyche as time goes on, and it would be nice, for everyone’s benefit here in Spain, to see the curve start to flatten out soon. For those of you in North America, my recommendation (and probably the same recommendation everyone in Europe would give you) still stands – lock yourself down at home and stay there for the foreseeable future.</p>]]></content:encoded>
    </item>
    <item>
      <title>Solidarity In A Time Of Crisis</title>
      <link>https://duanestorey.com/posts/solidarity-in-a-time-of-crisis.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/solidarity-in-a-time-of-crisis.html</guid>
      <pubDate>Sun, 22 Mar 2020 00:00:00 +0000</pubDate>
      <description>On January 7th, 2020, I was on an airplane flying from Vancouver, Canada, to Spain, fully unaware of what was occurring in Asia with regards to a novel coronavirus, now known as COVID-19. Little did I know, in roughly two months we would be on lockdown here in Spain for the foreseeable future in an ...</description>
      <content:encoded><![CDATA[<p>On January 7th, 2020, I was on an airplane flying from Vancouver, Canada, to Spain, fully unaware of what was occurring in Asia with regards to a novel coronavirus, now known as COVID-19. Little did I know, in roughly two months we would be on lockdown here in Spain for the foreseeable future in an effort to curb the rapidly increasing countrywide death rate associated with COVID-19.</p>
<p>Like many countries who now find themselves in a similar place, Spain mostly ignored the lessons we should have learned from Italy, and Italy largely ignored the lessons they should have learned from China. The end result for both Spain and Italy is a daily battle to prevent the collapse of the national health care system, and the continuing restriction of liberties in an effort to ‘flatten the curve’ and reduce the deaths that are occurring daily. I myself am guilty of it as well, as what was happening in Italy just didn’t seem real, certainly not enough to make the huge life-affecting changes required.</p>
<p>And now here we are, eight days into our fifteen day quarantine, knowing full well we will be inside for another 4-8 weeks at this point. Currently we are only allowed to do three things outside: to go get groceries (most neighbourhoods have some type of small grocery store within walking distance), to go to the pharmacy, or to walk a dog for five minutes or so. That’s it. We’re not allowed to go for runs, or go to the beach, or hike a mountain, or go sit on a park bench with a coffee – this is a lock down.</p>
<p>That’s why I’m continually frustrated when I see updates from people back in Canada and the United States, outside walking in parks or mostly going on as business as usual. Of course, I wish I could do those things as well, but part of the reason we find ourselves in this situation here in Spain is because we waited too long to basically lock ourselves inside, and the virus quickly took over.</p>
<p>If the first seven days here could be considered essentially a trial period for a lock down, the Spanish government has now entered a new, more serious phase this weekend, handing out steep fines for people travelling for leisure, and even arresting people with no regard for the health or safety of others. This is a scary prospect in any society, but is only occurring because people were continually ignoring demands to stay at home and placing the health of the population in jeopardy.</p>
<h4>Frequently Asked Questions</h4>
<p>Many questions continually come up with friends and family, so I wanted to try and answer a few of them for people.</p>
<ol>
<li><strong>How Is Life In Spain</strong>? Day to day life is manageable here in Spain. Other than the boredom and melancholy that goes along with self-isolation, mostly things are normal. I can see my grocery store from my window, so I try to plan my trips during periods when there aren’t many people queuing outside. Spain is a very social country where a huge part of daily life involves meeting friends in pubs or cafes and socializing, so a nationwide lockdown is extremely difficult for most Spaniards. Unlike in North America where everyone has fancy tech-toys to pass the time (Netflix, Playstation, etc), I suspect the average Spaniard doesn’t, instead relying on friends and family to fill up the time. So this is exceptionally painful for the country.</li>
<li><strong>Are Things Getting Better There</strong>? Unfortunately not. Based on the latest <a href="https://www.worldometers.info/coronavirus/country/spain/">Spanish COVID-19 Data</a> we still aren’t flattening the curve. Even though the incubation period is 2-14 days, the actual mean incubation period is more like 5.8 days, so we should have started to see the curve flattening. I suspect it hasn’t because a sizeable percentage of the population has been ignoring the requirement to stay at home, and continuing to interact with people. This is why going forward our police and military are going to be more involved, and ultimately the end result for any country where people don’t abide by the recommendations.</li>
<li><strong>How Long Will It Last</strong>? It’s hard to say, but China did a full lock down on January 23rd, and has only recently started to lift it. So if that experience translates to other countries, then it’s likely to take two months under strict quarantine for the virus to effectively disappear. Given what I’ve seen here in Spain, where people are a bit more sceptical of sweeping government mandates, I imagine it will take longer. And of course if people continually choose to go outside when they should be at home, it will take even longer (which effectively makes the sacrifices of those staying at home worthless).</li>
<li><strong>How Do You Pass The Time</strong>? Most of my client work as a freelancer has dried up, which seems to be typical in the industry. So I’m using my time to refresh some skills and to work on some of my websites. <a href="https://zoom.us">Zoom</a> has been absolutely invaluable as a tool to keep in touch with friends and family, and some of us try to have conference calls in the evenings to have some type of social interaction. I have lots of home improvement tasks I could be working on, but since all my neighbours are quarantined at home as well I’m not super keen on pulling out the saw and making lots of disruptive noise.</li>
<li><strong>What Do You Miss The Most</strong>? To be honest, I miss various things. But one of the favourite parts of my day was always my morning coffee down the road from me. A huge part of Spanish culture involves simply sitting in the sun and enjoying a food or beverage, and I miss my morning “me time” with a nice coffee.</li>
</ol>
<p>One of the most unfortunate aspects of this pandemic is that people seem extremely reluctant to take the advice of others who have already experienced it, or are currently experiencing it. You would think with the internet and the multitude of ways we can keep in touch and communicate that this wouldn’t be the case, but strangely most people have this attitude of “well, it will be different here,” when it most likely won’t be. Despite that, I’m going to do my best to appeal to some of my friends and associates back in North America with some of my recommendations. These are items we have learned from experience here, but should have learned from our Italian friends who were imploring us to do some of them previously.</p>
<h4>My Recommendations</h4>
<p>In terms of my recommendations for people in North America, here’s a short list:</p>
<ol>
<li><strong>Stay At Home</strong>. I can’t stress this enough. While technically you can go walk around and practice social distancing in public, it just doesn’t work. Someone will see someone else walking along the beach and misinterpret it, and then go out and think they can sunbathe. And then someone else will show up, and pretty soon you have a pile of people at the beach, <a href="https://www.theguardian.com/australia-news/2020/mar/21/bondi-beach-closed-down-after-crowds-defy-ban-on-gatherings-of-more-than-500-people">which just happened yesterday at Sydney, Australia’s Bondi beach</a> (which is now shut down due to people continuing to abuse it). You need to be isolating at home, not outside with your kids or loved ones. I realize it’s painful to not get any fresh air or to get any exercise, but that’s what’s going to be required. The sooner you get used to it, the sooner things will get better. And while I’m not a huge fan of social-shaming, it’s probably time to start lecturing your friends and family to do the same.</li>
<li><strong>Travel</strong>. If you’re planning on going on a trip now, cancel it. Seriously. I still see people boarding airplanes and going to Mexico or other fantastical spots. I hate to adopt a holier-than-thou attitude, but honestly in a time of crisis like this where self-isolation is required, boarding an airplane for a vacation is an incredibly selfish thing to do. The whole argument “well I have to live too” is understandable, but you can live at home as well, certainly for now. I saw someone call this our “civic responsibility” – our duty to our fellow citizens to stay at home and help stop the spread of the disease – and I agree. The only legitimate travel in my mind right now involves repatriation flights to get loved ones back home when they are out of country.</li>
<li><strong>Getting Groceries</strong>. My sister works in a grocery store in Canada, and she seems pretty worn out. Customers come in and take out all their frustrations at the staff, most of which don’t particularly want to be working in one of the most hazardous environments from a health perspective in a pandemic. Most don’t have any masks to use, or gloves to wear, and yet they are risking their lives daily so that you and your family can eat. So please go easy on them. In terms of quantities, just buy a reasonable amount, no more than you’d normally pick up. Yes, the shelves will be emptier than normal (they were here too) because of panic buying. But the surest way to create even more panic is to completely empty the shelves and make people legitimately worried for their lives. The food will continue to come. I’ve seen some friends back home urge others to buy enough groceries to stay at home for a long time – I disagree, as that’s a pretty close definition to hoarding. Simply buy enough to last you until your next shopping trip. And trust me, even though it’s dangerous outside, after being locked home for days or weeks, you’ll be looking forward to making a trip to the grocery store anyways.</li>
<li><strong>Hospitals</strong>. I’m no doctor, but I know the health care system here (one of the world’s best) is struggling. I have friends who are doctors, and most of them no longer have any masks to wear, but are helping anyways. That’s why here in Spain at roughly 8pm we gather on our balconies and clap – recognition for the countless healthcare workers who risk their lives daily. If you aren’t really that sick, you may want to consider staying home. I’m sure a sniffle or a sneeze may be cause for worry, but it’s quite possible it’s just a cold and will go away on its own. Hospitals are extremely busy right now dealing with actual infected people, so it’s best to try and help reduce their burden.</li>
<li><strong>Preparation</strong>. If you’re hunkering down in North America and getting ready for what’s about to come (and trust me, it will come), I’d recommend dusting off the board games, especially if you have children. You are going to have a lot of time to fill, and even the most inventive people will likely struggle to fill the days. I definitely recommend calling friends and family once a day and having a video chat with them. If you want to write about some of what you are going through, grab a free website at <a href="https://wordpress.com">WordPress.com</a>. Stock up on groceries, but not too much as other people need to eat too. If you still have Amazon where you are, place an order for a few new books and whatever items you need while you can.</li>
</ol>
<p>If there was to be a bright side to all of this, it would probably be the fact that the planet is using this opportunity to heal itself slightly. The canals in Venice have cleared up, pollution in Northern Italy is decreasing at a rate of about 10% a week, and deer are being spotted in forests long bereft of them in Japan. While being locked up for eight days has been a bit trying, there is a real hopefulness amongst my friends here that this event will bring humanity a bit closer together and make us realize how crucially interdependent we are despite our differences in location or culture. Of course the deaths are tragic, but what would be even more tragic is to ignore the lessons we will all learn during this period of time, and to not adjust society going forward when this is over.</p>
<p>This virus doesn’t care about the colour of your skin, or what deity you believe in. It doesn’t care if you are rich or poor, or whether you like cow’s milk or almond milk. It’s going to come regardless, and we need to do what’s necessary to survive this and to ultimately recover from this. In short, we are all in this together. So let’s do our best to help each other through this. Be kind to each other during this time, and just as important, be kind to yourself. While the next few months are likely to be trying, we will eventually be on the other side of this. And until then, it’s up to all of us to do our best to support each other, and to show kindness to the many workers who are putting their lives at risk for your benefit – healthcare, pharmacy, retail, grocery, etc. If anyone needs to chat, feel free to drop me a line via the contact form. But try to keep busy, try to stay positive, and more importantly, try to stay isolated at home.</p>
<p><strong><em>Update: Spain has just announced the quarantine/lock-down will be extended another two weeks [<a href="https://www.euroweeklynews.com/2020/03/22/breaking-news-spains-government-decides-to-prolong-state-of-alarm-by-15-days-as-the-worst-is-yet-to-come/?fbclid=IwAR0486_txQ_1soerlJbqfP1GeF7oesKay28xUhPMWA5HCEXXW1F1DIw6-YE#.XndZVkMo_Ua">link</a>]</em></strong></p>]]></content:encoded>
    </item>
    <item>
      <title>How We Wrecked Our Guts</title>
      <link>https://duanestorey.com/posts/how-we-wrecked-our-guts.html</link>
      <guid isPermaLink="true">https://duanestorey.com/posts/how-we-wrecked-our-guts.html</guid>
      <pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate>
      <description>There is great deal of evidence to show that our guts used to be in a much healthier state decades ago. For example, the Hadza in Africa, one of the last ‘hunter-gatherer’ species on the planet, appear to have 300% more bacteria in their guts than we do. It seems that over time we have lost many of ...</description>
      <content:encoded><![CDATA[<p>There is great deal of evidence to show that our guts used to be in a much healthier state decades ago. For example, the Hadza in Africa, one of the last ‘hunter-gatherer’ species on the planet, appear to have 300% more bacteria in their guts than we do. It seems that over time we have lost many of these bacteria, and whatever functions they once provided.</p>
<p>In terms of gut health, one metric that’s often used is diversity. Similar to the environment, it’s often thought that the health of any ecosystem is related to the number of species in it and their relative abundance. Harmony is basically where you have a lot of species, with a mostly equal membership. If any one species starts to take over and populate excessively, it endangers the entire ecosystem.</p>
<p>This is similar to the gut microbiota. Any overgrowth of a particular species can tend to cause problems for the health of the entire individual. Likewise, certain species seem to be protective against ailments like diabetes and obesity – a person generally doesn’t want to lose them.</p>
<h2>The Danger of Antibiotics</h2>
<p>When I was a child, my mother would take me to the doctor’s office when I was sick. They would perform a bunch of tests, sometimes putting cotton swabs in my nose or throat, and then wait a few days to see what I was infected with. If it was something treatable, often I would get a prescription for an antibiotic and take it home. The key difference back then was they often wanted to know what the bacterial infection was before prescribing the antibiotic. Nowadays most doctors simply prescribe broad-spectrum antibiotics, which are mostly non-specific with regards to the bacteria they tend to kill.</p>
<p>There’s no question that antibiotics save lives. But nowadays doctors are pretty eager to prescribe them, and patients have been trained to basically ask for them whenever there is an issue. The body has an amazing ability to heal itself and fight off disease, but most of us don’t want to go through that process and instead simply opt to take antibiotics whenever we are ill.</p>
<p>The problem is that antibiotics have a massive detrimental effect on the gut microbiota. In one study I read, one course of antibiotics caused persistent changes in the gut for over two years. Some species can be totally eliminated by antibiotics, and never return. Over time this has led to a gradually declining gut microbiota in North America, one that’s getting further and further from our Hadza counterparts in Africa.</p>
<p>I would never tell someone not to take antibiotics, but for myself I actively avoid them whenever I can. The last time I had any antibiotics was a few years ago when I had a surgery, and my gut health has never looked better. If I got really sick, I wouldn’t hesitate to take antibiotics. But for the average cold or periodic infection, I personally steer clear of them myself.</p>
<h2>Pregnancy</h2>
<p>Another aspect of gut health that is causing damage is the preferential shift to c-section deliveries in many countries. There are two problems with this.</p>
<p>First, there’s growing evidence that a child acquires its initial microbiota from its mother during delivery through the birth canal. C-section babies, since they don’t pass through the birth canal, instead end up with a microbiota that resembles the bacteria on the walls and equipment in the hospital, one that looks nothing like what a typical healthy microbiota is supposed to represent.</p>
<p>The second issue is that during a c-section antibiotics are usually administered, which has the effect of further damaging the microbiota of the mother and baby, depending on the timing of the antibiotics.</p>
<p>While there are many medically justified reasons to have a c-section childbirth over a natural birth, the trend in many countries to do it primarily for convenience or cosmetic reasons is increasing.</p>
<h2>Breast Feeding</h2>
<p>There’s a long line of research that shows that breastfed babies are generally healthier than ones fed formula. This seems to be the case as well in terms of the gut microbiota. In fact, there are certain elements in breast milk that can only be consumed by certain bacteria in the gut – without them they would pass right through the body. So this shows at some level that breast milk has evolved to not only feed the baby, but the baby’s microbiota as well.</p>
<h2>Excessive Cleanliness</h2>
<p>Another aspect which is hurting our gut microbiota is our excessive cleanliness. There are antibiotics unfortunately in many places now, and most people probably aren’t aware of them. For example, some toothpastes have ingredients in them that effectively act like antibiotics. Those hand sanitizers that many people use also are good at wiping away bacteria on our hands, many of which may be beneficial to the body. The chlorine and chloramine in our water also kills bacteria in the body.</p>
<p>Research has shown that children who grow up on farms have improved health in general, and one theory about why this is rests in the fact that they are exposed to far more germs and bacteria than kids off the farm. This causes the immune system to be far stronger, and seems to show that they can fend off more pathogens and diseases. So our excessive fear of being dirty may be causing our immune systems to be weaker.</p>
<p>Research has shown that in families with dogs, they not only have a healthier microbiota but also the microbiota of family members are more similar to each other. So Fido the dog is not only an important companion, but he’s helping to transfer beneficial bacteria (through licking and being outside) throughout the house.</p>
<p>So in terms of gut health, what does all of this mean? I can’t instruct others on what to do as these are personal decisions, but for me I avoid hand sanitizers (nothing wrong with a little water) and antibiotics whenever I can. I haven’t quite found the perfect solution to removing chlorine/chloramine from water, but I am actively looking for a good solution. But in general, I try to avoid anything that I think will hurt my microbiota.</p>
<p>In the next newsletter (<a href="http://eepurl.com/cA2cK5">sign-up here!</a>), I’ll talk about some common ways you can improve your gut health, primarily through what you are eating! We’ll discuss fibre (digestible and non-digestible) and the new term, Microbiota Accessible Carbohydrates (MAC).</p>]]></content:encoded>
    </item>
  </channel>
</rss>
