<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sailorfe</title>
    <description>The latest articles on DEV Community by sailorfe (@sailorfe).</description>
    <link>https://dev.to/sailorfe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1973834%2F674953d6-1d0d-430f-b002-b388fb3eaf0c.jpeg</url>
      <title>DEV Community: sailorfe</title>
      <link>https://dev.to/sailorfe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sailorfe"/>
    <language>en</language>
    <item>
      <title>I Stumbled Into Documentation-Driven Development</title>
      <dc:creator>sailorfe</dc:creator>
      <pubDate>Tue, 16 Sep 2025 16:24:45 +0000</pubDate>
      <link>https://dev.to/sailorfe/i-stumbled-into-documentation-driven-development-108k</link>
      <guid>https://dev.to/sailorfe/i-stumbled-into-documentation-driven-development-108k</guid>
      <description>&lt;p&gt;I'm in an odd position because developing something in the open generally means developers at least are part of the target userbase, but my end user for &lt;a href="https://codeberg.org/sailorfe/ephem" rel="noopener noreferrer"&gt;Ephem&lt;/a&gt;, a Python CLI for casting and storing horoscopes, is me: a professional astrologer and desktop Linux user who lives in the terminal. &lt;/p&gt;

&lt;p&gt;There has to be at least one more of us, or an astrologer on macOS who can be swayed to install something with &lt;code&gt;pipx&lt;/code&gt;, so I set out to write a tutorial for my CLI tool beyond a simple README to finally ship with v2.0.0 and quickly realized the user I was neglecting the whole time was &lt;em&gt;me&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I caught five UX issues in one evening of writing documentation that went unnoticed with weeks of automated tests. Of course I'm a few semantic versions into this development life cycle, but I felt like I was doing something wrong: shouldn't documentation be for finished products? But then I discovered &lt;strong&gt;documentation-driven development&lt;/strong&gt; (DDD), described in &lt;a href="https://gist.github.com/zsup/9434452" rel="noopener noreferrer"&gt;this Gist&lt;/a&gt; first published in 2014:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[F]rom the perspective of a user, if a feature is not documented, then it doesn't exist, and if a feature is documented incorrectly, then it's broken.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm not properly doing the suggested order of operations of "document first, code second" for &lt;em&gt;the entirety of a project&lt;/em&gt;. But here are the local git commits I made while writing my tutorial first draft on a dev branch confidently tagged v2.0.0b2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
413e0b5 &lt;span class="o"&gt;(&lt;/span&gt;HEAD -&amp;gt; v2&lt;span class="o"&gt;)&lt;/span&gt; display.month: add day of week
5ddf0c9 now/cast: print saved index
ae20773 add &lt;span class="nt"&gt;--list-zones&lt;/span&gt; global
47f2478 cast: accept seconds input
ebb1e2e fix now &lt;span class="nt"&gt;--save-config&lt;/span&gt; output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since this is Git history, let's start at the bottom.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fix now --save-config output&lt;/code&gt;: I modeled how to save your default coordinates because astrology is ultimately geocentric, so I wrote locale in the tutorial as the &lt;em&gt;first&lt;/em&gt; thing to configure. However, running &lt;code&gt;now --save-config -y 30 -x -80&lt;/code&gt;... didn't actually produce the Chart of the Moment. I just took it in stride that I re-ran &lt;code&gt;ephem now&lt;/code&gt; to actually see a chart.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cast: accept seconds input&lt;/code&gt;: The tutorial starts self-referentially with its own birth chart from its initial Git commit in H:M:S, but I initially only wrote the &lt;code&gt;cast&lt;/code&gt; command to take H:M since that's what's written on most birth certificates.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;add --list-zones global&lt;/code&gt;: I wrote a short section explaining IANA tz strings and &lt;code&gt;zoneinfo&lt;/code&gt; where I sent the user to a third-party website to find the timezone of their birth, which is contrary to a terminal workflow.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;now/cast: print saved index&lt;/code&gt;: There was no immediate confirmation my database &lt;code&gt;--save&lt;/code&gt; option did anything. In my months of dogfooding, I double-checked with a separate command, &lt;code&gt;data view&lt;/code&gt;. In other words, I didn't trust my own app and wrote an entire step of this tutorial telling someone else not to, either.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;display.month: add day of week&lt;/code&gt;: I modeled how to choose an astrologically optimal wedding date without knowing the day of the week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every single commit addresses an issue discovered only by roleplaying a new user with real use cases, not from testing individual functions. And these aren't just any users, but experts in their field with needs that only an astrologer-developer could anticipate. For something this niche, I am my own guinea pig.&lt;/p&gt;

