<?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: Valeriy Bagrintsev</title>
    <description>The latest articles on DEV Community by Valeriy Bagrintsev (@architeg).</description>
    <link>https://dev.to/architeg</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%2F1798669%2F114496b5-6b0f-45d8-bc78-e3c790ba67ac.jpg</url>
      <title>DEV Community: Valeriy Bagrintsev</title>
      <link>https://dev.to/architeg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/architeg"/>
    <language>en</language>
    <item>
      <title>Introducing Gloss: A Local-First Command Glossary for Your Terminal</title>
      <dc:creator>Valeriy Bagrintsev</dc:creator>
      <pubDate>Thu, 07 May 2026 17:21:53 +0000</pubDate>
      <link>https://dev.to/worksfine/introducing-gloss-a-local-first-command-glossary-for-your-terminal-1jh1</link>
      <guid>https://dev.to/worksfine/introducing-gloss-a-local-first-command-glossary-for-your-terminal-1jh1</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introducing Gloss: A Local-First Command Glossary for Your Terminal&lt;/strong&gt;
&lt;/h2&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%2Fbe0tk2u8mvt3aps8p9wz.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%2Fbe0tk2u8mvt3aps8p9wz.png" alt="Gloss TUI home screen" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shell history is useful. Until it becomes a pile of almost-right commands, forgotten flags, and aliases with names only past-you understood.&lt;/p&gt;

&lt;p&gt;That was the itch behind &lt;strong&gt;Gloss&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;Gloss&lt;/a&gt; is a small open-source CLI/TUI tool for saving reusable shell commands, searching them in a terminal UI, scanning &lt;code&gt;zsh&lt;/code&gt;/&lt;code&gt;bash&lt;/code&gt; configs, and safely syncing selected aliases into a managed shell config block.&lt;/p&gt;

&lt;p&gt;It is built for people who keep re-searching the same commands and slowly turn &lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.bashrc&lt;/code&gt;, notes, and shell history into one very specific junk drawer.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Gloss Does&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gloss&lt;/code&gt; gives reusable shell commands a small local home.&lt;/p&gt;

&lt;p&gt;You can use it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;save shell commands with descriptions and tags&lt;/li&gt;
&lt;li&gt;browse and search commands in a terminal UI&lt;/li&gt;
&lt;li&gt;scan &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt; config files for aliases/functions&lt;/li&gt;
&lt;li&gt;import useful commands from existing shell files&lt;/li&gt;
&lt;li&gt;add managed aliases&lt;/li&gt;
&lt;li&gt;preview alias sync before writing anything&lt;/li&gt;
&lt;li&gt;sync aliases into one dedicated shell config block&lt;/li&gt;
&lt;li&gt;create backups when sync changes an existing shell file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace your shell, your dotfiles, or your favorite fuzzy finder setup.&lt;/p&gt;

&lt;p&gt;It is just a focused tool for one annoying workflow: keeping useful commands findable and reusable.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why I Built It&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I kept running into the same pattern.&lt;/p&gt;

&lt;p&gt;I would search for a command, use it, forget it, then search for it again later. Sometimes I saved it as an alias. Sometimes I dropped it into notes. Sometimes I trusted shell history, which is optimistic behavior and should probably be monitored.&lt;/p&gt;

&lt;p&gt;Eventually I had useful commands spread across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shell history&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.zshrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;random Markdown notes&lt;/li&gt;
&lt;li&gt;aliases with unclear names&lt;/li&gt;
&lt;li&gt;browser searches I had already done before&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A plain text file with &lt;code&gt;fzf&lt;/code&gt; can solve part of this. That is a good setup. &lt;code&gt;gloss&lt;/code&gt; is for the point where I wanted a bit more structure: descriptions, tags, TUI browsing, scan/import, and safer alias sync.&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%2Fwgvhyqfzijmgeda2jsok.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%2Fwgvhyqfzijmgeda2jsok.png" alt="Gloss Commands Screen" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Alias Sync Works&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gloss does not rewrite your whole shell config.&lt;/p&gt;

&lt;p&gt;Managed aliases are written inside one dedicated block:&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="c"&gt;# &amp;gt;&amp;gt;&amp;gt; gloss aliases &amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git status"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ls -lah"&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;&amp;lt;&amp;lt; gloss aliases &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything outside that block stays untouched.&lt;/p&gt;

&lt;p&gt;Before syncing, you can preview what will be written. When sync changes an existing shell file, &lt;code&gt;gloss&lt;/code&gt; creates a backup. If nothing changed, it does not rewrite the file just to feel productive.&lt;/p&gt;

&lt;p&gt;That boring behavior is intentional.&lt;/p&gt;

&lt;p&gt;Shell config files are not a playground.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Platform Support&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gloss currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS with &lt;code&gt;zsh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Linux with &lt;code&gt;bash&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is written in Go and stores data locally.&lt;br&gt;
Windows is not officially supported yet.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Installation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Install script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Architeg/gloss/main/scripts/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;Architeg/tap/gloss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or check the version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;What Gloss Is Not&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gloss is intentionally not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a shell replacement&lt;/li&gt;
&lt;li&gt;a package manager&lt;/li&gt;
&lt;li&gt;a shell history analyzer&lt;/li&gt;
&lt;li&gt;an AI command explainer&lt;/li&gt;
&lt;li&gt;a full dotfiles manager&lt;/li&gt;
&lt;li&gt;a cloud sync product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a small local utility for documenting, finding, importing, and safely syncing useful shell commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Links&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;https://github.com/Architeg/gloss&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://worksfine.dev/gloss/" rel="noopener noreferrer"&gt;https://worksfine.dev/gloss/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Feedback Welcome&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gloss is still new, so feedback is useful.&lt;/p&gt;

