<?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: Lakshya Varshney</title>
    <description>The latest articles on DEV Community by Lakshya Varshney (@lakshya_varshney_52037684).</description>
    <link>https://dev.to/lakshya_varshney_52037684</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4074920%2F1a3b2ead-c1c3-4dfd-b11c-5ccc19c64c26.png</url>
      <title>DEV Community: Lakshya Varshney</title>
      <link>https://dev.to/lakshya_varshney_52037684</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lakshya_varshney_52037684"/>
    <language>en</language>
    <item>
      <title>I Rebuilt Git Without Git — 3,390 Lines of Python, Zero Dependencies</title>
      <dc:creator>Lakshya Varshney</dc:creator>
      <pubDate>Thu, 03 Sep 2026 13:51:20 +0000</pubDate>
      <link>https://dev.to/lakshya_varshney_52037684/i-rebuilt-git-without-git-3390-lines-of-python-zero-dependencies-ac2</link>
      <guid>https://dev.to/lakshya_varshney_52037684/i-rebuilt-git-without-git-3390-lines-of-python-zero-dependencies-ac2</guid>
      <description>&lt;h2&gt;
  
  
  I Rebuilt Git Without Git — 3,390 Lines of Python, Zero Dependencies
&lt;/h2&gt;

&lt;p&gt;For the Zero Dependency Hackathon, I decided not to build another application that simply happens to have an empty &lt;code&gt;requirements.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wanted to answer a harder question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much of a real developer tool can you rebuild from scratch using only Python's standard library?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My answer is &lt;strong&gt;pygit&lt;/strong&gt; — a content-addressed, Git-like version control system implemented in a &lt;strong&gt;single Python file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3,390 lines.&lt;br&gt;
1 Python file.&lt;br&gt;
141 tests.&lt;br&gt;
30 commands.&lt;br&gt;
0 external dependencies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And no, it isn't a wrapper around Git.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pygit_single.py&lt;/code&gt; never invokes the real &lt;code&gt;git&lt;/code&gt; executable. The object model, staging area, refs, merge logic, CLI, and synchronization protocol are implemented from scratch.&lt;/p&gt;
&lt;h2&gt;
  
  
  The packages I would normally install
&lt;/h2&gt;

&lt;p&gt;If I wanted to build something like this in Python, there are plenty of libraries that could handle much of the work.&lt;/p&gt;

&lt;p&gt;I could reach for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitPython / dulwich / pygit2&lt;/strong&gt; for Git functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;diff-match-patch&lt;/strong&gt; for diffing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;zstandard / python-lz4&lt;/strong&gt; for compression&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyYAML&lt;/strong&gt; for structured state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click / Typer&lt;/strong&gt; for the CLI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;requests / paramiko&lt;/strong&gt; for networking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pathspec&lt;/strong&gt; for gitignore-style matching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pytest&lt;/strong&gt; for testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, I removed the dependencies entirely.&lt;/p&gt;

&lt;p&gt;The challenge wasn't simply deleting &lt;code&gt;requirements.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The challenge was &lt;strong&gt;rebuilding what those packages normally give you&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What did I actually build?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Content-addressed object storage
&lt;/h3&gt;

&lt;p&gt;The foundation of pygit is a content-addressed object model.&lt;/p&gt;

&lt;p&gt;Files become blobs, directory structures become trees, commits contain tree and parent references, and tags point to commits.&lt;/p&gt;

&lt;p&gt;Objects are hashed using &lt;code&gt;hashlib.sha256&lt;/code&gt;, compressed with &lt;code&gt;zlib&lt;/code&gt;, and stored as loose objects or packed during garbage collection.&lt;/p&gt;

&lt;p&gt;No database.&lt;br&gt;
No Git library.&lt;/p&gt;

&lt;p&gt;Just Python's standard library and the filesystem.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs6smga9j3h0ufvz70jqz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs6smga9j3h0ufvz70jqz.png" alt="Internal Architecture" width="800" height="1333"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. A real staging area
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;add&lt;/code&gt; builds a JSON index mapping paths to blob hashes.&lt;/p&gt;