&lt;p&gt;Unit tests check if code works; documentation checks if humans can actually use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Am I weird?
&lt;/h2&gt;

&lt;p&gt;Looking into talks and writing on documentation-driven development beyond Zach Supalla, I didn't find much:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.writethedocs.org/videos/portland/2019/lessons-learned-in-a-year-of-docs-driven-development-jessica-parsons/" rel="noopener noreferrer"&gt;Lessons Learned in a Year of Docs-Driven Development&lt;/a&gt; (Jessica Parsons, 2019)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/this-is-learning/a-better-way-to-code-documentation-driven-development-1kem"&gt;A Better Way To Code: Documentation-Driven Development&lt;/a&gt; (Corbin Crutchley, 2022)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://buildwithandrew.medium.com/whats-documentation-driven-development-4b007f4de6a1" rel="noopener noreferrer"&gt;What's Documentation-Driven Development?&lt;/a&gt; (Andrew Johns, 2025)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Parsons (&lt;a href="https://www.verythorough.com/" rel="noopener noreferrer"&gt;verythorough&lt;/a&gt;) describes exactly what I experienced around the 14:00 mark. A dev realized only after explaining a feature in writing that it was "going to be way too hard for the customer to do it in the way [they've] planned for it" and adjusted accordingly. But I get the impression from sparse writing on the subject since this talk that this is an unusual way of writing code.&lt;/p&gt;

&lt;p&gt;Crutchley's article for &lt;em&gt;This Is Learning&lt;/em&gt; encapsulates something else I found in this process: "&lt;strong&gt;Docs influence code influence docs.&lt;/strong&gt;" It isn't that you write docs once, then code. A document goes through revisions and review just like any codebase. I did graduate work writing footnoted, enormous Markdown files in a Git repo that was originally an Obsidian vault (my trajectory is weird), so I'm frankly more used to using &lt;code&gt;git diff&lt;/code&gt; to compare drafts of prose than code commits. In the process of the five git commits here, I:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Described a workflow that &lt;em&gt;didn't work&lt;/em&gt; or that I discovered was confusing.&lt;/li&gt;
&lt;li&gt;Revised the modules in question.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Then&lt;/em&gt; rewrote anywhere from 100-800 words of documentation after I fixed it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a totally normal process for me as a writer. I find it intuitive, but maybe it's because I'm a self-taught developer. My undergraduate degrees are in theater and journalism and my longest-running side hustle is astrology &lt;del&gt;which is more stable than either of those industries&lt;/del&gt;. I've written and spoken plain English professionally for longer than I've written code, but...&lt;/p&gt;

&lt;p&gt;I'm drafting this tutorial in a separate Git repo where I do &lt;em&gt;all&lt;/em&gt; my writing before I &lt;code&gt;cp&lt;/code&gt; it to my project dir for editing. Why? I suppose it's because in the world of OSS, I don't really see people dedicating chunks of their Git commits to tweaking their READMEs, so I felt like I wanted to keep my history pure or mostly code for no good reason. This seems to be the bifurcation that &lt;a href="https://docsascode.org/" rel="noopener noreferrer"&gt;Documentation As Code&lt;/a&gt; wants to address. Their point that "It is time also to train non-developers on how to use a versioning system" is hilarious to me, though, because using Git to manage professional and hobby writing made me a developer.&lt;/p&gt;

&lt;p&gt;The Ephem tutorial draft lives in the same directory as one for a newsletter I sent in June: a tutorial for other astrologers &lt;a href="https://buttondown.com/sailorfe/archive/the-astrolog-cli" rel="noopener noreferrer"&gt;about open-source astrology software from the 90s&lt;/a&gt; that I use in my client work, Astrolog. It's written in C++, has had one maintainer since 1991, and isn't very popular with my generation of astrologers in part because like most of Gen Z can't even touch-type. I wrote the tutorial knowing that the terminal is a learning curve for astrologers used to mouse-driven GUIs, but it also led me to really ruminate on my frustrations with Astrolog. So not only is this docs-driven development, but docs-&lt;em&gt;inspired&lt;/em&gt; development or docs-driven &lt;em&gt;design&lt;/em&gt; where writing about &lt;em&gt;someone else's application&lt;/em&gt;, an application I still love and use, led me to imagine my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try documentation-driven development yourself
&lt;/h2&gt;

