<?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: CH Amrut Prasad Patro</title>
    <description>The latest articles on DEV Community by CH Amrut Prasad Patro (@halloloid).</description>
    <link>https://dev.to/halloloid</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%2F3873200%2Fcaeab073-f208-4361-a008-cc959eb226e6.png</url>
      <title>DEV Community: CH Amrut Prasad Patro</title>
      <link>https://dev.to/halloloid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/halloloid"/>
    <language>en</language>
    <item>
      <title>Terminal Snake in Rust: A Systems Programming Journey</title>
      <dc:creator>CH Amrut Prasad Patro</dc:creator>
      <pubDate>Fri, 17 Apr 2026 13:34:55 +0000</pubDate>
      <link>https://dev.to/halloloid/terminal-snake-in-rust-a-systems-programming-journey-jma</link>
      <guid>https://dev.to/halloloid/terminal-snake-in-rust-a-systems-programming-journey-jma</guid>
      <description>&lt;h2&gt;
  
  
  Building Terminal Snake in Rust: A Systems Programming Journey
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkrr73c6ebqj221t49p1.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%2Fgkrr73c6ebqj221t49p1.gif" alt=" " width="144" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After completing The Rust Book through Chapter 8, I decided to build something practical to internalize ownership, borrowing, and structs. The result: a fully-functional terminal Snake game using &lt;code&gt;crossterm&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The game is built around four core structs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[derive(Clone,&lt;/span&gt; &lt;span class="nd"&gt;Copy,&lt;/span&gt; &lt;span class="nd"&gt;PartialEq)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Position&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u16&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Direction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Left&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Snake&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Position&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;snake&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Snake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Implementation Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Non-Blocking Input Handling&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The game loop runs at 80ms intervals, but we need to check for keyboard input without blocking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nn"&gt;event&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_millis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nn"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key_event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;event&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Process arrow keys&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern is crucial for game loops where the snake moves continuously even without input.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Snake Movement &amp;amp; Growth&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Movement is implemented by inserting a new head and removing the tail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;snake&lt;/span&gt;&lt;span class="py"&gt;.body&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_head_position&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;snake&lt;/span&gt;&lt;span class="py"&gt;.body&lt;/span&gt;&lt;span class="nf"&gt;.pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Remove tail (unless growing)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When food is eaten, we skip the &lt;code&gt;pop()&lt;/code&gt;, naturally growing the snake.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Efficient Rendering with Buffering&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of flushing every draw command (O(n) terminal updates), we batch them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;snake&lt;/span&gt;&lt;span class="py"&gt;.body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="nf"&gt;.queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;MoveTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="py"&gt;.x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="py"&gt;.y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
          &lt;span class="nf"&gt;.queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;style&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;PrintStyledContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"██"&lt;/span&gt;&lt;span class="nf"&gt;.yellow&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="nf"&gt;.flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Single flush for entire frame&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This eliminates flicker and improves performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Collision Detection Order Matters&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A subtle bug: checking body collision &lt;em&gt;after&lt;/em&gt; eating food caused false positives. The fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nf"&gt;check_wall_collision&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;check_body_collision&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// ← Check BEFORE eating food&lt;/span&gt;
&lt;span class="nf"&gt;check_food_collision&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Ownership &amp;amp; Borrowing in Practice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passing &lt;code&gt;&amp;amp;mut Game&lt;/code&gt; vs &lt;code&gt;&amp;amp;Game&lt;/code&gt; based on whether functions modify state&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;.clone()&lt;/code&gt; strategically for &lt;code&gt;Position&lt;/code&gt; (cheap Copy type)&lt;/li&gt;
&lt;li&gt;Managing mutable references across function boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pattern Matching Power:&lt;/strong&gt;&lt;br&gt;
Direction changes with validation (can't reverse into yourself):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;key_event&lt;/span&gt;&lt;span class="py"&gt;.code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;KeyCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Up&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nd"&gt;matches!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snake&lt;/span&gt;&lt;span class="py"&gt;.direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Memory Safety:&lt;/strong&gt;&lt;br&gt;
Zero &lt;code&gt;unsafe&lt;/code&gt; code, no memory leaks, no buffer overflows. Rust's compiler enforced correct resource management throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;crossterm&lt;/strong&gt; - Cross-platform terminal manipulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rand&lt;/strong&gt; - Random food spawning&lt;/li&gt;
&lt;li&gt;Raw mode terminal with alternate screen buffers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This project was a stepping stone toward my goal of becoming an ML Systems Engineer. Next up: building production Rust backends with Axum for async ML inference serving.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Halloloid/RustySnake" rel="noopener noreferrer"&gt;https://github.com/Halloloid/RustySnake&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What game would you build to learn a new language? Drop your thoughts below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>gamedev</category>
      <category>systems</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built DevBlog: A Medium-Style Platform with Redis Caching and Background Workers</title>
      <dc:creator>CH Amrut Prasad Patro</dc:creator>
      <pubDate>Sat, 11 Apr 2026 09:20:33 +0000</pubDate>
      <link>https://dev.to/halloloid/i-built-devblog-a-medium-style-platform-with-redis-caching-and-background-workers-378m</link>
      <guid>https://dev.to/halloloid/i-built-devblog-a-medium-style-platform-with-redis-caching-and-background-workers-378m</guid>
      <description>&lt;p&gt;I just launched &lt;strong&gt;DevBlog&lt;/strong&gt;—a blogging platform for developers to share technical content, projects, and in-progress ideas.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://dev-blog-post.vercel.app" rel="noopener noreferrer"&gt;https://dev-blog-post.vercel.app&lt;/a&gt; (currently running with demo data—feel free to create a post and test it out!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I wanted a space where developers could publish openly without the noise of social media, but with better engagement features than a static blog. Think Medium, but built for our workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;Here's what powers it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js backend&lt;/strong&gt; with Express&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; for dual purposes:

&lt;ul&gt;
&lt;li&gt;Hot cache layer for fast reads&lt;/li&gt;
&lt;li&gt;Background worker for async like processing (keeps the UI snappy)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;QStash&lt;/strong&gt; for view count synchronization&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;OAuth 2.0&lt;/strong&gt; for authentication&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cloudinary&lt;/strong&gt; for media uploads and optimization&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Dual-layer data architecture&lt;/strong&gt; (hot cache + persistent storage)&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Technical Decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why Redis for background workers?&lt;/strong&gt;&lt;br&gt;
Instead of blocking the request-response cycle when someone likes a post, I offload it to a Redis-backed worker. The UI responds instantly while the database update happens asynchronously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why QStash for view counts?&lt;/strong&gt;&lt;br&gt;
View tracking is high-frequency but low-priority. QStash batches these updates efficiently without hammering the database on every page load.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Right now it's running with demo data to see if there's interest. If people actually use it, I'll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move to a custom domain&lt;/li&gt;
&lt;li&gt;Build a recommendation engine&lt;/li&gt;
&lt;li&gt;Scale the infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Go ahead and &lt;strong&gt;create your first post&lt;/strong&gt;: &lt;a href="https://dev-blog-post.vercel.app" rel="noopener noreferrer"&gt;https://dev-blog-post.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature requests&lt;/li&gt;
&lt;li&gt;Any bugs you encounter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your thoughts below! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>node</category>
      <category>showdev</category>
      <category>redis</category>
    </item>
  </channel>
</rss>
