<?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: Omar</title>
    <description>The latest articles on DEV Community by Omar (@opmr0).</description>
    <link>https://dev.to/opmr0</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%2F3832744%2F658d596b-2d00-4efc-8fba-46af6cf3b8a7.png</url>
      <title>DEV Community: Omar</title>
      <link>https://dev.to/opmr0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/opmr0"/>
    <language>en</language>
    <item>
      <title>I built a CLI snippet manager in Rust because I was tired of googling the same things</title>
      <dc:creator>Omar</dc:creator>
      <pubDate>Mon, 13 Apr 2026 12:11:01 +0000</pubDate>
      <link>https://dev.to/opmr0/i-built-a-cli-snippet-manager-in-rust-because-i-was-tired-of-googling-the-same-things-4j4g</link>
      <guid>https://dev.to/opmr0/i-built-a-cli-snippet-manager-in-rust-because-i-was-tired-of-googling-the-same-things-4j4g</guid>
      <description>&lt;p&gt;I have a habit. Every time I sit down to code I end up googling the same thing, how to center a div, the Rust test module boilerplate, docker run flags, ffmpeg commands. Every. Single. Time.&lt;/p&gt;

&lt;p&gt;So I built sinbo, a CLI snippet manager that lets you store code once and retrieve it anywhere.&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/opmr0/sinbo" rel="noopener noreferrer"&gt;https://github.com/opmr0/sinbo&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sinbo add docker-run &lt;span class="nt"&gt;-t&lt;/span&gt; docker        &lt;span class="c"&gt;# save it once&lt;/span&gt;
sinbo get docker-run                  &lt;span class="c"&gt;# get it anywhere&lt;/span&gt;
sinbo copy docker-run                 &lt;span class="c"&gt;# or copy to clipboard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Snippets are stored locally as plain files in your config directory. No cloud, no account, no sync. Just files you own.&lt;/p&gt;

&lt;p&gt;You can tag snippets, add descriptions, and filter by tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sinbo add nginx-conf &lt;span class="nt"&gt;-t&lt;/span&gt; infra server &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"default nginx config"&lt;/span&gt;
sinbo list &lt;span class="nt"&gt;-t&lt;/span&gt; infra
sinbo search &lt;span class="s2"&gt;"nginx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encryption
&lt;/h2&gt;

&lt;p&gt;The feature I am most proud of, sensitive snippets like API keys and tokens can be encrypted at rest using AES-256-GCM with Argon2id key derivation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sinbo add github-token &lt;span class="nt"&gt;--encrypt&lt;/span&gt;
sinbo get github-token   &lt;span class="c"&gt;# prompts for password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plaintext never touches disk. Only the &lt;code&gt;.enc&lt;/code&gt; file is stored. &lt;/p&gt;

&lt;h2&gt;
  
  
  Variable placeholders
&lt;/h2&gt;

&lt;p&gt;Snippets can contain placeholders using a custom &lt;code&gt;SINBO:var:&lt;/code&gt; syntax:&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;# snippet content:&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; SINBO:port: &lt;span class="nt"&gt;-it&lt;/span&gt; SINBO:name:

&lt;span class="c"&gt;# usage:&lt;/span&gt;
sinbo get docker-run &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8080 &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myapp
&lt;span class="c"&gt;# output: docker run -p 8080 -it myapp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Piping
&lt;/h2&gt;

&lt;p&gt;Since &lt;code&gt;sinbo get&lt;/code&gt; prints to stdout it composes naturally with other tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sinbo get deploy-script | sh
sinbo get query | psql mydb
sinbo get docker-run &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8080 | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shell completions
&lt;/h2&gt;

&lt;p&gt;Tab completion for snippet names works out of the box for bash, zsh, fish and powershell:&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(sinbo completions bash)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;sinbo get [TAB]&lt;/code&gt; shows your actual snippet names.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;This was my first time implementing real encryption in Rust. The &lt;code&gt;aes-gcm&lt;/code&gt; and &lt;code&gt;argon2&lt;/code&gt; crates made it approachable but I still had to understand the underlying concepts to use them correctly. Building sinbo pushed me to actually learn AES-256-GCM, why nonces matter, and what Argon2id does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;sinbo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you find this useful, drop a ⭐️ on GitHub&lt;/p&gt;

</description>
      <category>rust</category>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a TOML-based task runner in Rust</title>
      <dc:creator>Omar</dc:creator>
      <pubDate>Sat, 28 Mar 2026 17:04:26 +0000</pubDate>
      <link>https://dev.to/opmr0/i-built-a-toml-based-task-runner-in-rust-59kp</link>
      <guid>https://dev.to/opmr0/i-built-a-toml-based-task-runner-in-rust-59kp</guid>
      <description>&lt;p&gt;Every project I work on has the same problem. There's always a set of commands I run in the same order every time, setting up dependencies, building, running checks. I got tired of either remembering them or keeping a random notes file.&lt;/p&gt;

