<?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: Aarav Rana</title>
    <description>The latest articles on DEV Community by Aarav Rana (@devnotes).</description>
    <link>https://dev.to/devnotes</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%2F3368878%2F896b9e12-4875-4b49-959a-60bfc144defb.webp</url>
      <title>DEV Community: Aarav Rana</title>
      <link>https://dev.to/devnotes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devnotes"/>
    <language>en</language>
    <item>
      <title>GraphRAG Pipeline: Airbyte Ingestion to Neo4j Knowledge Graph</title>
      <dc:creator>Aarav Rana</dc:creator>
      <pubDate>Sat, 17 Jan 2026 16:33:33 +0000</pubDate>
      <link>https://dev.to/devnotes/graphrag-pipeline-airbyte-ingestion-to-neo4j-knowledge-graph-3h3f</link>
      <guid>https://dev.to/devnotes/graphrag-pipeline-airbyte-ingestion-to-neo4j-knowledge-graph-3h3f</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I’ve spent the last year building RAG systems, and I’ve hit a hard ceiling.&lt;/p&gt;

&lt;p&gt;Vector databases are fantastic at finding similar text. If you ask, "How do I reset my password?", a vector search finds the password reset doc immediately.&lt;/p&gt;

&lt;p&gt;But they are terrible at relationships.&lt;/p&gt;

&lt;p&gt;If I ask my internal dev bot: "Who is currently working on the ticket related to the billing API latency?", a vector DB fails. It finds documents with "billing" and "latency," but it has no concept of "Assigned To" or "Created By." It sees words; it doesn't see the graph.&lt;/p&gt;

&lt;p&gt;To fix this, I stopped trying to force everything into vectors and moved to GraphRAG.&lt;/p&gt;

&lt;p&gt;This is the architecture I built to solve it: Airbyte handles the messy API extraction, Neo4j stores the topology, and Gemini 3.0 translates my English questions into Cypher queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/url?sa=E&amp;amp;q=https://github.com/RanaAarav/Airbyte-Neo4j-GraphRAG" rel="noopener noreferrer"&gt;View the Full Source Code on GitHub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;We aren't just moving tables; we are building a semantic network.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ingestion (Airbyte):&lt;/strong&gt; It pulls raw data (Issues, Pull Requests, Users) from GitHub/Jira/Salesforce instead of writing custom scrapers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage (Neo4j):&lt;/strong&gt; We need a native graph database to traverse deep relationships (e.g., User -&amp;gt; Team -&amp;gt; Ticket -&amp;gt; PR).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reasoning (Gemini 3.0 Pro):&lt;/strong&gt;  We need an LLM that is strictly logical to write accurate database queries. The 3.0 Pro model is significantly better at SQL/Cypher generation than previous iterations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Why I ditched Vector-Only RAG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my previous iteration of this project, I used a standard vector database. It worked fine for questions like "What is an error?" but failed miserably at "Who is responsible for the error?".&lt;/p&gt;

&lt;p&gt;I found that Vector DBs are great at Similarity but terrible at Topology. If the relationship between "User" and "Issue" isn't explicitly written in text (e.g., "John created issue #4"), the vector search misses it. Neo4j was the only way to make those invisible links visible to the LLM.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker &amp;amp; Docker Compose&lt;/strong&gt; installed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Airbyte&lt;/strong&gt; (Open Source version running locally).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Neo4j Database&lt;/strong&gt; (Neo4j Aura Free Tier or local Docker).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.10+&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Local Infrastructure
&lt;/h2&gt;

&lt;p&gt;I run Neo4j in Docker to keep my host machine clean. We need the apoc plugins enabled to handle some of the JSON parsing later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker-compose.yml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;neo4j&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;neo4j:5.15.0&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;graphrag-neo4j&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7474:7474"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7687:7687"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;NEO4J_AUTH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;neo4j/password&lt;/span&gt;
      &lt;span class="na"&gt;NEO4J_PLUGINS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;["apoc"]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: The "Airbyte" Data Dump
&lt;/h2&gt;

&lt;p&gt;When Airbyte syncs data into a database, it doesn't magically create a graph. It dumps "Raw Tables." For example, a GitHub Issue becomes a node labeled &lt;code&gt;_AirbyteRawGitHubIssues&lt;/code&gt; containing a giant JSON blob.&lt;/p&gt;