&lt;p&gt;Branch switching doesn't just change a pointer — the index is rebuilt from the target tree while the working tree is updated, keeping &lt;code&gt;status&lt;/code&gt; consistent after a checkout.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Three-way merging
&lt;/h3&gt;

&lt;p&gt;One of the most important parts I wanted to implement rather than fake was merging.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pygit&lt;/code&gt; performs three-way merges using &lt;code&gt;difflib.SequenceMatcher&lt;/code&gt; at the line level.&lt;/p&gt;

&lt;p&gt;It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast-forward merges&lt;/li&gt;
&lt;li&gt;Clean three-way merges&lt;/li&gt;
&lt;li&gt;Conflicting merges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When changes actually collide, it produces genuine conflict markers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;
=======
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and returns a non-zero exit status rather than silently resolving the conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A surprisingly large Git-style command surface
&lt;/h3&gt;

&lt;p&gt;This isn't just &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, and &lt;code&gt;commit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;30 commands&lt;/strong&gt;, including:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;tag&lt;/code&gt;, &lt;code&gt;reset&lt;/code&gt;, &lt;code&gt;stash&lt;/code&gt;, &lt;code&gt;cherry-pick&lt;/code&gt;, &lt;code&gt;rebase&lt;/code&gt;, &lt;code&gt;revert&lt;/code&gt;, &lt;code&gt;reflog&lt;/code&gt;, &lt;code&gt;blame&lt;/code&gt;, &lt;code&gt;gc&lt;/code&gt;, &lt;code&gt;clean&lt;/code&gt;, &lt;code&gt;remote&lt;/code&gt;, &lt;code&gt;serve&lt;/code&gt;, &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;, and &lt;code&gt;config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I also tested behavior against real Git where there was a meaningful comparison to make, including failure cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that really had no package to hide behind: networking
&lt;/h2&gt;

&lt;p&gt;For remote synchronization, I didn't use Git's protocol or install a networking abstraction.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pygit&lt;/code&gt; has its own client/server synchronization protocol.&lt;/p&gt;

&lt;p&gt;A clone/fetch follows a flow like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client → WANT &amp;lt;ref&amp;gt;
server → TIP &amp;lt;sha&amp;gt;
client → HAVE &amp;lt;known shas&amp;gt;
server → streams missing objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push performs a fast-forward check and refuses to update a remote when the histories have diverged.&lt;/p&gt;

&lt;p&gt;The transport uses Python's standard-library &lt;code&gt;socket&lt;/code&gt;, with binary length-framed object transfer.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No requests.&lt;br&gt;
No paramiko.&lt;br&gt;
No Git wire protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just sockets and a protocol designed for pygit.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faimv2mcdgayvntshuhnn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faimv2mcdgayvntshuhnn.png" alt="custom sync protocol" width="800" height="933"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What replacing the dependencies looked like
&lt;/h2&gt;

&lt;p&gt;This is where the "zero dependency" requirement became an actual engineering challenge.&lt;/p&gt;

&lt;p&gt;The substitution table ended up looking like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Normally install&lt;/th&gt;
&lt;th&gt;I used instead&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitPython / dulwich / pygit2&lt;/td&gt;
&lt;td&gt;My own implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;diff libraries&lt;/td&gt;
&lt;td&gt;&lt;code&gt;difflib&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zstandard / lz4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zlib&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyYAML&lt;/td&gt;
&lt;td&gt;&lt;code&gt;json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Click / Typer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;argparse&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;requests / paramiko&lt;/td&gt;
&lt;td&gt;&lt;code&gt;socket&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pathspec&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fnmatch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pytest&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unittest&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Directory-walking helpers&lt;/td&gt;
&lt;td&gt;&lt;code&gt;os.walk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These aren't hypothetical substitutions. &lt;code&gt;STDLIB.md&lt;/code&gt; documents the replacements and states that each row is backed by an actual import/use in the codebase.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F29y4ppjz4f8xy5d0hl49.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F29y4ppjz4f8xy5d0hl49.png" alt="zero dependency map" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;The final implementation is a single Python source file.&lt;/p&gt;

&lt;p&gt;There is no packaging step.&lt;/p&gt;

&lt;p&gt;There is no &lt;code&gt;pip install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is no vendored dependency tree.&lt;/p&gt;