&lt;p&gt;I am especially interested in thoughts around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scan/import behavior&lt;/li&gt;
&lt;li&gt;managed alias sync&lt;/li&gt;
&lt;li&gt;TUI flow&lt;/li&gt;
&lt;li&gt;whether the command glossary idea fits real terminal workflows&lt;/li&gt;
&lt;li&gt;what would make it safer or simpler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you already have a clean &lt;code&gt;fzf&lt;/code&gt; + notes setup, I am also curious where Gloss feels unnecessary. That is useful feedback too.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>terminal</category>
    </item>
    <item>
      <title>5 CLI Tools I Use to Keep Terminal Workflows Less Annoying</title>
      <dc:creator>Valeriy Bagrintsev</dc:creator>
      <pubDate>Thu, 07 May 2026 16:40:31 +0000</pubDate>
      <link>https://dev.to/architeg/5-cli-tools-i-use-to-keep-terminal-workflows-less-annoying-3c3n</link>
      <guid>https://dev.to/architeg/5-cli-tools-i-use-to-keep-terminal-workflows-less-annoying-3c3n</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;5 CLI Tools I Use to Keep Terminal Workflows Less Annoying&lt;/strong&gt;
&lt;/h2&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%2Ftn6bmsgn0k9wd9d3f2ep.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%2Ftn6bmsgn0k9wd9d3f2ep.png" alt="Dark terminal workspace showing several CLI tools: command glossary, fuzzy finder, search output, syntax-highlighted file preview, and directory listing." width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The terminal is supposed to make work faster, which is funny, because mine regularly turns into a junk drawer with a cursor. Old commands hide in history, aliases multiply quietly, and somehow I still end up searching the web for the same &lt;code&gt;tar&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, or Git command I already solved months ago.&lt;/p&gt;

&lt;p&gt;This is not a “definitive best CLI tools ever created by humanity” list. Those lists usually become 47 tools you install, admire, and forget. These are five CLI tools I actually reach for when I want terminal work to feel less annoying across &lt;code&gt;zsh&lt;/code&gt;, &lt;code&gt;bash&lt;/code&gt;, macOS, and Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Small Problem With Terminal Productivity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Terminal workflows rarely collapse because of one dramatic failure. They usually decay through tiny repeated annoyances.&lt;/p&gt;

&lt;p&gt;You forget the exact command. You remember an alias, but not what it does. You know a file exists somewhere, but not where. You open a config file and immediately wish it had syntax highlighting. You run &lt;code&gt;ls&lt;/code&gt; and get a gray wall of filenames that technically contains information, in the same way a landfill technically contains furniture.&lt;/p&gt;

&lt;p&gt;Good CLI tools do not need to replace your whole workflow. The useful ones shave off friction. They make the thing you already do slightly faster, clearer, or harder to mess up.&lt;/p&gt;

&lt;p&gt;My go-to 5 CLI tools are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;gloss&lt;/a&gt; — a command glossary for reusable shell commands&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt; — fuzzy finding for almost everything&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/BurntSushi/ripgrep" rel="noopener noreferrer"&gt;ripgrep&lt;/a&gt; — fast text search&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sharkdp/bat" rel="noopener noreferrer"&gt;bat&lt;/a&gt; — readable file viewing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/eza-community/eza" rel="noopener noreferrer"&gt;eza&lt;/a&gt; — a better &lt;code&gt;ls&lt;/code&gt; for daily navigation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are plenty of honorable mentions: &lt;code&gt;zoxide&lt;/code&gt;, &lt;code&gt;fd&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;httpie&lt;/code&gt;, &lt;code&gt;tmux&lt;/code&gt;, &lt;code&gt;delta&lt;/code&gt;, &lt;code&gt;lazygit&lt;/code&gt;, &lt;code&gt;just&lt;/code&gt;, &lt;code&gt;tldr&lt;/code&gt;, &lt;code&gt;pet&lt;/code&gt;, &lt;code&gt;navi&lt;/code&gt;, &lt;code&gt;direnv&lt;/code&gt;, &lt;code&gt;starship&lt;/code&gt;, and half the Rust-powered replacements for old Unix commands. I like many of them. But if the goal is fewer annoying terminal moments, these five cover a practical loop: remember, find, search, inspect, and navigate.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. ⭐ Gloss — A Command Glossary for Reusable Shell Commands&lt;/strong&gt;
&lt;/h2&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%2F6vblki03gacbkq2wym5z.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%2F6vblki03gacbkq2wym5z.png" alt="Gloss TUI home screen showing saved command sections, scan, aliases, settings, and README navigation." width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s start with the biased one. I built &lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;gloss&lt;/a&gt; because I kept re-searching the same shell commands and spreading aliases across history, notes, random Markdown files, and shell config files.&lt;/p&gt;

&lt;p&gt;At some point, shell history stops being useful memory and becomes a messy archaeological site. Yes, the command is probably in there. Somewhere. Under six failed attempts, three typos, and one questionable &lt;code&gt;sudo&lt;/code&gt; experiment.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gloss&lt;/code&gt; gives reusable commands a small local home. You can save a command with a description and tags, search it in a TUI, scan &lt;code&gt;zsh&lt;/code&gt; or &lt;code&gt;bash&lt;/code&gt; config files, and sync selected aliases into one managed shell config block with backups.&lt;/p&gt;

