<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Abhi's Feed</title>
  <link href="https://abhinandh-s.github.io/"/>
  <link href="https://abhinandh-s.github.io/atom.xml" rel="self"/>
  <updated>2026-02-06T00:00:00Z</updated>
  <id>https://abhinandh-s.github.io/</id>
  
  <entry>
    <title>Yew.rs and SSR - The Circle of Migration</title>
    <link href="https://abhinandh-s.github.io/articles/deno-fresh-to-yew-rs"/>
    <id>https://abhinandh-s.github.io/articles/deno-fresh-to-yew-rs</id>
    <updated>2026-02-06T00:00:00Z</updated>
    <summary>How I finally achieved the "Rust Dream" by migrating from Deno Fresh to Yew.rs with SSR.</summary>
    <content type="html"><![CDATA[<p>Years ago, when i dicided to build my own website, first thing i looked for was
how to build it in <strong>rust</strong>. Since rust is my first language, i felt I had the upper hand there.</p>
<p><strong>My requirements were</strong>:</p>
<ul>
<li>[ ] Built in rust</li>
<li>[ ] Free deployment</li>
<li>[ ] High performance</li>
<li>[ ] Stylable</li>
<li>[ ] Serverless</li>
</ul>
<p>Well that was too much to ask for.</p>
<p>The only option for rust was to build a website
using web assembly. I took a look at many frameworks and finally settled on <strong>yew.rs</strong>.
I managed to get a site up and running on Github Pages.
But the load time was painful.</p>
<p>Eventually, I compromised. I learned TypeScript and rebuilt the site using the <strong>Deno Fresh</strong> framework.</p>
<p>It served me for like 2 years.</p>
<h3>The 2026 Breakthrough</h3>
<p>This year, I revisited my original dream. But this time,
I finally managed to &quot;duct-tape&quot; all my requirements together into a high-performance stack.
All because Deno now supports web assembly. Now i am back on yew.rs again.</p>
<ul>
<li>[x] Built in rust  =&gt; yew.rs</li>
<li>[x] Free deployment  =&gt; Deno deploy</li>
<li>[x] High performance  =&gt; Server Side Rendering</li>
<li>[x] Stylable  =&gt; tailwindcss</li>
<li>[x] Serverless</li>
</ul>
<ul>
<li><strong>Live Site:</strong> <a href="https://abhinandhs.deno.dev">abhinandhs.deno.dev</a></li>
<li><strong>Source Code:</strong> <a href="https://github.com/abhinandh-s/abhinandhs.deno.dev">GitHub Repository</a></li>
</ul>
<p>I have put a close to bare minimum yew on deno setup -</p>
<ul>
<li><strong>Live Site:</strong> <a href="https://abhi.deno.dev">abhi.deno.dev</a></li>
<li><strong>Source Code:</strong> <a href="https://github.com/abhinandh-s/yew-deno">GitHub Repository</a></li>
</ul>
]]></content>
  </entry>

  <entry>
    <title>age.nvim</title>
    <link href="https://abhinandh-s.github.io/articles/age-nvim"/>
    <id>https://abhinandh-s.github.io/articles/age-nvim</id>
    <updated>2024-12-10T00:00:00Z</updated>
    <summary>Neovim plugin for encrypting and decrypting text files inside neovim using `age` with ease.</summary>
    <content type="html"><![CDATA[<p><strong>Neovim plugin for encrypting and decrypting text files inside neovim using <a href="https://github.com/FiloSottile/age">age</a> with ease.</strong></p>
<h2>Installation</h2>
<blockquote>
<p>[!WARNING]
Master branch supports Neovim version &gt;= 0.11</p>
</blockquote>
<pre style="background-color:#2b303b;"><code class="language-lua"><span style="color:#c0c5ce;">  </span><span style="color:#d08770;">...  
</span><span style="color:#c0c5ce;">  &#39;</span><span style="color:#a3be8c;">abhinandh-s/age.nvim</span><span style="color:#c0c5ce;">&#39;,
</span><span style="color:#c0c5ce;">  branch = &quot;</span><span style="color:#a3be8c;">nvim-v10</span><span style="color:#c0c5ce;">&quot;, </span><span style="color:#65737e;">-- pin branch for Neovim version 0.10
</span><span style="color:#c0c5ce;">  </span><span style="color:#d08770;">...
</span></code></pre>
<p>Install Age using your favorite plugin manager. For example, with <a href="https://github.com/folke/lazy.nvim">lazy.nvim</a>:</p>
<h3>Dependencies</h3>
<ul>
<li><strong>None</strong></li>
</ul>
<blockquote>
<p>[!NOTE]
<code>age.nvim</code> does not require the <code>age</code> CLI to be installed separately.
Everything needed for encryption and decryption is handled within the plugin itself.</p>
</blockquote>
<h3>config via env variable</h3>
<pre style="background-color:#2b303b;"><code class="language-lua"><span style="color:#65737e;">-- ~/.config/nvim/lua/plugins/age.lua
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">    &#39;</span><span style="color:#a3be8c;">abhinandh-s/age.nvim</span><span style="color:#c0c5ce;">&#39;,
</span><span style="color:#c0c5ce;">    cmd = { &quot;</span><span style="color:#a3be8c;">Age</span><span style="color:#c0c5ce;">&quot; },
</span><span style="color:#c0c5ce;">    config = </span><span style="color:#b48ead;">function</span><span style="color:#c0c5ce;">()
</span><span style="color:#c0c5ce;">    </span><span style="color:#b48ead;">local</span><span style="color:#c0c5ce;"> public_key = </span><span style="color:#96b5b4;">os.getenv</span><span style="color:#c0c5ce;">(&quot;</span><span style="color:#a3be8c;">AGE_PUBLIC_KEY</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">    </span><span style="color:#b48ead;">local</span><span style="color:#c0c5ce;"> private_key = </span><span style="color:#96b5b4;">os.getenv</span><span style="color:#c0c5ce;">(&quot;</span><span style="color:#a3be8c;">AGE_PRIVATE_KEY</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#96b5b4;">require</span><span style="color:#c0c5ce;">(&#39;</span><span style="color:#a3be8c;">age</span><span style="color:#c0c5ce;">&#39;).setup({
</span><span style="color:#c0c5ce;">        encrypt_and_del = </span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">, </span><span style="color:#65737e;">-- will remove the original file after encrypting.
</span><span style="color:#c0c5ce;">        public_key = public_key,
</span><span style="color:#c0c5ce;">        private_key = private_key,
</span><span style="color:#c0c5ce;">      })
</span><span style="color:#c0c5ce;">    </span><span style="color:#b48ead;">end
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<blockquote>
<p>[!TIP]
check examples dir for non panic version</p>
</blockquote>
<h3>config via lua file</h3>
<pre style="background-color:#2b303b;"><code class="language-lua"><span style="color:#65737e;">-- ~/.config/nvim/lua/plugins/age.lua
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">    &#39;</span><span style="color:#a3be8c;">abhinandh-s/age.nvim</span><span style="color:#c0c5ce;">&#39;,
</span><span style="color:#c0c5ce;">    cmd = { &quot;</span><span style="color:#a3be8c;">Age</span><span style="color:#c0c5ce;">&quot; },
</span><span style="color:#c0c5ce;">    config = </span><span style="color:#b48ead;">function</span><span style="color:#c0c5ce;">()
</span><span style="color:#c0c5ce;">      </span><span style="color:#b48ead;">local</span><span style="color:#c0c5ce;"> key = </span><span style="color:#96b5b4;">require</span><span style="color:#c0c5ce;">(&#39;</span><span style="color:#a3be8c;">key</span><span style="color:#c0c5ce;">&#39;)
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#96b5b4;">require</span><span style="color:#c0c5ce;">(&#39;</span><span style="color:#a3be8c;">age</span><span style="color:#c0c5ce;">&#39;).setup({
</span><span style="color:#c0c5ce;">        encrypt_and_del = </span><span style="color:#d08770;">true</span><span style="color:#c0c5ce;">, </span><span style="color:#65737e;">-- will remove the original file after encrypting.
</span><span style="color:#c0c5ce;">        public_key = &quot;</span><span style="color:#a3be8c;">ageXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span><span style="color:#c0c5ce;">&quot;,
</span><span style="color:#c0c5ce;">        private_key = key.private_key, </span><span style="color:#65737e;">-- defined in another lua file which is not included in git for safety
</span><span style="color:#c0c5ce;">      })
</span><span style="color:#c0c5ce;">    </span><span style="color:#b48ead;">end
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<pre style="background-color:#2b303b;"><code class="language-lua"><span style="color:#65737e;">-- ~/.config/nvim/lua/key.lua
</span><span style="color:#c0c5ce;">
</span><span style="color:#b48ead;">return</span><span style="color:#c0c5ce;"> {
</span><span style="color:#c0c5ce;">  private_key = &quot;</span><span style="color:#a3be8c;">AGE-SECRET-KEY-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span><span style="color:#c0c5ce;">&quot;,
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<h2>Usage</h2>
<p>Age provides the <code>:Age</code> command with the following syntax:</p>
<pre style="background-color:#2b303b;"><code class="language-vim"><span style="color:#c0c5ce;">:Age [action]
</span></code></pre>
<ul>
<li><code>[action]</code> can be one of:
<ul>
<li><code>encrypt</code>,</li>
<li><code>decrypt</code>,</li>
<li><code>genkey</code></li>
</ul>
</li>
</ul>
<h4>Examples:</h4>
<ul>
<li>Generates an age key pair into key.txt in current working directory.</li>
</ul>
<pre style="background-color:#2b303b;"><code class="language-vim"><span style="color:#c0c5ce;">:Age genkey
</span></code></pre>
<ul>
<li>Kills the current buffer and switches to a previous buffer or creates a scratch buffer in case there is no buffer to switch, then encrypts the file with the provided age key.</li>
</ul>
<pre style="background-color:#2b303b;"><code class="language-vim"><span style="color:#c0c5ce;">:Age encrypt
</span></code></pre>
<ul>
<li>Decrypts the currently opened encrypted file, and switches to the decrypted file.</li>
</ul>
<pre style="background-color:#2b303b;"><code class="language-vim"><span style="color:#c0c5ce;">:Age decrypt
</span></code></pre>
<p>You can use age api in nvim configs as:</p>
<p>age.nvim provides 2 apis -</p>
<ul>
<li><code>decrypt_to_string</code> -- this uses private key provided in setup config</li>
<li><code>decrypt_to_string_with_identities</code> -- takes from file</li>
</ul>
<pre style="background-color:#2b303b;"><code class="language-lua"><span style="color:#b48ead;">return</span><span style="color:#c0c5ce;"> {
</span><span style="color:#c0c5ce;">  {
</span><span style="color:#c0c5ce;">    &quot;</span><span style="color:#a3be8c;">folke/tokyonight.nvim</span><span style="color:#c0c5ce;">&quot;,
</span><span style="color:#c0c5ce;">    dependencies = {
</span><span style="color:#c0c5ce;">      &#39;</span><span style="color:#a3be8c;">abhinandh-s/age.nvim</span><span style="color:#c0c5ce;">&#39; </span><span style="color:#65737e;">-- # add age as dependency
</span><span style="color:#c0c5ce;">    },
</span><span style="color:#c0c5ce;">    config = </span><span style="color:#b48ead;">function</span><span style="color:#c0c5ce;">()
</span><span style="color:#c0c5ce;">      </span><span style="color:#b48ead;">local</span><span style="color:#c0c5ce;"> age = </span><span style="color:#96b5b4;">require</span><span style="color:#c0c5ce;">(&quot;</span><span style="color:#a3be8c;">age</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">---------
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">-- api 01 
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">---------
</span><span style="color:#c0c5ce;">      age.setup({
</span><span style="color:#c0c5ce;">          private_key = &quot;</span><span style="color:#a3be8c;">private_key</span><span style="color:#c0c5ce;">&quot;,
</span><span style="color:#c0c5ce;">        })
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">-- Load the secret
</span><span style="color:#c0c5ce;">      </span><span style="color:#b48ead;">local</span><span style="color:#c0c5ce;"> secret = age.decrypt_to_string(vim.fn.expand(&quot;</span><span style="color:#a3be8c;">~/.config/nvim/top_secret.txt.age</span><span style="color:#c0c5ce;">&quot;))
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#96b5b4;">print</span><span style="color:#c0c5ce;">(secret)
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">---------
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">-- api 02 
</span><span style="color:#c0c5ce;">      </span><span style="color:#65737e;">---------
</span><span style="color:#c0c5ce;">      </span><span style="color:#b48ead;">local</span><span style="color:#c0c5ce;"> secret_02 = age.decrypt_to_string_with_identities(
</span><span style="color:#c0c5ce;">        vim.fn.expand(&quot;</span><span style="color:#a3be8c;">~/.config/nvim/top_secret.txt.age</span><span style="color:#c0c5ce;">&quot;),
</span><span style="color:#c0c5ce;">        {
</span><span style="color:#c0c5ce;">          vim.fn.expand(&quot;</span><span style="color:#a3be8c;">~/.local/share/age/key.txt</span><span style="color:#c0c5ce;">&quot;),
</span><span style="color:#c0c5ce;">        }
</span><span style="color:#c0c5ce;">      )
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="color:#96b5b4;">print</span><span style="color:#c0c5ce;">(secret_02)
</span><span style="color:#c0c5ce;">    </span><span style="color:#b48ead;">end</span><span style="color:#c0c5ce;">,
</span><span style="color:#c0c5ce;">  },
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<blockquote>
<p>[!NOTE]
If you have any suggestions, please let me know.</p>
</blockquote>
<h2>What is age?</h2>
<p><a href="https://age-encryption.org/">age</a> is a simple, modern and secure file encryption tool.</p>
<p>It features small explicit keys, no config options, and UNIX-style composability.</p>
<h3>Why Choose Age Over GPG?</h3>
<ol>
<li><strong>Simplicity</strong>: Age has a straightforward syntax and intuitive design, making it easier to use without extensive documentation.</li>
<li><strong>Modern Cryptography</strong>: Age uses state-of-the-art cryptographic algorithms like X25519, ChaCha20-Poly1305, and HMAC-SHA256, ensuring robust security.</li>
<li><strong>Minimal Attack Surface</strong>: Age's codebase is minimal and easier to audit compared to the complex and extensive GPG ecosystem.</li>
<li><strong>Portable Keys</strong>: Age uses compact, user-friendly key formats, which are easy to manage and transfer.</li>
<li><strong>Focused Use Case</strong>: Age is purpose-built for encrypting files securely and efficiently, without the additional complexity of key management and email encryption that GPG supports.</li>
</ol>
<h2>License</h2>
<p>Licensed under <!-- raw HTML omitted -->MIT license<!-- raw HTML omitted -->.</p>
<p>Copyright (c) 2025 Abhinandh S</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the &quot;Software&quot;), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</p>
]]></content>
  </entry>

  <entry>
    <title>roxide</title>
    <link href="https://abhinandh-s.github.io/articles/roxide"/>
    <id>https://abhinandh-s.github.io/articles/roxide</id>
    <updated>2024-11-25T00:00:00Z</updated>
    <summary>A lightweight, high-performance alternative to the traditional rm command, written in rust.</summary>
    <content type="html"><![CDATA[<p><code>roxide</code> is a lightweight, high-performance alternative to the traditional <code>rm</code>
command, designed with an emphasis on speed and data preservation. Unlike
standard rm, which permanently deletes files, roxide safely moves them to a
designated &quot;<code>trash</code>&quot; directory. This approach enables efficient and fast file
removal without risking unintended data loss.</p>
<p><strong>Note</strong>: I am an amateur Rust programmer, so while this code might not be the
most refined, it prioritizes safety and has been thoroughly tested. If you have
ideas for improvement or notice any issues, contributions are very welcome! This
project is open to suggestions, code reviews, and pull requests from developers
of all experience levels.</p>
<h2>Getting started</h2>
<ul>
<li><code>roxide file.txt</code>: files will moved to <code>trash dir</code>. ie,
$HOME/.local/share/Trash/files/</li>
<li><code>roxide revert</code> : restores perviously removed file/directory to its pervious
path</li>
<li><code>roxide -r | --recursive</code> : Remove directories and their contents recursively</li>
<li><code>roxide -f | --force</code> : Remove without moving to trash directory</li>
<li><code>roxide -v | --verbose</code> : will print the file name and its out path</li>
<li><code>roxide some/dir/ -p .pdf</code>: will remove files matching the pattern from
some/dir</li>
<li><code>roxide some/dir/ -rp .pdf</code>: will recursively remove files matching the
pattern from some/dir</li>
<li><code>roxide some/dir/ -rp .pdf -l</code>: will list files, like dry run</li>
<li><code>roxide some/* -i never</code>: will never prompt</li>
<li><code>roxide some/* -i once</code>: Prompt once before removing more than three files or
when removing recursivly</li>
<li><code>roxide some/* -i always</code>: Prompt before every removal</li>
<li><code>roxide some/* -p .pdf -i always</code>: Prompt before every removal</li>
</ul>
<blockquote>
<p>[!WARNING]</p>
<ol>
<li>Do not use sudo. Support for sudo is still work in progress.</li>
<li>It wont warn about write protected contents (wip)</li>
<li>It is not possible to bring back files removed using patterns with <code>revert</code>
flag but you can still access it from Trash dir</li>
</ol>
</blockquote>
<h2>Installation</h2>
<h3>Build</h3>
<pre style="background-color:#2b303b;"><code class="language-bash"><span style="color:#8fa1b3;">git</span><span style="color:#c0c5ce;"> clone https://github.com/abhi-xyz/roxide.git</span><span style="color:#bf616a;"> --depth</span><span style="color:#c0c5ce;">=1 
</span><span style="color:#96b5b4;">cd</span><span style="color:#c0c5ce;"> roxide
</span><span style="color:#8fa1b3;">cargo</span><span style="color:#c0c5ce;"> build</span><span style="color:#bf616a;"> --release
</span><span style="color:#8fa1b3;">cp</span><span style="color:#c0c5ce;"> target/release/roxide /usr/local/bin/
</span></code></pre>
<h3>cargo</h3>
<pre style="background-color:#2b303b;"><code class="language-bash"><span style="color:#8fa1b3;">cargo</span><span style="color:#c0c5ce;"> install roxide
</span></code></pre>
<h3>Nixos</h3>
<p>Add <code>roxide</code> as a flake input: In your flake.nix file, add the roxide input
pointing to its GitHub repository.</p>
<pre style="background-color:#2b303b;"><code class="language-nix"><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">  inputs = {
</span><span style="color:#c0c5ce;">    nixpkgs.url = &quot;github:NixOS/nixpkgs&quot;;
</span><span style="color:#c0c5ce;">    roxide = {
</span><span style="color:#c0c5ce;">      url = &quot;github:abhi-xyz/roxide&quot;;
</span><span style="color:#c0c5ce;">      inputs.nixpkgs.follows = &quot;nixpkgs&quot;; # Follows the nixpkgs input
</span><span style="color:#c0c5ce;">    };
</span><span style="color:#c0c5ce;">  };
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">  outputs = { self, roxide, nixpkgs, ... }@inputs:
</span><span style="color:#c0c5ce;">  {
</span><span style="color:#c0c5ce;">    # Your NixOS configuration or other settings
</span><span style="color:#c0c5ce;">  };
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<p>Include roxide in NixOS configuration: In the outputs section, set up
nixosConfigurations and add roxide as a module to enable it within your system
configuration.</p>
<pre style="background-color:#2b303b;"><code class="language-nix"><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">  outputs = { self, roxide, nixpkgs, ... }@inputs:
</span><span style="color:#c0c5ce;">  {
</span><span style="color:#c0c5ce;">    nixosConfigurations.&quot;my-nixos-host&quot; = nixpkgs.lib.nixosSystem {
</span><span style="color:#c0c5ce;">      system = &quot;x86_64-linux&quot;;
</span><span style="color:#c0c5ce;">      specialArgs = { inherit inputs; };
</span><span style="color:#c0c5ce;">      modules = [
</span><span style="color:#c0c5ce;">        ./hosts/configuration.nix # Main NixOS configuration file
</span><span style="color:#c0c5ce;">        roxide.nixosModules.roxide      # Enable the &quot;roxide&quot; module from the flake
</span><span style="color:#c0c5ce;">      ];
</span><span style="color:#c0c5ce;">    };
</span><span style="color:#c0c5ce;">  };
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<p>Activate &quot;roxide&quot; in configuration.nix: Within configuration.nix, enable the
&quot;roxide&quot; program:</p>
<pre style="background-color:#2b303b;"><code class="language-nix"><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">  # Other configurations...
</span><span style="color:#c0c5ce;">  
</span><span style="color:#c0c5ce;">  program.roxide.enable = true; # note: its program not programs
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<p>Apply Configuration: After updating your configuration, apply it with:</p>
<pre style="background-color:#2b303b;"><code class="language-bash"><span style="color:#8fa1b3;">sudo</span><span style="color:#c0c5ce;"> nixos-rebuild switch</span><span style="color:#bf616a;"> --flake</span><span style="color:#c0c5ce;"> .
</span></code></pre>
<h2>known bugs</h2>
<ul>
<li>won't warn about git directory</li>
<li>can't use sudo</li>
<li>~~golb pattern isn't working~~</li>
<li>~~pattern -flag interfering with other flags~~</li>
<li>~~cant remove a directory which is inside a directory~~</li>
</ul>
<h2>Planned Features</h2>
<ul>
<li>~~roxide revert: Restores files from the trash directory to their original
location.~~</li>
<li>roxide --gc &lt;TIME_PERIOD&gt;: Performs garbage collection on trashed files,
automatically clearing files older than a specified period.</li>
<li>~~roxide -f: Forces deletion without moving files to the trash directory.~~</li>
<li>roxide -s: Shreds files for secure deletion.</li>
</ul>
]]></content>
  </entry>

  <entry>
    <title>Nix Functions To Setup Newsboat Urls</title>
    <link href="https://abhinandh-s.github.io/articles/setting-up-newsboat-the-nix-way"/>
    <id>https://abhinandh-s.github.io/articles/setting-up-newsboat-the-nix-way</id>
    <updated>2024-10-22T00:00:00Z</updated>
    <summary>Setting up your newsboat configuration using Nix functions.</summary>
    <content type="html"><![CDATA[<p>RSS is a powerful way to stay updated with your favorite blogs, social media
channels, and other online content without being distracted by endless scrolling
on the actual platforms. <a href="https://newsboat.org/">Newsboat</a>, a terminal-based RSS
reader, is an excellent tool for this.</p>
<p>In this post, I'll guide you through how to set up your newsboat configuration
using Nix functions to generate RSS feeds from platforms like YouTube, Twitter,
Reddit, Instagram, and Spotify with less boilerplates. For more informations on
supported platforms visit <a href="https://rsshub.netlify.app/">rsshub</a>.</p>
<h1>Setting Up Nix Functions for RSS Feeds</h1>
<h1>Nix Functions</h1>
<p>In Nix, functions are written as follows:</p>
<h4>Single parameter</h4>
<pre style="background-color:#2b303b;"><code class="language-json"><span style="color:#c0c5ce;">param</span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">: {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">#</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">Function</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">Body</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<h4>Two parameters</h4>
<pre style="background-color:#2b303b;"><code class="language-json"><span style="color:#c0c5ce;">param</span><span style="color:#d08770;">1</span><span style="color:#c0c5ce;">: param</span><span style="color:#d08770;">2</span><span style="color:#c0c5ce;">: {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">#</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">Function</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">Body</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<p>Here, param1, param2, and so on are the inputs (arguments) to the function. This
allows you to write reusable functions where you only need to provide specific
data, such as a username or unique ID, and the function handles the boilerplate
parts of the links.</p>
<p>You might notice that functions in Nix don’t have a name. Nix functions are
similar to closures in Rust, This means you can’t call them directly by name,
they are anonymous. To use them, you must bind the function to a variable. Once
bound, you can call the variable like a named function.</p>
<p>Here’s an example:</p>
<h3>without funtions</h3>
<pre style="background-color:#2b303b;"><code class="language-json"><span style="color:#c0c5ce;">{ </span><span style="background-color:#bf616a;color:#2b303b;">...</span><span style="color:#c0c5ce;"> }:
</span><span style="color:#c0c5ce;">let
</span><span style="color:#c0c5ce;">in
</span><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">programs.newsboat</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">{</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">        </span><span style="background-color:#bf616a;color:#2b303b;">enable</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">true;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">        </span><span style="background-color:#bf616a;color:#2b303b;">urls</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">            </span><span style="background-color:#bf616a;color:#2b303b;">{tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">articles</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://proton.me/blog/feed</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">}
</span><span style="color:#c0c5ce;">            { </span><span style="background-color:#bf616a;color:#2b303b;">#</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">normal</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">way</span><span style="color:#c0c5ce;"> 
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">music</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@JFlaMusic</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">            }
</span><span style="color:#c0c5ce;">            { 
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">movies</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@DanMurrellMovies</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">            }
</span><span style="color:#c0c5ce;">            { 
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">programming</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@jonhoo</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">            }
</span><span style="color:#c0c5ce;">            { 
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">programming</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">                </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@ThePrimeagen</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">            }
</span><span style="color:#c0c5ce;">            # and so on...
</span><span style="color:#c0c5ce;">        ]
</span><span style="color:#c0c5ce;">    };
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<h3>with funtions</h3>
<pre style="background-color:#2b303b;"><code class="language-json"><span style="color:#c0c5ce;">{ </span><span style="background-color:#bf616a;color:#2b303b;">...</span><span style="color:#c0c5ce;"> }:
</span><span style="color:#c0c5ce;">let
</span><span style="color:#c0c5ce;">    Youtube = userName: tags: {
</span><span style="color:#c0c5ce;">        </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">tags;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">        </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@${userName}</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    };
</span><span style="color:#c0c5ce;">in
</span><span style="color:#c0c5ce;">    {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">programs.newsboat</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">{</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">        </span><span style="background-color:#bf616a;color:#2b303b;">enable</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">true;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">        </span><span style="background-color:#bf616a;color:#2b303b;">urls</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">            </span><span style="background-color:#bf616a;color:#2b303b;">{tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">articles</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://proton.me/blog/feed</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">}
</span><span style="color:#c0c5ce;">            (Youtube &quot;</span><span style="color:#a3be8c;">JFlaMusic</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">music</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">            (Youtube &quot;</span><span style="color:#a3be8c;">DanMurrellMovies</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">movies</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">            (Youtube &quot;</span><span style="color:#a3be8c;">jonhoo</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">programming</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">            (Youtube &quot;</span><span style="color:#a3be8c;">ThePrimeagen</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">programming</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">            # and so on...
</span><span style="color:#c0c5ce;">        ]
</span><span style="color:#c0c5ce;">    };
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<p>This approach is much cleaner and simplifies debugging in the future. If the API
for RSS changes, you only need to update a single line in the function
definition, rather than rewriting all the occurrences.</p>
<h1>Final code</h1>
<pre style="background-color:#2b303b;"><code class="language-json"><span style="color:#c0c5ce;">{ </span><span style="background-color:#bf616a;color:#2b303b;">...</span><span style="color:#c0c5ce;"> }:
</span><span style="color:#c0c5ce;">let
</span><span style="color:#c0c5ce;">instagramFeeds = users: map ( userNames: {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">instagram</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/picuki/profile/${userNames}</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    }) users;
</span><span style="color:#c0c5ce;">twitterFeeds = users: map ( userNames: {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">twitter</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://nitter.privacydev.net/${userNames}/rss</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    }) users;
</span><span style="color:#c0c5ce;">redditFeeds = users: map ( userNames: {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">reddit</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://www.reddit.com/r/${userNames}.rss</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    }) users;
</span><span style="color:#c0c5ce;">youTubeFeeds = users: map ( userNames: {
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@${userNames}</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    }) users;
</span><span style="color:#c0c5ce;">Youtube = userName: tags: {
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">tags;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/user/@${userName}</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">};
</span><span style="color:#c0c5ce;">YoutubeId = channel_id: tags: {
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">tags;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://www.youtube.com/feeds/videos.xml?channel_id=${channel_id}</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">};
</span><span style="color:#c0c5ce;">YtMusicChart = category: countryCode: tags: {
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">tags;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/youtube/charts/${category}/${countryCode}/RightNow</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">};
</span><span style="color:#c0c5ce;">Spotify = category: name: id: {
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">music</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://rsshub.app/spotify/${category}/${id}</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">};
</span><span style="color:#c0c5ce;">in 
</span><span style="color:#c0c5ce;">{
</span><span style="color:#c0c5ce;">  </span><span style="background-color:#bf616a;color:#2b303b;">programs.newsboat</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">{</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">enable</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">true;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">browser</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">linkhandler</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">autoReload</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">false;</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    </span><span style="background-color:#bf616a;color:#2b303b;">urls</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">      </span><span style="background-color:#bf616a;color:#2b303b;">{tags</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">[</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">articles</span><span style="color:#c0c5ce;">&quot; </span><span style="background-color:#bf616a;color:#2b303b;">];</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">url</span><span style="color:#c0c5ce;"> </span><span style="background-color:#bf616a;color:#2b303b;">=</span><span style="color:#c0c5ce;"> &quot;</span><span style="color:#a3be8c;">https://feeds.feedburner.com/collabfund</span><span style="color:#c0c5ce;">&quot;</span><span style="background-color:#bf616a;color:#2b303b;">;</span><span style="color:#c0c5ce;">}
</span><span style="color:#c0c5ce;">      (Youtube &quot;</span><span style="color:#a3be8c;">CinemaStellar</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">movies</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">      (Youtube &quot;</span><span style="color:#a3be8c;">DanMurrellMovies</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">youtube</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">movies</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">      (YoutubeId &quot;</span><span style="color:#a3be8c;">UC7YOGHUfC1Tb6E4pudI9STA</span><span style="color:#c0c5ce;">&quot; [])
</span><span style="color:#c0c5ce;">      (YoutubeId &quot;</span><span style="color:#a3be8c;">UCP7WmQ_U4GB3K51Od9QvM0w</span><span style="color:#c0c5ce;">&quot; [])
</span><span style="color:#c0c5ce;">      (YtMusicChart &quot;</span><span style="color:#a3be8c;">TopSongs</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">in</span><span style="color:#c0c5ce;">&quot; [ &quot;</span><span style="color:#a3be8c;">YtMusic</span><span style="color:#c0c5ce;">&quot; ])
</span><span style="color:#c0c5ce;">      (Spotify &quot;</span><span style="color:#a3be8c;">playlist</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">Top Songs - Global</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">37i9dQZEVXbNG2KDcFcKOF</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">      (Spotify &quot;</span><span style="color:#a3be8c;">playlist</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">Top Songs - India</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">37i9dQZEVXbMWDif5SCBJq</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">      (Spotify &quot;</span><span style="color:#a3be8c;">artist</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">Halsey</span><span style="color:#c0c5ce;">&quot;            &quot;</span><span style="color:#a3be8c;">26VFTg2z8YR0cCuwLzESi2</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">      (Spotify &quot;</span><span style="color:#a3be8c;">artist</span><span style="color:#c0c5ce;">&quot; &quot;</span><span style="color:#a3be8c;">The Chainsmokers</span><span style="color:#c0c5ce;">&quot;  &quot;</span><span style="color:#a3be8c;">69GGBxA162lTqCwzJG5jLp</span><span style="color:#c0c5ce;">&quot;)
</span><span style="color:#c0c5ce;">      ]
</span><span style="color:#c0c5ce;">      ++ youTubeFeeds [
</span><span style="color:#c0c5ce;">        &quot;</span><span style="color:#a3be8c;">jonhoo</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">        &quot;</span><span style="color:#a3be8c;">LukeSmithxyz</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">        &quot;</span><span style="color:#a3be8c;">NoBoilerplate</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">        ]
</span><span style="color:#c0c5ce;">        ++ twitterFeeds [
</span><span style="color:#c0c5ce;">          &quot;</span><span style="color:#a3be8c;">jonhoo</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">          &quot;</span><span style="color:#a3be8c;">MikaPikaZo</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">        ]
</span><span style="color:#c0c5ce;">        ++ redditFeeds [
</span><span style="color:#c0c5ce;">          &quot;</span><span style="color:#a3be8c;">rust</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">          &quot;</span><span style="color:#a3be8c;">nixos</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">          &quot;</span><span style="color:#a3be8c;">unixporn</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">        ]
</span><span style="color:#c0c5ce;">        ++ instagramFeeds [
</span><span style="color:#c0c5ce;">          &quot;</span><span style="color:#a3be8c;">kartikaaryan</span><span style="color:#c0c5ce;">&quot;
</span><span style="color:#c0c5ce;">        ];
</span><span style="color:#c0c5ce;">
</span><span style="color:#c0c5ce;">    extraConfig = &#39;&#39;
</span><span style="color:#c0c5ce;">      bind-key j down
</span><span style="color:#c0c5ce;">      bind-key k up
</span><span style="color:#c0c5ce;">      &#39;&#39;;
</span><span style="color:#c0c5ce;">  };
</span><span style="color:#c0c5ce;">}
</span></code></pre>
]]></content>
  </entry>

  <entry>
    <title>How to Set Up GoDaddy Domain With GitHub Pages</title>
    <link href="https://abhinandh-s.github.io/articles/how-to-set-up-godaddy-domain-with-github-pages"/>
    <id>https://abhinandh-s.github.io/articles/how-to-set-up-godaddy-domain-with-github-pages</id>
    <updated>2024-10-19T00:00:00Z</updated>
    <summary>How to Set Up GoDaddy Domain With GitHub Pages.</summary>
    <content type="html"><![CDATA[<p>Congrats! You’ve finally bought yourself a domain, and now you're ready to
connect it to your GitHub Pages website. This guide will walk you through the
steps to set up your GoDaddy domain with GitHub Pages.</p>
<h1>Step 1: Configuring GitHub Pages</h1>
<p>First, ensure that your repository name follows the required naming convention
for GitHub Pages ie, your repository name must be your-username.github.io.</p>
<p>mine is: https://github.com/abhi-xyz/abhi-xyz.github.io</p>
<p>Once your repository is ready, navigate to the repository’s Settings.</p>
<h2>Enable GitHub Pages</h2>
<ol>
<li>Go to the Settings of your repository.</li>
<li>Scroll down to the Code and Automation section and select Pages.</li>
<li>Under Source, choose the branch that contains your static site. For most
cases, this will be the main or master branch.</li>
<li>For the directory, choose root (ie, the directory which the index.html is
situated).</li>
<li>Save the changes, and GitHub will start serving your site from
your-username.github.io.</li>
</ol>
<h1>Step 2: Setting Up DNS Records in GoDaddy</h1>
<p>Now that your GitHub Pages site is live, the next step is to point your custom
GoDaddy domain to GitHub Pages.</p>
<h2>Add DNS Records in GoDaddy</h2>
<ol>
<li>Log in to your <a href="https://www.godaddy.com/">GoDaddy account</a>.</li>
<li>Under <strong>My Products</strong>, find your domain and click DNS to manage its DNS
settings.</li>
<li>Add the following entries in the DNS management settings:</li>
</ol>
<p><img src="/static/articles/how-to-set-up-GoDaddy-domain-with-gitHub-pages/01-godaddy-dns-management.avif" alt="add these entries in GoDaddy's DNS management settings" /></p>
<ul>
<li>Type: A</li>
<li>Name: @</li>
<li>Value: 185.199.108.153 (Values might change so refer this
<a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-an-apex-domain">instructions</a>
and put aprropriate values.)</li>
</ul>
<p>(Repeat this for all four IPs: 185.199.108.153, 185.199.109.153,
185.199.110.153, 185.199.111.153)</p>
<ul>
<li>TTL: 600 seconds (default is fine)</li>
</ul>
<ol start="4">
<li>Add a CNAME record as well: (optional if you want to set www with
yourdomain.com. ie, www.yourdomain.com)</li>
</ol>
<ul>
<li>Type: CNAME</li>
<li>Name: www</li>
<li>Value: your-username.github.io</li>
<li>TTL: 600 seconds</li>
</ul>
<p>Save the changes.</p>
<h1>Step 3: Configuring a Custom Domain in GitHub Pages</h1>
<p>Once you’ve set up the DNS records in GoDaddy, go back to your GitHub
repository.</p>
<p>Head to Settings &gt; Pages.</p>
<p><img src="/static/articles/how-to-set-up-GoDaddy-domain-with-gitHub-pages/01-github-pages.avif" alt="github-pages" /></p>
<p>Scroll down to the Custom Domain section.</p>
<p><img src="/static/articles/how-to-set-up-GoDaddy-domain-with-gitHub-pages/01-github-pages-settings.avif" alt="github-pages settings" /></p>
<p>Enter your GoDaddy domain (e.g., yourdomain.com) in the field. GitHub will
automatically create a CNAME file in the root directory of your repository. This
file tells GitHub that your website is linked to this custom domain.</p>
<p><img src="/static/articles/how-to-set-up-GoDaddy-domain-with-gitHub-pages/01-docs-folder.avif" alt="generated CNAME file in root" /></p>
<p>After adding the domain, GitHub Pages will take a few minutes to process the
changes.</p>
<h1>Step 4: Check SSL/TLS and HTTPS</h1>
<p>After configuring your custom domain, it's crucial to ensure that your website
is served securely over HTTPS. GitHub Pages offers built-in support for HTTPS
through Let's Encrypt, which is a major advantage over traditional domain
providers like GoDaddy.</p>
<ol>
<li>Go to your repository's Settings.</li>
<li>In the GitHub Pages section, look for the option to Enforce HTTPS.</li>
<li>Enable the Enforce HTTPS checkbox. This will ensure that visitors are
automatically redirected to the secure version (HTTPS) of your site.</li>
</ol>
<p>However, after adding your domain, you may encounter a message saying, &quot;TLS
certificate is being provisioned&quot;. This is completely normal and indicates that
GitHub is working with Let's Encrypt to issue your SSL certificate. You may need
to refresh the page after some time if the Enforce HTTPS option is disabled at
first.</p>
<p><img src="/static/articles/how-to-set-up-GoDaddy-domain-with-gitHub-pages/tls_provisioned.avif" alt="TLS certificate provisioned" /></p>
<h2>Why HTTPS Matters</h2>
<p>Normally, domains purchased from GoDaddy or other providers are routed through
HTTP by default, which means your site won't be secure. When someone visits your
site, their browser will display a warning indicating that the site is not
secure, which can drive away visitors.</p>
<p>If you were to purchase a SSL certificate from GoDaddy, it could cost you
approximately ₹4999 annually. However, by using GitHub Pages, you get a free TLS
certificate through Let's Encrypt, giving you secure, encrypted access to your
website without additional costs. This is one of the key benefits of using
GitHub Pages for hosting!</p>
<p>Once the DNS settings propagate (which may take between 24-48 hours), your
GitHub Pages site will be securely accessible through your custom GoDaddy domain
over HTTPS.</p>
<p>That’s it! You've successfully set up your GoDaddy domain with GitHub Pages. 🎉
Enjoy your new, secure website!</p>
]]></content>
  </entry>

  <entry>
    <title>Hello World</title>
    <link href="https://abhinandh-s.github.io/articles/hello-world"/>
    <id>https://abhinandh-s.github.io/articles/hello-world</id>
    <updated>2024-06-26T00:00:00Z</updated>
    <summary>My first blog entry.</summary>
    <content type="html"><![CDATA[<p>Welcome to my first blog post! This content is written in Markdown and styled
using GitHub Flavored Markdown.</p>
<h1>Heading 01</h1>
<h2>Heading 02</h2>
<h3>Heading 03</h3>
<h4>Heading 04</h4>
<h5>Heading 05</h5>
<h6>Heading 06</h6>
<h2>Unordered Lists</h2>
<ul>
<li>Item one</li>
<li>Item two
<ul>
<li>Sub-item A (indent 2 or 4 spaces)</li>
<li>Sub-item B</li>
</ul>
</li>
<li>Item three</li>
</ul>
<h2>Ordered Lists</h2>
<ol>
<li>First thing</li>
<li>Second thing</li>
<li>Third thing
<ol>
<li>Nested ordered item</li>
</ol>
</li>
</ol>
<blockquote>
<p>Block quote</p>
</blockquote>
<blockquote>
<p>[!IMPORTANT]
This is important
Important	Purple	.markdown-alert-important</p>
</blockquote>
<blockquote>
<p>[!NOTE]
This is a note
Note	Blue	.markdown-alert-note</p>
</blockquote>
<blockquote>
<p>[!TIP]
This is a tip
Tip	Green	.markdown-alert-tip</p>
</blockquote>
<blockquote>
<p>[!WARNING]
This is a warning
Warning	Yellow/Orange	.markdown-alert-warning</p>
</blockquote>
<blockquote>
<p>[!CAUTION]
This is a caution
Caution  Red 	.markdown-alert-caution</p>
</blockquote>
<h2>CheckBoxes</h2>
<ul>
<li>[x] Done</li>
<li>[ ] Not done</li>
</ul>
<h2>Spoilers</h2>
<p>Lorem Ipsum is simply ||dummy text|| of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</p>
<pre style="background-color:#2b303b;"><code class="language-Rust"><span style="color:#96b5b4;">main</span><span style="color:#c0c5ce;">() {
</span><span style="color:#c0c5ce;">    println!(&quot;</span><span style="color:#a3be8c;">hello world!</span><span style="color:#c0c5ce;">&quot;);
</span><span style="color:#c0c5ce;">}
</span></code></pre>
<h2>Features</h2>
<ul>
<li><strong>Light and Dark Mode</strong> support</li>
<li>Code highlighting:
<pre style="background-color:#2b303b;"><code class="language-javascript"><span style="color:#c0c5ce;">console.</span><span style="color:#96b5b4;">log</span><span style="color:#c0c5ce;">(&quot;</span><span style="color:#a3be8c;">Hello, JavaScript!</span><span style="color:#c0c5ce;">&quot;);
</span></code></pre>
</li>
</ul>
]]></content>
  </entry>

</feed>
