<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://ryanrusnak.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ryanrusnak.com/" rel="alternate" type="text/html" /><updated>2026-07-31T17:06:33+00:00</updated><id>https://ryanrusnak.com/feed.xml</id><title type="html">Ryan Rusnak</title><subtitle>Ryan Rusnak on logistics software, plain text, and the slow craft of shipping things that last. Written in a folder, published by a robot.</subtitle><author><name>Ryan Rusnak</name></author><entry><title type="html">Why Airspace</title><link href="https://ryanrusnak.com/why-airspace/" rel="alternate" type="text/html" title="Why Airspace" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://ryanrusnak.com/why-airspace</id><content type="html" xml:base="https://ryanrusnak.com/why-airspace/"><![CDATA[<p>I met Nick in 2015. I had just woken up to the idea that spending my time on this planet writing software for the government was a terrible idea. It was just so disorganized that almost nothing moved forward in a meaningful way. I thought I was pretty damn good at making things and I wanted to know that I wasn’t wasting time doing it. So I started looking for two things:</p>

<ol>
  <li>Something meaningful.</li>
  <li>Something super hard.</li>
</ol>

<p>I wanted to go to bed every night knowing that I made the world a better place. That ruled out pretty much every company most people were vying to work at at the time like Twitter, Facebook, Pinterest, etc. Nothing against those companies, but they do not check point number one.</p>

<p>I also wanted something that would be the best measure of my skills. I wanted to <em>know</em> that I was good. I needed to prove it to myself for some reason. Who knows why.</p>

<p>Then, I meet Nick Bulcao. He explained to me that time critical shipping was broken and that people were suffering because of it. Doctors, for instance, try to minimize the time an organ for transplant is outside of the body so they will coordinate the surgery around the time that the forwarder gives them. Then something as simple as traffic happens and the patient might wake up finding out that their organ, that was a one in a million match, expired. Now it is going for research and they are back on the transplant list.</p>

<p>In that moment, I knew how I wanted to spend my time. That was almost 11 years ago, almost 20 patents ago, millions of lines of code ago, and to this day I still feel lucky to go to bed knowing that what I did that day mattered to someone.</p>]]></content><author><name>Ryan Rusnak</name></author><category term="airspace" /><category term="career" /><summary type="html"><![CDATA[In 2015 I wanted two things from my work: something meaningful and something super hard. Then I met Nick.]]></summary></entry><entry><title type="html">Publishing from a folder</title><link href="https://ryanrusnak.com/publishing-from-a-folder/" rel="alternate" type="text/html" title="Publishing from a folder" /><published>2026-07-24T00:00:00+00:00</published><updated>2026-07-24T00:00:00+00:00</updated><id>https://ryanrusnak.com/publishing-from-a-folder</id><content type="html" xml:base="https://ryanrusnak.com/publishing-from-a-folder/"><![CDATA[<p>Every post on this site begins as a file in a folder. It is an Obsidian vault,
which is a generous way of saying it is a directory of markdown with some links
between the files. There is no CMS. There is no publish button. There is a
folder, and there is a robot that watches it.</p>

<p>I have tried the other way. I have had blogs on platforms that let me drag images
around and pick from nine hundred fonts, and I wrote almost nothing on any of
them, because opening the editor felt like arriving at an office. Writing in a
text file feels like writing in a notebook — the tool disappears, and the only
thing left in front of me is the sentence I have not finished.</p>

<h2 id="the-pipeline">The pipeline</h2>

<p>The whole thing is four moving parts, and three of them are things I would have
running anyway. Obsidian writes the file. A script on an always-on Mac mini
imports it. Git moves the result. A GitHub Action builds the site with Jekyll.
Nothing here is clever, and that is the entire point — see <span class="wikilink-dead">boring by design</span>
for the longer argument.</p>

<div class="mermaid">
flowchart LR
  A[Obsidian<br />Blog/*.md] --&gt; B[import on the mini<br />publish: true only]
  B --&gt; C[git push<br />_posts only] --&gt; D[Jekyll build<br />GitHub Actions] --&gt; E[Pages]
</div>

<p>A note becomes a post when I add three lines of frontmatter to it. Everything
without <code class="language-plaintext highlighter-rouge">publish: true</code> stays private, which means the vault stays a vault — most
of what is in there is grocery lists and half-formed grudges.<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup></p>

<p>The important half is what the repository is allowed to contain. The vault never
enters git. The importer runs where the notes live, and the only thing that gets
committed is what it generated:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># on the machine with the vault</span>
ruby script/import_vault.rb ~/Obsidian<span class="se">\ </span>Vault   <span class="c"># reads Blog/, prunes the rest</span>
git add _posts assets/img <span class="o">&amp;&amp;</span> git push           <span class="c"># nothing else is tracked</span>
</code></pre></div></div>

<div class="callout callout-note">
  <div class="callout-title"><span class="ic">i</span>note</div>
  <p>`import_vault.rb` rewrites wikilinks into Jekyll permalinks, turns Obsidian callouts into the blocks you are looking at, and copies only the attachments that published notes actually reference.</p>
</div>

<div class="callout callout-warning">
  <div class="callout-title"><span class="ic">!</span>warning</div>
  <p>A vault-wide sync will happily publish a note you renamed at 1am. Read from an allowlisted folder rather than skipping a list of private ones — a denylist makes every folder you add later public by default.</p>
</div>

<h2 id="what-it-looks-like-from-the-inside">What it looks like from the inside</h2>

<p>Two panes, no browser. The left one is the note; the right one is the local
preview, which I check about twice per post and otherwise ignore.</p>

<blockquote>
  <p>The best writing tool is the one you already have open for another reason.</p>
</blockquote>

<p>I do not know whether anyone should copy this setup. I know that I have published
more in six months of owning a folder than in six years of owning an account, and
that when this site eventually dies, the writing will still be sitting in a
folder, in files I can open with anything.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>Both of which are, admittedly, good writing prompts. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Ryan Rusnak</name></author><category term="writing" /><category term="tooling" /><summary type="html"><![CDATA[Every post here starts as a markdown file in an Obsidian vault. No CMS, no publish button — a folder, a git remote, and forty lines of YAML.]]></summary></entry></feed>