&lt;p&gt;That last part matters. I do not want a tool spraying aliases all over &lt;code&gt;.zshrc&lt;/code&gt; or &lt;code&gt;.bashrc&lt;/code&gt; like it has been left unsupervised with a paint roller. gloss writes only inside a dedicated managed block:&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="c"&gt;# &amp;gt;&amp;gt;&amp;gt; gloss aliases &amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git status"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ls -lah"&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;&amp;lt;&amp;lt; gloss aliases &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is not meant to replace every dotfiles setup. A plain text file piped into &lt;code&gt;fzf&lt;/code&gt; is a perfectly valid solution. Something like this can go a long way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status &lt;span class="c"&gt;# check current repo state git&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; archive.tar.gz folder &lt;span class="c"&gt;# create compressed archive tar gzip&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com &lt;span class="c"&gt;# inspect headers curl http&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can pipe it into &lt;code&gt;fzf&lt;/code&gt;, select a line, and build your own little workflow. Honestly, that is the final boss of many developer tools: “could be a text file and fzf.”&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gloss&lt;/code&gt; is for the point where I wanted more structure without turning it into a huge knowledge base. Descriptions, tags, TUI browsing, scan/import from &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt;, and safer alias sync were enough.&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%2Fwgvhyqfzijmgeda2jsok.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%2Fwgvhyqfzijmgeda2jsok.png" alt="Gloss commands list screen." width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;people with lots of reusable shell commands&lt;/li&gt;
&lt;li&gt;people who forget what their aliases do&lt;/li&gt;
&lt;li&gt;people who want a local command glossary close to the terminal&lt;/li&gt;
&lt;li&gt;people who like TUIs but do not want a huge app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;people happy with shell history alone&lt;/li&gt;
&lt;li&gt;people who already have a clean text file + &lt;code&gt;fzf&lt;/code&gt; setup&lt;/li&gt;
&lt;li&gt;people who do not want any tool touching shell config files, even with preview/backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;gloss on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://worksfine.dev/gloss/" rel="noopener noreferrer"&gt;gloss landing page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. fzf — Fuzzy Finding for Almost Everything&lt;/strong&gt;
&lt;/h2&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%2Fmld9f6xp5x3ya7acx5ix.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%2Fmld9f6xp5x3ya7acx5ix.png" alt="fzf running inside a terminal with filtered file results and a preview pane." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once commands are saved somewhere, the next problem is finding things fast. That is where &lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt; earns its reputation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; is a general-purpose fuzzy finder. That sounds boring until it becomes the thing quietly powering half your terminal. Files, command history, processes, Git branches, directories, snippets — if you can pipe a list into it, &lt;code&gt;fzf&lt;/code&gt; can help you choose from that list without typing the exact thing.&lt;/p&gt;

&lt;p&gt;The classic use case is command history search. Instead of pressing the up arrow like you are trying to win the saddest slot machine, you fuzzy-search your previous commands.&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="nb"&gt;history&lt;/span&gt; | fzf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most shell integrations go further and bind this to &lt;code&gt;Ctrl+R&lt;/code&gt;, which makes old command lookup feel less like memory work and more like search.&lt;/p&gt;

&lt;p&gt;I also like &lt;code&gt;fzf&lt;/code&gt; for file selection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vim &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | fzf&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That example is intentionally basic. In practice, you might combine &lt;code&gt;fzf&lt;/code&gt; with &lt;code&gt;fd&lt;/code&gt;, &lt;code&gt;ripgrep&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, Git, or custom scripts. Some setups use previews, so you can move through search results and see file contents before selecting anything.&lt;/p&gt;

&lt;p&gt;A simple preview example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fzf &lt;span class="nt"&gt;--preview&lt;/span&gt; &lt;span class="s1"&gt;'bat --style=numbers --color=always {}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is where &lt;code&gt;fzf&lt;/code&gt; starts feeling less like a small filter and more like a terminal interaction layer.&lt;/p&gt;

&lt;p&gt;I use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;finding old commands&lt;/li&gt;
&lt;li&gt;jumping to files&lt;/li&gt;
&lt;li&gt;selecting Git branches&lt;/li&gt;
&lt;li&gt;choosing scripts&lt;/li&gt;
&lt;li&gt;narrowing down noisy output&lt;/li&gt;
&lt;li&gt;building tiny one-off terminal menus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The nice thing is that &lt;code&gt;fzf&lt;/code&gt; does not ask you to change your whole terminal life. It slips into existing commands. It is duct tape, but premium duct tape — the kind that fixes the workflow and somehow makes it look intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. ripgrep — Fast Text Search Without the Usual Pain&lt;/strong&gt;
&lt;/h2&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%2Fxisd3kpcovzv3fa9rbp8.jpg" 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%2Fxisd3kpcovzv3fa9rbp8.jpg" alt="ripgrep output in a terminal showing highlighted search matches across project files." width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After finding files, I usually need to search inside them. For that, &lt;a href="https://github.com/BurntSushi/ripgrep" rel="noopener noreferrer"&gt;ripgrep&lt;/a&gt;, usually called &lt;code&gt;rg&lt;/code&gt;, is my default.&lt;/p&gt;

&lt;p&gt;The simple pitch: it is like &lt;code&gt;grep&lt;/code&gt;, but fast, practical, and less interested in punishing you for having a modern project folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="s2"&gt;"DATABASE_URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That searches recursively, prints useful matches, and by default respects &lt;code&gt;.gitignore&lt;/code&gt;. This is one of those defaults that sounds small but saves real irritation. Most of the time, I do not want search results from &lt;code&gt;node_modules&lt;/code&gt;, build directories, generated files, vendor folders, or whatever digital compost heap lives in a project.&lt;/p&gt;

&lt;p&gt;For source code, config files, notes, and scripts, &lt;code&gt;rg&lt;/code&gt; is usually the first thing I reach for.&lt;/p&gt;

