<?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: Yash Kumar Saini</title>
    <description>The latest articles on DEV Community by Yash Kumar Saini (@yashksaini).</description>
    <link>https://dev.to/yashksaini</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%2F1242333%2F27bdd497-8c93-4290-a901-94eec3759056.jpeg</url>
      <title>DEV Community: Yash Kumar Saini</title>
      <link>https://dev.to/yashksaini</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yashksaini"/>
    <language>en</language>
    <item>
      <title>Turning Weekly GitHub Activity Into Blog Posts on Notion + DEV.to</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Fri, 27 Mar 2026 19:07:08 +0000</pubDate>
      <link>https://dev.to/yashksaini/i-built-a-3-agent-pipeline-that-turns-my-github-activity-into-weekly-blog-posts-on-notion-devto-1ndn</link>
      <guid>https://dev.to/yashksaini/i-built-a-3-agent-pipeline-that-turns-my-github-activity-into-weekly-blog-posts-on-notion-devto-1ndn</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/notion-2026-03-04"&gt;Notion MCP Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every Monday standup, someone asks: "What did you work on last week?" And every Monday, I stare at my screen trying to remember. Did I merge that PR on Wednesday or Thursday? Was that refactor in the auth module or the pipeline? How many repos did I even touch?&lt;/p&gt;

&lt;p&gt;I got tired of that blank moment. So I built &lt;strong&gt;DevNotion&lt;/strong&gt; — a 3-agent pipeline powered by &lt;a href="https://mastra.ai" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt; that harvests my entire week of GitHub activity, narrates it into a first-person blog post using Gemini, and publishes it to Notion (as a planner-style page with structured tables) and DEV.to (as a draft article). Every Sunday, automatically, via GitHub Actions.&lt;/p&gt;