&lt;p&gt;To make this guide reproducible, I wrote a script that mimics this exact "Raw Destination" format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;src/seed_airbyte_data.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    CREATE (n:_AirbyteRawGitHubIssues {
        _airbyte_data: $data,
        _airbyte_ab_id: randomUUID()
    })
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;issue&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;Run the seeder:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python src/seed_airbyte_data.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have the data, but it's messy. It's just disconnected JSON files. This is where normal RAG faces limits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Transforming JSON to Graph
&lt;/h2&gt;

&lt;p&gt;This is the most critical part of the pipeline. We need to take those JSON files and "explode" them into entities.&lt;/p&gt;

&lt;p&gt;We need to tell the database: "Take the &lt;code&gt;user.login&lt;/code&gt; field from the Issue JSON, find the User node with that name, and draw a &lt;code&gt;:CREATED&lt;/code&gt; line between them."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;src/build_graph.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;transform_graph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        MATCH (r:_AirbyteRawGitHubUsers)
        WITH r, apoc.convert.fromJsonMap(r._airbyte_data) AS data
        MERGE (u:User {login: data.login})
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        MATCH (r:_AirbyteRawGitHubIssues)
        WITH r, apoc.convert.fromJsonMap(r._airbyte_data) AS data
        MERGE (i:Issue {id: data.id})

        WITH i, data
        MATCH (u:User {login: data.user.login})

        MERGE (u)-[:CREATED]-&amp;gt;(i)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the build script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python src/build_graph.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you check the Neo4j Browser now, you won't see isolated records. You'll see a web.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: The Agent (Gemini 3.0)
&lt;/h2&gt;

&lt;p&gt;Standard RAG searches for keywords. GraphRAG searches for paths.&lt;/p&gt;