&lt;p&gt;A few examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="s2"&gt;"alias "&lt;/span&gt; ~/.zshrc ~/.bashrc ~/.bash_aliases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="s2"&gt;"TODO|FIXME"&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="nt"&gt;--type&lt;/span&gt; go &lt;span class="s2"&gt;"func main"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="nt"&gt;--hidden&lt;/span&gt; &lt;span class="nt"&gt;--glob&lt;/span&gt; &lt;span class="s1"&gt;'!node_modules'&lt;/span&gt; &lt;span class="s2"&gt;"API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--type&lt;/code&gt; filtering is especially useful. Search only Go files, Python files, Markdown files, JSON files, and so on. It reduces noise without making you write a tiny shell spell every time.&lt;/p&gt;

&lt;p&gt;How I use it with &lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;gloss&lt;/a&gt; is simple: when I find a command or pattern I keep searching for repeatedly, that is usually a sign it belongs in the glossary. &lt;code&gt;rg&lt;/code&gt; helps me discover the thing; &lt;code&gt;gloss&lt;/code&gt; helps me remember why I cared.&lt;/p&gt;

&lt;p&gt;That separation is useful. Search tools are excellent at discovery. They are not always great at turning discoveries into reusable knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. bat — A Less Miserable Way to Read Files&lt;/strong&gt;
&lt;/h2&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%2F0t6z5vcf60n1c1syzo6r.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%2F0t6z5vcf60n1c1syzo6r.png" alt="bat displaying a shell config file with line numbers, syntax highlighting, and Git gutter markers." width="656" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is nothing wrong with &lt;code&gt;cat&lt;/code&gt;. It does exactly what it says. It throws file contents into your terminal and then calmly walks away from the scene.&lt;/p&gt;

&lt;p&gt;But for reading code, scripts, configs, Markdown, YAML, JSON, or anything where your eyes are expected to survive the experience, &lt;a href="https://github.com/sharkdp/bat" rel="noopener noreferrer"&gt;bat&lt;/a&gt; is much nicer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bat&lt;/code&gt; is often described as a better &lt;code&gt;cat&lt;/code&gt;: syntax highlighting, line numbers, Git integration, automatic paging for long files, and generally more readable output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bat ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bat README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bat package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is not a complicated tool, which is part of the appeal. You can use it directly, or you can pair it with &lt;code&gt;fzf&lt;/code&gt; as a previewer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fzf &lt;span class="nt"&gt;--preview&lt;/span&gt; &lt;span class="s1"&gt;'bat --color=always --style=numbers {}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That combo is excellent. &lt;code&gt;fzf&lt;/code&gt; lets you choose; &lt;code&gt;bat&lt;/code&gt; lets you preview without opening each file. It is the difference between rummaging through a drawer with the lights off and having labels on the boxes.&lt;/p&gt;

&lt;p&gt;I especially like &lt;code&gt;bat&lt;/code&gt; for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;previewing shell scripts before running/editing them&lt;/li&gt;
&lt;li&gt;reading config files&lt;/li&gt;
&lt;li&gt;checking Markdown&lt;/li&gt;
&lt;li&gt;inspecting JSON/YAML quickly&lt;/li&gt;
&lt;li&gt;making &lt;code&gt;fzf&lt;/code&gt; previews more useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some people alias &lt;code&gt;cat&lt;/code&gt; to &lt;code&gt;bat&lt;/code&gt;. I do not always do that, because I still like plain &lt;code&gt;cat&lt;/code&gt; for scripts and pipes where predictable minimal output matters. But for human reading, &lt;code&gt;bat&lt;/code&gt; wins almost every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. eza — A Better ls for Daily Navigation&lt;/strong&gt;
&lt;/h2&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%2Fu1q8kkubexz6arwe8jxj.jpg" 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%2Fu1q8kkubexz6arwe8jxj.jpg" alt="eza listing a project directory with colorized file types, Git status, and tree view." width="800" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last tool is less dramatic, but it improves one of the most common terminal actions: looking around.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/eza-community/eza" rel="noopener noreferrer"&gt;eza&lt;/a&gt; is a modern replacement for &lt;code&gt;ls&lt;/code&gt;. It is the community-maintained successor to &lt;code&gt;exa&lt;/code&gt;, and it gives you colorized output, icons if you want them, Git status, better long listings, and tree views.&lt;/p&gt;

&lt;p&gt;A few common commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eza
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eza &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eza &lt;span class="nt"&gt;--tree&lt;/span&gt; &lt;span class="nt"&gt;--level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eza &lt;span class="nt"&gt;-la&lt;/span&gt; &lt;span class="nt"&gt;--git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Git status view is useful in project folders. You can see what changed without immediately jumping into &lt;code&gt;git status&lt;/code&gt;, and the tree output is handy when you need a quick mental map of a project.&lt;/p&gt;

&lt;p&gt;I do not think &lt;code&gt;eza&lt;/code&gt; changes your life. That would be an alarming amount of emotional pressure to put on a file listing tool. But it does make directory inspection clearer, and that matters because navigation is constant background noise in terminal work.&lt;/p&gt;

&lt;p&gt;There is also &lt;a href="https://github.com/lsd-rs/lsd" rel="noopener noreferrer"&gt;lsd&lt;/a&gt;, which fills a similar role. Some people prefer its style. I lean toward &lt;code&gt;eza&lt;/code&gt;, but both are worth trying. This is one of those choices where the “best” tool is the one whose output your brain reads fastest.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How These CLI Tools Fit Together&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The real benefit is not in using each tool separately. It is in how they form a small workflow loop.&lt;/p&gt;

&lt;p&gt;Here is a realistic version.&lt;/p&gt;