&lt;p&gt;Makefiles work but feel wrong outside of C projects. npm scripts are JavaScript-only. &lt;code&gt;just&lt;/code&gt; is great but it's another syntax to learn on top of everything else.&lt;/p&gt;

&lt;p&gt;So I built xeq.&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%2F65v475ejt6j18uqh7alw.gif" 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%2F65v475ejt6j18uqh7alw.gif" alt="demo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You define named scripts in a &lt;code&gt;xeq.toml&lt;/code&gt; file and run them with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[check]&lt;/span&gt;
&lt;span class="py"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"cargo fmt --check"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"cargo clippy -- -D warnings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"cargo test"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[build]&lt;/span&gt;
&lt;span class="py"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"xeq:check"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"cargo build --release"&lt;/span&gt;
&lt;span class="p"&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;xeq run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No new syntax, just TOML that any project already understands.&lt;/p&gt;

&lt;p&gt;It supports variables with fallback values, positional and named arguments, environment variables, nested script calls, parallel execution with thread control, and &lt;code&gt;on_success&lt;/code&gt;/&lt;code&gt;on_error&lt;/code&gt; event hooks.&lt;/p&gt;

&lt;p&gt;The feature I'm most happy with is &lt;code&gt;xeq validate&lt;/code&gt;, it catches undefined variables, missing nested scripts, circular dependencies, and parallel conflicts before you run anything.&lt;/p&gt;

&lt;p&gt;There are also 30+ init templates so you can get started instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xeq init rust
xeq init docker
xeq init nextjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works on Linux, macOS, and Windows.&lt;/p&gt;

&lt;p&gt;Still early but functional. Would love feedback❤️&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/opmr0/xeq" rel="noopener noreferrer"&gt;https://github.com/opmr0/xeq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crates.io: &lt;a href="https://crates.io/crates/xeq" rel="noopener noreferrer"&gt;https://crates.io/crates/xeq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a file watcher in Rust</title>
      <dc:creator>Omar</dc:creator>
      <pubDate>Wed, 18 Mar 2026 21:11:40 +0000</pubDate>
      <link>https://dev.to/opmr0/i-built-a-file-watcher-in-rust-that-just-works-46mp</link>
      <guid>https://dev.to/opmr0/i-built-a-file-watcher-in-rust-that-just-works-46mp</guid>
      <description>&lt;p&gt;You know the loop.&lt;/p&gt;

&lt;p&gt;Save. Switch to terminal. Up arrow. Enter. Wait. Switch back. Repeat forever.&lt;/p&gt;

&lt;p&gt;I got tired of it so I built &lt;strong&gt;fyr&lt;/strong&gt;, a file watcher that kills the ritual.&lt;/p&gt;




&lt;h2&gt;
  
  
  The basics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fyr &lt;span class="nt"&gt;-w&lt;/span&gt; src &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"cargo run"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save a file inside &lt;code&gt;/src&lt;/code&gt;, fyr runs your command. Previous run still going? It kills it first. No stale processes, no duplicate output. Just a clean run every time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tasks system
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fyr task add build &lt;span class="nt"&gt;-w&lt;/span&gt; src &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"cargo build --release"&lt;/span&gt;
fyr run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it once, run it from anywhere. No more remembering flags.&lt;/p&gt;

&lt;p&gt;You can also drop a &lt;code&gt;fyr.toml&lt;/code&gt; in your project and commit it, so everyone on the team gets the same setup for free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[tasks.build]&lt;/span&gt;
&lt;span class="py"&gt;watch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cargo build --release"&lt;/span&gt;

&lt;span class="nn"&gt;[tasks.test]&lt;/span&gt;
&lt;span class="py"&gt;watch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tests"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;run&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cargo test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How it stacks up
&lt;/h2&gt;

&lt;p&gt;Benchmarked against the popular alternatives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Startup&lt;/th&gt;
&lt;th&gt;Idle memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fyr&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;219ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.6 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;watchexec&lt;/td&gt;
&lt;td&gt;238ms&lt;/td&gt;
&lt;td&gt;13.5 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chokidar&lt;/td&gt;
&lt;td&gt;501ms&lt;/td&gt;
&lt;td&gt;37.6 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nodemon&lt;/td&gt;
&lt;td&gt;528ms&lt;/td&gt;
&lt;td&gt;41.2 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/opmr0/fyr" rel="noopener noreferrer"&gt;https://github.com/opmr0/fyr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear what you think, especially if you've used watchexec or cargo-watch before.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>cli</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