&lt;p&gt;To make this work, we use LangChain to pipe our schema into Gemini 3.0 Pro. We have to be very strict with the prompt. LLMs hallucinate column names (guessing &lt;code&gt;username&lt;/code&gt; instead of &lt;code&gt;login&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;src/query_graph.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatGoogleGenerativeAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-3.0-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&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;CYPHER_GENERATION_TEMPLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Schema:
{schema}

CRITICAL RULES:
1. For User nodes, ALWAYS use the property &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;login&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.
2. The relationship is [:CREATED], do NOT guess [:AUTHORED].
3. Use &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CONTAINS&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; for partial string matching.

The question is: {question}
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GraphCypherQAChain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;cypher_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CYPHER_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Result
&lt;/h2&gt;

&lt;p&gt;Let's try a query that requires hopping from a User to an Issue based on a partial title match.&lt;/p&gt;

&lt;p&gt;Query: "Who created the issue about 'Memory Leak'?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generated Cypher:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;u:&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:CREATED&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;i:&lt;/span&gt;&lt;span class="n"&gt;Issue&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;toLower&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i.title&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;CONTAINS&lt;/span&gt; &lt;span class="n"&gt;toLower&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Memory Leak'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;u.login&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;💡 AI: ai_wizard created the issue.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fnw1a633jfp59rlpcp9nk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnw1a633jfp59rlpcp9nk.png" alt="Result demo" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;Building this pipeline made me realize that data topology is just as important as data content.&lt;/p&gt;

&lt;p&gt;By using Airbyte for the plumbing and Neo4j for the structure, we can build AI agents that actually understand context, not just keywords. And by leveraging Gemini 3.0 Pro, we get high-accuracy query generation without the massive cost overhead of older models.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/url?sa=E&amp;amp;q=https://github.com/RanaAarav/Airbyte-Neo4j-GraphRAG" rel="noopener noreferrer"&gt;View the Full Source Code on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>airbyte</category>
      <category>neo4j</category>
      <category>graphrag</category>
      <category>ai</category>
    </item>
    <item>
      <title>Serverless AI Agents on Civo: Replacing Docker with WebAssembly (Spin) and Rust</title>
      <dc:creator>Aarav Rana</dc:creator>
      <pubDate>Sat, 17 Jan 2026 16:33:11 +0000</pubDate>
      <link>https://dev.to/devnotes/serverless-ai-agents-on-civo-replacing-docker-with-webassembly-spin-and-rust-20ch</link>
      <guid>https://dev.to/devnotes/serverless-ai-agents-on-civo-replacing-docker-with-webassembly-spin-and-rust-20ch</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Performance benchmarks for AI agents often overlook the impact of cold-start latency. While Docker remains the industry standard for containerization, its resource overhead is a significant bottleneck for ephemeral AI workloads. Wrapping a simple inference agent in a 2GB Linux container is inefficient, especially when scaling hundreds of instances on a Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;WebAssembly (Wasm) offers a high-performance alternative. By compiling Rust-based agents into Wasm modules, we can achieve binary sizes under 5MB and near-instant execution. This guide demonstrates how to deploy these modules on a Civo K3s cluster using SpinKube to optimize both cost and infrastructure density.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/url?sa=E&amp;amp;q=https://github.com/RanaAarav/CIVO-Spin-AI-Agent" rel="noopener noreferrer"&gt;&lt;strong&gt;View the Full Source Code on GitHub&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Bottleneck
&lt;/h2&gt;

&lt;p&gt;I started this experiment because I was hitting a wall with my Docker-based agents. On a standard K3s node, pulling a 2GB PyTorch container took about 14 seconds on a cold start. For a chatbot that needs to reply instantly, that's unacceptable.&lt;/p&gt;

&lt;p&gt;By switching to this Rust/Wasm architecture, I didn't just "optimize" code—I changed the physics of the deployment.&lt;/p&gt;

&lt;p&gt;Docker Cold Start: ~14.2s&lt;br&gt;
Wasm Cold Start: ~0.04s&lt;/p&gt;


&lt;h2&gt;
  
  
  Why WASM on Civo?
&lt;/h2&gt;

&lt;p&gt;Civo’s K3s clusters are optimized for lightweight workloads. By pairing Civo with the Spin framework, we gain three distinct advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sub-millisecond Startups: WASM modules bypass the heavy initialization of the Linux kernel required by Docker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resource Efficiency: High pod density is achievable because Wasm modules share the host's runtime resources more efficiently than containers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Native AI Integration: The Spin SDK allows Wasm modules to offload LLM inference to the host nodes, removing the need to bundle heavy libraries like PyTorch or TensorFlow within the application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F6ue2zgh11vsjdvmn3wtr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ue2zgh11vsjdvmn3wtr.png" alt="WASM Architecture vs Docker" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Rust 1.84+&lt;/li&gt;
&lt;li&gt;  Spin CLI v3.0+.&lt;/li&gt;
&lt;li&gt;  Civo CLI&lt;/li&gt;
&lt;li&gt;  Helm&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step 1: The Infrastructure (Civo + SpinKube)
&lt;/h2&gt;

&lt;p&gt;Standard Kubernetes nodes are designed to execute OCI containers. To run Wasm binaries, we must install the SpinKube operator and a runtime shim.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Install the SpinKube Operator:&lt;/strong&gt; Use Helm to deploy the operator and the runtime class.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add kwasm http://kwasm.sh/kwasm-operator/
helm &lt;span class="nb"&gt;install &lt;/span&gt;kwasm-operator kwasm/kwasm-operator &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; kwasm &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; kwasmOperator.installer.type&lt;span class="o"&gt;=&lt;/span&gt;image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Annotate K3s Nodes:&lt;/strong&gt; Label your Civo nodes to enable the WASM runtime shim.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl annotate node &lt;span class="nt"&gt;--all&lt;/span&gt; kwasm.sh/kwasm-node&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Developing the Inference Agent
&lt;/h2&gt;

&lt;p&gt;We will build an agent that performs sentiment analysis using Llama 2. The Rust code utilizes the &lt;em&gt;spin_sdk::llm&lt;/em&gt; module to perform inference without managing model weights in memory.&lt;/p&gt;

&lt;p&gt;Logic (src/lib.rs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use spin_sdk::http::&lt;span class="o"&gt;{&lt;/span&gt;IntoResponse, Request, Response&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
use spin_sdk::http_component&lt;span class="p"&gt;;&lt;/span&gt;
use spin_sdk::llm&lt;span class="p"&gt;;&lt;/span&gt;
use std::str&lt;span class="p"&gt;;&lt;/span&gt;

const MODEL: llm::InferencingModel &lt;span class="o"&gt;=&lt;/span&gt; llm::InferencingModel::Llama2Chat&lt;span class="p"&gt;;&lt;/span&gt;

fn handle_request&lt;span class="o"&gt;(&lt;/span&gt;req: Request&lt;span class="o"&gt;)&lt;/span&gt; -&amp;gt; anyhow::Result&amp;lt;impl IntoResponse&amp;gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;let &lt;/span&gt;body &lt;span class="o"&gt;=&lt;/span&gt; req.body&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;let &lt;/span&gt;input_text &lt;span class="o"&gt;=&lt;/span&gt; str::from_utf8&lt;span class="o"&gt;(&lt;/span&gt;body&lt;span class="o"&gt;)&lt;/span&gt;.unwrap_or&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nb"&gt;let &lt;/span&gt;prompt &lt;span class="o"&gt;=&lt;/span&gt; format!&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;"Analyze the sentiment of this text and reply with only 'Positive', 'Negative', or 'Neutral': '{}'"&lt;/span&gt;,
        input_text
    &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nb"&gt;let &lt;/span&gt;result &lt;span class="o"&gt;=&lt;/span&gt; llm::infer&lt;span class="o"&gt;(&lt;/span&gt;MODEL, &amp;amp;prompt&lt;span class="o"&gt;)&lt;/span&gt;?&lt;span class="p"&gt;;&lt;/span&gt;

    Ok&lt;span class="o"&gt;(&lt;/span&gt;Response::builder&lt;span class="o"&gt;()&lt;/span&gt;
        .status&lt;span class="o"&gt;(&lt;/span&gt;200&lt;span class="o"&gt;)&lt;/span&gt;
        .header&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Content-Type"&lt;/span&gt;, &lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        .body&lt;span class="o"&gt;(&lt;/span&gt;format!&lt;span class="o"&gt;(&lt;/span&gt;r#&lt;span class="s2"&gt;"{{"&lt;/span&gt;sentiment&lt;span class="s2"&gt;": "&lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;"}}"&lt;/span&gt;&lt;span class="c"&gt;#, result.text.trim()))&lt;/span&gt;
        .build&lt;span class="o"&gt;())&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Compiling to WebAssembly
&lt;/h2&gt;

&lt;p&gt;We target the WebAssembly System Interface (WASI) to ensure the binary is portable across any infrastructure running a compatible shim.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Configure the Build:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In your &lt;em&gt;spin.toml&lt;/em&gt;, ensure the build command points to the wasip1 target.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[component.civo-spin-ai-agent]&lt;/span&gt;
&lt;span class="py"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"target/wasm32-wasip1/release/civo_spin_ai_agent.wasm"&lt;/span&gt;
&lt;span class="py"&gt;build&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cargo build --target wasm32-wasip1 --release"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; Execute the Build:
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;p&gt;Upon completion, the resulting .wasm file should be approximately 2.5MB. This is a massive reduction in deployment size compared to a 2GB Python-based Docker image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0inl0jzffdmqxhvhk6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0inl0jzffdmqxhvhk6e.png" alt="Working Finished Code" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Production Deployment
&lt;/h2&gt;

&lt;p&gt;We package the Wasm binary as an OCI artifact and push it to a registry.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Push the Artifact:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spin registry login ghcr.io

spin registry push ghcr.io/RanaAarav/CIVO-Spin-AI-Agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; Deploy to Kubernetes:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We don't need to write a YAML file manually. Spin creates the "Runtime Class" configuration for us.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spin kube scaffold &lt;span class="nt"&gt;--from&lt;/span&gt; ghcr.io/RanaAarav/CIVO-Spin-AI-Agent/deploy/k8s-deployment.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; Apply it:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s-deployment.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Testing the Agent
&lt;/h2&gt;

&lt;p&gt;Now let's hit the endpoint. Since we didn't set up an Ingress for this demo, we'll port-forward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward svc/civo-agent 8000:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8000 &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"Civo Kubernetes is incredibly fast and easy to use."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By moving away from the "Docker-for-everything" mindset, we can build AI agents that are significantly leaner and faster. Using Rust and Wasm on Civo K3s reduces binary sizes by 99% and eliminates the cold-start latencies typically associated with containerized AI. As the serverless AI landscape evolves, this architecture provides a cost-effective and scalable foundation for real-time agentic applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/url?sa=E&amp;amp;q=https://github.com/RanaAarav/CIVO-Spin-AI-Agent" rel="noopener noreferrer"&gt;&lt;strong&gt;View the Source Code on GitHub&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webassembly</category>
      <category>kubernetes</category>
      <category>ai</category>
    </item>
    <item>
      <title>Beyond Git: Features Every Young Professional Should Know in 2025</title>
      <dc:creator>Aarav Rana</dc:creator>
      <pubDate>Sun, 21 Sep 2025 14:48:36 +0000</pubDate>
      <link>https://dev.to/devnotes/beyond-git-features-every-young-professional-should-know-in-2025-efb</link>
      <guid>https://dev.to/devnotes/beyond-git-features-every-young-professional-should-know-in-2025-efb</guid>
      <description>&lt;p&gt;Everyone knows &lt;strong&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/strong&gt;. They’re foundational.  &lt;/p&gt;

&lt;p&gt;But if you're building skills that stand out, there are several new GitHub practices &amp;amp; features that are becoming essential in 2025.&lt;/p&gt;

&lt;p&gt;Here are some features &amp;amp; best practices that fresh grads, interns, or early-career devs should be aware of, not just for doing the job, but doing it &lt;em&gt;professionally&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5lo30z2szok38e2lpny.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5lo30z2szok38e2lpny.jpg" alt="GitHub logo futuristic 2025" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Advanced Security with GitHub Advanced Security (GHAS)
&lt;/h3&gt;

&lt;p&gt;GitHub isn’t just a hosting platform anymore, it now offers more built-in protection for your code and dependencies than a team of testers.&lt;br&gt;
&lt;a href="https://docs.github.com/en/get-started/learning-about-github/about-github-advanced-security" rel="noopener noreferrer"&gt;Official GHAS docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key updates in 2025:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unbundled security products&lt;/strong&gt;:
As of September 2025, GHAS is split into two offerings:

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Secret Protection&lt;/strong&gt; → catches leaked secrets (API keys, credentials), includes push protection using AI-powered detection.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Code Security&lt;/strong&gt; → includes code scanning (via CodeQL), dependency review, Copilot Autofix, and security campaigns.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&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%2Fkvtt476xt0o2vaj3n6c7.webp" 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%2Fkvtt476xt0o2vaj3n6c7.webp" alt="GitHub Advanced Security diagram" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public vs Private repos&lt;/strong&gt;: 
Many security features are free for public repositories; for private/internal ones, you’ll often need GHAS.
Using these tools avoids vulnerabilities, supply chain risks, and shows safety in your workflow.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  2. Immutable Actions &amp;amp; Supply Chain Safety
&lt;/h3&gt;

&lt;p&gt;Supply chain security is a huge deal in 2025. GitHub now offers features to lock things down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Immutable Actions (preview)&lt;/strong&gt;
Instead of depending on mutable references like this:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You pin it to a commit hash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@93ea4e...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F2tn9dt8itck5s23rnd1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tn9dt8itck5s23rnd1p.png" alt="CI/CD Pipelines" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are distributed as OCI artifacts with provenance info.&lt;br&gt;
Immutable Releases (public preview)&lt;/p&gt;

&lt;p&gt;Once a release is marked immutable, its assets and Git tag cannot be changed. Attestations are generated automatically so you can verify provenance.&lt;br&gt;
&lt;a href="https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/immutable-releases" rel="noopener noreferrer"&gt;Immutable Releases docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This prevents tampering with actions or releases, protecting your builds and users.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. GitHub Previews (Spark, Copilot Spaces, etc.)
&lt;/h3&gt;

&lt;p&gt;AI is becoming a daily part of dev workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Copilot Agents &amp;amp; Mission Control&lt;/strong&gt; GitHub Agents can now fix bugs, generate PRs, or update docs automatically. The Agents Panel (“Mission Control”) lets you start tasks from anywhere and track progress.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Previews worth trying&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immutable Actions &lt;/li&gt;
&lt;li&gt;Copilot Autofix and deeper IDE integrations
&lt;/li&gt;
&lt;li&gt;GitHub Spark (lightweight collaboration tool)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&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%2Fuscrd556hpgym9vhyp9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuscrd556hpgym9vhyp9w.png" alt="Github Preview" width="800" height="445"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/features/preview" rel="noopener noreferrer"&gt;GitHub Previews&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Workflow &amp;amp; CI/CD Best Practices
&lt;/h3&gt;

&lt;p&gt;Beyond “Hello World” workflows, code needs maintainability and reusability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reusable workflows / templates&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./.github/workflows/build.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cache &amp;amp; split jobs&lt;/strong&gt; Speed up builds by caching dependencies and breaking workflows into parallel jobs.&lt;/li&gt;
&lt;/ul&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%2Fa70wy0zf7vc79gyn7a8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa70wy0zf7vc79gyn7a8g.png" alt="Workflow CI/CD" width="784" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-hosted runners&lt;/strong&gt; Required in orgs with sensitive infra. Know how to set them up &amp;amp; secure them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Networking requirements&lt;/strong&gt; With Immutable Actions, self-hosted runners must allow traffic to &lt;code&gt;pkg.actions.githubusercontent.com&lt;/code&gt; and &lt;code&gt;ghcr.io&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://github.blog/changelog/2025-02-12-notice-of-upcoming-deprecations-and-breaking-changes-for-github-actions" rel="noopener noreferrer"&gt;Breaking changes notice&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Branch protection &amp;amp; reviews&lt;/strong&gt; Configure required reviews, status checks, and security rules. These reflect professionalism.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Essentials Freshers Often Overlook 🧭
&lt;/h3&gt;

&lt;p&gt;These aren’t fancy, but they separate juniors from pros.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSH vs HTTPS:&lt;/strong&gt; HTTPS now requires PATs. SSH is smoother daily. Worth setting up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Managing multiple accounts:&lt;/strong&gt; Use &lt;code&gt;~/.ssh/config&lt;/code&gt; to handle work + personal + college accounts cleanly:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;Host github-work&lt;/span&gt;
  &lt;span class="s"&gt;HostName github.com&lt;/span&gt;
  &lt;span class="s"&gt;User git&lt;/span&gt;
  &lt;span class="s"&gt;IdentityFile ~/.ssh/id_rsa_work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;README.md = Your Project’s Resume&lt;/strong&gt; Include: intro, setup, usage, license, screenshots, badges.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CONTRIBUTING.md&lt;/strong&gt; Document contribution flow, coding style, PR etiquette. Maintainers &lt;em&gt;do&lt;/em&gt; notice.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Commit hygiene:&lt;/strong&gt; Small, clear commits with meaningful messages. Recruiters and reviewers value this more than people think.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fl5741nqw4n7ti23rjkxy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5741nqw4n7ti23rjkxy.jpg" alt="SSH KEY" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Why This Matters in 2025 (and Beyond)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security threats&lt;/strong&gt; are more sophisticated. Immutable releases/actions and GHAS are direct defenses.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI tools&lt;/strong&gt; are embedded in workflows, not optional extras. Early adopters gain an edge.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional Styling&lt;/strong&gt; (docs, workflows, secure pipelines) is &lt;em&gt;expected&lt;/em&gt; in modern dev environments.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Employers and open source maintainers&lt;/strong&gt; notice these things before they even look at your code.&lt;/li&gt;
&lt;/ul&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%2Fpcz9jpiteki8ipdhr857.webp" 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%2Fpcz9jpiteki8ipdhr857.webp" alt="Robot Holding a Shield" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Takeaway
&lt;/h3&gt;

&lt;p&gt;GitHub in 2025 is not just about &lt;strong&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security first&lt;/strong&gt; → GHAS, immutable actions/releases.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI productivity&lt;/strong&gt; → Copilot Agents, previews, automation.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional polish&lt;/strong&gt; → SSH, READMEs, CONTRIBUTING.md, commit hygiene.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the Github knowledge you'd want to beat 2025.&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>devops</category>
      <category>security</category>
    </item>
  </channel>
</rss>