&lt;p&gt;You start in a project folder and use &lt;code&gt;eza&lt;/code&gt; to inspect the layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eza &lt;span class="nt"&gt;--tree&lt;/span&gt; &lt;span class="nt"&gt;--level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You use &lt;code&gt;ripgrep&lt;/code&gt; to search for a config value, function, command, or old script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="s2"&gt;"deploy"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You pipe files into &lt;code&gt;fzf&lt;/code&gt; when the result list gets too long:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="nt"&gt;--files&lt;/span&gt; | fzf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You preview selected files with &lt;code&gt;bat&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fzf &lt;span class="nt"&gt;--preview&lt;/span&gt; &lt;span class="s1"&gt;'bat --color=always --style=numbers {}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is where &lt;code&gt;gloss&lt;/code&gt; fits into the loop. When a command keeps coming back — maybe a deployment command, Docker cleanup command, local server shortcut, &lt;code&gt;curl&lt;/code&gt; header check, or some deeply specific &lt;code&gt;rg&lt;/code&gt;/&lt;code&gt;find&lt;/code&gt; combo — I save it with a description and tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later, instead of searching history again or trying to remember which note file contains the command, I hit &lt;code&gt;gloss list&lt;/code&gt; or open the TUI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or I scan existing shell config files and import useful aliases/functions I already had lying around:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole point. Do not collect CLI tools like decorative mugs. Build a loop where each tool removes one small annoyance.&lt;/p&gt;

&lt;p&gt;For me, the loop looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eza&lt;/code&gt; helps me see where I am&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rg&lt;/code&gt; helps me find what I need&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fzf&lt;/code&gt; helps me choose from noisy output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bat&lt;/code&gt; helps me read before acting&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gloss&lt;/code&gt; helps me keep those commands within reach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not fancy. It is just less irritating.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Few Honorable Mentions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There are other CLI tools worth keeping nearby, depending on the work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ajeetdsouza/zoxide" rel="noopener noreferrer"&gt;zoxide&lt;/a&gt; is a smarter &lt;code&gt;cd&lt;/code&gt; that learns where you go and lets you jump around by partial names. It is one of those tools that feels weird for a day and then makes normal &lt;code&gt;cd&lt;/code&gt; feel like walking to another city.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sharkdp/fd" rel="noopener noreferrer"&gt;fd&lt;/a&gt; is a friendlier, faster alternative to &lt;code&gt;find&lt;/code&gt;, with sensible defaults and clean output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jqlang/jq" rel="noopener noreferrer"&gt;jq&lt;/a&gt; is essential if JSON appears in your life, willingly or otherwise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/httpie/cli" rel="noopener noreferrer"&gt;httpie&lt;/a&gt; is easier to read than &lt;code&gt;curl&lt;/code&gt; when testing APIs manually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dandavison/delta" rel="noopener noreferrer"&gt;delta&lt;/a&gt; makes Git diffs easier to inspect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tmux/tmux" rel="noopener noreferrer"&gt;tmux&lt;/a&gt; is still hard to beat when you need persistent terminal sessions, panes, and project workspaces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tldr-pages/tldr" rel="noopener noreferrer"&gt;tldr&lt;/a&gt; is perfect when man pages are too detailed and you only need the common examples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/knqyf263/pet" rel="noopener noreferrer"&gt;pet&lt;/a&gt; and &lt;a href="https://github.com/denisidoro/navi" rel="noopener noreferrer"&gt;navi&lt;/a&gt; are especially relevant if you like command snippets and interactive cheatsheets. They overlap with parts of the problem &lt;code&gt;gloss&lt;/code&gt; touches, though each tool approaches it differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You do not need every tool on this list. In fact, installing too many CLI tools at once is how a clean terminal turns into a garage where every shelf contains “useful stuff” nobody can identify.&lt;/p&gt;

&lt;p&gt;Start with one annoying workflow.&lt;/p&gt;

&lt;p&gt;If you constantly search old commands, try &lt;code&gt;gloss&lt;/code&gt; or a plain text file with &lt;code&gt;fzf&lt;/code&gt;. If file search is slow, try &lt;code&gt;ripgrep&lt;/code&gt;. If opening files in the terminal hurts your eyes, try &lt;code&gt;bat&lt;/code&gt;. If navigation feels muddy, try &lt;code&gt;eza&lt;/code&gt; or &lt;code&gt;zoxide&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The best CLI tools for productivity are not the ones with the longest feature lists. They are the ones that quietly remove friction from work you already do.&lt;/p&gt;




&lt;p&gt;The terminal does not need to become your entire personality. It just needs to stop making simple things harder than they should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What are the best CLI tools for productivity?&lt;/strong&gt;&lt;br&gt;
For a practical starting set, I would pick gloss, fzf, ripgrep, bat, and eza. Together they help with command recall, fuzzy selection, text search, file preview, and directory navigation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do these tools work with both zsh and bash?&lt;/strong&gt;&lt;br&gt;
Most of them work fine in both &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt;. Some shell integrations, shortcuts, or plugins may require shell-specific setup, but the core tools are generally cross-platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is gloss better than a text file with fzf?&lt;/strong&gt;&lt;br&gt;
Not always. A text file with &lt;code&gt;fzf&lt;/code&gt; is a great minimal setup. gloss is useful when you want more structure: descriptions, tags, TUI browsing, scan/import from shell configs, and managed alias sync with backups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Should I replace standard Unix tools like grep, cat, and ls?&lt;/strong&gt;&lt;br&gt;
You do not have to replace them completely. I still think it is worth knowing the standard tools. But for daily local work, tools like ripgrep, bat, and eza often provide better defaults and clearer output.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Which tool should I install first?&lt;/strong&gt;&lt;br&gt;
Start with the annoyance you feel most often. If you lose commands, try gloss or fzf. If you search code constantly, try ripgrep. If you read files in the terminal, try bat. If directory listings feel noisy, try eza.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What is one small CLI tool that changed your daily workflow more than expected?&lt;/p&gt;

