<?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>Ryan Dickinson — Blog</title>
    <link>https://rndx.dev/blog</link>
    <description>Ryan Dickinson is a full-stack developer from Michigan who builds open-source tools with Vue, Laravel, and C++. Explore projects, certifications, and writing.</description>
    <language>en-us</language>
    <atom:link href="https://rndx.dev/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>shelloveu — A Shell You Actually Want to Use</title>
      <link>https://rndx.dev/blog/shelloveu-a-shell-you-actually-want-to-use</link>
      <guid isPermaLink="true">https://rndx.dev/blog/shelloveu-a-shell-you-actually-want-to-use</guid>
      <pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate>
      <description>I built a Unix shell from scratch in C++17 with a file manager, text editor, image viewer, and a hidden dinosaur game. Here's how to use it.</description>
      <category>c++</category>
      <category>linux</category>
      <category>terminal</category>
      <category>open-source</category>
      <category>project</category>
      <content:encoded><![CDATA[<h1>shelloveu — A Shell You Actually Want to Use</h1>
<p>What if your shell came with batteries included?</p>
<p><strong>shelloveu</strong> is a Unix shell I wrote from scratch in C++17. Not a wrapper around bash. Not a plugin for zsh. A full shell — tokenizer, parser, pipeline executor, job control — built on GNU Readline and designed to be something you&#39;d actually want as your daily driver.</p>
<p>But the shell is just the beginning. shelloveu ships with a <strong>built-in file manager</strong>, a <strong>text editor</strong>, a <strong>sixel image viewer</strong>, and yes — a <strong>hidden dinosaur runner game</strong>. All in one binary.</p>
<h2>The Shell</h2>
<p>At its core, shelloveu handles everything you&#39;d expect from a real shell — and then some:</p>
<ul>
<li><strong>Pipelines</strong> — <code>cat log.txt | grep ERROR | sort | uniq -c</code></li>
<li><strong>Redirections</strong> — <code>&lt;</code>, <code>&gt;</code>, <code>&gt;&gt;</code>, <code>2&gt;</code>, <code>&amp;&gt;</code>, heredocs (<code>&lt;&lt;</code>), fd duplication (<code>2&gt;&amp;1</code>)</li>
<li><strong>Globs</strong> — <code>*.txt</code>, <code>file?.log</code>, <code>[a-z]*</code></li>
<li><strong>Variable expansion</strong> — <code>$VAR</code>, <code>${VAR}</code>, <code>$?</code>, <code>$$</code>, plus <code>export</code>/<code>unset</code></li>
<li><strong>Command substitution</strong> — <code>$(...)</code> and backticks</li>
<li><strong>Control flow</strong> — <code>;</code>, <code>&amp;&amp;</code>, <code>||</code></li>
<li><strong>Scripting</strong> — <code>if</code>/<code>for</code>/<code>while</code>/<code>until</code>, <code>break</code>/<code>continue</code>, functions with positional params</li>
<li><strong>Job control</strong> — background jobs, <code>fg</code>/<code>bg</code>/<code>kill</code>, <code>%N</code> references, <code>Ctrl-Z</code> suspend</li>
<li><strong>Live syntax highlighting</strong> and <strong>history autosuggestions</strong> as you type</li>
<li><strong>Tab completion</strong> for builtins, aliases, and <code>$PATH</code> commands</li>
<li><strong>Structured history</strong> — every command is logged to <code>~/.shelloveu/history.jsonl</code> with timestamps, working directory, exit code, and duration</li>
</ul>
<p>The prompt is themeable and git-aware — it shows your current directory, branch, last exit code, and how many background jobs are running.</p>
<h3>Safety fuse</h3>
<p>Run <code>rm -rf /</code> by accident? shelloveu catches dangerous <code>rm</code> patterns before they execute. Toggle it with <code>set safety=on</code> in your <code>~/.shelloveurc</code>.</p>
<h2>The File Manager — <code>fm</code></h2>
<p>Type <code>fm</code> and you drop into a <strong>ranger-style two-pane TUI</strong>. Directory listing on the left, live file preview on the right. Navigate with arrow keys or <code>hjkl</code> (vim-style):</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody><tr>
<td><code>j</code> / <code>k</code> or arrows</td>
<td>Move up/down</td>
</tr>
<tr>
<td><code>l</code> / <code>Enter</code></td>
<td>Enter directory or open file in editor</td>
</tr>
<tr>
<td><code>h</code> / <code>Backspace</code></td>
<td>Go to parent directory</td>
</tr>
<tr>
<td><code>.</code></td>
<td>Toggle hidden files</td>
</tr>
<tr>
<td><code>~</code></td>
<td>Jump to home</td>
</tr>
<tr>
<td><code>q</code></td>
<td>Quit — and <strong>cd into whatever directory you were browsing</strong></td>
</tr>
</tbody></table>
<p>That last part is key: when you quit <code>fm</code>, your shell&#39;s working directory changes to wherever you navigated. No more <code>cd</code>-ing after you find what you&#39;re looking for.</p>
<h2>The Text Editor — <code>edit</code></h2>
<p>Type <code>edit myfile.txt</code> and you get a full-screen terminal editor in the spirit of <a href="https://viewsourcecode.org/snaptoken/kilo/">kilo</a>. It&#39;s not vim and it&#39;s not trying to be — it&#39;s a clean, distraction-free editor for quick edits:</p>
<ul>
<li>Tab-aware rendering with horizontal and vertical scrolling</li>
<li>Status bar with filename, modified flag, line count, and cursor position</li>
<li><code>Ctrl-S</code> to save (prompts for a filename on new buffers)</li>
<li><code>Ctrl-Q</code> to quit (warns once if you have unsaved changes)</li>
<li>Home / End / PgUp / PgDn navigation</li>
</ul>
<p>Set <code>export EDITOR=edit</code> and the file manager will open files in it automatically.</p>
<h2>The Image Viewer</h2>
<p>Browse to an image in <code>fm</code> and it renders right in your terminal. shelloveu supports two rendering backends:</p>
<ul>
<li><strong>Sixel graphics</strong> — real pixel-resolution images with 256-color median-cut quantization, Floyd-Steinberg dithering, and run-length encoding. Works in Windows Terminal 1.22+, xterm, foot, and mlterm.</li>
<li><strong>Half-block fallback</strong> — uses the <code>▀</code> character with 24-bit foreground/background colors. Two pixels per cell. Works everywhere.</li>
</ul>
<p>For JPEGs, it even parses EXIF data and shows you camera model, date taken, and exposure info. EXIF orientation is applied automatically.</p>
<h2>The Dinosaur Game</h2>
<p>Type <code>dino</code> and shelloveu launches a Chrome-dinosaur-style ASCII runner. Jump cacti with <code>Space</code>, <code>Up</code>, or <code>W</code>. The game speeds up the longer you survive, and your high score is saved to <code>~/.shelloveu/dino_highscore</code>.</p>
<p>It&#39;s completely pointless and I love it.</p>
<h2>Getting Started</h2>
<h3>Install</h3>
<pre><code class="language-bash"># Prerequisites
sudo apt update &amp;&amp; sudo apt install -y build-essential g++ libreadline-dev

# Clone and build
git clone https://github.com/rndxdev/shelloveu.git
cd shelloveu
make
</code></pre>
<h3>Run</h3>
<pre><code class="language-bash">./shelloveu                 # interactive mode
./shelloveu -c &quot;ls | wc -l&quot; # single command
./shelloveu -f script.txt   # run a script
</code></pre>
<h3>Configure</h3>
<p>Create a <code>~/.shelloveurc</code> to customize your experience:</p>
<pre><code class="language-bash">set safety=on              # rm -rf protection
set fun_prompt=on          # playful prompt style
set prompt_symbol=&gt;&gt;        # change the prompt character
set banner=off             # hide the startup dino
alias ll=&quot;ls -la&quot;
alias gs=&quot;git status&quot;
</code></pre>
<h3>Quick tour</h3>
<pre><code class="language-bash">fm                         # launch the file manager
edit notes.txt             # open the text editor
dino                       # play the dinosaur game
hist 20                    # show last 20 commands with metadata
please                     # re-run last command with sudo
mkcd new-project           # mkdir + cd in one shot
</code></pre>
<h2>Why Build a Shell?</h2>
<p>Because nothing teaches you how Unix works like implementing it yourself. Every pipe is a <code>fork</code> + <code>exec</code> + <code>dup2</code>. Every redirect is an <code>open</code> + file descriptor shuffle. Every background job is a process group you have to track, wait on, and report.</p>
<p>shelloveu started as an Operating Systems course project and grew into something I actually use. Globs, <code>&amp;&amp;</code>/<code>||</code> chaining, <code>fg</code>/<code>bg</code>, scripting, syntax highlighting, autosuggestions — all shipped. Every feature is something I built because I wanted it.</p>
<p>Check it out on <a href="https://github.com/rndxdev/shelloveu">GitHub</a> and give it a spin.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Building SIT (Safe Ice Tool)</title>
      <link>https://rndx.dev/blog/building-the-safe-ice-tool</link>
      <guid isPermaLink="true">https://rndx.dev/blog/building-the-safe-ice-tool</guid>
      <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
      <description>Why Michigan's ice fishing community needs better safety tools — and how SIT is trying to fill that gap.</description>
      <category>community</category>
      <category>michigan</category>
      <category>open-source</category>
      <category>project</category>
      <category>outdoors</category>
      <content:encoded><![CDATA[<h1>Building SIT (Safe Ice Tool)</h1>
<p><strong>SIT</strong> — <em>Stay In The Knowledge</em>, or sit at home if conditions aren&#39;t safe.</p>
<p>Every winter in Michigan, thousands of people head out onto frozen lakes. Ice fishing, snowmobiling, ice skating or even just walking — it&#39;s part of life in Michigan. But ice is unpredictable and never completely safe. Conditions change fast, and bad information can put people in real danger.</p>
<h2>Why This Matters</h2>
<p>I built SIT because every winter, people fall through the ice in Michigan — and it&#39;s almost always preventable. Stories like <a href="https://www.freep.com/story/news/local/michigan/2026/02/02/person-falls-through-lake-michigan-ice-shelf-officials-say-what-we-know/88475681007/">someone falling through a Lake Michigan ice shelf</a> or the <a href="https://www.cbsnews.com/detroit/news/man-5-year-old-girl-both-dead-after-falling-through-ice-in-mid-michigan/">tragedy in mid-Michigan where a man and a 5-year-old girl both lost their lives</a> are way too common.</p>
<p>The <a href="https://www.michigan.gov/dnr">Michigan DNR</a> puts out safety guidelines, and there are experienced anglers in every community who know their lakes inside and out. But that knowledge stays locked in Facebook groups, fishing forums, and word of mouth. By the time you find a report, it&#39;s often days old. Ice doesn&#39;t wait days.</p>
<p>I kept thinking: <em>there has to be a better way to share this information.</em></p>
<h2>People Already Do This — Just Badly</h2>
<p>Here&#39;s the thing — the community already shares ice conditions. Every morning during hard water season, people post in local fishing groups: &quot;6 inches on Houghton Lake, drilled near the south shore.&quot; &quot;Stay off Higgins, it&#39;s sketchy by the launch.&quot; This information saves lives.</p>
<p>The problem is it&#39;s scattered across dozens of groups, buried under memes and unrelated posts, impossible to search, and gone within hours. A guy in Cadillac posting about his local lake can&#39;t easily help someone from downstate planning a weekend trip up north.</p>
<p>SIT takes what the community is already doing and gives it a home — one map, real-time reports, all in one place.</p>
<h2>How It Works</h2>
<p>The idea is simple:</p>
<ul>
<li><strong>Drop a pin</strong> on the lake you&#39;re at</li>
<li><strong>Report what you&#39;re seeing</strong> — ice thickness, conditions, any hazards</li>
<li><strong>Check the map before you go</strong> — see color-coded reports from other anglers</li>
<li><strong>Know when it was reported</strong> — no more guessing if a report is from today or last week</li>
</ul>
<p>Reports are color-coded so you can scan conditions at a glance:</p>
<ul>
<li><strong>Green</strong> — solid ice, 8+ inches</li>
<li><strong>Yellow</strong> — use caution, 4-8 inches</li>
<li><strong>Red</strong> — dangerous, under 4 inches or deteriorating</li>
</ul>
<p>No accounts required to view. No clutter. Just the information you need to make a smart decision before you load up the truck.</p>
<h2>Built by the Community, for the Community</h2>
<p>The most rewarding part of building SIT has been watching people actually use it. I shared an early version with a few fishing buddies. Within a week, they&#39;d shared it with their friends, who shared it with theirs. No marketing, no launch strategy — just a tool that filled a gap people already felt.</p>
<p>That organic growth told me something important: <strong>people want to help each other stay safe.</strong> They&#39;re already doing it — they just needed a better place to do it.</p>
<p>I&#39;ve had guys message me saying they checked SIT before heading out and decided to wait a day. That&#39;s exactly the point. The name says it all — Stay In The Knowledge, or sit at home if it&#39;s not safe. There&#39;s always another day to fish.</p>
<h2>What&#39;s Next</h2>
<p>SIT is still growing. Some things I&#39;m working on:</p>
<ul>
<li><strong>Historical data</strong> — showing ice trends over multiple seasons so people can spot patterns and make better calls</li>
<li><strong>Notifications</strong> — get alerted when someone posts a new report for your favorite lakes</li>
<li><strong>Better mobile experience</strong> — most people check conditions from their phone, so it needs to feel native</li>
<li><strong>Community moderation</strong> — as more people use it, the community needs tools to flag bad or outdated reports</li>
</ul>
<p>The goal isn&#39;t to build the next big app. It&#39;s to build something that keeps people safe and brings the Michigan outdoor community closer together. If SIT prevents even one person from going out on bad ice, it&#39;s worth every line of code.</p>
<h2>Get Involved</h2>
<p>Check out SIT at <a href="https://safeicetool.org">safeicetool.org</a> or view the source on <a href="https://github.com/rndxdev/safe-ice-tool">GitHub</a>. You don&#39;t have to be a developer to contribute — if you spend time on the ice anywhere in the US and want to help shape what this becomes, I want to hear from you. Report a bug, suggest a feature, or just share it with your fishing crew.</p>
<p>For SIT-related inquiries, reach out at <a href="mailto:community@safeicetool.org">community@safeicetool.org</a>.</p>
<p>Right now SIT is US-based, but the goal is to expand into Canada and eventually anywhere people are dealing with ice conditions. If you&#39;re north of the border and interested in helping bring SIT to your area, reach out.</p>
<p>Stay safe out there. Stay in the knowledge.</p>
<hr>
<p><strong>Important:</strong> SIT is an informational tool built by and for the community — it is not a substitute for professional safety guidance. Ice conditions can change rapidly and reports may not reflect current conditions. Always use your own judgment. <strong>If you or someone else is in danger on the ice, call 911 immediately.</strong> For Michigan-specific resources, contact the <a href="https://www.michigan.gov/dnr">Michigan DNR</a> or your local sheriff&#39;s department.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introducing Ryan Dickinson rndx.dev</title>
      <link>https://rndx.dev/blog/hello-world</link>
      <guid isPermaLink="true">https://rndx.dev/blog/hello-world</guid>
      <pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate>
      <description>Welcome to my personal blog — who I am, what I'm building, and what you'll find here.</description>
      <category>intro</category>
      <category>personal</category>
      <category>outdoors</category>
      <category>open-source software</category>
      <category>tech</category>
      <content:encoded><![CDATA[<h1>Introducing Ryan Dickinson and rndx.dev</h1>
<p>Welcome to rndx.dev — my personal blog and a place to share what I&#39;m working on, what I&#39;m learning, and what I care about.</p>
<h2>Who I Am</h2>
<p>I&#39;m Ryan Dickinson, a full-stack developer from Michigan. I build full stack web applications with <a href="https://laravel.com">Laravel</a> and <a href="https://vuejs.org">Vue.js</a>, and I spend a lot of my free time on open source projects and other web projects. When I&#39;m not at a keyboard, I&#39;m usually outside — fishing, hiking, hunting, or exploring somewhere in the great outdoors of Michigan.</p>
<p>I believe software is best when it solves real problems for real people and brings people together in a community. That&#39;s what drives everything I build.</p>
<h2>What I&#39;m Building</h2>
<p>My biggest project right now is <a href="https://safeicetool.org">SIT (Safe Ice Tool)</a> — a community-driven ice safety platform. The name stands for <em>Stay In The Knowledge</em>, or sit at home if conditions aren&#39;t safe. It&#39;s an open source web based platform, that helps anglers and outdoor enthusiasts share real-time ice conditions so people can make safer decisions before heading out on the hard water. You can read more about it in my post on <a href="/blog/building-the-safe-ice-tool">Building SIT</a>.</p>
<p>Beyond SIT, I&#39;m always tinkering with something — whether it&#39;s a tool that scratches my own itch or a contribution to someone else&#39;s project. Open source is where I feel most at home as a developer.</p>
<h2>What You&#39;ll Find Here</h2>
<p>This blog is going to be a mix of:</p>
<ul>
<li><strong>Community and outdoors</strong> — stories from the Michigan outdoor community and how technology can support it</li>
<li><strong>Open source</strong> — what I&#39;m contributing to, lessons learned, and why I think open source matters</li>
<li><strong>Projects</strong> — updates on SIT and whatever else I&#39;m working on</li>
<li><strong>Web development</strong> — Laravel, Vue, and the tools I use day to day</li>
</ul>
<p>I&#39;m not trying to write tutorials or chase trends. This is just an honest space to share what I&#39;m doing and thinking about. If any of it resonates with you, I&#39;d love to hear from you.</p>
<h2>Let&#39;s Connect</h2>
<p>You can find me on <a href="https://github.com/rndxdev">GitHub</a> or reach out at <a href="mailto:hello@rndx.dev">hello@rndx.dev</a>. If you&#39;re into ice fishing, open source, or both — we&#39;ll probably get along.</p>
<p>Thanks for stopping by.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>