&lt;p&gt;There is no subprocess call to Git.&lt;/p&gt;

&lt;p&gt;Running it is simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 pygit_single.py init
python3 pygit_single.py add &lt;span class="nb"&gt;.&lt;/span&gt;
python3 pygit_single.py commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"First commit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project has &lt;strong&gt;141 tests&lt;/strong&gt; covering object serialization, repository operations, diffs, status, ignore rules, all three merge paths, stash, tags, reset, reflog, cherry-pick, rebase, revert, packfiles, garbage collection, blame, cleanup safety, colored output, and the network protocol.&lt;/p&gt;

&lt;p&gt;The project also has a reproducibility check based on the SHA-256 of the source file, so the exact source a judge evaluates can be independently verified.&lt;/p&gt;

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

&lt;p&gt;The interesting lesson wasn't simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You can use Python's standard library."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We already know that.&lt;/p&gt;

&lt;p&gt;The interesting lesson was that &lt;strong&gt;dependencies often represent engineering decisions that you have to make yourself when you remove them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A library doesn't just save lines of code.&lt;/p&gt;

&lt;p&gt;It saves you from thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Object formats&lt;/li&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;li&gt;Merge semantics&lt;/li&gt;
&lt;li&gt;Filesystem state&lt;/li&gt;
&lt;li&gt;Protocol framing&lt;/li&gt;
&lt;li&gt;History traversal&lt;/li&gt;
&lt;li&gt;Failure modes&lt;/li&gt;
&lt;li&gt;CLI behavior&lt;/li&gt;
&lt;li&gt;Testing infrastructure&lt;/li&gt;
&lt;li&gt;Edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building pygit forced me to understand those pieces instead of treating them as black boxes.&lt;/p&gt;

&lt;p&gt;That's what made the project worth building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pygit is my submission to the Zero Dependency Hackathon — Track A: Developer Tools &amp;amp; CLI.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Project
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Lakshya-Varshney/pygit?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;GitHub Repository — Lakshya-Varshney/pygit&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://youtu.be/s9El2HzCo30?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Watch the pygit demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #ZeroDependencyHack #Python #OpenSource #Git #DeveloperTools #CLI #PythonStandardLibrary #BuildInPublic
&lt;/h2&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>git</category>
      <category>developertools</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Lakshya Varshney</dc:creator>
      <pubDate>Wed, 12 Aug 2026 13:51:04 +0000</pubDate>
      <link>https://dev.to/lakshya_varshney_52037684/-2482</link>
      <guid>https://dev.to/lakshya_varshney_52037684/-2482</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/codewitharyan29/porting-natsort-to-rust-taught-me-that-it-compiles-is-the-easy-5-2ac3" class="crayons-story__hidden-navigation-link"&gt;Porting natsort to Rust taught me that "it compiles" is the easy 5%&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/jVz_2AP4U4w" title="Porting natsort to Rust taught me that &amp;quot;it compiles&amp;quot; is the easy 5%"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/codewitharyan29" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4065878%2F04861b36-4758-40cc-88c6-b96cee0bd97f.png" alt="codewitharyan29 profile" class="crayons-avatar__image" width="420" height="420"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/codewitharyan29" class="crayons-story__secondary fw-medium m:hidden"&gt;
              codewitharyan29
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                codewitharyan29
                
                
              
              &lt;div id="story-author-preview-content-4333366" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/codewitharyan29" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4065878%2F04861b36-4758-40cc-88c6-b96cee0bd97f.png" class="crayons-avatar__image" alt="" width="420" height="420"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;codewitharyan29&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/codewitharyan29/porting-natsort-to-rust-taught-me-that-it-compiles-is-the-easy-5-2ac3" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/codewitharyan29/porting-natsort-to-rust-taught-me-that-it-compiles-is-the-easy-5-2ac3" id="article-link-4333366"&gt;
          Porting natsort to Rust taught me that "it compiles" is the easy 5%
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/algorithms"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;algorithms&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rust"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rust&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/codewitharyan29/porting-natsort-to-rust-taught-me-that-it-compiles-is-the-easy-5-2ac3" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;21&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/codewitharyan29/porting-natsort-to-rust-taught-me-that-it-compiles-is-the-easy-5-2ac3#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