</description>
      <category>cli</category>
      <category>productivity</category>
      <category>bash</category>
      <category>zsh</category>
    </item>
    <item>
      <title>How to Manage Shell Commands Without Turning zsh or bash Into a Junk Drawer</title>
      <dc:creator>Valeriy Bagrintsev</dc:creator>
      <pubDate>Thu, 07 May 2026 15:09:03 +0000</pubDate>
      <link>https://dev.to/architeg/how-to-manage-shell-commands-without-turning-zsh-or-bash-into-a-junk-drawer-gmk</link>
      <guid>https://dev.to/architeg/how-to-manage-shell-commands-without-turning-zsh-or-bash-into-a-junk-drawer-gmk</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;How to Manage Shell Commands Without Turning zsh or bash Into a Junk Drawer&lt;/strong&gt;
&lt;/h2&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%2F29jjr2yfn7q9k946v44h.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%2F29jjr2yfn7q9k946v44h.png" alt="A dark terminal desk setup with scattered command notes, shell history, aliases, and a clean command glossary interface." width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shell history is great until it becomes a haunted attic. The command is probably there somewhere, wedged between three failed attempts, one typo, and a &lt;code&gt;sudo&lt;/code&gt; moment that should not be legally discussed.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;Gloss&lt;/a&gt; because I kept re-searching the same shell commands and spreading useful aliases across &lt;code&gt;zsh&lt;/code&gt;, &lt;code&gt;bash&lt;/code&gt;, notes, and random config files. This post is not really “use my tool, please clap.” It is more about the workflow problem that pushed me to build it — and the simple alternatives that are honestly good enough for many people.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Problem: Shell History Is Not Knowledge&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Shell history remembers what happened. It does not always remember why it mattered.&lt;/p&gt;

&lt;p&gt;That difference becomes painful over time.&lt;/p&gt;

&lt;p&gt;A command like this may be useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt; &lt;span class="nt"&gt;-mtime&lt;/span&gt; +7 &lt;span class="nt"&gt;-delete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But when it appears in history later, it has no context. Was it safe? Was it for the current project? Did I test it first? Did I copy it from somewhere? Did it work, or was it one of the failed attempts before the actual command?&lt;/p&gt;

&lt;p&gt;Shell history is chronological, not meaningful. It is a receipt drawer. Useful sometimes, but not exactly a knowledge system.&lt;/p&gt;

&lt;p&gt;I still use history constantly. With tools like &lt;code&gt;fzf&lt;/code&gt;, searching history becomes much nicer. &lt;code&gt;Ctrl+R&lt;/code&gt; with fuzzy search is one of those tiny upgrades that makes the terminal feel less hostile.&lt;/p&gt;

&lt;p&gt;But history has a ceiling. It is good for commands I recently used. It is weaker for commands I use once every few weeks, commands with dangerous flags, commands that need a note, or commands that belong to a specific category like Git, Docker, network checks, deployment, WordPress cleanup, or “things I should understand before pressing Enter.”&lt;/p&gt;

&lt;p&gt;That is where I wanted something more deliberate.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Aliases Alone Become Messy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Aliases are the first obvious fix. And they are useful. Very useful.&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="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git status"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git push"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ls -lah"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good alias turns a repeated command into muscle memory. One word instead of a small ceremony.&lt;/p&gt;

&lt;p&gt;The problem starts when aliases become a private language nobody documented, including the person who wrote them. After enough time, &lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.bashrc&lt;/code&gt;, or &lt;code&gt;.bash_aliases&lt;/code&gt; can become a junk drawer with syntax highlighting.&lt;/p&gt;

&lt;p&gt;You open the file and see:&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="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;dcu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"docker compose up"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;dcd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"docker compose down"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;fixperms&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sudo chown -R &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt; ."&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;thing2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"some command I apparently trusted in 2024"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very professional. Museum-quality chaos.&lt;/p&gt;

&lt;p&gt;Aliases are fast, but they are not always self-explanatory. They also do not naturally answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does this alias do?&lt;/li&gt;
&lt;li&gt;Why did I create it?&lt;/li&gt;
&lt;li&gt;Is it still useful?&lt;/li&gt;
&lt;li&gt;Is it safe?&lt;/li&gt;
&lt;li&gt;Which project or workflow does it belong to?&lt;/li&gt;
&lt;li&gt;Do I have five versions of the same idea?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For small sets of aliases, no problem. For years of terminal usage, things get weird.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Notes Are Too Far From the Terminal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The next solution is notes.&lt;/p&gt;

&lt;p&gt;A Markdown file. Notion. Obsidian. Apple Notes. A private wiki. A giant &lt;code&gt;commands.md&lt;/code&gt; file that starts clean and ends like a basement.&lt;/p&gt;

&lt;p&gt;Notes are better than history because they can include explanations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Check HTTP headers&lt;/span&gt;

Use this when debugging redirects or CDN/cache behavior.

curl -I https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is already much better. Context exists. The command is readable. Future-me has a fighting chance.&lt;/p&gt;

&lt;p&gt;But notes have another problem: distance.&lt;/p&gt;

&lt;p&gt;When I am in the terminal, switching to a browser or notes app often breaks the flow. It is not a huge interruption. It is just enough friction to make me not do it. And when friction wins, the command goes back into history, or worse, into a random alias with no explanation.&lt;/p&gt;

&lt;p&gt;There are tools that bridge this gap. For example, QOwnNotes command-line snippet manager can search command snippets stored in notes using &lt;code&gt;fzf&lt;/code&gt; or &lt;code&gt;peco&lt;/code&gt;. That is a nice idea: keep notes as the source, but make snippets accessible from the command line.&lt;/p&gt;