&lt;p&gt;It's totally possible to test drive this process without starting a brand new project or changing an existing one. Here are some ways you can get a taste:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write a real tutorial, not just a README.&lt;/strong&gt; You're essentially in an extended roleplay with yourself as both teacher and student. This lets you re-encounter a codebase you &lt;em&gt;think&lt;/em&gt; you know well from the perspective of an end user who is possibly not even a developer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow the tutorial like you're a user.&lt;/strong&gt; I kind of combined this step and the previous: I wrote and ran example commands and discovered my output was half as informative as it should've been, or that in my dogfooding I'd gotten used to extra steps I shouldn't have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs influence code influence docs.&lt;/strong&gt; It isn't a waste of time to document a flawed iteration, fix it, then rewrite the documentation. This is basically more verbose, more audience-oriented rubber duck debugging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try documenting someone else's project.&lt;/strong&gt; Take an application you use often and see what points of friction you've accepted as quirks you can live with. This is what I did with Astrolog!&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>documentation</category>
      <category>testing</category>
      <category>ux</category>
      <category>opensource</category>
    </item>
    <item>
      <title>foot with true-color tmux support (à la Alacritty)</title>
      <dc:creator>sailorfe</dc:creator>
      <pubDate>Mon, 06 Jan 2025 19:28:05 +0000</pubDate>
      <link>https://dev.to/sailorfe/foot-with-true-color-tmux-support-a-la-alacritty-25gj</link>
      <guid>https://dev.to/sailorfe/foot-with-true-color-tmux-support-a-la-alacritty-25gj</guid>
      <description>&lt;p&gt;I find &lt;a href="https://codeberg.org/dnkl/foot" rel="noopener noreferrer"&gt;foot&lt;/a&gt;, the default terminal in Wayland, either supremely underrated or SEO-proof due to its name. It's easy to configure and fast, and I especially love being able to include other files like color schemes. So when I started using tmux dailly I was dismayed I might have to switch to Alacritty or kitty for Neovim to look right, because Googling "foot ________" does not lead anywhere, and its documentation is a little on the thinner side. This humble first post of mine is an attempt to evangelize about this terminal and its flexibility.&lt;/p&gt;

&lt;p&gt;The solution was pretty simple to figure out. I followed &lt;a href="https://gist.github.com/andersevenrud/015e61af2fd264371032763d4ed965b6" rel="noopener noreferrer"&gt;the conventional wisdom&lt;/a&gt; of setting TERM in Alacritty's &lt;code&gt;env&lt;/code&gt; table, compared it to &lt;code&gt;foot&lt;/code&gt;'s &lt;a href="https://www.mankier.com/5/foot.ini" rel="noopener noreferrer"&gt;config man page&lt;/a&gt;, and tried this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[main]
term=xterm-256color
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TERM is the only possible field under the environment section, but the man page says "&lt;a href="https://www.mankier.com/5/foot.ini#SECTION:_environment" rel="noopener noreferrer"&gt;Note: do not set TERM here; use the term option in the main (default) section instead.&lt;/a&gt;" I already had &lt;code&gt;.config/tmux/tmux.conf&lt;/code&gt; configured with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and &lt;code&gt;termguicolors&lt;/code&gt; set to true in Neovim.&lt;/p&gt;

&lt;p&gt;Now tmux shows Neovim's lovely background colors on all three of my machines even when I connect to them remotely. Sans includes, my &lt;code&gt;foot.ini&lt;/code&gt; is fewer than 20 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# -*- conf -*-

[main]
term=xterm-256color
#font=Cozette:size=9
font=JetBrainsMono NF:size=12
pad=12x18
include=~/.config/foot/moonqueen.ini

[scrollback]
lines=100000

[key-bindings]
clipboard-copy=Control+Shift+c XF86Copy
clipboard-paste=Control+Shift+v XF86Paste

[colors]
alpha=0.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here you can see two different Neovim colorschemes. The pink one reminds me that tmux panel is hosted by my headless server, while the indigo editor matches my client &lt;code&gt;foot&lt;/code&gt; config and overall Sway styling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9oou8q3ye3tx6ouqtx3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9oou8q3ye3tx6ouqtx3s.png" alt="tmux and neovim in foot" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wayland</category>
      <category>linux</category>
      <category>tmux</category>
    </item>
  </channel>
</rss>