&lt;p&gt;No more Monday amnesia. The blog writes itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it actually does
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Harvests&lt;/strong&gt; my GitHub activity via GraphQL — commits, PRs, issues, code reviews, discussions, language stats, contribution streak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Narrates&lt;/strong&gt; the raw data into a casual, first-person blog post using Gemini (with a deterministic fallback if the LLM is unavailable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publishes&lt;/strong&gt; to two platforms simultaneously:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notion&lt;/strong&gt; — a planner-style page with stats tables, repo breakdowns, PR/issue/review tables, language breakdown, and the full blog post&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to&lt;/strong&gt; — a draft article ready for review&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Key features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3 specialized agents&lt;/strong&gt; — each does one thing well (harvest, narrate, publish)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM only where it adds value&lt;/strong&gt; — harvest and publish are deterministic, zero token overhead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 blog tone profiles&lt;/strong&gt; — casual (default), professional, technical, storytelling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planner-style Notion pages&lt;/strong&gt; — not just a wall of text, but structured tables with stats, repos, PRs, issues, reviews, and languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion MCP integration&lt;/strong&gt; — full Notion API surface via Model Context Protocol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion Markdown Content API&lt;/strong&gt; — write rich markdown directly to pages (the real game changer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV.to draft publishing&lt;/strong&gt; — articles created as drafts, ready to review and publish&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions CI&lt;/strong&gt; — weekly cron (Sundays 08:00 UTC) + manual dispatch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blog log in README&lt;/strong&gt; — CI auto-commits a metrics table after each run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback chain&lt;/strong&gt; — always produces a blog post, even if Gemini is down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting everywhere&lt;/strong&gt; — &lt;code&gt;p-queue&lt;/code&gt; + &lt;code&gt;p-retry&lt;/code&gt; for both Notion and DEV.to APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&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%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FDevNotion%2Fmaster%2Fassets%2FArchitecture.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%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FDevNotion%2Fmaster%2Fassets%2FArchitecture.png" alt="DevNotion pipeline Architecture" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Harvest&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github-harvest-agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetches weekly GitHub data via GraphQL (deterministic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Narrate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;narrator-agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes a first-person blog post from the data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish&lt;/td&gt;
&lt;td&gt;&lt;code&gt;publisher-agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates Notion planner page + DEV.to draft via direct APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pipeline only uses an LLM where it genuinely adds value — narration. Harvest and publish are pure function calls. No token overhead, no hallucination risk, faster execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Deep-Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why 3 agents, not 1?
&lt;/h3&gt;

&lt;p&gt;I could've built one mega-agent that does everything. But that's a recipe for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Burning tokens on deterministic work (fetching GitHub data doesn't need an LLM)&lt;/li&gt;
&lt;li&gt;Hallucinating URLs and stats (the publish step should never make things up)&lt;/li&gt;
&lt;li&gt;Debugging nightmares (which part of the monolith failed?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, each agent is a specialist. The workflow chains them together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weeklyDispatchWorkflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createWorkflow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;weekly-dispatch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;weekStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;outputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PublishOutputSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;harvestStep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;narrateStep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publishStep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three steps, chained with &lt;code&gt;.then()&lt;/code&gt;, committed as a single workflow. Mastra handles the data handoff between steps automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Harvest: deterministic data, zero LLM
&lt;/h3&gt;

&lt;p&gt;The harvest step calls GitHub's GraphQL API directly — no agent reasoning needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;harvestStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStep&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;harvest-github&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;weekStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;outputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WeeklyDataSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;inputData&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchWeeklyContributions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weekStart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;WeeklyDataSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&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;One GraphQL query pulls commits, PRs, issues, reviews, discussions, language stats, and contribution streak for the week. The response gets validated through a Zod schema. No LLM in the loop — this is pure data fetching.&lt;/p&gt;

&lt;h3&gt;
  
  
  Narrate: LLM with a fallback chain
&lt;/h3&gt;

&lt;p&gt;This is where the LLM earns its keep. The narrator agent takes raw JSON and writes a blog post that sounds like I wrote it myself. The system prompt has a full personality profile — it writes in first person, knows my tech stack (Python, Rust, TypeScript), references my OSS work, and matches one of four tone profiles.&lt;/p&gt;

&lt;p&gt;But LLMs can be flaky. So the narrate step has a fallback chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;narrateStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStep&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;narrate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mastra&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mastra&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;narrator-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseFrontmatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildFallbackNarration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;blog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildFallbackNarration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;weeklyData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;inputData&lt;/span&gt; &lt;span class="p"&gt;};&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gemini generates&lt;/strong&gt; a markdown blog with YAML frontmatter&lt;/li&gt;
&lt;li&gt;If parsing fails → &lt;strong&gt;deterministic fallback&lt;/strong&gt; builds a basic post from raw data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A blog post is always produced, even if Gemini is completely down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish: Notion planner + DEV.to draft
&lt;/h3&gt;

&lt;p&gt;The publish step is where things get interesting. It doesn't just dump text into Notion — it builds a &lt;strong&gt;planner-style page&lt;/strong&gt; with structured tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publishStep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStep&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;publish&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;inputData&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;weeklyData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// 1. Create Notion page&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createNotionPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Create DEV.to draft (so the link goes into the Notion planner)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;devtoResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createDevtoArticle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body_markdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;buildDevtoMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Write planner markdown to Notion (includes DEV.to link)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plannerMd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildPlannerMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weeklyData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;writeNotionMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;notionPageId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;plannerMd&lt;/span&gt;&lt;span class="p"&gt;);&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;The order matters: DEV.to draft gets created &lt;em&gt;before&lt;/em&gt; writing the Notion page content, so the Notion planner can include a link to the DEV.to draft. Cross-platform linking, done right.&lt;/p&gt;

&lt;p&gt;Each Notion page includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Published Links&lt;/strong&gt; table — Notion page URL + DEV.to draft edit link&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week at a Glance&lt;/strong&gt; — commits, PRs, issues, reviews, lines added/removed, streak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active Repositories&lt;/strong&gt; — repo name, commits, language, line changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull Requests / Issues / Reviews / Discussions&lt;/strong&gt; — structured tables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Languages&lt;/strong&gt; — top languages by commit count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full blog post&lt;/strong&gt; — the narrated content below a separator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2038152048533979142-162" src="https://platform.twitter.com/embed/Tweet.html?id=2038152048533979142"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2038152048533979142-162');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2038152048533979142&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;p&gt;&lt;a href="https://github.com/yashksaini-coder/DevNotion" rel="noopener noreferrer"&gt;&lt;br&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%2F4se6cggnvqbifg4yxllc.png" alt="DevNotion Project" width="800" height="420"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yashksaini-coder/DevNotion" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star DevNotion on GitHub&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Notion MCP
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most excited about. DevNotion uses the Notion MCP Server in two complementary ways:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Notion MCP Server via &lt;code&gt;@mastra/mcp&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The publisher agent integrates with the official &lt;a href="https://github.com/makenotion/notion-mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;@notionhq/notion-mcp-server&lt;/code&gt;&lt;/a&gt; through Mastra's MCP client. This gives the agent access to the &lt;strong&gt;full Notion API surface&lt;/strong&gt; via Model Context Protocol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MCPClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mastra/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;notionMcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MCPClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;notion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;npx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-y&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@notionhq/notion-mcp-server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;OPENAPI_MCP_HEADERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOTION_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Notion-Version&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2022-06-28&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30000&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;The MCP tools are loaded lazily with a graceful fallback — if the MCP server fails to start, the direct tools still work independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getNotionMcpTools&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;notionMcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MCP: Notion MCP server unavailable, using direct tools only&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{};&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;h3&gt;
  
  
  2. Direct tools + MCP tools merged
&lt;/h3&gt;

&lt;p&gt;The publisher agent merges both tool sets — MCP tools for the full Notion API surface, and direct tools for capabilities MCP doesn't cover:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Direct tools (Markdown Content API + DEV.to — not available via MCP)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;directTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;createNotionPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;createNotionPageTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;writeMarkdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;writeMarkdownTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;searchNotion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;searchNotionTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;updateNotionPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;updateNotionPageTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Merge: Notion MCP tools + direct tools&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcpTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getNotionMcpTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&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="nx"&gt;mcpTools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;directTools&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This dual approach means the publisher agent gets the best of both worlds — MCP's broad API surface for interactive use in the Mastra playground, plus direct tools for the automated workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Markdown Content API (the game changer)
&lt;/h3&gt;

&lt;p&gt;This is the Notion feature that made the planner-style pages possible. Instead of constructing Notion blocks one by one (which is painful and rate-limit-heavy), I write the entire page as markdown in one API call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.notion.com/v1/pages/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/markdown`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PATCH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOTION_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Notion-Version&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2026-03-11&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;replace_content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;replace_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;new_str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&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;One &lt;code&gt;PATCH&lt;/code&gt; request replaces the entire page content with rich markdown — including tables, headings, blockquotes, links, code blocks, everything. This is what powers the planner-style layout with structured stats tables + the full blog post, all in a single API call.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Rate limiting
&lt;/h3&gt;

&lt;p&gt;Notion's API allows roughly 3 requests per second. Every Notion call (MCP and direct) goes through a shared rate limiter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PQueue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;334&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;intervalCap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;rateLimited&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;pRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;&lt;code&gt;p-queue&lt;/code&gt; throttles concurrency, &lt;code&gt;p-retry&lt;/code&gt; handles transient failures. I learned this the hard way — without rate limiting, the Notion API will 429 you into oblivion when you're creating a page, writing markdown, and updating the icon in quick succession.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Rate limits are the real boss
&lt;/h3&gt;

&lt;p&gt;Notion (3 req/s), DEV.to (30 req/30s), GitHub GraphQL (5000 points/hr) — every API has its own throttle. I ended up with &lt;code&gt;p-queue&lt;/code&gt; + &lt;code&gt;p-retry&lt;/code&gt; wrappers around everything. The rate limiter code is almost identical across all three services, and honestly, it should probably be a shared utility. But three similar lines of code is better than a premature abstraction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured output is slower than you'd think
&lt;/h3&gt;

&lt;p&gt;I originally used Gemini's native JSON schema for structured output (&lt;code&gt;agent.generate(prompt, { structuredOutput: { schema } })&lt;/code&gt;). It worked, but added 20-40 seconds per call. Switching to plain text generation with YAML frontmatter parsing was 3-4x faster and just as reliable. The deterministic fallback catches the rare parsing failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini model musical chairs
&lt;/h3&gt;

&lt;p&gt;I've been through three Gemini models on this project: &lt;code&gt;gemini-2.5-flash-preview-04-17&lt;/code&gt; (retired), &lt;code&gt;gemini-2.5-flash&lt;/code&gt; (stable but slow for structured output), and now &lt;code&gt;gemini-3-flash-preview&lt;/code&gt; (current). The lesson: always make the model configurable via env vars. Hardcoding model IDs is a recipe for broken deploys.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Zod conflict that broke everything
&lt;/h3&gt;

&lt;p&gt;Mastra and my code both depend on Zod, but different versions. Having two Zod instances means &lt;code&gt;z.string()&lt;/code&gt; from one isn't recognized by the other — schema validation just silently fails. The fix: a single line in &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pnpm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"overrides"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"zod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$zod"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Forces pnpm to deduplicate to one Zod version. Took me way too long to figure that out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direct API calls beat agent reasoning for deterministic work
&lt;/h3&gt;

&lt;p&gt;The harvest and publish steps started as full agent calls. But an LLM doesn't add anything when the task is "call this GraphQL endpoint and return the result." Switching to direct function calls made the pipeline faster, cheaper, and more predictable. Only use an LLM where you need creativity or reasoning — everywhere else, just write a function.&lt;/p&gt;




&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/mpMpQuOufHY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Built with &lt;a href="https://mastra.ai" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt;, &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;, &lt;a href="https://developers.notion.com" rel="noopener noreferrer"&gt;Notion API&lt;/a&gt;, and a lot of coffee. If you've ever forgotten what you worked on last week, give DevNotion a try.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>notionchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>Simulating P2P Attacks and Teaching AI to Resume Sessions</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Fri, 27 Mar 2026 18:12:28 +0000</pubDate>
      <link>https://dev.to/yashksaini/simulating-p2p-attacks-and-teaching-ai-to-resume-sessions-2i16</link>
      <guid>https://dev.to/yashksaini/simulating-p2p-attacks-and-teaching-ai-to-resume-sessions-2i16</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;It’s been one of those weeks where the terminal never really closed. I clocked 78 commits and pushed 4 PRs across 9 different repositories, maintaining a perfect 7-day streak. The bulk of the heavy lifting happened in the P2P space—specifically simulating network attacks—and adding some much-needed session persistence to my AI coding tool, nanocoder. With over 21,000 lines added and about 6,500 deleted, it was a high-output week focused on building out complex systems and then immediately refining them.&lt;/p&gt;

&lt;h2&gt;
  
  
  WHAT I BUILT
&lt;/h2&gt;

&lt;p&gt;The star of the show this week was definitely &lt;strong&gt;P2P-Attack-Simulation&lt;/strong&gt;. I’ve been obsessed with how decentralized networks handle adversarial conditions, and I finally merged a massive PR for &lt;a href="https://github.com/yashksaini-coder/P2P-Attack-Simulation/pull/1" rel="noopener noreferrer"&gt;Topology ts simulation&lt;/a&gt;. We’re talking 18,756 additions and 6,436 deletions. I essentially rewrote how the network topology is represented in TypeScript to make it more modular. Before, the simulation was a bit too rigid; now, I can spin up different node behaviors and see how the gossip protocols hold up when half the network starts acting malicious. It’s one thing to read about Sybil attacks in a paper, but seeing the message propagation latency spike in your own simulation is a different kind of satisfying.&lt;/p&gt;

&lt;p&gt;Over in &lt;strong&gt;nanocoder&lt;/strong&gt;, I spent a good chunk of time on the developer experience. If you’ve used AI coding assistants, you know the pain of losing context or having to restart a session from scratch. I implemented a new &lt;a href="https://github.com/Nano-Collective/nanocoder/pull/390" rel="noopener noreferrer"&gt;Feature &lt;code&gt;/resume&lt;/code&gt; command to continue session&lt;/a&gt;. This involved a fair bit of state management (about 2,300 lines of code) to ensure that when you come back to a project, the AI knows exactly where you left off. It’s all about reducing friction. I want to spend my time coding, not re-explaining my file structure to a LLM.&lt;/p&gt;

&lt;p&gt;I also dipped back into the low-level world with the &lt;strong&gt;networking&lt;/strong&gt; repo. This is where I get my Rust fix. I merged two PRs here: one to &lt;a href="https://github.com/cb7chaitanya/networking/pull/22" rel="noopener noreferrer"&gt;Implement proper RST generation&lt;/a&gt; and another to &lt;a href="https://github.com/cb7chaitanya/networking/pull/20" rel="noopener noreferrer"&gt;refactor: remove timer module and associated functionality&lt;/a&gt;. The RST (Reset) generation is crucial for proper TCP handling—basically telling the other side "I have no idea what you're talking about, let's start over." The refactor felt great, too. I realized the custom timer module was overkill for what we needed, so I ripped out 137 lines of brittle code. Less code, fewer bugs.&lt;/p&gt;

&lt;p&gt;Beyond the big features, I kept the wheels turning on several other projects. I pushed 10 commits to &lt;strong&gt;py-libp2p&lt;/strong&gt; and 1 to &lt;strong&gt;dotnet-libp2p&lt;/strong&gt;, mostly keeping the Python and C# implementations of the p2p stack in sync. I also spent some time tweaking my environment, with 8 commits to my &lt;strong&gt;nvim&lt;/strong&gt; config (because a dev's work is never done when it comes to Lua plugins) and 7 commits to my &lt;strong&gt;notes&lt;/strong&gt; repo, which is where I dump my raw thoughts on C and systems programming.&lt;/p&gt;

&lt;h2&gt;
  
  
  PULL REQUESTS
&lt;/h2&gt;

&lt;p&gt;I managed to get four significant PRs merged this week, and they really tell the story of my transition from "building the foundation" to "polishing the experience."&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/yashksaini-coder/P2P-Attack-Simulation/pull/1" rel="noopener noreferrer"&gt;Topology ts simulation&lt;/a&gt; PR was the most exhausting but rewarding. It wasn't just about adding lines; it was about restructuring the entire simulation engine. I had to ensure that the TypeScript types correctly reflected the state of a peer at any given millisecond during an attack.&lt;/p&gt;

&lt;p&gt;On the AI side, the &lt;a href="https://github.com/Nano-Collective/nanocoder/pull/390" rel="noopener noreferrer"&gt;Feature &lt;code&gt;/resume&lt;/code&gt; command&lt;/a&gt; in nanocoder was a fun challenge in serialization. Making sure the session state could be saved and reloaded without losing the "vibe" of the conversation took a few iterations, but it's finally in a place where it feels seamless.&lt;/p&gt;

&lt;p&gt;The Rust work in the networking repo was much more surgical. &lt;a href="https://github.com/cb7chaitanya/networking/pull/22" rel="noopener noreferrer"&gt;Implementing RST generation&lt;/a&gt; required me to get back into the weeds of packet headers, while the &lt;a href="https://github.com/cb7chaitanya/networking/pull/20" rel="noopener noreferrer"&gt;timer module refactor&lt;/a&gt; was a classic "addition by subtraction" move.&lt;/p&gt;

&lt;h2&gt;
  
  
  CODE REVIEWS
&lt;/h2&gt;

&lt;p&gt;I only did one formal review this week, but it was a deep one. I looked at a PR for &lt;strong&gt;py-ipld-dag&lt;/strong&gt; titled &lt;a href="https://github.com/ipld/py-ipld-dag/pull/17" rel="noopener noreferrer"&gt;Add Block API, IPLD data model, codecs, registry, and tests&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I actually ended up requesting changes on this one. IPLD (InterPlanetary Linked Data) is the backbone of how we structure data in the p2p world, and the proposed implementation of the Block API felt a bit too coupled to specific codecs. I suggested a more registry-based approach to make it easier for others to plug in new data formats later. It’s important to get these base-level APIs right early on, or you end up paying for it in technical debt for years.&lt;/p&gt;

&lt;h2&gt;
  
  
  TECH STACK
&lt;/h2&gt;

&lt;p&gt;This week was a true polyglot marathon. &lt;/p&gt;

&lt;p&gt;TypeScript was my primary driver for the simulation work and the AI tooling. With over 15 million bytes of TS in my environment, it’s definitely my "get things done" language. But Python isn't far behind—especially with the work on &lt;code&gt;py-libp2p&lt;/code&gt; and the IPLD reviews. &lt;/p&gt;

&lt;p&gt;The Rust work in the networking repo reminded me why I love the language: the compiler is a jerk until you get it right, and then your code just &lt;em&gt;works&lt;/em&gt;. I also touched some Lua for my Neovim setup and a bit of C for my personal notes and experiments.&lt;/p&gt;

&lt;p&gt;My add/delete ratio was pretty high (21k vs 6k), which usually means I'm in a heavy feature-building phase. However, that 6k deletions in the P2P repo shows I'm not just piling code on top of code—I'm actively replacing the old stuff as I go.&lt;/p&gt;

&lt;p&gt;And yeah, that 7-day streak feels good. It wasn't a forced grind; I just genuinely had something I wanted to solve every single morning when I woke up.&lt;/p&gt;

&lt;h2&gt;
  
  
  WHAT'S NEXT
&lt;/h2&gt;

&lt;p&gt;Next week, I’m planning to take the P2P simulation even further. Now that the topology is flexible, I want to start implementing specific Eclipse attack scenarios to see how quickly a node can be isolated from the rest of the network. &lt;/p&gt;

&lt;p&gt;I’m also keeping an eye on the feedback for the &lt;code&gt;/resume&lt;/code&gt; command in nanocoder. There are probably some edge cases with large file buffers that I’ll need to iron out. &lt;/p&gt;

&lt;p&gt;On the Rust side, now that RST generation is handled, I might start looking into better congestion control mechanisms for the networking library. There’s always more to optimize. See you in the commit logs!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>rust</category>
      <category>p2p</category>
      <category>backend</category>
    </item>
    <item>
      <title>Beyond the Panic: Hardening the Rust SDK</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Fri, 27 Mar 2026 14:41:20 +0000</pubDate>
      <link>https://dev.to/yashksaini/beyond-the-panic-hardening-the-rust-sdk-53oj</link>
      <guid>https://dev.to/yashksaini/beyond-the-panic-hardening-the-rust-sdk-53oj</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Engineering is often the art of managing the "unhappy path." This week was a testament to that philosophy. With 74 commits, 2 PRs, 3 issues, and 3 reviews across 5 repositories, the focus shifted from building new features to fortifying the foundations. The headline? A concerted effort to purge &lt;code&gt;unwrap()&lt;/code&gt; and &lt;code&gt;panic&lt;/code&gt; calls from our Rust SDKs in favor of robust, &lt;code&gt;Result&lt;/code&gt;-based error handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Work: Velocity in the Engine Room
&lt;/h2&gt;

&lt;p&gt;The bulk of the week's momentum was concentrated in the Python ecosystem, specifically within &lt;strong&gt;p2pCalc&lt;/strong&gt; and &lt;strong&gt;AgentPay&lt;/strong&gt;. These two repositories accounted for 54 of the week's 74 commits, representing a high-velocity push in our core logic layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  p2pCalc &amp;amp; AgentPay
&lt;/h3&gt;

&lt;p&gt;In &lt;strong&gt;p2pCalc&lt;/strong&gt; (32 commits), we focused on the computational integrity of our peer-to-peer logic. While the additions and deletions were kept internal to the commit history, the sheer volume of activity suggests a deep dive into the algorithmic core. Parallel to this, &lt;strong&gt;AgentPay&lt;/strong&gt; (22 commits) saw significant movement. When dealing with payment agents, there is no room for ambiguity. My focus here was on ensuring that the state machine governing agent transactions is both predictable and idempotent.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevNotion &amp;amp; The Developer Environment
&lt;/h3&gt;

&lt;p&gt;Meanwhile, &lt;strong&gt;DevNotion&lt;/strong&gt; (14 commits) continues to evolve. As a TypeScript-based project, it serves as the bridge between our raw data and the narratives we share. The work here was iterative, likely refining the very engine that powers these weekly field notes. &lt;/p&gt;

&lt;p&gt;I also took a moment to sharpen the saw. Five commits to my &lt;strong&gt;nvim&lt;/strong&gt; configuration (Lua) might seem like minor housekeeping, but for a principal engineer, the editor is the primary instrument. A well-tuned environment isn't a luxury; it’s a prerequisite for the kind of deep work required to handle complex refactors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pull Requests: The Safety Initiative
&lt;/h2&gt;

&lt;p&gt;The most critical architectural work happened within the Appwrite ecosystem. We are currently in the process of maturing the Rust SDK, and that means moving away from "prototype-grade" code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;fix(rust): replace unwrap/panic with Result-based error handling&lt;/td&gt;
&lt;td&gt;sdk-generator&lt;/td&gt;
&lt;td&gt;OPEN&lt;/td&gt;
&lt;td&gt;Prevents generator-level crashes during SDK synthesis.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refactor: replace unwrap with error handling in Client methods&lt;/td&gt;
&lt;td&gt;sdk-for-rust&lt;/td&gt;
&lt;td&gt;CLOSED&lt;/td&gt;
&lt;td&gt;Shifts error responsibility to the library consumer, avoiding runtime panics.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The PR in &lt;strong&gt;sdk-for-rust&lt;/strong&gt; (&lt;a href="https://github.com/appwrite/sdk-for-rust/pull/9" rel="noopener noreferrer"&gt;#9&lt;/a&gt;) was a substantial undertaking, involving 149 additions and 46 deletions. In Rust, using &lt;code&gt;.unwrap()&lt;/code&gt; is a debt you eventually have to pay. By replacing these with proper &lt;code&gt;Result&lt;/code&gt; types, we ensure that the SDK doesn't bring down a user's entire application just because of a transient network failure or a malformed response. It’s about respecting the caller’s right to decide how to handle failure.&lt;/p&gt;

&lt;p&gt;The work continues in &lt;strong&gt;sdk-generator&lt;/strong&gt; (&lt;a href="https://github.com/appwrite/sdk-generator/pull/1398" rel="noopener noreferrer"&gt;#1398&lt;/a&gt;), where I am applying similar logic to the generator itself. If the generator panics, the entire CI/CD pipeline halts. By implementing &lt;code&gt;Result&lt;/code&gt;-based handling, we allow the system to fail gracefully and provide actionable feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Conversations: Setting the Standard
&lt;/h2&gt;

&lt;p&gt;Collaboration this week was centered on documentation and issue tracking. I closed two critical issues in the &lt;strong&gt;sdk-for-rust&lt;/strong&gt; repo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Issue #8&lt;/strong&gt;: The bug report that initiated the &lt;code&gt;unwrap()&lt;/code&gt; refactor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue #7&lt;/strong&gt;: The creation of &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The latter is particularly important. As we scale, we need to ensure that external contributors understand the quality bar we’ve set. A clear &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; is the first step in building a healthy open-source community around the Rust SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reviews: Raising the Bar
&lt;/h2&gt;

&lt;p&gt;Reviewing 3 PRs while authoring 2 is a healthy ratio for a week focused on quality. My reviews on &lt;strong&gt;awesome-py-libp2p-examples&lt;/strong&gt; resulted in "CHANGES_REQUESTED" for two separate PRs (&lt;a href="https://github.com/seetadev/awesome-py-libp2p-examples/pull/6" rel="noopener noreferrer"&gt;#6&lt;/a&gt; and &lt;a href="https://github.com/seetadev/awesome-py-libp2p-examples/pull/3" rel="noopener noreferrer"&gt;#3&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;When reviewing collaborative tools like a "Whiteboard" or "p2p model checking," I look for more than just "does it run?" I look for idiomatic patterns and clear documentation. If an example is meant to be "awesome," it must serve as a gold standard for others to follow. My comments on &lt;strong&gt;py-libp2p&lt;/strong&gt; (&lt;a href="https://github.com/libp2p/py-libp2p/pull/1222" rel="noopener noreferrer"&gt;#1222&lt;/a&gt;) regarding the reorganization of example scripts follow this same theme: structure dictates usability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Craft: A Polyglot Reality
&lt;/h2&gt;

&lt;p&gt;This week’s data reveals a truly polyglot workflow. While &lt;strong&gt;Python&lt;/strong&gt; remains the dominant language by volume (over 77MB of context), the most impactful changes were written in &lt;strong&gt;Rust&lt;/strong&gt; and &lt;strong&gt;TypeScript&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The add/delete ratio (+227/-80) indicates a week of net-new growth, but the nature of that growth was defensive. We weren't just adding features; we were adding safety nets. The lack of a commit streak this week is a reminder that engineering isn't always a daily sprint; sometimes it’s a series of deep-dive sessions separated by the necessary time to think through architectural implications.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Horizon
&lt;/h2&gt;

&lt;p&gt;As we look toward next week, the primary objective is to land the open PR in the &lt;strong&gt;sdk-generator&lt;/strong&gt;. Once the generator is hardened, we can begin rolling out these safety improvements across all generated Rust SDKs. &lt;/p&gt;

&lt;p&gt;We’ve moved the needle on reliability this week. The transition from "it works" to "it's resilient" is often invisible to the end-user until something goes wrong and the system &lt;em&gt;doesn't&lt;/em&gt; crash. That is the quiet victory of the seasoned architect. &lt;/p&gt;

&lt;p&gt;Onward.&lt;/p&gt;

</description>
      <category>python</category>
      <category>rust</category>
      <category>refactoring</category>
      <category>consistency</category>
    </item>
    <item>
      <title>I Built a TUI That Makes Rust Code Inspection Feel Like Magic ✨</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Sun, 15 Feb 2026 22:34:42 +0000</pubDate>
      <link>https://dev.to/yashksaini/i-built-a-tui-that-makes-rust-code-inspection-feel-like-magic-375k</link>
      <guid>https://dev.to/yashksaini/i-built-a-tui-that-makes-rust-code-inspection-feel-like-magic-375k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Why Did I Build This?" Moment
&lt;/h2&gt;

&lt;p&gt;Okay so here's the thing. I was working on this Rust project at 2 AM (as you do), trying to figure out where the hell &lt;code&gt;DeserializeOwned&lt;/code&gt; was actually implemented. The codebase had like 50,000 lines, and there were these 17 different &lt;code&gt;impl&lt;/code&gt; blocks just... everywhere. Scattered across 8 files like someone playing hide and seek with code.&lt;/p&gt;

&lt;p&gt;And I'm sitting there thinking about my options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fire up VSCode? My SSH connection was lagging harder than my reaction time on Monday mornings&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;grep&lt;/code&gt;? Sure, if I wanted to scroll through 400 lines of garbage output&lt;/li&gt;
&lt;li&gt;Try &lt;code&gt;ripgrep&lt;/code&gt; with regex? I'd rather debug segfaults than write another regex at 2 AM&lt;/li&gt;
&lt;li&gt;Make coffee and pretend the problem doesn't exist? Tempting...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you know what? I got frustrated enough to actually do something about it.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Oracle&lt;/strong&gt; — basically a code inspector that lives in your terminal and actually doesn't suck to use. And to flex it more, Github Copilot helped me build, review, clean, optimize and vibe code all of this in just under 3 days. &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%2Fd2qfilxnaz467yhot78w.gif" class="article-body-image-wrapper"&gt;&lt;img width="600" 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%2Fd2qfilxnaz467yhot78w.gif" height="335"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;So 🔮 &lt;strong&gt;&lt;a href="https://crates.io/crates/oracle-tui" rel="noopener noreferrer"&gt;Oracle&lt;/a&gt;&lt;/strong&gt; is basically a terminal-based code inspector for Rust projects. Think of it like... if &lt;code&gt;grep&lt;/code&gt; and VSCode had a baby, and that baby grew up to be really good at understanding Rust code. No GUI bloat, no browser tabs eating your RAM, just your terminal doing cool stuff.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  📦 Deep Code Analysis
&lt;/h3&gt;

&lt;p&gt;Look, it parses everything. And I mean &lt;em&gt;everything&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functions (with those fancy async/const/unsafe badges, plus all the parameters and return types)&lt;/li&gt;
&lt;li&gt;Structs (every field, every derive, all the generics — no more squinting at code trying to figure out field types)&lt;/li&gt;
&lt;li&gt;Enums (it shows you ALL the variants with their field types spelled out)&lt;/li&gt;
&lt;li&gt;Traits (methods, associated types, supertraits, the works)&lt;/li&gt;
&lt;li&gt;Impl blocks (both the regular ones and trait implementations)&lt;/li&gt;
&lt;li&gt;Modules, type aliases, constants, statics... basically if Rust can define it, Oracle can show it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Intelligent Search
&lt;/h3&gt;

&lt;p&gt;The search is actually pretty smart (if I do say so myself):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fuzzy matching that updates as you type (using &lt;code&gt;fuzzy-matcher&lt;/code&gt; under the hood)&lt;/li&gt;
&lt;li&gt;Context-aware, so when you're in the Functions tab, it only searches functions (no more wading through noise)&lt;/li&gt;
&lt;li&gt;You can search for functions like and will get fully qualified paths like &lt;code&gt;serde::de::Deserialize&lt;/code&gt; and it just works&lt;/li&gt;
&lt;li&gt;Filter stuff by visibility (public/private/crate-level)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📋 Dependency Inspector
&lt;/h3&gt;

&lt;p&gt;This part's kinda cool — it reads your &lt;code&gt;Cargo.toml&lt;/code&gt; and shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your entire dependency tree visualized nicely&lt;/li&gt;
&lt;li&gt;Live info from crates.io (descriptions, GitHub stars, license info)&lt;/li&gt;
&lt;li&gt;All the crates installed in your &lt;code&gt;~/.cargo/registry&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;o&lt;/code&gt; to open docs.rs, press &lt;code&gt;c&lt;/code&gt; to open crates.io — boom, instant browser tabs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎨 Beautiful Themes
&lt;/h3&gt;

&lt;p&gt;Because apparently I care about aesthetics even in my terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default Dark (clean and professional-ish)&lt;/li&gt;
&lt;li&gt;Nord (if you like cool blues)&lt;/li&gt;
&lt;li&gt;Catppuccin Mocha (cozy vibes)&lt;/li&gt;
&lt;li&gt;Dracula (for the dramatic folks)&lt;/li&gt;
&lt;li&gt;Just press &lt;code&gt;t&lt;/code&gt; to cycle through them&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Smooth Animations
&lt;/h3&gt;

&lt;p&gt;Yeah I added animations to a CLI tool. Fight me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selection highlights that fade in smoothly&lt;/li&gt;
&lt;li&gt;Tab transitions that don't feel jarring&lt;/li&gt;
&lt;li&gt;Scrolling with momentum (it feels buttery smooth)&lt;/li&gt;
&lt;li&gt;Real-time syntax highlighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, I spent way too much time on the animations, but they make it feel really nice to use.&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%2Fylqi0icb4k6r2oiv1j1z.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%2Fylqi0icb4k6r2oiv1j1z.png" alt="Oracle Inspector Panel" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/yashksaini-coder/oracle" rel="noopener noreferrer"&gt;github.com/yashksaini-coder/oracle&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install from source&lt;/span&gt;
git clone https://github.com/yashksaini-coder/oracle.git
&lt;span class="nb"&gt;cd &lt;/span&gt;oracle
cargo &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Run on any Rust project&lt;/span&gt;
oracle /path/to/rust/project

&lt;span class="c"&gt;# Or analyze current directory&lt;/span&gt;
oracle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Inspect a famous crate&lt;/span&gt;
cargo new test_project
&lt;span class="nb"&gt;cd &lt;/span&gt;test_project
cargo add tokio

&lt;span class="c"&gt;# Launch Oracle&lt;/span&gt;
oracle

&lt;span class="c"&gt;# Now press:&lt;/span&gt;
&lt;span class="c"&gt;# - Tab 4 times to get to Crates tab&lt;/span&gt;
&lt;span class="c"&gt;# - Navigate to "tokio"&lt;/span&gt;
&lt;span class="c"&gt;# - Press Enter&lt;/span&gt;
&lt;span class="c"&gt;# - Search for "copy" with /&lt;/span&gt;
&lt;span class="c"&gt;# - Browse copy methods and implementations&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%2Fy3fap47c423aleidgk1b.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%2Fy3fap47c423aleidgk1b.png" alt="Crates Demo" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;Alright, confession time: This was my first serious Rust project that involved terminal UI stuff. I'd never touched Ratatui before, barely understood how &lt;code&gt;syn&lt;/code&gt; worked, and was basically figuring everything out as I went.&lt;/p&gt;

&lt;p&gt;GitHub Copilot CLI basically became my rubber duck, my Stack Overflow, and my patient senior developer all rolled into one. And the best part? I never had to leave my terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 How Copilot Saved My Sanity
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Wrestling with the &lt;code&gt;syn&lt;/code&gt; Crate&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;So Rust's &lt;code&gt;syn&lt;/code&gt; crate is &lt;em&gt;amazing&lt;/em&gt; for parsing Rust code, but holy hell the learning curve is steep. I needed to extract function signatures, struct fields, enum variants, all the trait bounds... basically everything.&lt;/p&gt;

&lt;p&gt;I was staring at the docs feeling like I was reading ancient Greek, so I just asked Copilot:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gh copilot suggest "parse rust struct with syn crate extract all fields and visibility"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And it straight up gave me this:&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;use&lt;/span&gt; &lt;span class="nn"&gt;syn&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;ItemStruct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;analyze_struct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ItemStruct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;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;Field&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="py"&gt;.fields&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nn"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Named&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;named&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;named&lt;/span&gt;&lt;span class="py"&gt;.named&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="py"&gt;.ident&lt;/span&gt;&lt;span class="nf"&gt;.as_ref&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;ty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nd"&gt;quote!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;#&lt;span class="n"&gt;ty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;parse_visibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="py"&gt;.vis&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// ... Tuple and Unit variants&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;Like, it just &lt;em&gt;worked&lt;/em&gt;. This became the foundation for parsing everything else — enums, traits, impl blocks, you name it. I just extended this pattern to handle all the other Rust item types.&lt;/p&gt;

&lt;p&gt;Honestly? Saved me probably 8-10 hours of banging my head against the &lt;code&gt;syn&lt;/code&gt; docs. Worth it.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;2. Making the TUI Not Look Like Garbage&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I wanted something that looked good. Not just functional, but actually pleasant to use. Panels, borders, smooth scrolling, the whole nine yards.&lt;/p&gt;

&lt;p&gt;Problem: Ratatui's layout system made my brain hurt. How do you even compose these things?&lt;/p&gt;

&lt;p&gt;Asked Copilot: &lt;code&gt;gh copilot explain "ratatui layout constraints horizontal vertical split"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It explained that layouts are basically Lego blocks — you can compose them with &lt;code&gt;Constraint::Percentage&lt;/code&gt; and &lt;code&gt;Constraint::Length&lt;/code&gt;, and nest them for complex UIs. That made it click.&lt;/p&gt;

&lt;p&gt;Then I was like: &lt;code&gt;gh copilot suggest "ratatui scrollable panel with borders and title"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Got this back:&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;let&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Block&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.borders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Borders&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ALL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Inspector "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;paragraph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Paragraph&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.scroll&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;scroll_offset&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u16&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beautiful. That became the core of my inspector panel. Later on I added the animations by interpolating the &lt;code&gt;scroll_offset&lt;/code&gt; with some easing functions (because I'm extra like that).&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;3. Making Search Feel Snappy&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I wanted the search to feel like VSCode's Ctrl+P — you know, where you just start typing and boom, instant results. No lag, no BS.&lt;/p&gt;

&lt;p&gt;Asked Copilot: &lt;code&gt;gh copilot suggest "rust fuzzy search crate with scoring"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It recommended &lt;code&gt;fuzzy-matcher&lt;/code&gt; with &lt;code&gt;SkimMatcherV2&lt;/code&gt;. Here's what I ended up with:&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;use&lt;/span&gt; &lt;span class="nn"&gt;fuzzy_matcher&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;skim&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SkimMatcherV2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;matcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;SkimMatcherV2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;scored&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;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
    &lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.filter_map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;matcher&lt;/span&gt;&lt;span class="nf"&gt;.fuzzy_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="py"&gt;.name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.map&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&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="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;scored&lt;/span&gt;&lt;span class="nf"&gt;.sort_by&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="na"&gt;.1&lt;/span&gt;&lt;span class="nf"&gt;.cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="na"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Highest score first&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And guess what? It worked perfectly on the first try. No debugging, no tweaking, just... worked. Those moments are rare in programming and should be celebrated.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;4. Parsing Cargo.toml Without Crying&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Dependencies and Cargo.toml can get complex real fast, especially with workspaces and transitive deps. I needed to parse all of that and build a proper dependency tree.&lt;/p&gt;

&lt;p&gt;I was dreading this part until I asked: &lt;code&gt;gh copilot explain "cargo metadata crate rust get all dependencies"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Turns out there's a crate called &lt;code&gt;cargo_metadata&lt;/code&gt; (who knew?) that gives you structured JSON output. Copilot showed me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to get the root package&lt;/li&gt;
&lt;li&gt;How to traverse the dependency tree&lt;/li&gt;
&lt;li&gt;How to detect direct vs transitive dependencies&lt;/li&gt;
&lt;li&gt;How to handle workspace crates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what came out of it:&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;use&lt;/span&gt; &lt;span class="nn"&gt;cargo_metadata&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MetadataCommand&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;MetadataCommand&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.manifest_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;manifest_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.exec&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;let&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="nf"&gt;.root_package&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="py"&gt;.dependencies&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="py"&gt;.kind&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nn"&gt;DependencyKind&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Normal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, clean, and it actually works. Love it when code is like that.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;5. Fetching Live Crate Info&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I wanted to show real crate info when someone's browsing dependencies — descriptions, GitHub stars, license info, all that good stuff. Which meant hitting the crates.io API.&lt;/p&gt;

&lt;p&gt;Me, having zero experience with async HTTP in Rust: &lt;code&gt;gh copilot suggest "rust async http request to crates.io api"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Copilot pointed me to &lt;code&gt;reqwest&lt;/code&gt; and showed me the blocking client pattern for background threads:&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;use&lt;/span&gt; &lt;span class="nn"&gt;reqwest&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;blocking&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;fetch_crate_docs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CrateDoc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://crates.io/api/v1/crates/{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="nf"&gt;.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.send&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.ok&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;let&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;serde_json&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="nf"&gt;.json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.ok&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;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CrateDoc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"crate"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nf"&gt;.as_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"crate"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nf"&gt;.as_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;from&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I needed GitHub repo stats too, so I asked how to parse GitHub URLs and hit their API. Got that working too.&lt;/p&gt;

&lt;p&gt;The whole crates.io + GitHub integration took one evening instead of... I don't know, a week of reading API docs?&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;6. Cross-Platform Path Hell&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;You know what's annoying? File paths. Windows uses backslashes, Unix uses forward slashes, and I needed to convert file paths to module paths (&lt;code&gt;src/analyzer/parser.rs&lt;/code&gt; → &lt;code&gt;["analyzer", "parser"]&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Asked: &lt;code&gt;gh copilot suggest "rust strip src directory from pathbuf get module path"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Got this beauty:&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;fn&lt;/span&gt; &lt;span class="nf"&gt;derive_module_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;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="nb"&gt;String&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;path&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.skip_while&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="s"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Skip "src" itself&lt;/span&gt;
        &lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.to_string_lossy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="nf"&gt;.collect&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;Works on Windows, macOS, Linux. No &lt;code&gt;#[cfg]&lt;/code&gt; needed. Just works everywhere.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;7. Making Animations Not Suck&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Okay so this is where I got a bit carried away. I wanted smooth scrolling with momentum, not that janky jump-scroll thing most TUIs have.&lt;/p&gt;

&lt;p&gt;Asked Copilot: &lt;code&gt;gh copilot suggest "rust easing functions ease in out cubic"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It gave me the classic easing formulas:&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;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;ease_out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.powi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;ease_in_out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.powi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.0&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;h4&gt;
  
  
  &lt;strong&gt;8. Integrating Copilot within itself&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;At this point I was just too deep into the rabbit hole and wanted to see how far I can reach, and so decided to give it a AI chat interface area, completely powered by Copilot and guess what ....&lt;/p&gt;

&lt;p&gt;It Actually Works, it was mind blowing telling copilot to build and integrate yourself within my tool. &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%2Fz3emfcj4i8y72huqmg6i.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%2Fz3emfcj4i8y72huqmg6i.png" alt="Oracle Copilot integration" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Applied these to scroll offset interpolation and boom — butter-smooth 60fps scrolling. Completely unnecessary for a CLI tool? Yes. Did I do it anyway? Also yes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stuff That Almost Broke Me
&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%2Fdg0i7978melgjz3v3tya.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%2Fdg0i7978melgjz3v3tya.png" alt="Oracle Building challenges Panel" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 1: Not Freezing the Terminal When Parsing Big Projects
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; So I tried running Oracle on the &lt;code&gt;tokio&lt;/code&gt; codebase (which has like 200+ files), and my terminal just... froze. For a solid 10 seconds. Completely unresponsive. Not great.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt;&lt;br&gt;
I moved all the parsing to background threads so the UI could stay responsive. Added a splash screen with this little wave animation (because if users have to wait, at least make it pretty). Also pre-computed search indices so that wouldn't lag either.&lt;/p&gt;

&lt;p&gt;Copilot helped me figure out the threading patterns and how to show progress without blocking the UI. Game changer.&lt;/p&gt;


&lt;h3&gt;
  
  
  Challenge 2: Making Search Feel Instant (Even When It's Not)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; When you have 10,000+ items to search through, every keystroke was taking like 100ms. That's noticeable lag, and it felt janky.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only search within the active tab (if you're in Functions, only search functions)&lt;/li&gt;
&lt;li&gt;Limit results to top 50 (nobody scrolls past that anyway)&lt;/li&gt;
&lt;li&gt;Used &lt;code&gt;fuzzy-matcher&lt;/code&gt;'s batch scoring (it's faster than one-by-one)&lt;/li&gt;
&lt;li&gt;Cached search results for repeated queries&lt;/li&gt;
&lt;li&gt;Only rendered visible items on screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result? Search now takes &amp;lt; 16ms per keystroke. That's 60fps territory. Smooth.&lt;/p&gt;


&lt;h3&gt;
  
  
  Challenge 3: GitHub Rate Limits Are Real
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; The GitHub API rate-limits unauthenticated requests to 60 per hour. I was hitting that limit basically immediately when testing the crates.io features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added support for &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; environment variable (gives you 5000/hour when authenticated)&lt;/li&gt;
&lt;li&gt;Cached responses per crate so we don't re-fetch&lt;/li&gt;
&lt;li&gt;Graceful fallback when rate-limited (just show "rate limited" instead of crashing)&lt;/li&gt;
&lt;li&gt;Added a hint to users: "Set GITHUB_TOKEN for more requests"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copilot helped explain the GitHub API auth flow and how to parse rate limit headers. Much better now.&lt;/p&gt;


&lt;h3&gt;
  
  
  Challenge 4: Scrollable Content That Doesn't Suck
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; When you select an item, the inspector panel shows all its details. But what if the docs are really long? It just got cut off. Not ideal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt;&lt;br&gt;
Had to track scroll offset per selected item, bind &lt;code&gt;j/k&lt;/code&gt; and arrow keys to scroll up/down, show a scrollbar indicator when content overflows, and reset scroll position when switching items.&lt;/p&gt;

&lt;p&gt;Copilot showed me Ratatui's &lt;code&gt;Scrollbar&lt;/code&gt; widget and how to manage scroll state properly. Works great now.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why You Might Actually Want to Use This
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🚀 It's Fast (Like, Really Fast)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parses 200+ files in under 2 seconds&lt;/li&gt;
&lt;li&gt;Search responds instantly (&amp;lt; 16ms per keystroke)&lt;/li&gt;
&lt;li&gt;60fps animations (yes, in a terminal)&lt;/li&gt;
&lt;li&gt;Zero network calls for local analysis (your code never leaves your machine)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🎨 It Doesn't Look Like Hot Garbage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;4 hand-crafted themes (Nord is chef's kiss)&lt;/li&gt;
&lt;li&gt;Smooth scrolling with easing (because I have standards)&lt;/li&gt;
&lt;li&gt;Context-aware UI (functions show parameter hints, structs show field types)&lt;/li&gt;
&lt;li&gt;Professional documentation formatting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔧 Actually Designed for Terminal Use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works perfectly over SSH (no GUI needed, no X forwarding BS)&lt;/li&gt;
&lt;li&gt;Vim-style keybindings (&lt;code&gt;j/k&lt;/code&gt; for life)&lt;/li&gt;
&lt;li&gt;One command: &lt;code&gt;oracle&lt;/code&gt; — that's it&lt;/li&gt;
&lt;li&gt;Installable via &lt;code&gt;cargo install&lt;/code&gt; (once I publish it to crates.io)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📚 It Actually Understands Rust
&lt;/h3&gt;

&lt;p&gt;Most code search tools are just fancy grep. Oracle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyzes ALL Rust item types (functions, structs, enums, traits, impls, modules)&lt;/li&gt;
&lt;li&gt;Shows qualified paths (&lt;code&gt;serde::de::Deserialize&lt;/code&gt; works perfectly)&lt;/li&gt;
&lt;li&gt;Handles visibility modifiers properly&lt;/li&gt;
&lt;li&gt;Understands generics, lifetimes, trait bounds, async, const, unsafe — all of it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, it doesn't just &lt;em&gt;search&lt;/em&gt; your code, it &lt;em&gt;understands&lt;/em&gt; it.&lt;/p&gt;


&lt;h2&gt;
  
  
  How I Actually Use This Thing
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Before Oracle:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Trying to find all trait implementations&lt;/span&gt;
rg &lt;span class="s2"&gt;"impl.*for"&lt;/span&gt; | less  &lt;span class="c"&gt;# Scroll through 200 lines of noise&lt;/span&gt;

&lt;span class="c"&gt;# Trying to understand a struct&lt;/span&gt;
rg &lt;span class="s2"&gt;"struct Config"&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; 20 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"pub"&lt;/span&gt;  &lt;span class="c"&gt;# Miss half the fields&lt;/span&gt;

&lt;span class="c"&gt;# Finding function signatures&lt;/span&gt;
rg &lt;span class="s2"&gt;"pub fn connect"&lt;/span&gt;  &lt;span class="c"&gt;# Get incomplete matches without parameters&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  With Oracle:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oracle
&lt;span class="c"&gt;# Tab to Functions, type "connect", press Enter&lt;/span&gt;
&lt;span class="c"&gt;# See:&lt;/span&gt;
&lt;span class="c"&gt;#   - Full signature with all parameters and types&lt;/span&gt;
&lt;span class="c"&gt;#   - Complete documentation&lt;/span&gt;
&lt;span class="c"&gt;#   - Return type with error handling&lt;/span&gt;
&lt;span class="c"&gt;#   - Source location (file + line number)&lt;/span&gt;
&lt;span class="c"&gt;# Press 'o' to open in your editor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It's just... so much faster. And less annoying.&lt;/p&gt;

&lt;p&gt;Another example: You add &lt;code&gt;tokio&lt;/code&gt; to your project and want to understand how &lt;code&gt;spawn&lt;/code&gt; works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the tokio repo&lt;/li&gt;
&lt;li&gt;grep for "pub fn spawn"&lt;/li&gt;
&lt;li&gt;Get 47 matches&lt;/li&gt;
&lt;li&gt;Try to figure out which one is the right one&lt;/li&gt;
&lt;li&gt;Give up and read the docs instead&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;With Oracle:&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;oracle ~/.cargo/registry/src/&lt;span class="k"&gt;*&lt;/span&gt;/tokio-&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="c"&gt;# Press 4 for Crates tab&lt;/span&gt;
&lt;span class="c"&gt;# Navigate to "tokio", press Enter&lt;/span&gt;
&lt;span class="c"&gt;# Type "spawn" in search&lt;/span&gt;
&lt;span class="c"&gt;# See signature, docs, parameters, trait bounds&lt;/span&gt;
&lt;span class="c"&gt;# Press 'o' for docs.rs if you want more details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Time saved: Like 5 minutes every single time.&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%2Fsxldr2jlh49i3r8pex08.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%2Fsxldr2jlh49i3r8pex08.png" alt="Crates Tab Demo" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation &amp;amp; Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From source (recommended for now)&lt;/span&gt;
git clone https://github.com/yashksaini-coder/oracle.git
&lt;span class="nb"&gt;cd &lt;/span&gt;oracle
cargo &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Or use cargo directly (once published)&lt;/span&gt;
cargo &lt;span class="nb"&gt;install &lt;/span&gt;oracle-tui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Analyze current directory&lt;/span&gt;
oracle

&lt;span class="c"&gt;# Analyze specific project&lt;/span&gt;
oracle ~/code/my-rust-project

&lt;span class="c"&gt;# Set GitHub token for better crate.io API limits&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghp_yourtoken
oracle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What's Next (If People Actually Use This)
&lt;/h2&gt;

&lt;p&gt;Got some ideas for future versions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Symbol references:&lt;/strong&gt; Show where a function/type is actually being used (would be super helpful)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jump to definition:&lt;/strong&gt; Press a key, open the source file at the exact line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Macro expansion viewer:&lt;/strong&gt; See what those cryptic macros expand to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call graph visualization:&lt;/strong&gt; Show which functions call which (could get messy but cool)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git integration:&lt;/strong&gt; Show recent changes per item, like "this function was modified 3 days ago"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to JSON/HTML:&lt;/strong&gt; Generate static docs from your codebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LSP integration:&lt;/strong&gt; Hook into rust-analyzer for even deeper analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No promises on timeline though. This is still a side project I hacked together because I was annoyed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Rust?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Parsing is CPU-bound. Rust's zero-cost abstractions mean fast parsing without GC pauses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety:&lt;/strong&gt; No segfaults when traversing complex ASTs. The borrow checker caught 20+ bugs during development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecosystem:&lt;/strong&gt; &lt;code&gt;syn&lt;/code&gt; is the gold standard for Rust parsing. &lt;code&gt;ratatui&lt;/code&gt; makes TUIs actually fun to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-platform:&lt;/strong&gt; One binary works on Linux, macOS, Windows — no Python/Node runtime needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;TUI State Management is Hard&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Managing focus, scroll positions, search state, animations — all simultaneously — is trickier than React state. Had to build a small state machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Parsing is Expensive&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Even with &lt;code&gt;syn&lt;/code&gt;'s fast parser, analyzing 200+ files takes time. Had to optimize with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lazy loading (only parse visible items)&lt;/li&gt;
&lt;li&gt;Caching parsed results&lt;/li&gt;
&lt;li&gt;Background threads for heavy work&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Terminal Rendering is Delicate&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Drawing too frequently causes flicker. Drawing too infrequently feels laggy. Found the sweet spot: 60fps when animating, 10fps when idle.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Copilot CLI is a Force Multiplier&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Seriously. Having an AI explain &lt;code&gt;syn&lt;/code&gt; patterns, Ratatui layouts, async patterns, easing formulas — all without leaving the terminal — was incredible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;So yeah, that's Oracle. Built it because I was frustrated with existing tools, learned a ton about Rust, TUIs, and parsing along the way.&lt;/p&gt;

&lt;p&gt;GitHub Copilot CLI was honestly a lifesaver. Having an AI that could explain &lt;code&gt;syn&lt;/code&gt; patterns, show me Ratatui layouts, help with async patterns, and even provide easing formulas — all without leaving my terminal — was incredible. Saved me probably 30+ hours of reading docs and Stack Overflow.&lt;/p&gt;

&lt;p&gt;The result is a tool I actually use every day now. Every time I clone a new Rust project, I run &lt;code&gt;oracle&lt;/code&gt; first to get the lay of the land. It's just become part of my workflow.&lt;/p&gt;

&lt;p&gt;If you work with Rust, give it a shot. Worst case, you wasted 2 minutes installing it. Best case, it changes how you explore code.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yash Saini&lt;/strong&gt; - &lt;a href="https://github.com/yashksaini-coder" rel="noopener noreferrer"&gt;@yashksaini-coder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X:&lt;/strong&gt; &lt;a href="https://x.com/0xcrackedDev" rel="noopener noreferrer"&gt;0xcrackedDev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/yashksaini-coder/oracle" rel="noopener noreferrer"&gt;github.com/yashksaini-coder/oracle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crates:&lt;/strong&gt; &lt;a href="https://crates.io/crates/oracle-tui" rel="noopener noreferrer"&gt;oracle-tui&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latest Release:&lt;/strong&gt; &lt;a href="https://github.com/yashksaini-coder/oracle/releases" rel="noopener noreferrer"&gt;Latest releases&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Got feedback? Found a bug? Want a feature? Open an issue or drop a comment. I actually read them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with way too much coffee, Rust, Ratatui, and GitHub Copilot CLI being an absolute legend.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="link%20https://github.com/yashksaini-coder/vizier" class="crayons-btn crayons-btn--primary"&gt;Star Oracle&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you liked this, consider giving the repo a star. It makes me feel good about my life choices.&lt;/em&gt; ⭐&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #githubchallenge #cli #rust #tui #opensource
&lt;/h1&gt;

</description>
      <category>githubchallenge</category>
      <category>githubcopilot</category>
      <category>tui</category>
      <category>rust</category>
    </item>
    <item>
      <title>Kleos CLI: Mindsdb Knowledge Base supercharged</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Mon, 30 Jun 2025 08:46:51 +0000</pubDate>
      <link>https://dev.to/yashksaini/kleos-cli-mindsdb-knowledge-base-supercharged-1a83</link>
      <guid>https://dev.to/yashksaini/kleos-cli-mindsdb-knowledge-base-supercharged-1a83</guid>
      <description>&lt;p&gt;Okh so lets begin with the important context, currently there is constant evolution going on in the world of AI agents, and there is large amount of unstructured raw data which keeps on increasing, developers need to constantly simplify complex data and accelerate AI workflows to manage this whole data, so they seek help from  tools and frameworks that can make thier task easy. With many different database sources, and formats available storing them, managing them and running SQL queries to use them. All of this is very tedious work, one that requires accuracy and fast results.&lt;/p&gt;

&lt;p&gt;The perfect solution for this, is the new &lt;a href="https://docs.mindsdb.com/mindsdb_sql/knowledge-bases" rel="noopener noreferrer"&gt;Knowledge Base&lt;/a&gt; :- an an advance system that organizes data with its actual meaning not by just cross matching the frequent words or important keywords. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MindsDB's new Knowledge Base organizes data by its actual meaning, not just by the keywords or frequent words matching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It Supports semantic search with context-aware retrieval&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handles various data sources like databases, CSV, text, and many other integrations like Youtube, &lt;a href="https://news.ycombinator.com/" rel="noopener noreferrer"&gt;Hackernews&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilizes embedding models, re-ranking models, and vector stores to create embeddings to provide context data retrieval.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enables intelligent querying and meaningful data discovery&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/lfkm1IUKwOQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;To make interacting with MindsDB's powerful features even more intuitive and efficient, especially its cutting-edge Knowledge Base and AI Agent functionalities, I developed &lt;strong&gt;&lt;a href="https://github.com/yashksaini-coder/Kleos" rel="noopener noreferrer"&gt;Kleos&lt;/a&gt;&lt;/strong&gt;. Kleos (a greek word which summaries, &lt;em&gt;The enduring transmission of meaningful, wise knowledge — curated, remembered, and used across time.&lt;/em&gt;) is a Python-based async command-line interface designed to be your trusty companion for using the MindsDB Knowledge Base.&lt;/p&gt;

&lt;p&gt;Every system has its &lt;code&gt;telos&lt;/code&gt; — its final cause or purpose. This CLI fulfills the purpose of MindsDB's Knowledge Base: to seek, structure, and serve insight through intelligent agents. Kleos aims to streamline the process of building and managing these intelligent systems directly from your terminal.&lt;/p&gt;

&lt;p&gt;This article will walk you through Kleos CLI, highlighting its key features and demonstrating how it leverages MindsDB KB to help you build powerful AI-driven applications with ease.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Philosophy: SQL as the Language of AI
&lt;/h2&gt;

&lt;p&gt;One of MindsDB's foundational principles, which Kleos has integrated at root level, is the use of SQL as the primary language for AI development. Instead of requiring developers to learn complex machine learning libraries or manage separate MLOps pipelines for many common tasks, MindsDB allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Connect to diverse data sources:&lt;/strong&gt; From your existing databases to SaaS applications and file storages.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Create AI Models:&lt;/strong&gt; Train models for tasks like classification, regression, time series forecasting, and even interact with large language models (LLMs) for generative tasks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Build Knowledge Bases:&lt;/strong&gt; Create semantic search capabilities over your textual data.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Deploy AI Agents:&lt;/strong&gt; Combine LLMs with your data and KBs to create intelligent assistants.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Query Predictions and Insights:&lt;/strong&gt; Fetch predictions and insights as if you were querying a regular database table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this achieved by using SQL extensions. Kleos CLI acts as a convenient and powerful interface to execute these SQL commands, manage your MindsDB resources, and automate workflows, making the power of in-database AI more accessible than ever. We've built Kleos using Python, &lt;a href="https://click.palletsprojects.com/" rel="noopener noreferrer"&gt;Click&lt;/a&gt; for robust command-line parsing, and &lt;a href="https://rich.readthedocs.io/" rel="noopener noreferrer"&gt;Rich&lt;/a&gt; for beautiful, informative terminal output.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Kleos can do!
&lt;/h1&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%2F4o3yu855eqqc35ikh7kh.jpeg" 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%2F4o3yu855eqqc35ikh7kh.jpeg" alt="Kleos Commands" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features of Kleos &amp;amp; MindsDB in Action
&lt;/h3&gt;

&lt;p&gt;Kleos provides a comprehensive suite of commands to manage various aspects of your MindsDB environment. Here’s a look at some core functionalities:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Seamless Setup (&lt;code&gt;kleos setup&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Getting started often involves connecting to your data. MindsDB excels at integrating with numerous data sources. Kleos helps you quickly set up common datasources. For instance, the HackerNews datasource, a popular source for real-time discussions and articles, can be configured with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kleos setup hackernews &lt;span class="nt"&gt;--name&lt;/span&gt; my_hackernews_data
&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%2Fgy4py31t1vh46qqyu2bj.jpeg" 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%2Fgy4py31t1vh46qqyu2bj.jpeg" alt="Kleos Setup" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This simple command tells MindsDB to create a connection named &lt;code&gt;my_hackernews_data&lt;/code&gt; that can query HackerNews directly. Kleos ensures this process is smooth, even creating the datasource if it doesn't already exist when you try to use it in other commands.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Knowledge Bases (KBs) - The Heart of Kleos (&lt;code&gt;kleos kb ...&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Knowledge Bases are a cornerstone of MindsDB's recent advancements, allowing you to embed and search large volumes of text data semantically. Kleos provides extensive support for managing KBs.&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%2Fszyu89z9cu209hfqbymw.jpeg" 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%2Fszyu89z9cu209hfqbymw.jpeg" alt="Kleos KB" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a. Creating Knowledge Bases (&lt;code&gt;kleos kb create&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can easily create a new KB, specifying the underlying embedding models (to convert text to vectors) and optional reranking models (to improve search result relevance). Kleos supports models from various providers like Ollama (for local LLMs) and Google Gemini.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a KB using a local Ollama model for embeddings and google gemini for reranking model&lt;/span&gt;

kleos kb create gemini_ollama_kb &lt;span class="nt"&gt;--embedding-provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--embedding-model&lt;/span&gt; nomic-embed-text &lt;span class="nt"&gt;--reranking-provider&lt;/span&gt; gemini &lt;span class="nt"&gt;--reranking-model&lt;/span&gt; gemini-2.0-flash &lt;span class="nt"&gt;--google-api-key&lt;/span&gt; YOUR_GOOGLE_API_KEY &lt;span class="nt"&gt;--content-columns&lt;/span&gt; &lt;span class="s2"&gt;"question,answer"&lt;/span&gt; &lt;span class="nt"&gt;--metadata-columns&lt;/span&gt; &lt;span class="s2"&gt;"score"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Kleos handles the construction of the &lt;code&gt;CREATE KNOWLEDGE_BASE&lt;/code&gt; SQL, including the JSON parameters for model configurations.&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%2F10o2ccb24h46lznqxo3f.jpeg" 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%2F10o2ccb24h46lznqxo3f.jpeg" alt="Kleos KB Create" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b. Ingesting Data (&lt;code&gt;kleos kb ingest&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once a KB is created, you need to populate it. Kleos simplifies data ingestion, especially from structured sources like the HackerNews tables.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ingest the latest 100 stories from HackerNews into 'my_hn_kb'&lt;/span&gt;
&lt;span class="c"&gt;# This uses smart defaults for content and metadata columns.&lt;/span&gt;
kleos kb ingest my_hn_kb &lt;span class="nt"&gt;--from-hackernews&lt;/span&gt; stories &lt;span class="nt"&gt;--limit&lt;/span&gt; 100 &lt;span class="nt"&gt;--hn-datasource&lt;/span&gt; my_hackernews_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For more control, you can specify which columns map to your KB's content and metadata:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kleos kb ingest my_custom_kb &lt;span class="nt"&gt;--from-hackernews&lt;/span&gt; comments
  &lt;span class="nt"&gt;--hn-datasource&lt;/span&gt; my_hackernews_data
  &lt;span class="nt"&gt;--content-column&lt;/span&gt; &lt;span class="s2"&gt;"text"&lt;/span&gt;
  &lt;span class="nt"&gt;--metadata-map&lt;/span&gt; &lt;span class="s1"&gt;'{"comment_id":"id", "author":"by", "parent_story":"parent"}'&lt;/span&gt; 
  &lt;span class="nt"&gt;--limit&lt;/span&gt; 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This command translates to an &lt;code&gt;INSERT INTO ... SELECT ...&lt;/code&gt; statement, efficiently loading data into your KB.&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%2F6gskqkk2ihgv6ic9z62v.jpeg" 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%2F6gskqkk2ihgv6ic9z62v.jpeg" alt="Kleos KB Insert" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c. Semantic Search (&lt;code&gt;kleos kb query&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The true power of KBs lies in semantic search. Kleos allows you to query your KBs using natural language, with options for metadata filtering:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Simple semantic search&lt;/span&gt;
kleos kb query my_docs_kb &lt;span class="s2"&gt;"recent breakthroughs in quantum computing"&lt;/span&gt;

&lt;span class="c"&gt;# Search with metadata filtering and limit results&lt;/span&gt;
kleos kb query product_reviews_kb &lt;span class="s2"&gt;"positive feedback on model X"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metadata-filter&lt;/span&gt; &lt;span class="s1"&gt;'{"rating":{"$gte": 4}, "verified_purchase":true}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--limit&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;--metadata-filter&lt;/code&gt; accepts a JSON string, enabling powerful, targeted queries by combining vector search with traditional attribute filtering.&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%2F2186sop0y76872b211wr.jpeg" 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%2F2186sop0y76872b211wr.jpeg" alt="Kleos KB query" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. AI Agents - Your Intelligent Assistants (&lt;code&gt;kleos kb create-agent&lt;/code&gt;, &lt;code&gt;kleos kb query-agent&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;MindsDB allows you to create AI Agents that combine the power of Large Language Models (LLMs) with the contextual knowledge stored in your KBs and databases. Kleos makes agent creation and interaction straightforward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a. Creating Agents (&lt;code&gt;kleos kb create-agent&lt;/code&gt;)&lt;/strong&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%2Fnunecyiywm7nl83p0gwq.jpeg" 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%2Fnunecyiywm7nl83p0gwq.jpeg" alt="Kleos LB create-agent" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Define an agent, link it to one or more KBs, and specify the LLM it should use:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create an agent using Google's Gemini model, connected to 'product_faq_kb'&lt;/span&gt;
kleos kb create-agent product_support_agent 
  &lt;span class="nt"&gt;--model-name&lt;/span&gt; gemini-2.0-flash 
  &lt;span class="nt"&gt;--google-api-key&lt;/span&gt; &lt;span class="s2"&gt;"GOOGLE_API_KEY"&lt;/span&gt;
  &lt;span class="nt"&gt;--include-knowledge-bases&lt;/span&gt; &lt;span class="s2"&gt;"product_faq_kb"&lt;/span&gt; 
  &lt;span class="nt"&gt;--prompt-template&lt;/span&gt; &lt;span class="s2"&gt;"You are a helpful support agent. Answer the user's question based on the provided documents: {{question}}. Context: {{context}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also include regular database tables for additional context and pass other parameters like temperature or API keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b. Querying Agents (&lt;code&gt;kleos kb query-agent&lt;/code&gt;)&lt;/strong&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%2Fxsxnn87cl415kdt90fr6.jpeg" 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%2Fxsxnn87cl415kdt90fr6.jpeg" alt="Kleos KB query-agent" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once created, interact with your agent using natural language:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kleos kb query-agent product_support_agent &lt;span class="s2"&gt;"What is the warranty period for model X?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The agent will leverage its LLM and the content from &lt;code&gt;product_faq_kb&lt;/code&gt; to provide an answer.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. AI Models / Generative AI Tables (&lt;code&gt;kleos ai ...&lt;/code&gt;)
&lt;/h3&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%2Fjv1ux9g8kfjeawhxf193.jpeg" 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%2Fjv1ux9g8kfjeawhxf193.jpeg" alt="Kleos AI" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond KBs and Agents, Kleos helps you manage MindsDB's powerful AI Models (often referred to as Generative AI Tables). These models are trained on your data using SQL and can perform a variety of tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a. Creating AI Models from Data (&lt;code&gt;kleos ai create-model&lt;/code&gt;)&lt;/strong&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%2Fzhvca6t2pxwnw8x2vncb.jpeg" 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%2Fzhvca6t2pxwnw8x2vncb.jpeg" alt="Kleos AI create-model" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Train a model directly from a SQL query. For example, to create a model that summarizes HackerNews story titles:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kleos ai create-model title_summarizer
  &lt;span class="nt"&gt;--select-data-query&lt;/span&gt; &lt;span class="s2"&gt;"SELECT title AS original_title FROM my_hackernews_data.stories WHERE score &amp;gt; 50 LIMIT 100"&lt;/span&gt;
  &lt;span class="nt"&gt;--predict-column&lt;/span&gt; title_summary
  &lt;span class="nt"&gt;--engine&lt;/span&gt; google
  &lt;span class="nt"&gt;--prompt-template&lt;/span&gt; &lt;span class="s2"&gt;"Generate a very short, catchy summary for this news title: {{original_title}}"&lt;/span&gt; 
  &lt;span class="nt"&gt;--param&lt;/span&gt; api_key YOUR_GOOGLE_API_KEY
  &lt;span class="nt"&gt;--param&lt;/span&gt; model_name gemini-2.0-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a queryable &lt;code&gt;title_summarizer&lt;/code&gt; model. You can then select from it, providing new titles to get summaries. Kleos supports listing, describing, refreshing, and dropping these models too.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Automation with MindsDB Jobs (&lt;code&gt;kleos job ...&lt;/code&gt;)
&lt;/h3&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%2Fm0y7eq33nfcxqq4lg471.jpeg" 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%2Fm0y7eq33nfcxqq4lg471.jpeg" alt="Kleos Jobs" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repetitive tasks like data ingestion or model retraining can be automated using MindsDB Jobs. Kleos provides commands to manage these jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a. Creating Jobs (&lt;code&gt;kleos job create&lt;/code&gt;, &lt;code&gt;kleos job update-hn-refresh&lt;/code&gt;)&lt;/strong&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%2Fgx9615uoxh4he1u9wfep.jpeg" 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%2Fgx9615uoxh4he1u9wfep.jpeg" alt="Kleos job create" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For instance, to create a job that updates your HackerNews data daily:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kleos job update-hn-refresh daily_hn_data_update &lt;span class="nt"&gt;--schedule&lt;/span&gt; &lt;span class="s2"&gt;"EVERY 1 day at 02:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or, create a custom job with any SQL statements:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kleos job create nightly_kb_update
  &lt;span class="s2"&gt;"INSERT INTO my_kb SELECT new_text, new_metadata FROM new_data_source LATEST;"&lt;/span&gt;
  &lt;span class="nt"&gt;--schedule&lt;/span&gt; &lt;span class="s2"&gt;"EVERY 1 day at 03:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Kleos also allows you to list, check the status/history of, and drop jobs, giving you full control over your automated workflows. This combination aims to make the Kleos not just powerful but also pleasant to use.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Matters: The Power of In-Database AI &amp;amp; Kleos's Role
&lt;/h2&gt;

&lt;p&gt;The ability to perform complex AI/ML tasks directly within your database using SQL, as enabled by MindsDB, is a game-changer. It democratizes AI by lowering the barrier to entry and streamlines workflows by keeping data and intelligence in one place.&lt;/p&gt;

&lt;p&gt;Kleos CLI aims to be a key enabler in this ecosystem by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Accessibility:&lt;/strong&gt; A user-friendly command-line tool that makes MindsDB's advanced features easy to discover and use.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Productivity:&lt;/strong&gt; Simplifying common tasks like KB management, agent creation, and job automation.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Experimentation:&lt;/strong&gt; Facilitating local development and rapid prototyping with tools like the provided Docker Compose setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're building RAG (Retrieval Augmented Generation) applications, AI saas application, or AI agents workflows, creating custom chatbots, automating data insights, or simply exploring the potential of in-database AI, Kleos and MindsDB offer a powerful combination. &lt;/p&gt;
&lt;h2&gt;
  
  
  Nearly at End
&lt;/h2&gt;

&lt;p&gt;Kleos CLI is an open-source project, and your contributions and feedback are highly welcome!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yashksaini-coder" rel="noopener noreferrer"&gt;
        yashksaini-coder
      &lt;/a&gt; / &lt;a href="https://github.com/yashksaini-coder/Kleos" rel="noopener noreferrer"&gt;
        Kleos
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Every system has its `telos´ — its final cause. This CLI fulfills the purpose of MindsDB's Knowledge Base: to seek, structure, and serve insight through intelligent agents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kleos CLI - Your MindsDB Knowledge Base Toolkit&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/yashksaini-coder/Kleos/./public/Kleos%20Banner.jpeg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FKleos%2FHEAD%2F.%2Fpublic%2FKleos%2520Banner.jpeg" alt="Banner image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mindsdb.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6e711c01e92c9f27f07a65f2e025a80616029e6014cc36b59a560f1423de550b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f776572656425323062792d4d696e647344425f4b6e6f776c656467655f426173652d707572706c65" alt="MindsDB"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kleos&lt;/strong&gt; provides a powerful and interactive, Command Line Interface (CLI) for interacting with MindsDB, with a special focus on its Knowledge Base features and AI Agent integration. It also includes a suite of scripts for performance benchmarking, stress testing, and evaluating MindsDB's reranking capabilities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To learn more about the commands and advanced usage, please refer to the &lt;a href="https://github.com/yashksaini-coder/Kleos/./COMMANDS_REFERENCE.md" rel="noopener noreferrer"&gt;&lt;strong&gt;COMMANDS_REFERENCE.md&lt;/strong&gt;&lt;/a&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For a quick overview of the most common commands and their usage, see the &lt;a href="https://github.com/yashksaini-coder/Kleos/./Quick-examples.md" rel="noopener noreferrer"&gt;&lt;strong&gt;Quick-examples.md&lt;/strong&gt;&lt;/a&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🎥 Project Showcase&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Demo Video&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;DEV Post&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://www.youtube.com/watch?v=lfkm1IUKwOQ" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FKleos%2FHEAD%2F.%2Fpublic%2FKleos%2520About%2520Banner.jpeg" alt="YouTube"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://dev.to/yashksaini/kleos-cli-mindsdb-knowledge-base-supercharged-1a83" rel="nofollow"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FKleos%2FHEAD%2F.%2Fpublic%2FKleos%2520Banner.jpeg" alt="DEV"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhanced CLI (&lt;code&gt;kleos&lt;/code&gt;)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interactive mode for a shell-like experience (run &lt;code&gt;kleos&lt;/code&gt; then type commands).&lt;/li&gt;
&lt;li&gt;Manage MindsDB datasources (e.g., &lt;code&gt;kleos setup hackernews&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create, index, and query Knowledge Bases (e.g., &lt;code&gt;kleos kb create ...&lt;/code&gt;, &lt;code&gt;kleos kb query ...&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Ingest data into KBs (e.g., &lt;code&gt;kleos kb ingest ...&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create and query AI Agents linked to…&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yashksaini-coder/Kleos" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;

&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Try it out:&lt;/strong&gt; You can clone the repo and install it locally on your machine using &lt;code&gt;pip install .&lt;/code&gt; You can install the cli by running the command &lt;code&gt;pip install Kleos&lt;/code&gt;. While writing this article, this feature is in work and will be available very soon.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explore Knowledge Base&lt;/strong&gt; Dive deeper into what &lt;a href="https://docs.mindsdb.com/mindsdb_sql/knowledge-bases" rel="noopener noreferrer"&gt;Knowledge Base&lt;/a&gt; can offer.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;At present, the kleos depends on mindsdb docker-extension &amp;amp; gemini for llm proider, but journey of Kleos is just beginning. Future enhancements could include even richer interactive experiences, more detailed reporting outputs, and support for a wider array of MindsDB's evolving features. &lt;/p&gt;

&lt;p&gt;Thanks for sticking to the end of article. This project took a lot fo heart, research, and all-nighter and late nights snacks too. &lt;/p&gt;

&lt;p&gt;Donate if you wish to support 💗: &lt;a href="https://github.com/sponsors/yashksaini-coder" rel="noopener noreferrer"&gt;yashksaini-coder - GitHub&lt;/a&gt; and ⭐ the &lt;a href="https://github.com/yashksaini-coder/Kleos" rel="noopener noreferrer"&gt;Kleos&lt;/a&gt; project. See you all next time.&lt;/p&gt;

&lt;p&gt;Upvote &lt;a href="https://peerlist.io/yashksaini/project/kleos" rel="noopener noreferrer"&gt;Kleos&lt;/a&gt; and support if you haven't already.&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%2F4nucv387120cvt1zhgjz.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%2F4nucv387120cvt1zhgjz.gif" alt="Kisuke GIF" width="490" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>programming</category>
      <category>agentaichallenge</category>
    </item>
    <item>
      <title>What does not Giving up get you ? Prime example</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Sat, 21 Jun 2025 20:32:21 +0000</pubDate>
      <link>https://dev.to/yashksaini/what-does-not-giving-up-get-you-prime-example-2bn9</link>
      <guid>https://dev.to/yashksaini/what-does-not-giving-up-get-you-prime-example-2bn9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/chiragagg5k/from-student-to-full-time-platform-engineer-at-appwrite-49ci" class="crayons-story__hidden-navigation-link"&gt;From student to full-time Platform Engineer at Appwrite&lt;/a&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="/chiragagg5k" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F963052%2F5823e752-1d03-4f78-96ae-b9beec03752f.png" alt="chiragagg5k profile" class="crayons-avatar__image" width="400" height="400"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/chiragagg5k" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Chirag Aggarwal
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Chirag Aggarwal
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2552846" 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="/chiragagg5k" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F963052%2F5823e752-1d03-4f78-96ae-b9beec03752f.png" class="crayons-avatar__image" alt="" width="400" height="400"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Chirag Aggarwal&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/chiragagg5k/from-student-to-full-time-platform-engineer-at-appwrite-49ci" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 21 '25&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/chiragagg5k/from-student-to-full-time-platform-engineer-at-appwrite-49ci" id="article-link-2552846"&gt;
          From student to full-time Platform Engineer at Appwrite
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&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/chiragagg5k/from-student-to-full-time-platform-engineer-at-appwrite-49ci" 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/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;66&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/chiragagg5k/from-student-to-full-time-platform-engineer-at-appwrite-49ci#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              15&lt;span class="hidden s:inline"&gt; 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;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>career</category>
      <category>motivation</category>
      <category>codenewbie</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How I built a AI Agent server</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Sun, 20 Apr 2025 18:40:54 +0000</pubDate>
      <link>https://dev.to/yashksaini/how-i-built-a-ai-agent-server-3315</link>
      <guid>https://dev.to/yashksaini/how-i-built-a-ai-agent-server-3315</guid>
      <description>&lt;p&gt;Hi everyone, hope you are all doing well. Today I am going to share how I built an AI agent server and deployed it as API. I'm pretty sure, many of you know by now, what an AI agent is and how much popular they have become.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;&lt;em&gt;Hack Agno&lt;/em&gt;&lt;/strong&gt; an AI agent which is deployed as an API service. &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%2Fj54j0hr19vehw07qjpj5.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%2Fj54j0hr19vehw07qjpj5.png" alt="Worfklow" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the integrations and applications being developed, I also wanted to create such an application. The inspiration came from Youtube when I was, searching for resource materials to learn Agents. later on I saw a clickbait, where a guy once developed and created an Agent deployed as API.&lt;/p&gt;




&lt;p&gt;Just around that time, the opportunity presented itself, and then I was already working on building the server. Since this was my first solid AI agent project. I wanted to build with a tech stack that I have worked with before and one I had been working with a long time. So it was &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt; and &lt;a href="https://fastapi.tiangolo.com/" rel="noopener noreferrer"&gt;FastAPI&lt;/a&gt;   &lt;/p&gt;

&lt;p&gt;The hackathon was focused on building AI agents with any framework so with Python in mind, I opted to use a light-weight AI framework. which is, &lt;a href="https://www.agno.com/" rel="noopener noreferrer"&gt;Agno&lt;/a&gt; a lightweight library for building Agents with memory, knowledge, tools and reasoning.&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%2Fl64jb8lu551jfbmgh2a1.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%2Fl64jb8lu551jfbmgh2a1.png" alt="Agno" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use Agno to build Reasoning Agents, Multimodal Agents, Teams of Agents and Agentic Workflows. Agno also provides a beautiful UI to chat with your Agents and tools to monitor and evaluate their performance.&lt;/p&gt;

&lt;p&gt;I created different API routes, that mostly are powered by AI agents. In this project, there are two AI agents, which basically communicates with FastAPI backend, then the response is generated and the output is then show at the client side.&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%2Fcfzig2fuognvn2kwaw13.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%2Fcfzig2fuognvn2kwaw13.png" alt="Workflow" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I also had free time so I decided to give it a retro terminal like UI, and am really satisfied with it. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check out the Original server &lt;a href="https://hack-agent-server.onrender.com/" rel="noopener noreferrer"&gt;Here&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For those who want to see this in action can go to &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%2Fyjh6v2j9nxnajsz2cgjg.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%2Fyjh6v2j9nxnajsz2cgjg.png" alt="Main Page" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By building this project is taught me a lot of things, also showed me that we can use AI agent in many different themes and setups to automate, improve and make apps way more better and interactive.&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%2Fjsudqbzw3gne1vs2tr3r.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%2Fjsudqbzw3gne1vs2tr3r.png" alt="Quest 25" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this project You can vote for it. Login to the &lt;a href="https://quira.sh/" rel="noopener noreferrer"&gt;Quira&lt;/a&gt; and vote on the &lt;a href="https://quira.sh/repo/yashksaini-coder-Hack-Agent-Server-959755963" rel="noopener noreferrer"&gt;Hack Agent Server&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Follow for more such content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yashksaini-coder" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/yashksaini/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt; | &lt;a href="https://yashksaini.vercel.app/" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt; | &lt;a href="https://www.youtube.com/@yashksaini" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>fastapi</category>
      <category>api</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Automate Discord Messages</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Sat, 29 Mar 2025 10:40:03 +0000</pubDate>
      <link>https://dev.to/yashksaini/automate-discord-messages-30ip</link>
      <guid>https://dev.to/yashksaini/automate-discord-messages-30ip</guid>
      <description>&lt;p&gt;Hi 👋 &lt;strong&gt;DEVs&lt;/strong&gt;, in order to get my perspective and objectives of why I did this project and How I built this weekend project, let me first tell you about myself.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/yashksaini-coder" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F115717039%3Fv%3D4%3Fs%3D400" height="460" class="m-0" width="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/yashksaini-coder" rel="noopener noreferrer" class="c-link"&gt;
            yashksaini-coder (Yash Kumar Saini) · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Building 🌐 Skynet from Terminator 🤖 . yashksaini-coder has 155 repositories available. Follow their code on GitHub.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I'm a person who is passionate for building things my way like with retro, simple, and one that can allow me to skip or automate basic tasks. I started my Open Source journey over 3 years ago, At first I struggled with the basic commits, issues and PR stuff. However I loved the idea of all the open source projects, ideas, projects widely available for learn and use. &lt;/p&gt;

&lt;p&gt;I discovered Discord and there I joined many communities where i met and interacted with many Developers, each working on some project either their own or someone's else. &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%2Fvt84b4bjlk83qscw0ri6.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%2Fvt84b4bjlk83qscw0ri6.png" alt="Discord platform" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Why I Built this project ?
&lt;/h2&gt;

&lt;p&gt;Now, recently I was introduced to fun gaming bot widely famous and known as &lt;a href="https://owobot.com/" rel="noopener noreferrer"&gt;OWO&lt;/a&gt; where users can hunt, battle, gamble, complete quests and build their team to battle with among players. The main idea is to hunt and gather &lt;em&gt;resources&lt;/em&gt; &amp;amp; &lt;em&gt;animals&lt;/em&gt;  to build and strengthen your team. Complete &lt;em&gt;quests&lt;/em&gt; &amp;amp; &lt;em&gt;gamble&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;But as I am lazy I wasn't motivated enough to do this manually by typing. There I thought of why not automate this by using a python program to locally run a bot and write messages on certain channel using their ID. Then I started researching on web, how to use discord API and send messages through it with proper authorized token. &lt;/p&gt;

&lt;p&gt;I wanted to send more than one message with proper intervals so that my activity wouldn't be flagged as suspicious or malicious bot. So came up with the idea to set a custom &lt;strong&gt;&lt;em&gt;minimum&lt;/em&gt;&lt;/strong&gt; &amp;amp; &lt;strong&gt;&lt;em&gt;maximum&lt;/em&gt;&lt;/strong&gt; intervals of each message. Instead of using hard coded in lines, Generally I used to approach of using simple JSON (JavaScript Object Notation) implementation, for setting up user_tokem, channel_ID and messages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"channel_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_channel_id_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello, this is a test message!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"min_interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"max_interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This is another message."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"min_interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"max_interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  😉 How I built this project ?
&lt;/h2&gt;

&lt;p&gt;I built this project during the weekend and I wanted to make it feel like a simple Retro Terminal tools like &lt;a href="https://github.com/EnhancedJax/Bagels" rel="noopener noreferrer"&gt;bagels&lt;/a&gt;, &lt;a href="https://github.com/aristocratos/btop" rel="noopener noreferrer"&gt;btop&lt;/a&gt; I wrote the code to use rich and colorama to higlight the texts with proper color palette. Then later on decided to use Looping to send messages using Discord API with POST request. &lt;/p&gt;

&lt;p&gt;Oh! Almost forgot to mention this. Recently I started building all my general projects of Python using,  &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;a href="https://docs.astral.sh/uv" rel="noopener noreferrer"&gt;UV&lt;/a&gt;
&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%2Funghonbfh5fohpdr0wrc.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%2Funghonbfh5fohpdr0wrc.png" alt="UV" width="800" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's nn extremely fast package and project manager, written in Rust. Much better to use and better then all the other alternative tools &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;pip-tools&lt;/code&gt;, &lt;code&gt;pipx&lt;/code&gt;, &lt;code&gt;poetry&lt;/code&gt;, &lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;twine&lt;/code&gt;, &lt;code&gt;virtualenv&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;And for the program to feel more like a Terminal tool I used &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Textualize/rich" rel="noopener noreferrer"&gt;Rich&lt;/a&gt;&lt;br&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%2F5wwilra4z8d9kv1w3zjd.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%2F5wwilra4z8d9kv1w3zjd.png" alt="Rich" width="800" height="896"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://typer.tiangolo.com/" rel="noopener noreferrer"&gt;Typer&lt;/a&gt;&lt;br&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%2F6giqlscof7ohh5p5688p.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%2F6giqlscof7ohh5p5688p.png" alt="Typer" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ⚡Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Message Sending:&lt;/strong&gt; The bot sends messages to a specified Discord channel at random intervals within a defined range.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User-Friendly CLI Interface:&lt;/strong&gt; Uses &lt;a href="https://typer.tiangolo.com/" rel="noopener noreferrer"&gt;Typer&lt;/a&gt; and &lt;a href="https://github.com/Textualize/rich" rel="noopener noreferrer"&gt;Rich&lt;/a&gt; for an interactive and visually appealing command-line experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSON-Based Configuration:&lt;/strong&gt; Stores user settings, including the Discord bot token, channel ID, and message configurations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-Threaded Execution:&lt;/strong&gt; Each message runs in its own thread, ensuring asynchronous delivery without delays.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Graceful Shutdown Handling:&lt;/strong&gt; Supports interruption via &lt;code&gt;Ctrl+C&lt;/code&gt; while safely stopping all active threads.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logging &amp;amp; Error Handling:&lt;/strong&gt; Implements structured logging using &lt;code&gt;rich.logging&lt;/code&gt; and handles errors gracefully.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ✨ &lt;em&gt;Workflow Overview&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;The proper workflow that the script follows to allow users to automate messages can be visualized as follows:-&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%2Fr6d9s6sx1f0st2yyqym0.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%2Fr6d9s6sx1f0st2yyqym0.png" alt="Workflow" width="800" height="965"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;1. Configuration Setup&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;On the first run, the script checks for &lt;code&gt;config.json&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;If missing, it prompts the user to enter:

&lt;ul&gt;
&lt;li&gt;Discord bot token
&lt;/li&gt;
&lt;li&gt;Channel ID
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Saves this data in &lt;code&gt;config.json&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;2. Adding Messages&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Users can add messages to be sent at specific intervals.
&lt;/li&gt;
&lt;li&gt;Each message includes:

&lt;ul&gt;
&lt;li&gt;Message content
&lt;/li&gt;
&lt;li&gt;Minimum and maximum interval (in seconds)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Messages are stored in &lt;code&gt;config.json&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;3. Starting the Bot&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Loads settings from &lt;code&gt;config.json&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Spawns a separate thread for each message.
&lt;/li&gt;
&lt;li&gt;Sends messages at random intervals.
&lt;/li&gt;
&lt;li&gt;Logs each sent message with timestamps.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;4. Shutting Down&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;When interrupted (&lt;code&gt;Ctrl+C&lt;/code&gt;), the bot stops all threads.
&lt;/li&gt;
&lt;li&gt;Ensures a graceful shutdown without abrupt termination.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🤖 &lt;u&gt;Project Repository&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Although the project didn't took much time on coding phase, the research and ideation phase took almost a day, before I finalized a proper structure, design and proper logic to implement to build this project. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yashksaini-coder" rel="noopener noreferrer"&gt;
        yashksaini-coder
      &lt;/a&gt; / &lt;a href="https://github.com/yashksaini-coder/Auto-MSG-Discord" rel="noopener noreferrer"&gt;
        Auto-MSG-Discord
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Automating python script to send message to a channel on behalf of a user with specific messages &amp;amp; their assigned intervals.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Auto message 🤖 &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/530e74cebfc75184d8cc07e27143afa3a10794be9748c7af6d7832ca09cece06/68747470733a2f2f77616b6174696d652e636f6d2f62616467652f757365722f39613832376530342d356466382d343532352d616365382d6538383332366262663837612f70726f6a6563742f39623730333962612d633936662d343938352d623965632d6238343835633633353739312e737667"&gt;&lt;img src="https://camo.githubusercontent.com/530e74cebfc75184d8cc07e27143afa3a10794be9748c7af6d7832ca09cece06/68747470733a2f2f77616b6174696d652e636f6d2f62616467652f757365722f39613832376530342d356466382d343532352d616365382d6538383332366262663837612f70726f6a6563742f39623730333962612d633936662d343938352d623965632d6238343835633633353739312e737667" alt="wakatime"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;An Automating python script to send message to a channel on behalf of a user with specific messages &amp;amp; their assigned intervals.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-alert markdown-alert-caution"&gt;
&lt;p class="markdown-alert-title"&gt;Caution&lt;/p&gt;
&lt;p&gt;This bot is for educational purposes only. Use it responsibly and in accordance with Discord's Terms of Service
Do not use it for spamming or any malicious activities.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=e_oeqp96lRc" rel="nofollow noopener noreferrer"&gt;&lt;br&gt;
  &lt;div&gt;
&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FAuto-MSG-Discord%2FHEAD%2F.%2Fpublic%2Fdemo.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%2Fraw.githubusercontent.com%2Fyashksaini-coder%2FAuto-MSG-Discord%2FHEAD%2F.%2Fpublic%2Fdemo.png" height="400px" width="650px" alt="Auto Message Discord Bot"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage 🚀&lt;/h2&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repository:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/yashksaini-coder/auto-msg-discord
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; auto-msg-discord&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Create and activate virtual environment:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python -m venv venv
&lt;span class="pl-c1"&gt;source&lt;/span&gt; venv/bin/activate  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; On Windows, use `venv\Scripts\activate`&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Install dependencies:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Or use `uv pip install` if available&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Run the bot:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python bot.py&lt;/pre&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Configuration ⚙️&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;The configuration is done in the &lt;code&gt;config.json&lt;/code&gt; file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Make sure to configure &lt;code&gt;config.json&lt;/code&gt; before running the bot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"Config"&lt;/span&gt;: [
    {
      &lt;span class="pl-ent"&gt;"token"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;your_token_here&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
      &lt;span class="pl-ent"&gt;"channel_id"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;your_channel_id_here&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
      &lt;span class="pl-ent"&gt;"messages"&lt;/span&gt;: [
        {
          &lt;span class="pl-ent"&gt;"content"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Hello, this is a test message!&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yashksaini-coder/Auto-MSG-Discord" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Here's 🎞️ demo of me testing and running the bot live to automate sending messages on a particular channel on my own Discord server.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/e_oeqp96lRc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




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

&lt;p&gt;This project was very fun and challenging. Instead of using high use-case Python libraries, I used simple logic with very simple libraries to automate and send messages to a widely used application and the best part was to see that the code was working as it was intended and designed to do. Fulfilling and working properly, with a seamless, minimal, sleek UI design.&lt;/p&gt;

</description>
      <category>automaton</category>
      <category>discord</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>The Friendly Future: How AI Makes Life Easier and Safer for Everyone</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Thu, 06 Mar 2025 06:08:49 +0000</pubDate>
      <link>https://dev.to/yashksaini/the-friendly-future-how-ai-makes-life-easier-and-safer-for-everyone-4de8</link>
      <guid>https://dev.to/yashksaini/the-friendly-future-how-ai-makes-life-easier-and-safer-for-everyone-4de8</guid>
      <description>&lt;p&gt;Dear Reader,&lt;/p&gt;

&lt;p&gt;Hi there! I’m writing this letter to share some fun and simple ideas about how latest technology, especially the AI (Artificial Intelligence) is changing our world in different ways. Imagine having a little helper that’s as clever as your favorite storybook character, always ready to lend a hand and make your day brighter!&lt;/p&gt;

&lt;h3&gt;
  
  
  What Is AI and How Does It Work?
&lt;/h3&gt;

&lt;p&gt;Think of AI as a smart buddy living inside our computers and gadgets. It’s like a magic crayon that learns how to draw better pictures with every stroke. Just as you learn by playing, AI learns by looking at lots of examples and practicing over and over. It can help answer questions, find the fastest way home, or even suggest a yummy new snack recipe. In a way, AI is like a helpful friend who grows smarter with every adventure we share!&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%2F46wpqrkagao4qcccbwm8.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%2F46wpqrkagao4qcccbwm8.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How Technology Affects Us
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;At Home:&lt;/strong&gt;&lt;/em&gt; Imagine coming home to a cozy place where smart devices greet you like old friends. Lights that know when to turn on, speakers that play your favorite lullabies, and even a refrigerator that reminds you when it's time for a snack. These clever helpers make our everyday routines easier and more fun.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;At School and Work:&lt;/strong&gt;&lt;/em&gt; At school, computers and tablets turn learning into exciting games. Math becomes a puzzle to solve and reading transforms into a treasure hunt. At work, smart technology helps adults solve problems faster—almost like having a team of superheroes working together!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;In Our Communities:&lt;/strong&gt;&lt;/em&gt; Technology connects us no matter where we are. We can easily share pictures and stories with our loved ones who are far away, join online games with friends, or even attend fun virtual events. It’s like having a giant playground that stretches all around the world!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;For Our Health and Well-being:&lt;/strong&gt;&lt;/em&gt; Doctors and nurses use smart tools to keep us healthy. Imagine a friendly robot helping your doctor check your heartbeat or reminding you to drink water. These gadgets help keep us safe and happy, much like a caring guardian always by our side.&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%2Fov277o69157jn614a86j.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%2Fov277o69157jn614a86j.jpg" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How Technology Is Used in Everyday Life
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Learning and Creativity:&lt;/em&gt;&lt;/strong&gt; Technology isn’t just about work—it’s a gateway to creativity! Kids can paint digital pictures, build stories with interactive apps, and even make music with simple tools. It makes learning as playful as a game and creativity as endless as your imagination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Helping Hands Everywhere:&lt;/em&gt;&lt;/strong&gt; In our busy world, smart technology finds its way into nearly every part of our lives. It helps farmers water their fields just when the plants need it, guides cars along safe roads, and even assists scientists in exploring the mysteries of space. Every new gadget is like a tiny magic tool that helps us solve big puzzles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Connecting People:&lt;/em&gt;&lt;/strong&gt; Social media and video chats let us see the smiles of friends and family even if they are far away. It’s like having a giant digital hug that makes everyone feel close, no matter how far apart we might be.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Safety Guidelines for a Tech-Filled World
&lt;/h3&gt;

&lt;p&gt;Even though technology brings lots of fun and help, it’s important to use it wisely—just like riding a bicycle with a helmet!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Keep Your Information Safe:&lt;/em&gt;&lt;/strong&gt; Just as you wouldn’t share your secret hideout with strangers, it’s smart not to share personal details like your home address or special passwords online. Always ask an adult if you’re unsure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Use Friendly and Respectful Tools:&lt;/em&gt;&lt;/strong&gt; Remember to be kind online. Technology is a tool for sharing fun ideas and happy moments. Using it to help each other learn and grow is like building a wonderful digital playground where everyone can join in safely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ask for Help When Needed:&lt;/em&gt;&lt;/strong&gt; Sometimes, even smart technology can be confusing. If you ever feel lost in the digital world or see something that makes you uncomfortable, talk to a grown-up. They are like the wise guardians who help keep our digital playground safe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Regular Updates and Smart Settings:&lt;/em&gt;&lt;/strong&gt; Just as you put on a raincoat when it’s cloudy, keeping your devices updated with the latest safety features protects them from sneaky bugs and glitches. Ask an adult to help set up safe screens and privacy rules—these are like magical shields that keep bad things away.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thank you for reading my letter. I hope you’re as excited as I am about our future with technology. With growing technology it is necessary to know and learn about new things, AI can be applied to every field of domain in the civilization and help shape our future to a better end.&lt;/p&gt;

</description>
      <category>futurechallenge</category>
      <category>ai</category>
      <category>devchallenge</category>
      <category>requestforpost</category>
    </item>
    <item>
      <title>First look into Daytona + TypeScript Integration</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Sat, 14 Dec 2024 17:36:22 +0000</pubDate>
      <link>https://dev.to/yashksaini/first-look-into-daytona-typescript-integration-51i4</link>
      <guid>https://dev.to/yashksaini/first-look-into-daytona-typescript-integration-51i4</guid>
      <description>&lt;h4&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Daytona is a very good and very simple to use open source Development environment manager, that can be very useful for building a proper development workflow. It ensures development environments remain consistent and predictable throughout out the dev lifecycle. &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%2F57n9fgsc0libtdiarhdj.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%2F57n9fgsc0libtdiarhdj.png" alt="Daytona Banner" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How it helped me:
&lt;/h4&gt;

&lt;p&gt;When I started contributing to open source very seriously past this year and during the Hacktoberfest'24, I noticed that a lot of time and resources is spent during the setup of the projects I want to contribute to. In order to contribute, I first forked the project, cloned it locally open it on vscode, install dependencies and finally run it locally on my system.&lt;/p&gt;

&lt;p&gt;This took a lot of my time and resources initially. At that time I did wonder if there could be a way to skip this initial process or do it more quickly.&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%2Fhqy3qrwzr2qs5h335v1f.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%2Fhqy3qrwzr2qs5h335v1f.png" alt="Project setup workflow" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fortunately I learned about Daytona and its capabilities to quickly get started with coding, and skipping all those tedious tasks for Development environment setup.&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://www.daytona.io/" rel="noopener noreferrer"&gt;Daytona&lt;/a&gt; for my &lt;a href="https://github.com/yashksaini-coder/relay-chat-backend" rel="noopener noreferrer"&gt;relay-chat-backend&lt;/a&gt;, a WebSocket chat application written in Typescript/NodeJS setup. The experience was very good, every step was smooth run and properly executed. Encountered no problems. &lt;/p&gt;

&lt;h3&gt;
  
  
  Here's why you should also use Daytona:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works with every version control&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dgithub" alt="GitHub" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dgitlab" alt="GitLab" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dbitbucket" alt="Bitbucket" width="48" height="48"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Works with Any IDE of your choice&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dvim" alt="Vim" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dvscode" alt="VS Code" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Didea" alt="IntelliJ IDEA" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dwebstorm" alt="WebStorm" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Drider" alt="Rider" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dpycharm" alt="PyCharm" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dclion" alt="CLion" width="48" height="48"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Works anywhere with these integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dazure" alt="Azure" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Daws" alt="AWS" width="48" height="48"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fskillicons.dev%2Ficons%3Fi%3Dgcp" alt="GCP" width="48" height="48"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Advantages:
&lt;/h3&gt;

&lt;p&gt;The best thing I experienced about Daytona is that you get a very cool &amp;amp; interactive CLI with commands to easily get started with the development environment.&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%2Fg3rx1vog5dutvsar9i4p.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%2Fg3rx1vog5dutvsar9i4p.png" alt="Daytona CLI Interface" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The entire environment is created by using a simple command:-&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Getting Started&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install Daytona using their &lt;a href="https://www.daytona.io/docs/installation/installation/" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; guide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I used Daytona on Windows so you will need to install it using a &lt;strong&gt;powershell&lt;/strong&gt; script. Here's the script code,&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$architecture = if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64") { "amd64" } else { "arm64" }
md -Force "$Env:APPDATA\bin\daytona"; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12';
Invoke-WebRequest -URI "https://download.daytona.io/daytona/v0.47/daytona-windows-$architecture.exe" -OutFile "$Env:APPDATA\bin\daytona\daytona.exe";
$env:Path += ";" + $Env:APPDATA + "\bin\daytona"; [Environment]::SetEnvironmentVariable("Path", $env:Path, [System.EnvironmentVariableTarget]::User);
daytona serve;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Git-Providers&lt;/strong&gt;
Daytona allows its users to connect additional git providers very easily.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daytona git-providers add 
&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%2F57gzherxsf3rob3aru2w.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%2F57gzherxsf3rob3aru2w.png" alt="git-providers Interface" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;:- You can add many more git provider services&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%2Flelix8qbykf0k03hemax.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%2Flelix8qbykf0k03hemax.png" alt="More Git providers" width="735" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Providers&lt;/strong&gt;
You can easily create and manage your cloud environments very easily.
Different cloud providers are Azure, AWS, GCP, localhost, Docker (both local or remote). &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;:- For extra options it first needs to install the providers SDK.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daytona provider install
&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%2Feufsf9ex1mlb4wa0e8db.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%2Feufsf9ex1mlb4wa0e8db.png" alt="Daytona Providers" width="763" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add Dev Container&lt;/strong&gt;
Once you are completed, add a Devcontainer.json inside your project like this &lt;code&gt;.devcontainer/devcontainer.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are having trouble setup the devcontainer for your project, you can use the &lt;a href="https://devcontainer.ai/" rel="noopener noreferrer"&gt;Devcontainer AI&lt;/a&gt; to set it up for you very easily, by just copy-paste your repo link. It will automatically create the &lt;code&gt;devcontainer.json&lt;/code&gt; config file. &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%2F11yg0fibeuebibkzlvva.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%2F11yg0fibeuebibkzlvva.png" alt="Devcontainer AI page" width="800" height="849"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's my relay-chat-backend &lt;code&gt;devcontainer.json&lt;/code&gt; config file:-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WebSocket Chat Application"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcr.microsoft.com/devcontainers/typescript-node:20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forwardPorts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customizations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vscode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"typescript.tsdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/lib/node_modules/typescript/lib"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"extensions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"dbaeumer.vscode-eslint"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postCreateCommand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm install"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create your project workspace&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daytona create https://github.com/yashksaini-coder/relay-chat-backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Final Step&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To start the application, simple run this command in the terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Few Key takeaways:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Boosting my overall productivity, by automating the tedious dev environment initial setup and management, hence optimizing the overall efficiency of my workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Providing security, by control access and comprehensive dependency management, &amp;amp; safeguarding the projects &amp;amp; sensitive information from threats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It also supports scalability when I tested it on the full stack chat application (both frontend + backend) of my application. Easy re-modification and setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I really liked Daytona, it is very easy to use, can run on different machines, setting up &amp;amp; managing the Dev environments is very quick and smooth going. Try it today, I bet you will have a very good experience with it.&lt;/p&gt;

&lt;p&gt;If you like this blog, kindly show support to me &lt;a href="https://github.com/yashksaini-coder/relay-chat-backend" rel="noopener noreferrer"&gt;Project&lt;/a&gt; &amp;amp; to the &lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;Daytona&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yashksaini-coder/relay-chat-backend" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star Relay-chat-backend&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/daytonaio/daytona" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star Daytona&lt;/a&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Thu, 28 Nov 2024 14:30:34 +0000</pubDate>
      <link>https://dev.to/yashksaini/-4c4o</link>
      <guid>https://dev.to/yashksaini/-4c4o</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/chaoming/open-source-saas-starter-react-firebase-stripe-i18n-16nd" class="crayons-story__hidden-navigation-link"&gt;🌟Open-source SaaS Starter: React + Firebase + Stripe + i18n&lt;/a&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="/chaoming" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F381376%2Fa0526111-88d2-41d5-b2c3-e7536cc470a3.png" alt="chaoming profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/chaoming" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Chaoming Li
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Chaoming Li
                
              
              &lt;div id="story-author-preview-content-2122329" 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="/chaoming" 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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F381376%2Fa0526111-88d2-41d5-b2c3-e7536cc470a3.png" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Chaoming Li&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/chaoming/open-source-saas-starter-react-firebase-stripe-i18n-16nd" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 26 '24&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/chaoming/open-source-saas-starter-react-firebase-stripe-i18n-16nd" id="article-link-2122329"&gt;
          🌟Open-source SaaS Starter: React + Firebase + Stripe + i18n
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/stripe"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;stripe&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/saas"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;saas&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/chaoming/open-source-saas-starter-react-firebase-stripe-i18n-16nd" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/chaoming/open-source-saas-starter-react-firebase-stripe-i18n-16nd#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              17&lt;span class="hidden s:inline"&gt; 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;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>RAG Chatbot</title>
      <dc:creator>Yash Kumar Saini</dc:creator>
      <pubDate>Wed, 20 Nov 2024 16:05:28 +0000</pubDate>
      <link>https://dev.to/yashksaini/rag-chatbot-3bce</link>
      <guid>https://dev.to/yashksaini/rag-chatbot-3bce</guid>
      <description>&lt;h1&gt;
  
  
  🌟 Exciting Times: Sharing My Latest Project Adventure!
&lt;/h1&gt;

&lt;p&gt;Hey there, contributors and tech enthusiasts! 👋 &lt;/p&gt;

&lt;p&gt;After being caught up in a whirlwind of activities 🌪️, I almost forgot I had an account here! But guess what? I'm back with something exciting to share. 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 Inspiration Strikes!
&lt;/h2&gt;

&lt;p&gt;Recently, while exploring resources to level up my Flask skills, I stumbled upon an &lt;em&gt;absolute gem&lt;/em&gt; 💎 thanks to the courtesy of an amazing developer, @komsenapati.  &lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Introducing:&lt;/strong&gt; A fantastic Flask project starter template!&lt;br&gt;&lt;br&gt;
It comes with &lt;strong&gt;proper login&lt;/strong&gt; and &lt;strong&gt;register routes&lt;/strong&gt;—just what I needed to kick-start a new project. 🚀  &lt;/p&gt;

&lt;p&gt;Here's the link to the &lt;a href="https://github.com/pheonix-coder/flask-minimal-template" rel="noopener noreferrer"&gt;Flask Minimal Template&lt;/a&gt;. Trust me, it's worth bookmarking! 🔖  &lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 Building a RAG-PDF Chatbot
&lt;/h2&gt;

&lt;p&gt;Fueled by this resource and brimming with curiosity, I ventured into creating something I’m really proud of:  &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;A Multi-PDF RAG-Based Chatbot&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This chatbot leverages cutting-edge &lt;strong&gt;Gemini&lt;/strong&gt; and &lt;strong&gt;Groq AI&lt;/strong&gt; services to provide intelligent responses. 📄💬 It can read and process &lt;strong&gt;multiple PDFs&lt;/strong&gt;—perfect for those who work with document-heavy tasks. 📚✨  &lt;/p&gt;

&lt;p&gt;Here’s a sneak peek 👀:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=eruXhixW1VM" rel="noopener noreferrer"&gt;Demo Video&lt;/a&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%2F5apb65fref4domvmyp68.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%2F5apb65fref4domvmyp68.png" alt="RAG Chatbot Screenshot" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Check It Out
&lt;/h2&gt;

&lt;p&gt;I’ve open-sourced the project so others can learn, contribute, and improve upon it!  &lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Repo Link:&lt;/strong&gt; &lt;a href="https://github.com/yashksaini-coder/RAG-PDF-Chatbot" rel="noopener noreferrer"&gt;RAG-PDF Chatbot&lt;/a&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Why Contribute?
&lt;/h2&gt;

&lt;p&gt;Here’s why you should join hands and contribute:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Learn:&lt;/strong&gt; Deep dive into integrating AI services like Gemini &amp;amp; Groq.
&lt;/li&gt;
&lt;li&gt;🤝 &lt;strong&gt;Collaborate:&lt;/strong&gt; Work with a vibrant community of developers.
&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Build:&lt;/strong&gt; Add features like support for more file formats or better NLP models.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re a Flask fan, an AI enthusiast 🤖, or just someone looking for a cool project to contribute to, this one’s for you!  &lt;/p&gt;




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

&lt;p&gt;I’m planning to:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add support for &lt;strong&gt;real-time queries&lt;/strong&gt; on live PDFs.
&lt;/li&gt;
&lt;li&gt;Improve &lt;strong&gt;UI/UX&lt;/strong&gt; for a smoother user experience. 🎨
&lt;/li&gt;
&lt;li&gt;Incorporate &lt;strong&gt;more AI models&lt;/strong&gt; for multilingual support. 🌍
&lt;/li&gt;
&lt;li&gt;Make this more Enhanced with adding links of articles to converse with&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Let me know your thoughts in the comments 💬 or, better yet, submit a pull request! 💻✨ &amp;amp; let’s make this project a game-changer! 🌟  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; Huge shoutout to the open-source community for inspiring me to keep learning and building. 🛠️💡&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