&lt;p&gt;I like that pattern. It proves the core need is real: commands need memory, search, and proximity to the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Text File + fzf Solution&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before building anything, the obvious question is: why not just use a text file and &lt;code&gt;fzf&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Honestly? That works.&lt;/p&gt;

&lt;p&gt;You can create a simple file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status # check repo state git
curl -I https://example.com # inspect HTTP headers curl network
tar -czf archive.tar.gz folder # create compressed archive tar gzip
docker system prune -af # remove unused Docker data docker cleanup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search it:&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="nb"&gt;cat &lt;/span&gt;commands.txt | fzf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or make a tiny function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cmds&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.commands.txt"&lt;/span&gt; | fzf&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$selected&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is already useful. It is simple, transparent, and easy to back up. Nobody needs a new app for every problem. Sometimes the correct architecture is “a file, a pipe, and a little self-control.”&lt;/p&gt;

&lt;p&gt;There are also mature tools in this space. &lt;code&gt;pet&lt;/code&gt; is a command-line snippet manager that lets you save, tag, search, and execute snippets. It can use fuzzy finders and has been around long enough to prove that command snippets are not a fake problem. &lt;code&gt;navi&lt;/code&gt; approaches the idea from the interactive cheatsheet side, which is great when commands need parameters or guided input.&lt;/p&gt;

&lt;p&gt;Those tools are worth checking out. They solve overlapping problems, and depending on your workflow, one of them may be the better fit.&lt;/p&gt;

&lt;p&gt;So why did I still build &lt;code&gt;gloss&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Because I wanted a particular shape of workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Where I Wanted More Structure&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The text-file version is elegant, but I wanted a bit more structure around my own command mess.&lt;/p&gt;

&lt;p&gt;Not a full knowledge base. Not an AI command explainer. Not a shell replacement. Just a small local place where reusable shell commands can live with enough context to be useful later.&lt;/p&gt;

&lt;p&gt;The missing pieces for me were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;descriptions that are separate from the command itself&lt;/li&gt;
&lt;li&gt;tags for grouping commands by workflow&lt;/li&gt;
&lt;li&gt;a TUI for browsing and editing without opening a separate notes app&lt;/li&gt;
&lt;li&gt;scan/import from existing &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt; config files&lt;/li&gt;
&lt;li&gt;managed alias sync with preview and backups&lt;/li&gt;
&lt;li&gt;local storage, no account, no cloud requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became &lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;Gloss&lt;/a&gt;.&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%2Ftlweunjys4vur3zlf5xi.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%2Ftlweunjys4vur3zlf5xi.png" alt="Gloss Home Screen TUI" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gloss is a small local-first CLI/TUI tool for reusable shell commands. It stores commands locally, lets me search them in a terminal UI, scans shell configs, and can sync selected aliases into one managed block.&lt;/p&gt;

&lt;p&gt;The goal is not to make terminal work fancy. The goal is to stop re-solving the same small problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Gloss Handles Commands&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The basic Gloss workflow is simple.&lt;/p&gt;

&lt;p&gt;Launch the TUI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add an entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An entry is just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;command&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Description:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check HTTP response headers without downloading the body
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;network, curl, debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sounds small, but this small bit of structure helps. A command stops being a mysterious line from the past and becomes a reusable note that still belongs in the terminal.&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%2F9hlvkda28lenp6jnguot.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%2F9hlvkda28lenp6jnguot.png" alt="Gloss TUI showing saved command entries grouped by tags with search and filter controls." width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gloss also supports direct commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss list
gloss list &lt;span class="nt"&gt;--tag&lt;/span&gt; git
gloss scan
gloss edit &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
gloss delete &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The TUI is for browsing and editing. The CLI commands are for quick actions. Nothing revolutionary. That is partly the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Scan and Import Help Clean Up zsh and bash&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The part I personally needed most was scanning existing shell files.&lt;/p&gt;

&lt;p&gt;Gloss can scan common shell config locations such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.zshrc
~/.bashrc
~/.bash_aliases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the TUI, scan results can include aliases, simple functions, and executable scripts from configured paths. Then I can choose what to import.&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%2Ffh14zfi8x8oiyqp4rf0j.jpeg" 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%2Ffh14zfi8x8oiyqp4rf0j.jpeg" alt="Gloss scan/import screen showing aliases and shell functions detected from zsh or bash config files." width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This matters because most reusable commands already exist somewhere. They are just not organized. Some are aliases. Some are functions. Some are scripts. Some are ancient fossils from a setup you barely remember.&lt;/p&gt;

&lt;p&gt;Importing them into a glossary does not force them to become aliases. It just makes them findable, readable, and editable. That is a safer first step than “rewrite my shell config, good luck everybody.”&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Managed Alias Sync Works&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Alias sync is the dangerous part, so I wanted it boring.&lt;/p&gt;

&lt;p&gt;Boring is good here.&lt;/p&gt;

&lt;p&gt;Gloss does not rewrite the whole shell file. It writes aliases inside one managed block:&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="c"&gt;# &amp;gt;&amp;gt;&amp;gt; gloss aliases &amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git status"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ls -lah"&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;&amp;lt;&amp;lt; gloss aliases &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything outside that block stays untouched.&lt;/p&gt;

&lt;p&gt;The flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;add a managed alias in Gloss&lt;/li&gt;
&lt;li&gt;preview the sync block&lt;/li&gt;
&lt;li&gt;sync when ready&lt;/li&gt;
&lt;li&gt;Gloss writes or replaces only the managed block&lt;/li&gt;
&lt;li&gt;backup is created only if an existing shell file actually changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That backup behavior matters. Creating endless backups for no-op syncs would be annoying. Not creating backups when modifying shell files would be reckless. The middle ground is simple: backup when sync changes an existing file.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss &lt;span class="nb"&gt;alias &lt;/span&gt;add
gloss &lt;span class="nb"&gt;alias sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is mainly for people who want aliases, but do not want alias management to become a hand-edited swamp.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What I Intentionally Did Not Build&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is tempting to keep adding features. That is how a small command glossary becomes a life management platform with plugins, sync, AI summaries, a graph view, and probably a calendar for some reason.&lt;/p&gt;

&lt;p&gt;I tried not to do that.&lt;/p&gt;

&lt;p&gt;Gloss is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a shell replacement&lt;/li&gt;
&lt;li&gt;a shell history analyzer&lt;/li&gt;
&lt;li&gt;a package manager&lt;/li&gt;
&lt;li&gt;an AI command generator&lt;/li&gt;
&lt;li&gt;a full dotfiles manager&lt;/li&gt;
&lt;li&gt;a cloud sync product&lt;/li&gt;
&lt;li&gt;a replacement for &lt;code&gt;fzf&lt;/code&gt;, &lt;code&gt;pet&lt;/code&gt;, or &lt;code&gt;navi&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is important. Gloss overlaps with snippet tools, but it does not try to win every category. A &lt;code&gt;commands.txt&lt;/code&gt; file with &lt;code&gt;fzf&lt;/code&gt; may be enough. &lt;code&gt;pet&lt;/code&gt; may be better if you want snippet execution and mature snippet management. &lt;code&gt;navi&lt;/code&gt; may be better if you want interactive cheatsheets with parameters.&lt;/p&gt;

&lt;p&gt;Gloss is more narrowly about keeping reusable commands documented, searchable, importable from shell configs, and optionally syncable as managed aliases.&lt;/p&gt;

&lt;p&gt;That is the lane.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Practical Setup I Would Recommend&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For a sane shell-command workflow, I would not start by installing five tools and reorganizing everything. That is how “productivity” becomes procrastination wearing a nice jacket.&lt;/p&gt;

&lt;p&gt;I would start smaller:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep normal shell history.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;fzf&lt;/code&gt; history search if you do not already use it.&lt;/li&gt;
&lt;li&gt;Keep aliases for commands you run constantly.&lt;/li&gt;
&lt;li&gt;Save less frequent but important commands somewhere searchable.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;gloss&lt;/code&gt;, &lt;code&gt;pet&lt;/code&gt;, &lt;code&gt;navi&lt;/code&gt;, or a plain text file depending on how much structure you need.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A simple rule helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If I run it daily, it can be an alias.&lt;/li&gt;
&lt;li&gt;If I need to understand it later, it needs a description.&lt;/li&gt;
&lt;li&gt;If I keep searching it again, it belongs in a glossary/snippet system.&lt;/li&gt;
&lt;li&gt;If it modifies shell config, it needs preview and backups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That rule is not science. It is more like putting labels on boxes before the garage wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Installing Gloss&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gloss is open source under the MIT license, written in Go, and supports macOS/Linux with &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Install script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Architeg/gloss/main/scripts/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;Architeg/tap/gloss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gloss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/Architeg/gloss" rel="noopener noreferrer"&gt;https://github.com/Architeg/gloss&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project page:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://worksfine.dev/gloss/" rel="noopener noreferrer"&gt;https://worksfine.dev/gloss/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Managing shell commands is not about becoming a terminal wizard. It is about not making the same tiny decisions forever.&lt;/p&gt;

&lt;p&gt;Shell history is useful. Aliases are useful. Notes are useful. A text file with &lt;code&gt;fzf&lt;/code&gt; is useful. But once commands start spreading across all of them, the workflow gets blurry. Gloss is my attempt to make that middle space cleaner: local, searchable, documented, and close to the terminal.&lt;/p&gt;




&lt;p&gt;The terminal does not need another shiny layer of complexity. It needs fewer forgotten commands, fewer mystery aliases, and fewer browser searches for things already solved once. How do you manage the commands you know you will need again?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What problem does Gloss solve?&lt;/strong&gt;&lt;br&gt;
Gloss helps manage reusable shell commands that are too important to leave buried in history but not used often enough to remember perfectly. It gives them descriptions, tags, search, scan/import, and optional managed alias sync.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is Gloss better than using aliases in zsh or bash?&lt;/strong&gt;&lt;br&gt;
Not exactly. Aliases are still great for commands used constantly. Gloss is more useful for commands that need context, tags, or occasional lookup. It can also sync selected commands as aliases when that makes sense.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Can I just use a text file with fzf instead?&lt;/strong&gt;&lt;br&gt;
Yes. A text file plus &lt;code&gt;fzf&lt;/code&gt; is a good minimal solution. Gloss is for users who want more structure: separate descriptions, tags, TUI editing, shell config scanning, and safer alias sync with backups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does Gloss replace tools like pet or navi?&lt;/strong&gt;&lt;br&gt;
No. &lt;code&gt;pet&lt;/code&gt; is a mature command-line snippet manager, and &lt;code&gt;navi&lt;/code&gt; is an interactive cheatsheet tool. &lt;code&gt;gloss&lt;/code&gt; focuses on a local command glossary plus &lt;code&gt;zsh&lt;/code&gt;/&lt;code&gt;bash&lt;/code&gt; scan/import and managed alias syncing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is it safe to let a tool write to .zshrc or .bashrc?&lt;/strong&gt;&lt;br&gt;
Caution is reasonable. Gloss only writes inside a dedicated managed block, leaves unrelated shell config untouched, and creates backups when sync changes an existing shell file. Still, preview the block before syncing and keep your dotfiles backed up.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;How do you manage reusable commands? Drop your setup, questions, or criticism in the comments — I’d like to see what works for other people.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>productivity</category>
      <category>bash</category>
      <category>zsh</category>
    </item>
  </channel>
</rss>
