<?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: Rohan Sharma</title>
    <description>The latest articles on DEV Community by Rohan Sharma (@rohan_sharma).</description>
    <link>https://dev.to/rohan_sharma</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%2F1936949%2Fa1fd5434-8c99-4531-9491-2d117d2e6996.jpg</url>
      <title>DEV Community: Rohan Sharma</title>
      <link>https://dev.to/rohan_sharma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rohan_sharma"/>
    <language>en</language>
    <item>
      <title>AI Native DevCon’26: The London conference for developers building with AI</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Thu, 21 May 2026 06:06:32 +0000</pubDate>
      <link>https://dev.to/tessl/ai-native-devcon26-the-london-conference-for-developers-building-with-ai-4nm9</link>
      <guid>https://dev.to/tessl/ai-native-devcon26-the-london-conference-for-developers-building-with-ai-4nm9</guid>
      <description>&lt;p&gt;The bottleneck moved from writing code to governing it.&lt;/p&gt;

&lt;p&gt;The promise was 2× throughput. The reality is 2× the review queue, 2× the security exposure, and a CI signal you can no longer trust. &lt;a href="https://tessl.io/devcon" rel="noopener noreferrer"&gt;AI Native DevCon&lt;/a&gt; 2026 is for the engineering leaders who have to figure out how to ship anyway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tessl.io/devcon" rel="noopener noreferrer"&gt;AI Native DevCon&lt;/a&gt; 2026 lands at The Brewery in London on June 1 and 2, with a hybrid track for remote. This is the conference for VPs of engineering, CTOs, platform owners, security leads, and senior engineers running agents in production, or about to. 500+ builders. Four tracks.&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%2Fgp2a7mihm3ub05mz53mx.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%2Fgp2a7mihm3ub05mz53mx.png" alt="sponsors" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/guypo/" rel="noopener noreferrer"&gt;Guy Podjarny&lt;/a&gt;, founder of &lt;a href="https://tessl.io" rel="noopener noreferrer"&gt;Tessl&lt;/a&gt;, organizer of &lt;a href="https://tessl.io/devcon" rel="noopener noreferrer"&gt;AI Native DevCon&lt;/a&gt;, and previously of &lt;a href="https://snyk.io/" rel="noopener noreferrer"&gt;Snyk&lt;/a&gt;, frames the 2026 question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If 2025 was the year coding agents started showing real promise, 2026 is the year we figure out how they hold up in production. The challenge is no longer getting an agent to work, it is getting it to work consistently across teams, codebases, and environments without constant human correction.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The schedule is organized around four tracks: &lt;strong&gt;context engineering&lt;/strong&gt; (building with agents), &lt;strong&gt;agent orchestration&lt;/strong&gt; (verification when CI is no longer enough), &lt;strong&gt;organizational enablement&lt;/strong&gt; (coordination at agent throughput), and &lt;strong&gt;agent enablement&lt;/strong&gt; (security and governance). Each maps to a problem most teams are already hitting.&lt;/p&gt;

&lt;p&gt;The agenda is built around the problems they actually have right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. “We do not know how to build with agents yet.”
&lt;/h2&gt;

&lt;p&gt;How the engineer’s role is changing, and what products designed for humans need to do once agents start using them. By 2026, that question lands on every platform team. This is the context engineering track.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/ryanlopopolo/" rel="noopener noreferrer"&gt;&lt;strong&gt;Ryan Lopopolo&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(OpenAI)&lt;/strong&gt;, &lt;em&gt;Harness Engineering&lt;/em&gt;. Concrete patterns for systems where humans set direction and agents execute, including the review and approval surfaces that keep it safe at scale.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/dglawson" rel="noopener noreferrer"&gt;&lt;strong&gt;Dana Lawson&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Netlify, CTO)&lt;/strong&gt;, &lt;em&gt;Built for Humans. Now Agents Are Here.&lt;/em&gt; What changes in a developer platform when half the users are non-human, and the API and UX decisions Netlify made in response.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/anatomic/" rel="noopener noreferrer"&gt;&lt;strong&gt;Ian Thomas&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Meta)&lt;/strong&gt;, &lt;em&gt;AI Native Engineering&lt;/em&gt;. How a large engineering org is restructuring workflows around agent-assisted development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://uk.linkedin.com/in/steve-ruiz-61a150239" rel="noopener noreferrer"&gt;&lt;strong&gt;Steve Ruiz&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(tldraw)&lt;/strong&gt;, &lt;em&gt;Agents on the canvas&lt;/em&gt;. Interaction patterns for visual agents, with shipping examples you can copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. “We can generate code. We cannot verify it.”
&lt;/h2&gt;

&lt;p&gt;CI is no longer evidence of correctness. Two years of agent-generated code has proved it. The agent orchestration track is about what to put in its place.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/justincormack/" rel="noopener noreferrer"&gt;&lt;strong&gt;Justin Cormack&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(ex-Docker CTO)&lt;/strong&gt;, &lt;em&gt;When Tests Lie&lt;/em&gt;. Runtime signals that flag agent-introduced drift before it reaches users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.linkedin.com/in/dave-farley-a67927/" rel="noopener noreferrer"&gt;Dave Farley&lt;/a&gt; (Founder &amp;amp; CEO of Continuous Delivery Ltd. - 250k on Youtube),&lt;/strong&gt; &lt;em&gt;Vibe Coding, really?&lt;/em&gt;  The ideas that may actually survive the AI programming revolution, beyond hype, demos, and generated boilerplate.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/fowlerchad/" rel="noopener noreferrer"&gt;&lt;strong&gt;Chad Fowler&lt;/strong&gt;&lt;/a&gt;, &lt;em&gt;Regenerative Software&lt;/em&gt;. An architectural model where components are regenerated rather than patched, and what verification looks like when code is short-lived by design.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. “AI writes code faster than teams can coordinate.”
&lt;/h2&gt;

&lt;p&gt;Two years into coding-agent adoption, throughput is up roughly 2×. Coordination cost scaled with it. The organizational enablement track covers review, ownership, and team structure.&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%2F5ng9y6sw60tvf7ann6jw.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%2F5ng9y6sw60tvf7ann6jw.png" alt="guypo" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/guypo/" rel="noopener noreferrer"&gt;&lt;strong&gt;Guy Podjarny&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Tessl)&lt;/strong&gt;, &lt;em&gt;Skills are the new Code&lt;/em&gt; (keynote). The case for &lt;a href="https://tessl.io/registry" rel="noopener noreferrer"&gt;treating skills as proper software&lt;/a&gt;: versioned, tested, owned, reviewed. With the Tessl Registry now holding 2,000+ evaluated skills, the talk covers what that means for repo structure and review process.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/birgittaboeckeler/" rel="noopener noreferrer"&gt;&lt;strong&gt;Birgitta Böckeler&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Thoughtworks)&lt;/strong&gt;, &lt;em&gt;State of Play: AI Coding Assistants&lt;/em&gt; (keynote). Two years of field data on which adoption patterns work and which create future technical debt.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/patrickdebois/" rel="noopener noreferrer"&gt;&lt;strong&gt;Patrick Debois&lt;/strong&gt;&lt;/a&gt;, &lt;em&gt;The Rise of Agent Enablement&lt;/em&gt;. &lt;a href="https://tessl.io/agent-enablement" rel="noopener noreferrer"&gt;Agent Enablement&lt;/a&gt; is the function that owns reliable agent adoption inside an engineering org. It defines standards for skills, evals, and workflows, and sits next to DevOps and Platform Engineering. Patrick’s session covers who owns it, what they do, and how teams formalize it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. “Your AI is a new attack surface.”
&lt;/h2&gt;

&lt;p&gt;Vulnerability classes that did not exist 18 months ago, and the controls most teams have not put in place yet. This is the agent enablement track from a security and governance angle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/talliran/" rel="noopener noreferrer"&gt;&lt;strong&gt;Liran Tal&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Snyk)&lt;/strong&gt;, &lt;em&gt;Your AI Agent Installed Malware Because a SKILL.md Told It To&lt;/em&gt;. Live demo of prompt-injection via SKILL.md manifests, with the threat model and mitigations.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://linkedin.com/in/jkcso" rel="noopener noreferrer"&gt;&lt;strong&gt;Joseph Katsioloudes&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(GitHub)&lt;/strong&gt;, &lt;em&gt;Code Security Reinvented&lt;/em&gt;. How SAST, secret scanning, and review need to change for AI-generated code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/jack-wotherspoon/" rel="noopener noreferrer"&gt;&lt;strong&gt;Jack Wotherspoon&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Google)&lt;/strong&gt;, &lt;em&gt;Humans vs. Slop&lt;/em&gt;. New rules for open source maintainers when an unknown share of contributors are agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why engineering leaders should attend
&lt;/h2&gt;

&lt;p&gt;Five things your team brings back to Monday:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A verification model that does not assume CI catches the regression&lt;/li&gt;
&lt;li&gt;Threat models for prompt-injection and SKILL.md attacks, with mitigations&lt;/li&gt;
&lt;li&gt;Team structures and review workflows that scale with agent throughput&lt;/li&gt;
&lt;li&gt;A working definition of Agent Enablement as a discipline, including ownership and scope&lt;/li&gt;
&lt;li&gt;A model for evaluating skills before they go org-wide, with review patterns and KPIs&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  Hosts and the wider lineup
&lt;/h2&gt;

&lt;p&gt;Hosted by &lt;a href="https://www.linkedin.com/in/sammyhepburn/" rel="noopener noreferrer"&gt;&lt;strong&gt;Sam Hepburn&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/patrickdebois/" rel="noopener noreferrer"&gt;&lt;strong&gt;Patrick Debois&lt;/strong&gt;&lt;/a&gt;. Day-one keynote from &lt;a href="https://x.com/lievenscheire" rel="noopener noreferrer"&gt;&lt;strong&gt;Lieven Scheire&lt;/strong&gt;&lt;/a&gt; on AI from outside the engineering bubble. The wider roster covers agent observability, MCP transports, runtime intelligence, brownfield adoption, and team-level adoption metrics, with practitioners from Anthropic, OpenAI, NVIDIA, Adobe, Hugging Face, Mozilla.ai, Cisco, Nearform, GitHub, and much more.&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%2Fkdvcmrgty5seazs7mhf6.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%2Fkdvcmrgty5seazs7mhf6.png" alt="speakers" width="800" height="857"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full speaker list and abstracts: &lt;a href="https://tessl.io/devcon" rel="noopener noreferrer"&gt;tessl.io/devcon&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dates:&lt;/strong&gt; June 1 and 2, 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; 2 days in-person or 1 day virtual&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Venue:&lt;/strong&gt; The Brewery, Barbican, London.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Register:&lt;/strong&gt; &lt;a href="https://luma.com/aidevcon-ldn26?coupon=R30" rel="noopener noreferrer"&gt;https://luma.com/aidevcon-ldn26?coupon=R30&lt;/a&gt; (&lt;code&gt;R30&lt;/code&gt; auto-applies at checkout to knocks off 30% off)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bringing a team?&lt;/strong&gt; Contact at &lt;a href="https://tessl.io/get-in-touch/" rel="noopener noreferrer"&gt;tessl.io/get-in-touch&lt;/a&gt;, and we can arrange a group purchase discount.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See you at the event!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>career</category>
      <category>eventsinyourcity</category>
    </item>
    <item>
      <title>GPT-5.5 is OpenAI's best model. But paying more for it makes no sense.</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Wed, 06 May 2026 13:13:28 +0000</pubDate>
      <link>https://dev.to/tessl/gpt-55-is-openais-best-model-but-paying-more-for-it-makes-no-sense-2227</link>
      <guid>https://dev.to/tessl/gpt-55-is-openais-best-model-but-paying-more-for-it-makes-no-sense-2227</guid>
      <description>&lt;p&gt;We added OpenAI’s gpt-5.5 model to our eval suite the day it launched. We ran 1,742 tests overall, which included over 45 task scenarios across using 11 real engineering skills, each run 6 times and averaged the data, which is shown in this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;The gpt-5.5 model has the highest raw capability of any OpenAI model we've tested. When it uses agent skills and performs the same tasks, it pretty much ties with gpt-5.4 on score but costs 63% more per run.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best Codex model out of the box?&lt;/td&gt;
&lt;td&gt;gpt-5.5: 75.6 avg baseline, highest in the family&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Codex model with skills loaded?&lt;/td&gt;
&lt;td&gt;gpt-5.4 and gpt-5.5 tie at 89.3 and 89.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worth the 63% price premium over gpt-5.4?&lt;/td&gt;
&lt;td&gt;With this data, we don’t think so&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any scenario where it wins?&lt;/td&gt;
&lt;td&gt;Latency: 89.5s vs 135.4s for gpt-5.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Should you use gpt-5.3 instead?&lt;/td&gt;
&lt;td&gt;No, oddly enough, gpt-5.3 costs 47% more than gpt-5.4 for a worse result because of the token bloat.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The one-line verdict: gpt-5.5 is the most capable Codex model we've benchmarked, and when using agent skills to guide with tasks, it performs pretty much identically to a model that costs a third less. The interesting story is actually gpt-5.3, which costs more than gpt-5.4 and scores worse, because of the token bloat in 5.3. The per-token cost is, of course, more expensive with gpt-5.5.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Takeaways
&lt;/h2&gt;

&lt;p&gt;The most counterintuitive thing in this data: gpt-5.5 and gpt-5.4 score within 0.1 points of each other when given domain skills, 89.4 vs 89.3. The self-sufficiency story holds directionally, but these two models are functionally the same on skill-augmented work. The question is purely cost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tessl.io/devcon" rel="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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbraf14e4s66n7ibzuwuk.png" alt="Join us at AI Native DevCon" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;
Join us at AI Native DevCon (use C0DE30 for 30% discount)



&lt;p&gt;The gpt-5.3 story is sharper. The headline numbers put it at 83.9 with skills against 89.3 for gpt-5.4, a 5.4 point gap. It also costs $0.44 per run against $0.30 for gpt-5.4. You pay more and get less, which is a complete description of a bad deal.&lt;/p&gt;

&lt;p&gt;You pay $0.49/run for 89.4 points with gpt-5.5. You pay $0.30/run for 89.3 points with gpt-5.4. The only dimension where gpt-5.5 leads is latency, at 89.5s against 135.4s. If you're running latency-constrained agents and can absorb the cost, it's a defensible choice. Otherwise you're paying a 63% premium for 0.1 points.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Stacks Up
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Task Scores (using agent skill)&lt;/th&gt;
&lt;th&gt;Cost/run&lt;/th&gt;
&lt;th&gt;Score/$&lt;/th&gt;
&lt;th&gt;Avg lift&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-7&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;+12.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor:composer-2&lt;/td&gt;
&lt;td&gt;89.6&lt;/td&gt;
&lt;td&gt;$0.23&lt;/td&gt;
&lt;td&gt;389&lt;/td&gt;
&lt;td&gt;+15.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.5&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;td&gt;$0.49&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;td&gt;+13.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4&lt;/td&gt;
&lt;td&gt;89.3&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;td&gt;298&lt;/td&gt;
&lt;td&gt;+15.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex&lt;/td&gt;
&lt;td&gt;83.9&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;td&gt;191&lt;/td&gt;
&lt;td&gt;+18.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5-codex&lt;/td&gt;
&lt;td&gt;78.7&lt;/td&gt;
&lt;td&gt;$1.05&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;+10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;gpt-5.5 and gpt-5.4 are functionally interchangeable on skill performance. The question is whether 45 seconds per run is worth $0.19.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Tested
&lt;/h2&gt;

&lt;p&gt;This benchmark runs on &lt;a href="https://tessl.io" rel="noopener noreferrer"&gt;Tessl&lt;/a&gt;, an agentic evaluation platform. A skill is a &lt;code&gt;SKILL.md&lt;/code&gt; file, which is a structured markdown document containing rules, patterns, and examples for a specific domain. For the baseline run, the agent sees only the task prompt with no additional context. For the with-skill run, the &lt;code&gt;SKILL.md&lt;/code&gt; is loaded into the agent's context alongside the task, same model, same task, same rubric. The score delta is the lift. The platform runs each scenario twice and scores the output against a pre-written rubric checklist automatically.&lt;/p&gt;

&lt;p&gt;Each scenario was run 6 times and scored independently; all figures are averaged across those runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why rubric checklists?&lt;/strong&gt; Because the scenarios have objectively right answers. "Does the agent delete &lt;code&gt;.eslintrc.json&lt;/code&gt; and create &lt;code&gt;eslint.config.js&lt;/code&gt;?" is not a matter of opinion. Neither is "Does it use PKCE method S256?" or "Does it call &lt;code&gt;pipeline()&lt;/code&gt; instead of chaining &lt;code&gt;.pipe()&lt;/code&gt;?" Binary criteria eliminate evaluation noise wherever possible.&lt;/p&gt;

&lt;p&gt;Example rubric: &lt;em&gt;Modernize the Linting Setup for a Node.js Library&lt;/em&gt;, 11 criteria, 101 points.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;Pass condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;neostandard installed&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;neostandard present in devDependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard uninstalled&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;standard absent from devDependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flat config file&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;eslint.config.js or .mjs exists, not .eslintrc*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;neostandard in config&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Config imports from neostandard and calls neostandard()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lint script uses eslint&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;package.json lint script runs eslint ., not neostandard . or standard .&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;migrate command used&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Instructions reference npx neostandard --migrate to generate the config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lint:fix script present&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;lint:fix script runs eslint . --fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI uses non-fix run&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;CI config runs lint without --fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard config removed&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;No top-level standard key in package.json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lint-staged uses eslint&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Pre-commit hook runs eslint --fix, not neostandard or standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;eslint@9 installed&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;eslint at version 9.x in devDependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A model that migrates the config correctly but leaves &lt;code&gt;standard&lt;/code&gt; in devDependencies scores 91/101. One that creates &lt;code&gt;eslint.config.js&lt;/code&gt; alongside &lt;code&gt;.eslintrc.json&lt;/code&gt; instead of replacing it scores 0 on three criteria at once.&lt;/p&gt;

&lt;p&gt;All skills and rubrics are published at &lt;a href="https://tessl.io/registry/simon/skills" rel="noopener noreferrer"&gt;simon/skills on the Tessl registry&lt;/a&gt;. Full eval results for this run &lt;a href="https://tessl.io/registry/simon/skills/evals" rel="noopener noreferrer"&gt;can be found here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Baseline scores (no skill), sorted by highest average
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;docs&lt;/th&gt;
&lt;th&gt;fastify&lt;/th&gt;
&lt;th&gt;init&lt;/th&gt;
&lt;th&gt;lint&lt;/th&gt;
&lt;th&gt;node&lt;/th&gt;
&lt;th&gt;node-core&lt;/th&gt;
&lt;th&gt;oauth&lt;/th&gt;
&lt;th&gt;octocat&lt;/th&gt;
&lt;th&gt;skill-opt&lt;/th&gt;
&lt;th&gt;snip&lt;/th&gt;
&lt;th&gt;ts&lt;/th&gt;
&lt;th&gt;Avg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-7&lt;/td&gt;
&lt;td&gt;85.7&lt;/td&gt;
&lt;td&gt;80.9&lt;/td&gt;
&lt;td&gt;79.7&lt;/td&gt;
&lt;td&gt;92.9&lt;/td&gt;
&lt;td&gt;73.7&lt;/td&gt;
&lt;td&gt;91.6&lt;/td&gt;
&lt;td&gt;75.7&lt;/td&gt;
&lt;td&gt;84.7&lt;/td&gt;
&lt;td&gt;85.0&lt;/td&gt;
&lt;td&gt;60.1&lt;/td&gt;
&lt;td&gt;78.8&lt;/td&gt;
&lt;td&gt;80.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.5&lt;/td&gt;
&lt;td&gt;89.9&lt;/td&gt;
&lt;td&gt;71.8&lt;/td&gt;
&lt;td&gt;63.6&lt;/td&gt;
&lt;td&gt;94.4&lt;/td&gt;
&lt;td&gt;64.6&lt;/td&gt;
&lt;td&gt;72.3&lt;/td&gt;
&lt;td&gt;73.6&lt;/td&gt;
&lt;td&gt;85.5&lt;/td&gt;
&lt;td&gt;83.2&lt;/td&gt;
&lt;td&gt;54.7&lt;/td&gt;
&lt;td&gt;78.3&lt;/td&gt;
&lt;td&gt;75.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4&lt;/td&gt;
&lt;td&gt;87.6&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;71.1&lt;/td&gt;
&lt;td&gt;84.5&lt;/td&gt;
&lt;td&gt;62.3&lt;/td&gt;
&lt;td&gt;77.4&lt;/td&gt;
&lt;td&gt;77.5&lt;/td&gt;
&lt;td&gt;80.5&lt;/td&gt;
&lt;td&gt;80.8&lt;/td&gt;
&lt;td&gt;50.9&lt;/td&gt;
&lt;td&gt;75.9&lt;/td&gt;
&lt;td&gt;74.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor:composer-2&lt;/td&gt;
&lt;td&gt;84.3&lt;/td&gt;
&lt;td&gt;74.7&lt;/td&gt;
&lt;td&gt;61.6&lt;/td&gt;
&lt;td&gt;94.1&lt;/td&gt;
&lt;td&gt;65.4&lt;/td&gt;
&lt;td&gt;78.8&lt;/td&gt;
&lt;td&gt;73.1&lt;/td&gt;
&lt;td&gt;78.5&lt;/td&gt;
&lt;td&gt;82.3&lt;/td&gt;
&lt;td&gt;58.5&lt;/td&gt;
&lt;td&gt;65.5&lt;/td&gt;
&lt;td&gt;74.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5-codex&lt;/td&gt;
&lt;td&gt;80.2&lt;/td&gt;
&lt;td&gt;67.3&lt;/td&gt;
&lt;td&gt;60.2&lt;/td&gt;
&lt;td&gt;84.9&lt;/td&gt;
&lt;td&gt;60.4&lt;/td&gt;
&lt;td&gt;76.5&lt;/td&gt;
&lt;td&gt;72.9&lt;/td&gt;
&lt;td&gt;75.3&lt;/td&gt;
&lt;td&gt;63.8&lt;/td&gt;
&lt;td&gt;47.5&lt;/td&gt;
&lt;td&gt;66.5&lt;/td&gt;
&lt;td&gt;68.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex&lt;/td&gt;
&lt;td&gt;63.5&lt;/td&gt;
&lt;td&gt;65.4&lt;/td&gt;
&lt;td&gt;52.1&lt;/td&gt;
&lt;td&gt;76.5&lt;/td&gt;
&lt;td&gt;62.4&lt;/td&gt;
&lt;td&gt;75.3&lt;/td&gt;
&lt;td&gt;77.9&lt;/td&gt;
&lt;td&gt;68.3&lt;/td&gt;
&lt;td&gt;70.5&lt;/td&gt;
&lt;td&gt;42.1&lt;/td&gt;
&lt;td&gt;66.4&lt;/td&gt;
&lt;td&gt;65.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  With-skill scores, sorted by highest average
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;docs&lt;/th&gt;
&lt;th&gt;fastify&lt;/th&gt;
&lt;th&gt;init&lt;/th&gt;
&lt;th&gt;lint&lt;/th&gt;
&lt;th&gt;node&lt;/th&gt;
&lt;th&gt;node-core&lt;/th&gt;
&lt;th&gt;oauth&lt;/th&gt;
&lt;th&gt;octocat&lt;/th&gt;
&lt;th&gt;skill-opt&lt;/th&gt;
&lt;th&gt;snip&lt;/th&gt;
&lt;th&gt;ts&lt;/th&gt;
&lt;th&gt;Avg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-7&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;98.9&lt;/td&gt;
&lt;td&gt;82.3&lt;/td&gt;
&lt;td&gt;97.2&lt;/td&gt;
&lt;td&gt;95.1&lt;/td&gt;
&lt;td&gt;84.7&lt;/td&gt;
&lt;td&gt;94.3&lt;/td&gt;
&lt;td&gt;97.7&lt;/td&gt;
&lt;td&gt;99.7&lt;/td&gt;
&lt;td&gt;92.9&lt;/td&gt;
&lt;td&gt;88.0&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor:composer-2&lt;/td&gt;
&lt;td&gt;95.6&lt;/td&gt;
&lt;td&gt;93.9&lt;/td&gt;
&lt;td&gt;85.7&lt;/td&gt;
&lt;td&gt;96.4&lt;/td&gt;
&lt;td&gt;94.0&lt;/td&gt;
&lt;td&gt;92.3&lt;/td&gt;
&lt;td&gt;83.9&lt;/td&gt;
&lt;td&gt;94.5&lt;/td&gt;
&lt;td&gt;93.7&lt;/td&gt;
&lt;td&gt;85.3&lt;/td&gt;
&lt;td&gt;70.4&lt;/td&gt;
&lt;td&gt;89.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.5&lt;/td&gt;
&lt;td&gt;96.1&lt;/td&gt;
&lt;td&gt;86.0&lt;/td&gt;
&lt;td&gt;81.8&lt;/td&gt;
&lt;td&gt;96.3&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;td&gt;88.6&lt;/td&gt;
&lt;td&gt;91.7&lt;/td&gt;
&lt;td&gt;92.1&lt;/td&gt;
&lt;td&gt;96.0&lt;/td&gt;
&lt;td&gt;86.5&lt;/td&gt;
&lt;td&gt;79.2&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4&lt;/td&gt;
&lt;td&gt;97.1&lt;/td&gt;
&lt;td&gt;76.9&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;98.1&lt;/td&gt;
&lt;td&gt;84.8&lt;/td&gt;
&lt;td&gt;93.7&lt;/td&gt;
&lt;td&gt;91.6&lt;/td&gt;
&lt;td&gt;95.7&lt;/td&gt;
&lt;td&gt;94.6&lt;/td&gt;
&lt;td&gt;90.9&lt;/td&gt;
&lt;td&gt;79.0&lt;/td&gt;
&lt;td&gt;89.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex&lt;/td&gt;
&lt;td&gt;96.9&lt;/td&gt;
&lt;td&gt;86.1&lt;/td&gt;
&lt;td&gt;80.4&lt;/td&gt;
&lt;td&gt;90.2&lt;/td&gt;
&lt;td&gt;75.9&lt;/td&gt;
&lt;td&gt;77.1&lt;/td&gt;
&lt;td&gt;93.1&lt;/td&gt;
&lt;td&gt;92.3&lt;/td&gt;
&lt;td&gt;77.3&lt;/td&gt;
&lt;td&gt;79.4&lt;/td&gt;
&lt;td&gt;74.1&lt;/td&gt;
&lt;td&gt;83.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5-codex&lt;/td&gt;
&lt;td&gt;62.9&lt;/td&gt;
&lt;td&gt;88.9&lt;/td&gt;
&lt;td&gt;74.8&lt;/td&gt;
&lt;td&gt;92.1&lt;/td&gt;
&lt;td&gt;66.3&lt;/td&gt;
&lt;td&gt;77.7&lt;/td&gt;
&lt;td&gt;89.3&lt;/td&gt;
&lt;td&gt;85.9&lt;/td&gt;
&lt;td&gt;80.7&lt;/td&gt;
&lt;td&gt;86.0&lt;/td&gt;
&lt;td&gt;61.1&lt;/td&gt;
&lt;td&gt;78.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Lift: what skills actually added per model, sorted by highest average lift
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;docs&lt;/th&gt;
&lt;th&gt;fastify&lt;/th&gt;
&lt;th&gt;init&lt;/th&gt;
&lt;th&gt;lint&lt;/th&gt;
&lt;th&gt;node&lt;/th&gt;
&lt;th&gt;node-core&lt;/th&gt;
&lt;th&gt;oauth&lt;/th&gt;
&lt;th&gt;octocat&lt;/th&gt;
&lt;th&gt;skill-opt&lt;/th&gt;
&lt;th&gt;snip&lt;/th&gt;
&lt;th&gt;ts&lt;/th&gt;
&lt;th&gt;Avg lift&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex&lt;/td&gt;
&lt;td&gt;+33.4&lt;/td&gt;
&lt;td&gt;+20.7&lt;/td&gt;
&lt;td&gt;+28.3&lt;/td&gt;
&lt;td&gt;+13.7&lt;/td&gt;
&lt;td&gt;+13.5&lt;/td&gt;
&lt;td&gt;+1.8&lt;/td&gt;
&lt;td&gt;+15.2&lt;/td&gt;
&lt;td&gt;+24.0&lt;/td&gt;
&lt;td&gt;+6.8&lt;/td&gt;
&lt;td&gt;+37.3&lt;/td&gt;
&lt;td&gt;+7.7&lt;/td&gt;
&lt;td&gt;+18.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cursor:composer-2&lt;/td&gt;
&lt;td&gt;+11.3&lt;/td&gt;
&lt;td&gt;+19.2&lt;/td&gt;
&lt;td&gt;+24.1&lt;/td&gt;
&lt;td&gt;+2.3&lt;/td&gt;
&lt;td&gt;+28.6&lt;/td&gt;
&lt;td&gt;+13.5&lt;/td&gt;
&lt;td&gt;+10.8&lt;/td&gt;
&lt;td&gt;+16.0&lt;/td&gt;
&lt;td&gt;+11.4&lt;/td&gt;
&lt;td&gt;+26.8&lt;/td&gt;
&lt;td&gt;+4.9&lt;/td&gt;
&lt;td&gt;+15.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4&lt;/td&gt;
&lt;td&gt;+9.5&lt;/td&gt;
&lt;td&gt;+10.2&lt;/td&gt;
&lt;td&gt;+8.9&lt;/td&gt;
&lt;td&gt;+13.6&lt;/td&gt;
&lt;td&gt;+22.5&lt;/td&gt;
&lt;td&gt;+16.3&lt;/td&gt;
&lt;td&gt;+14.1&lt;/td&gt;
&lt;td&gt;+15.2&lt;/td&gt;
&lt;td&gt;+13.8&lt;/td&gt;
&lt;td&gt;+40.0&lt;/td&gt;
&lt;td&gt;+3.1&lt;/td&gt;
&lt;td&gt;+15.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.5&lt;/td&gt;
&lt;td&gt;+6.2&lt;/td&gt;
&lt;td&gt;+14.2&lt;/td&gt;
&lt;td&gt;+18.2&lt;/td&gt;
&lt;td&gt;+1.9&lt;/td&gt;
&lt;td&gt;+23.7&lt;/td&gt;
&lt;td&gt;+16.3&lt;/td&gt;
&lt;td&gt;+18.1&lt;/td&gt;
&lt;td&gt;+6.6&lt;/td&gt;
&lt;td&gt;+12.8&lt;/td&gt;
&lt;td&gt;+31.8&lt;/td&gt;
&lt;td&gt;+0.9&lt;/td&gt;
&lt;td&gt;+13.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-7&lt;/td&gt;
&lt;td&gt;+11.0&lt;/td&gt;
&lt;td&gt;+18.0&lt;/td&gt;
&lt;td&gt;+2.6&lt;/td&gt;
&lt;td&gt;+4.3&lt;/td&gt;
&lt;td&gt;+21.4&lt;/td&gt;
&lt;td&gt;-6.9&lt;/td&gt;
&lt;td&gt;+18.6&lt;/td&gt;
&lt;td&gt;+13.0&lt;/td&gt;
&lt;td&gt;+14.7&lt;/td&gt;
&lt;td&gt;+32.8&lt;/td&gt;
&lt;td&gt;+9.2&lt;/td&gt;
&lt;td&gt;+12.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5-codex&lt;/td&gt;
&lt;td&gt;-17.3&lt;/td&gt;
&lt;td&gt;+21.6&lt;/td&gt;
&lt;td&gt;+14.6&lt;/td&gt;
&lt;td&gt;+7.2&lt;/td&gt;
&lt;td&gt;+5.9&lt;/td&gt;
&lt;td&gt;+1.2&lt;/td&gt;
&lt;td&gt;+16.4&lt;/td&gt;
&lt;td&gt;+10.6&lt;/td&gt;
&lt;td&gt;+16.9&lt;/td&gt;
&lt;td&gt;+38.5&lt;/td&gt;
&lt;td&gt;-5.4&lt;/td&gt;
&lt;td&gt;+10.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Reading the lift table.&lt;/strong&gt; A few observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;claude-opus-4-7 &lt;code&gt;node-core&lt;/code&gt;: -6.9.&lt;/strong&gt; Opus starts at 91.6 baseline on Node.js internals, the highest raw score on any skill for any model in the benchmark. Adding a skill that prescribes specific patterns for primordials and commit message format on top of a model that already knows the material produced interference, not uplift. The skill was written to close a gap that Opus doesn't have.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;gpt-5-codex &lt;code&gt;docs&lt;/code&gt;: -17.3.&lt;/strong&gt; The same skill that boosted gpt-5.3-codex by +33.4 points degraded gpt-5-codex by 17. The Diátaxis framework is highly prescriptive about structure: tutorial titles must start with verbs, reference sections must contain no instruction. gpt-5-codex starts at 80.2 baseline for docs, it produces fluent, correct-seeming prose, and the skill's structural constraints appear to actively conflict with its default output style. High baseline does not predict positive lift.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;gpt-5-codex &lt;code&gt;ts&lt;/code&gt;: -5.4.&lt;/strong&gt; Same pattern. A 66.5 baseline on TypeScript drops to 61.1 with the skill. The TypeScript skill enforces branded types and zero &lt;code&gt;any&lt;/code&gt;, rules that require restructuring code rather than extending it. For a model with established TypeScript habits, the prescriptive guidance appears to create noise rather than correct the specific gaps.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;claude-opus-4-7 &lt;code&gt;init&lt;/code&gt;: +2.6.&lt;/strong&gt; The lowest positive lift in the table. Claude Opus is the model that introduced the &lt;code&gt;AGENTS.md&lt;/code&gt; convention, it was already near-ceiling on this skill before any context was added.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;gpt-5.4 &lt;code&gt;snip&lt;/code&gt;: +40.0.&lt;/strong&gt; The single highest lift cell in the entire dataset. snipgrapher's private CLI documentation gives a model that knows nothing a complete specification for a tool it's never encountered. gpt-5.4's strong instruction-following amplifies that advantage cleanly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The cost of running gpt-5.5 vs the alternatives
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Cost/run (with skill)&lt;/th&gt;
&lt;th&gt;Time (with skill)&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Score/$&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cursor:composer-2&lt;/td&gt;
&lt;td&gt;$0.23&lt;/td&gt;
&lt;td&gt;152.0s&lt;/td&gt;
&lt;td&gt;89.6&lt;/td&gt;
&lt;td&gt;389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.4&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;td&gt;135.4s&lt;/td&gt;
&lt;td&gt;89.3&lt;/td&gt;
&lt;td&gt;298&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.3-codex&lt;/td&gt;
&lt;td&gt;$0.44&lt;/td&gt;
&lt;td&gt;87.9s&lt;/td&gt;
&lt;td&gt;83.9&lt;/td&gt;
&lt;td&gt;191&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5.5&lt;/td&gt;
&lt;td&gt;$0.49&lt;/td&gt;
&lt;td&gt;89.5s&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;td&gt;182&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;claude-opus-4-7&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;td&gt;158.9s&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-5-codex&lt;/td&gt;
&lt;td&gt;$1.05&lt;/td&gt;
&lt;td&gt;136.2s&lt;/td&gt;
&lt;td&gt;78.7&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  More details about the 11 skills and scenarios
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;fastify-best-practices&lt;/code&gt;:&lt;/strong&gt; Fastify has strong opinions, and the skill encodes them. Scenarios: &lt;em&gt;Security Hardening for a Healthcare Web API&lt;/em&gt; (CORS scoped to two named origins, CSP + HSTS headers, HTTPS redirect, a wildcard &lt;code&gt;*&lt;/code&gt; or a missing header scores zero); &lt;em&gt;Authentication Service for a SaaS Platform&lt;/em&gt; (passwords migrated from bcrypt to argon2id, in-memory rate limiting replaced with Redis for multi-instance correctness, SIGTERM handled with &lt;code&gt;close-with-grace&lt;/code&gt;); &lt;em&gt;Protecting a Product Catalogue API from Overload&lt;/em&gt; (does it reach for &lt;code&gt;@fastify/under-pressure&lt;/code&gt; or invent its own backpressure loop?); &lt;em&gt;Order Management API with PostgreSQL&lt;/em&gt; (uses &lt;code&gt;@fastify/postgres&lt;/code&gt; with correct pool lifecycle, not raw &lt;code&gt;pg&lt;/code&gt;); &lt;em&gt;Consistent Error Handling for a Multi-Tenant SaaS API&lt;/em&gt; (typed &lt;code&gt;createError&lt;/code&gt;, uniform JSON shape, no stack traces to clients).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;node-best-practices&lt;/code&gt;:&lt;/strong&gt; The patterns in this skill diverge from what you'd find on Stack Overflow. Scenarios: &lt;em&gt;Hardening Logging in a Fintech API&lt;/em&gt; (pino must redact auth tokens and raw card fields before they reach the SIEM, masking after the fact doesn't count); &lt;em&gt;Webhook Receiver Service&lt;/em&gt; (structured logging of sensitive payment provider fields, graceful shutdown under concurrent in-flight requests); &lt;em&gt;Fix Throughput Degradation in a High-Load API Gateway&lt;/em&gt; (&lt;code&gt;dns.lookup()&lt;/code&gt; saturating the libuv thread pool, the fix is &lt;code&gt;dns.resolve4()&lt;/code&gt; and &lt;code&gt;UV_THREADPOOL_SIZE&lt;/code&gt;, not a caching layer); &lt;em&gt;High-Throughput Merchant DNS Routing Service&lt;/em&gt; (concurrent resolution under load, observable thread pool saturation).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;snipgrapher&lt;/code&gt;:&lt;/strong&gt; A custom internal CLI with a non-public API. The model has never seen its documentation. At baseline, every model is essentially guessing (avg 50-60/100). With the skill, agents either follow the spec or they don't. Scenarios: &lt;em&gt;Automating Changelog Snippet Images in CI&lt;/em&gt; (correct flag order, env var overrides, pipeline integration) and &lt;em&gt;Code Snippet Image Pipeline for Documentation Site&lt;/em&gt; (batch rendering, profile configuration). This skill delivers the highest lift of any in the benchmark across every model, averaging between 27 and 40 points. The reason: it encodes knowledge that does not exist on the internet. Public skills are becoming less necessary as frontier models grow stronger. Private tooling is where skills still dominate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;typescript-magician&lt;/code&gt;:&lt;/strong&gt; Not "add types to this function." Scenarios: &lt;em&gt;Domain-Safe Payment Processing Types&lt;/em&gt; (branded types for &lt;code&gt;AccountId&lt;/code&gt;, &lt;code&gt;PaymentId&lt;/code&gt;, &lt;code&gt;RefundId&lt;/code&gt;, plain type aliases don't count, &lt;code&gt;as&lt;/code&gt; casts score zero); &lt;em&gt;Product Catalog API for an E-Commerce Platform&lt;/em&gt; (TypeBox schemas inferred as TypeScript types end-to-end, internal cost fields stripped from public responses, no &lt;code&gt;any&lt;/code&gt;); &lt;em&gt;Eliminate &lt;code&gt;any&lt;/code&gt; from a Data Pipeline Utility Library&lt;/em&gt; (&lt;code&gt;tsc&lt;/code&gt; output captured before and after, zero &lt;code&gt;any&lt;/code&gt; remaining, no &lt;code&gt;@ts-ignore&lt;/code&gt;); &lt;em&gt;Project Bootstrap: Node.js TypeScript Service&lt;/em&gt; (native &lt;code&gt;--strip-types&lt;/code&gt;, no &lt;code&gt;ts-node&lt;/code&gt;, no build step, no &lt;code&gt;tsc&lt;/code&gt; in the start script).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;oauth&lt;/code&gt;:&lt;/strong&gt; Is the implicit flow explicitly removed? Is PKCE method S256? Is the refresh token replaced on rotation? Scenarios: &lt;em&gt;Add User Authentication to a Fastify API&lt;/em&gt; (full Authorization Code + PKCE flow with &lt;code&gt;@fastify/oauth2&lt;/code&gt;, state verification, token rotation); &lt;em&gt;OAuth Login Integration for a Fastify Web App&lt;/em&gt; (CSRF-hardened flow, &lt;code&gt;@fastify/session&lt;/code&gt; for state, correct cookie flags).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;linting-neostandard-eslint9&lt;/code&gt;:&lt;/strong&gt; ESLint v9's flat config is a breaking change. Scenarios checked whether agents actually migrated, not just created a new config alongside the old one. Is &lt;code&gt;.eslintrc.json&lt;/code&gt; gone? Is &lt;code&gt;standard&lt;/code&gt; removed from devDependencies? Scenarios: &lt;em&gt;Modernize the Linting Setup&lt;/em&gt; (two variants: &lt;code&gt;envparser&lt;/code&gt; open-source library and &lt;code&gt;payments-api&lt;/code&gt; service); &lt;em&gt;Add Linting to the Inventory Service&lt;/em&gt; (neostandard from scratch); &lt;em&gt;Set Up Automated Lint Enforcement&lt;/em&gt; (husky + lint-staged pre-commit hook, CI step that blocks on violations).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;documentation&lt;/code&gt;:&lt;/strong&gt; Based on the Diátaxis framework. The skill teaches agents when to write a tutorial vs a how-to vs reference vs explanation. Scenarios: &lt;em&gt;Restructure Documentation for a Configuration Library&lt;/em&gt; (sprawling &lt;code&gt;confz&lt;/code&gt; README split into four Diátaxis types, tutorial title must start with a verb, reference section must contain no instruction); &lt;em&gt;Getting Started Guide for a CLI Deployment Tool&lt;/em&gt; (&lt;code&gt;shipctl&lt;/code&gt; onboarding tutorial with Goal→Prerequisites→Numbered steps→Verifiable result structure, no conceptual digressions in the steps).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;init&lt;/code&gt;:&lt;/strong&gt; Writing &lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;CLAUDE.md&lt;/code&gt; files that actually help AI assistants. Scenarios: &lt;em&gt;Set Up Agent Instructions for a Growing Python Monorepo&lt;/em&gt; (3-year-old codebase, multiple service packages, identify the three constraints that cause the most agent damage); &lt;em&gt;Set Up Agent Instructions for a Node.js Monorepo&lt;/em&gt; (workspace-aware package manager, per-package test commands, legacy directory exclusion); &lt;em&gt;Audit and Slim Down a Bloated AGENTS.md&lt;/em&gt; (what to cut, what to keep, signal vs noise after a year of uncurated growth); &lt;em&gt;Set Up Agent Instructions for a Growing Monorepo&lt;/em&gt; (hierarchical root-level vs per-package instructions, discoverability filtering).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;octocat&lt;/code&gt;:&lt;/strong&gt; GitHub CLI patterns and correct flag usage. Scenarios: &lt;em&gt;Automate Feature Branch PR Submission&lt;/em&gt; (correct &lt;code&gt;gh pr create&lt;/code&gt; flags, CI polling with &lt;code&gt;gh run watch&lt;/code&gt;, merge only after checks pass); &lt;em&gt;Preparing Commits for a Node.js Core Module Contribution&lt;/em&gt; (subsystem prefix, 72-char subject, &lt;code&gt;Reviewed-By&lt;/code&gt; trailers, the format changelog toolbots parse); &lt;em&gt;Prepare Node.js Core Contribution Commits&lt;/em&gt; (backport workflow, correct metadata for automated release pipelines); &lt;em&gt;Automate Pull Request Workflow&lt;/em&gt; (reusable shell script, idempotent, surfaces CI failures before merge). &lt;strong&gt;&lt;code&gt;nodejs-core&lt;/code&gt;:&lt;/strong&gt; Contributing to Node.js core: primordials, commit message format, native addons with &lt;code&gt;AsyncWorker&lt;/code&gt;. Scenarios: &lt;em&gt;Product Catalog Caching Service&lt;/em&gt; (async-cache-dedupe, concurrency control to prevent thundering herd on a rate-limited upstream); &lt;em&gt;Microservice Routing Layer: Latency Spike Investigation&lt;/em&gt; (diagnosing &lt;code&gt;UV_THREADPOOL_SIZE&lt;/code&gt; exhaustion, &lt;code&gt;dns.lookup()&lt;/code&gt; blocking the pool); &lt;em&gt;Diagnose and Fix V8 Performance Regression in Analytics Processor&lt;/em&gt; (&lt;code&gt;--prof&lt;/code&gt;, &lt;code&gt;--trace-opt&lt;/code&gt;, reading isolate-*.log, acting on deoptimization reasons). &lt;strong&gt;&lt;code&gt;skill-optimizer&lt;/code&gt;:&lt;/strong&gt; Meta: given a poorly-written skill or benchmark report, improve it or interpret it correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;gpt-5.5 is a better model than gpt-5.4 on raw capability, and on latency it is not close. For everything else, they are the same model at different price points. Pay the 63% premium if you need the speed. Skip it if you care about cost or value per dollar.&lt;/p&gt;

&lt;p&gt;The model to actually avoid is gpt-5.3. It costs 47% more than gpt-5.4 and scores 5.4 points worse. If you are running gpt-5.3 today, the case for switching to gpt-5.4 is strong on both cost and performance.&lt;/p&gt;

&lt;p&gt;Frontier models are becoming more self-sufficient. The ROI on domain skills is concentrating in genuinely proprietary knowledge: your internal APIs, your custom tooling, patterns that simply aren't on the internet. Snipgrapher lifted every model by 27 to 40 points because no model had ever seen its documentation. ESLint v9 flat config lifted them by 2 to 14 points because capable models already know it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The original author of this blog is &lt;a href="//uk.linkedin.com/in/simonmaple"&gt;Simon Maple&lt;/a&gt; and is originally posted on &lt;a href="https://tessl.io/blog/gpt-55-is-openais-best-model-but-paying-more-for-it-makes-no-sense/" rel="noopener noreferrer"&gt;tessl.io/blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Simon Maple is the Head of Developer Relations at Tessl, and AI Native Dev co-host. Previously, Simon was the Field CTO, and VP Developer Relations at Snyk, ZeroTurnaround, and IBM. He became a Java Champion in 2014, JavaOne Rockstar speaker in 2014 and 2017, Duke’s Choice award winner, Virtual JUG founder and organiser, and London Java Community co-leader.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>openai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My Docs Are Safer Than My Search History 😎</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Sun, 15 Feb 2026 10:20:01 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/my-docs-are-safer-than-my-search-history-5e4f</link>
      <guid>https://dev.to/rohan_sharma/my-docs-are-safer-than-my-search-history-5e4f</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-copilot-cli"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;: Build with AI&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Hey there! Welcome back. This is my latest project that I'm super excited to share with you!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Remember that one time your friend asked you to "just quickly check" their Google Doc, and you spent 20 minutes figuring out if you had view-only or editing access? Or when your team's important document got accidentally shared with the entire internet? Yeah, me too. 😅&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;Radhika's AI DocManager&lt;/strong&gt;, a document management system that doesn't mess around when it comes to security, roles, and AI-powered features.&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%2F3kp6onz4p0im0d9de97o.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%2F3kp6onz4p0im0d9de97o.png" alt="banner"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://radhika-docmanager.vercel.app/" rel="noopener noreferrer"&gt;radhika-docmanager.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  What's This All About? 🤔
&lt;/h2&gt;

&lt;p&gt;Imagine you and your partner have a shared notebook. But here's the twist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You&lt;/strong&gt; can write anything you want in your sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your partner&lt;/strong&gt; can only read some sections (View Only)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your partner&lt;/strong&gt; can comment on other sections but not edit them (Comment)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some pages&lt;/strong&gt; are locked with a password because they contain surprise party plans 🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's basically what this project does, but for teams and organizations!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question for you:&lt;/strong&gt; &lt;em&gt;Have you ever accidentally deleted someone else's important document or had your document deleted by someone? How did that go? 😬&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  The Cool Features That'll Make You Go "Woah!" 🚀
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1️⃣ Four Roles, Four Levels of Trust
&lt;/h3&gt;

&lt;p&gt;Think of roles like relationship stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User&lt;/strong&gt; (Dating Stage): You can only see and manage your own stuff. Can't touch anyone else's documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin&lt;/strong&gt; (Committed Relationship): You can see everything in your organization and manage your team members. You're the responsible one now!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Super Admin&lt;/strong&gt; (Marriage Level): Like Admin but with superpowers! You approve who joins your org, can promote people to Admin, and have elevated privileges. But you're still tied to your organization!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;God&lt;/strong&gt; (The Parent): Full control over the ENTIRE platform across ALL organizations. Can post documents to ALL organizations at once. The ONLY role with cross-org access! Ultimate power! 💪

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Important Note&lt;/strong&gt;: God has read access to all documents across organizations for platform management, but the primary focus is on public documents and cross-org coordination. Organizations still maintain their privacy for internal operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each role has a "weight" number. Higher weight = more authority. Just like how your mom outranks you when deciding what's for dinner! 😄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Only God can see across organizations. Super Admin, Admin, and User are all scoped to their own organization!&lt;/p&gt;
&lt;h3&gt;
  
  
  2️⃣ Document Security That Actually Makes Sense
&lt;/h3&gt;

&lt;p&gt;Your documents can have different classification levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public&lt;/strong&gt;: Everyone can see it (like your Instagram story)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization&lt;/strong&gt;: Only your team can see it (like your company Slack)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal&lt;/strong&gt;: More restricted (like your team's strategy docs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidential&lt;/strong&gt;: Top secret stuff (like your salary slip)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General&lt;/strong&gt;: The default, casual classification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, you can set &lt;strong&gt;access levels&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View Only&lt;/strong&gt;: Read-only, no comments allowed (like when your partner says "just look, don't touch")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comment&lt;/strong&gt;: Can read and comment but not edit (like leaving sticky notes on a physical document)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit&lt;/strong&gt;: Can make changes to the content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Access&lt;/strong&gt;: Complete control (the relationship goals)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Want to add extra protection?&lt;/strong&gt; Lock any document with a 9-digit password! 🔐&lt;/p&gt;
&lt;h3&gt;
  
  
  3️⃣ AI That Works For YOU (Not For Big Tech)
&lt;/h3&gt;

&lt;p&gt;Here's the thing: I hate vendor lock-in. You know what's worse than a bad breakup? Being forced to stay with a service because you can't leave!&lt;/p&gt;

&lt;p&gt;That's why Radhika's AI DocManager lets you &lt;strong&gt;bring your own API keys&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Groq&lt;/strong&gt; (FREE tier available! Fast and perfect for getting started)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; (Premium quality)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic&lt;/strong&gt; (Great for long documents)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your keys are encrypted with &lt;strong&gt;AES-256-GCM&lt;/strong&gt; encryption. That's military-grade security, folks! Even if someone breaks into the database, your keys are safer than your ex's secrets in your DMs. 🤫&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI can:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarize documents (TL;DR generator)&lt;/li&gt;
&lt;li&gt;Analyze sentiment (is this doc angry or happy?)&lt;/li&gt;
&lt;li&gt;Extract key points (bullet points anyone?)&lt;/li&gt;
&lt;li&gt;Improve writing (make it sound professional)&lt;/li&gt;
&lt;li&gt;Translate content (hola, bonjour, namaste!)&lt;/li&gt;
&lt;li&gt;Generate Q&amp;amp;A (instant study guide)&lt;/li&gt;
&lt;li&gt;Custom prompts (ask it anything!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; You also get FREE local tools that work without any API key — Word Count, Structure Analysis, and Text Preview. All running in your browser!&lt;/p&gt;
&lt;h3&gt;
  
  
  4️⃣ Organizations That Don't Mix Like Oil and Water
&lt;/h3&gt;

&lt;p&gt;Multiple organizations, complete data isolation. Think of it like this:&lt;/p&gt;

&lt;p&gt;You have three friend groups:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;College friends (Acme Corp)&lt;/li&gt;
&lt;li&gt;Work friends (Globex Inc)&lt;/li&gt;
&lt;li&gt;Gym friends (Initech LLC)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each group has its own private WhatsApp group. Nobody from college friends can see what's happening in your work friends group. That's exactly how organizations work here!&lt;/p&gt;

&lt;p&gt;To join an organization, you need an &lt;strong&gt;Organization Code&lt;/strong&gt; (like a secret club password). A Super Admin must approve your membership request. No random people crashing your party! 🎊&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  How GitHub Copilot CLI Supercharged My Development 🚀
&lt;/h2&gt;

&lt;p&gt;Okay, confession time: Building this project would have taken me MUCH longer without GitHub Copilot CLI. Let me tell you how it became my coding partner!&lt;/p&gt;
&lt;h3&gt;
  
  
  What is GitHub Copilot CLI?
&lt;/h3&gt;

&lt;p&gt;Think of it as having a really smart friend who sits in your terminal and helps you with commands, debugging, and understanding code. You just talk to it in natural language!&lt;/p&gt;
&lt;h3&gt;
  
  
  How I Used It in This Project
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Generating the Complete Supabase Schema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was HUGE. Instead of manually writing hundreds of lines of SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot suggest &lt;span class="s2"&gt;"generate supabase schema for document management system with organizations, users, documents, comments, and audit logs with proper foreign keys and indexes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It gave me a complete schema structure! I just had to customize it for my needs. Saved hours of work!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Setting Up Row Level Security (RLS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supabase RLS policies are tricky. I asked:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot suggest &lt;span class="s2"&gt;"create row level security policy for organization isolation in supabase"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It generated the exact SQL I needed to ensure users can only see data from their organization!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Database Schema Debugging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When my foreign key constraints weren't working:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot explain &lt;span class="s2"&gt;"Why is my foreign key constraint failing between documents and profiles?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Boom! Got the answer instantly and fixed the relationship properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Creating Storage Buckets with Policies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Setting up Supabase storage:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot suggest &lt;span class="s2"&gt;"create supabase storage bucket for documents with 50MB limit and access policies"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Got the complete SQL for buckets AND storage policies. No more digging through docs!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Complex Git Operations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Had to rebase multiple commits with conflicting changes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot suggest &lt;span class="s2"&gt;"rebase last 5 commits and squash them into one"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Got the exact git commands I needed. No more Stack Overflow!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. TypeScript Type Errors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When dealing with complex Supabase types:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot explain &lt;span class="s2"&gt;"Cannot find name 'UserRole' in this scope"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instantly told me I needed to import from &lt;code&gt;@/lib/supabase/types&lt;/code&gt;. No more hunting through files!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Debugging Permission Logic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When my role-based access control wasn't working:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot explain &lt;span class="s2"&gt;"why is my outranks function returning false for admin checking user role"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Helped me understand the weight comparison logic and fix the bug in minutes!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. File Upload Implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Struggled with Supabase storage upload with progress:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot suggest &lt;span class="s2"&gt;"upload file to supabase storage bucket with progress tracking and error handling"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Got complete working code with progress bars and proper error handling!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Understanding bcrypt Hashing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When implementing password security:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot explain &lt;span class="s2"&gt;"difference between bcrypt compare and hash and when to use each"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Clear explanation that helped me implement secure authentication correctly!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Deployment to Vercel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploying with all environment variables:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot suggest &lt;span class="s2"&gt;"deploy next.js app to vercel with environment variables from .env file"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Got the proper CLI commands with all the flags needed!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Testing Database Queries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When testing complex SQL with multiple JOINs:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot explain &lt;span class="s2"&gt;"how to test row level security policies in Supabase without deploying"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It explained the whole local testing process step by step!&lt;/p&gt;

&lt;p&gt;But do you know? I've even implemented most of the frontend with it as well. 😎&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Copilot CLI is a Game Changer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Context Switching&lt;/strong&gt;: Stay in your terminal, no need to open browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Natural Language&lt;/strong&gt;: Ask questions like you'd ask a friend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project-Aware&lt;/strong&gt;: It understands your codebase context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Answers&lt;/strong&gt;: Faster than googling and reading 10 different answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real Talk&lt;/strong&gt;: I probably saved 10-15 hours of googling, debugging, and trial-and-error just by having Copilot CLI help me with terminal commands, git operations, and understanding error messages.&lt;/p&gt;

&lt;p&gt;If you're not using it yet, you're missing out! It's like having a senior developer on speed dial. 🎯&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  The Tech Magic Behind the Curtain 🎩✨
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Don't worry, I'll keep it light!)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Built With Love Using:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14&lt;/strong&gt; (App Router)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; (PostgreSQL database + storage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; (because typos are for noobs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS + shadcn/ui&lt;/strong&gt; (for that crispy dark mode 🌙)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bun runtime&lt;/strong&gt; (faster than your morning coffee hitting your system)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Security Layers:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Passwords&lt;/strong&gt;: bcrypt hashing (can't crack it even if you try)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Keys&lt;/strong&gt;: AES-256-GCM encryption (Fort Knox level)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Passwords&lt;/strong&gt;: Another layer of bcrypt (double protection!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization Isolation&lt;/strong&gt;: Complete data separation (no mixing allowed)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Document Support:
&lt;/h3&gt;

&lt;p&gt;Upload pretty much anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF (with embedded viewer)&lt;/li&gt;
&lt;li&gt;Word docs (auto text extraction!)&lt;/li&gt;
&lt;li&gt;Plain text, CSV, Markdown&lt;/li&gt;
&lt;li&gt;HTML, JSON, RTF, ODT&lt;/li&gt;
&lt;li&gt;Even Excel and PowerPoint (why not?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;File size limit:&lt;/strong&gt; 50 MB per document. That's like... a LOT of cat pictures! 🐱&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  The Boyfriend-Girlfriend Analogy That'll Make You Understand Permissions 💑
&lt;/h2&gt;

&lt;p&gt;Let's say you and your partner are working on planning a surprise party:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Role&lt;/strong&gt; (You):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can create your own to-do list&lt;/li&gt;
&lt;li&gt;You can only see your own tasks&lt;/li&gt;
&lt;li&gt;You can't see or touch your partner's secret guest list&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Admin Role&lt;/strong&gt; (Your Partner who's more organized):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can see both your lists (within your organization)&lt;/li&gt;
&lt;li&gt;Can delete tasks from User-level people&lt;/li&gt;
&lt;li&gt;Can manage who's invited to the planning team&lt;/li&gt;
&lt;li&gt;But can only see YOUR organization's party, not other orgs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Super Admin Role&lt;/strong&gt; (The Senior Party Planner):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Like Admin but can also approve new members joining YOUR organization&lt;/li&gt;
&lt;li&gt;Can promote people to Admin within your org&lt;/li&gt;
&lt;li&gt;Has elevated privileges for your organization&lt;/li&gt;
&lt;li&gt;But still can't see OTHER organizations' parties (that's God's job!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;God Role&lt;/strong&gt; (The Person Whose Birthday It Is):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Knows about ALL surprise parties EVERYWHERE (cross-org access!)&lt;/li&gt;
&lt;li&gt;Can access any planning doc in any organization for platform management&lt;/li&gt;
&lt;li&gt;Can post announcements to all party groups at once&lt;/li&gt;
&lt;li&gt;Bypasses all password locks (it's their birthday, after all!)&lt;/li&gt;
&lt;li&gt;The ONLY role that can see across all organizations!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;But remember&lt;/strong&gt;: God is the platform administrator, not Big Brother watching everything. The focus is on managing public documents and cross-org coordination, while respecting organizational privacy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See? Not so complicated! 😊&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;
&lt;h3&gt;
  
  
  For Teams:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Store company policies (Organization classification)&lt;/li&gt;
&lt;li&gt;Share meeting notes (Comment access)&lt;/li&gt;
&lt;li&gt;Collaborate on proposals (Edit access)&lt;/li&gt;
&lt;li&gt;Lock sensitive HR docs (Password protection)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  For Content Creators:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Draft blog posts (Draft status)&lt;/li&gt;
&lt;li&gt;Get feedback from editors (Assign reviewers)&lt;/li&gt;
&lt;li&gt;Publish final versions (Published status)&lt;/li&gt;
&lt;li&gt;Archive old content (Archived status)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  For Students:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Store class notes&lt;/li&gt;
&lt;li&gt;Collaborate on group projects&lt;/li&gt;
&lt;li&gt;Share study guides&lt;/li&gt;
&lt;li&gt;Keep research papers organized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Question for you:&lt;/strong&gt; &lt;em&gt;What would YOU use this for? I'd love to hear your use case! Drop it in the comments! 💭&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  The Journey (AKA The Fun Part) 🎢
&lt;/h2&gt;

&lt;p&gt;Building this was like assembling IKEA furniture while blindfolded. Here's what I learned:&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge #1: Role-Based Access Control
&lt;/h3&gt;

&lt;p&gt;Creating a system where User &amp;lt; Admin &amp;lt; Super Admin &amp;lt; God without breaking everything? HARD. I used a "weight" system (User = 10, Admin = 50, Super Admin = 75, God = 100). Simple math, complex implications!&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge #2: Organization Isolation
&lt;/h3&gt;

&lt;p&gt;Making sure Acme Corp never accidentally sees Globex Inc's documents? I had to filter EVERYTHING by organization. Every. Single. Query.&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge #3: Encryption That Doesn't Break
&lt;/h3&gt;

&lt;p&gt;Encrypting API keys is easy. Making sure you can decrypt them later? That's the trick! Used AES-256-GCM with unique IVs for each key. Sounds fancy, works perfectly!&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenge #4: God's Multi-Org Publishing
&lt;/h3&gt;

&lt;p&gt;When God creates a document for "All Orgs", the system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uploads the file ONCE to storage&lt;/li&gt;
&lt;li&gt;Creates a document record for EACH organization&lt;/li&gt;
&lt;li&gt;All records point to the same file&lt;/li&gt;
&lt;li&gt;When God changes the status, ALL copies update together&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's like posting on all your social media at once, but harder!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  The Tech Implementation (For My Developer Friends)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Permission Checking:
&lt;/h3&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;function&lt;/span&gt; &lt;span class="nf"&gt;outranks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;roleB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getRoleWeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleA&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;getRoleWeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleB&lt;/span&gt;&lt;span class="p"&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;function&lt;/span&gt; &lt;span class="nf"&gt;isAtLeast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;roleB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getRoleWeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleA&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;getRoleWeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleB&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;Simple, elegant, effective!&lt;/p&gt;
&lt;h3&gt;
  
  
  Document Deletion Logic:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;User can delete: Own docs only&lt;/li&gt;
&lt;li&gt;Admin can delete: Own + User docs (Admin outranks User)&lt;/li&gt;
&lt;li&gt;Super Admin can delete: Own + User + Admin docs&lt;/li&gt;
&lt;li&gt;God can delete: Own + any public document&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  AI Action Flow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;User clicks an AI action&lt;/li&gt;
&lt;li&gt;System decrypts their API key in memory (never stored decrypted!)&lt;/li&gt;
&lt;li&gt;Sends document content to AI provider&lt;/li&gt;
&lt;li&gt;Returns result to user&lt;/li&gt;
&lt;li&gt;Result NOT stored (privacy first!)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Organization Membership:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;New user registers with Organization Code&lt;/li&gt;
&lt;li&gt;Account created with "pending" status&lt;/li&gt;
&lt;li&gt;Super Admin approves or rejects&lt;/li&gt;
&lt;li&gt;If approved, user gets full access&lt;/li&gt;
&lt;li&gt;If rejected, user can't log in&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Clean workflow, no confusion!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Try It Yourself!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://radhika-docmanager.vercel.app/" rel="noopener noreferrer"&gt;https://radhika-docmanager.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://radhika-docmanager.vercel.app/docs" rel="noopener noreferrer"&gt;https://radhika-docmanager.vercel.app/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to test it locally? Here's the speed run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repo from &lt;a href="https://github.com/RS-labhub/AI-DocManager" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Set up Supabase project (free tier)&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;.env.example&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt; and fill in your credentials&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;bun install &amp;amp;&amp;amp; bun dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Visit &lt;code&gt;http://localhost:3000/api/seed&lt;/code&gt; to get demo accounts&lt;/li&gt;
&lt;li&gt;Log in and start creating documents!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Demo accounts&lt;/strong&gt; (all use password &lt;code&gt;Password123!&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;god@system.local&lt;/code&gt; - God role (platform-wide access!)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;superadmin@acme.com&lt;/code&gt; - Super Admin (approve memberships!)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;admin@acme.com&lt;/code&gt; - Admin role (manage your team!)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user1@acme.com&lt;/code&gt; - Regular user (the everyday experience)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Or try the live app&lt;/strong&gt;: &lt;a href="https://radhika-docmanager.vercel.app/" rel="noopener noreferrer"&gt;radhika-docmanager.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://radhika-docmanager.vercel.app/docs" rel="noopener noreferrer"&gt;full documentation&lt;/a&gt; for setup details!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  What's Special About This Project?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Security First
&lt;/h3&gt;

&lt;p&gt;Most projects add security as an afterthought. I built it from day one. Encryption, hashing, isolation — the works!&lt;/p&gt;
&lt;h3&gt;
  
  
  2. No Vendor Lock-In
&lt;/h3&gt;

&lt;p&gt;Your API keys, your choice. Switch providers anytime without losing data.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Real Enterprise Features
&lt;/h3&gt;

&lt;p&gt;Multi-org support, approval workflows, audit logs, reviewer assignments — this isn't a toy project!&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Actually Good UX
&lt;/h3&gt;

&lt;p&gt;Dark mode that doesn't hurt your eyes. Clean interface. Logical workflows. I actually USED it while building it!&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Named After Someone Special
&lt;/h3&gt;

&lt;p&gt;Radhika's DocManager is named after Radhika Sharma. Built by Rohan Sharma (yes, it's me). Want to know more about Radhika? Find the secret page in my portfolio. ❤️&lt;/p&gt;

&lt;p&gt;

&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://rohansrma.vercel.app/" 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%2Frohansrma.vercel.app%2Fog-image.jpg" height="auto" class="m-0"&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://rohansrma.vercel.app/" rel="noopener noreferrer" class="c-link"&gt;
            Rohan Sharma - Software Developer, Professional Blog Writer and UI/UX Designer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Explore the portfolio of Rohan Sharma, featuring cutting-edge software projects, insightful blogs, and creative UI/UX work.
          &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%2Frohansrma.vercel.app%2Ffavicon.ico"&gt;
          rohansrma.vercel.app
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  6. Built with GitHub Copilot CLI
&lt;/h3&gt;

&lt;p&gt;The entire development process was supercharged by GitHub Copilot CLI; from debugging complex database queries to writing deployment scripts. It's like pair programming with an AI! 🤖&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Project for the GitHub Copilot CLI Challenge? 🏆
&lt;/h2&gt;

&lt;p&gt;This challenge is all about showcasing how GitHub Copilot CLI enhances the development process, and boy, did it ever!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge&lt;/strong&gt;: Build an AI-powered, multi-tenant document management system with enterprise-grade security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reality&lt;/strong&gt;: That's A LOT of complexity; database schemas, encryption, role hierarchies, file uploads, organization isolation, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: GitHub Copilot CLI became my development companion, helping me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debug complex SQL queries and foreign key constraints&lt;/li&gt;
&lt;li&gt;Generate secure encryption keys and understand crypto operations&lt;/li&gt;
&lt;li&gt;Navigate git operations when managing multiple feature branches&lt;/li&gt;
&lt;li&gt;Understand error messages and fix bugs faster&lt;/li&gt;
&lt;li&gt;Write deployment scripts and environment configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Result&lt;/strong&gt;: A production-ready application deployed at &lt;a href="https://radhika-docmanager.vercel.app/" rel="noopener noreferrer"&gt;radhika-docmanager.vercel.app&lt;/a&gt; with features that would normally take months to build!&lt;/p&gt;

&lt;p&gt;Without Copilot CLI, I would have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate the entire Supabase schema&lt;/strong&gt; from a single prompt describing my data model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create Row Level Security policies&lt;/strong&gt; for organization isolation automatically&lt;/li&gt;
&lt;li&gt;Spent hours googling obscure error messages&lt;/li&gt;
&lt;li&gt;Made security mistakes in encryption implementation&lt;/li&gt;
&lt;li&gt;Struggled with git conflicts during feature merges&lt;/li&gt;
&lt;li&gt;Wasted time reading documentation for every command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've even implemented most of the frontend with it. Ehehe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instead&lt;/strong&gt;, I focused on building features and solving real problems while Copilot CLI handled the "how do I do this?" questions instantly.&lt;/p&gt;

&lt;p&gt;That's the power of AI meeting the command line! 🚀&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;Building Radhika's AI DocManager was a rollercoaster. There were moments of "WHY ISN'T THIS WORKING?!" and moments of "OMG IT ACTUALLY WORKS!"&lt;/p&gt;

&lt;p&gt;But you know what? Creating something that helps teams manage documents securely while leveraging AI (without selling their soul to Big Tech) feels pretty amazing.&lt;/p&gt;

&lt;p&gt;If you've made it this far, thank you for reading! You're awesome! 🌟&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RS-labhub/AI-DocManager" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star the Github Repo 🌠&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try the project, break it, suggest features, report bugs, I want to hear it all!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if you're wondering why it's called "Radhika's DocManager", it's named after Radhika Sharma, someone special whose memory inspired this project. Sometimes the best projects come from the heart. ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  Links &amp;amp; Contact
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live App&lt;/strong&gt;: &lt;a href="https://radhika-docmanager.vercel.app/" rel="noopener noreferrer"&gt;https://radhika-docmanager.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://radhika-docmanager.vercel.app/docs" rel="noopener noreferrer"&gt;https://radhika-docmanager.vercel.app/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repo&lt;/strong&gt;: &lt;a href="https://github.com/RS-labhub/AI-DocManager" rel="noopener noreferrer"&gt;RS-labhub/AI-DocManager&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Portfolio&lt;/strong&gt;: &lt;a href="https://rohansrma.vercel.app" rel="noopener noreferrer"&gt;rohansrma.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: &lt;a href="mailto:rs4101976@gmail.com"&gt;rs4101976@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a href="https://www.linkedin.com/in/rohan-sharma-9386rs/" rel="noopener noreferrer"&gt;Rohan Sharma&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X/Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/rrs00179" rel="noopener noreferrer"&gt;@rrs00179&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try the live app and let me know what you think!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank youuuuuuuuuuuuuuuu for reading! ❣️&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Creating a Chatbot that actually Stands Out! (vibe coded version)🦖</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Thu, 29 Jan 2026 05:04:47 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/creating-a-chatbot-that-actually-stands-out-vibe-coded-version-draft-1ake</link>
      <guid>https://dev.to/rohan_sharma/creating-a-chatbot-that-actually-stands-out-vibe-coded-version-draft-1ake</guid>
      <description>&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;As I promised at the start of this year, I'm fulfilling my commitment. 😆&lt;/p&gt;

&lt;p&gt;In this blog, I will discuss how you can create a chatbot far better than the rest of the other chatbots around. This blog is mostly for learning, so keep an eye at every section. I will be referencing the Chatbot I've created. Btw, my chatbot is called "Radhika", so I will call it by its name itself.&lt;/p&gt;

&lt;p&gt;

&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://radhika-sharma.vercel.app/" 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/http%3A%2F%2Fradhika-sharma.vercel.app%2Fog-image.png" height="auto" class="m-0"&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://radhika-sharma.vercel.app/" rel="noopener noreferrer" class="c-link"&gt;
            Radhika
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Radhika is a versatile AI chatbot designed to assist with a wide range of tasks, from answering questions to providing recommendations and engaging in casual conversation.
          &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%2Fradhika-sharma.vercel.app%2Ffavicon.ico"&gt;
          radhika-sharma.vercel.app
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Try it out, give feedback and suggestions, request changes, etc,.&lt;/p&gt;

&lt;p&gt;It's &lt;a href="https://github.com/RS-labhub/Radhika" rel="noopener noreferrer"&gt;open-source&lt;/a&gt; as well, so leave a github star if you loved it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;br&gt;
Switch to GROQ in case Gemini encounters an error. Currently, I'm using the free plan, so the tokens might get exhausted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Let's start building our Chatbot!
&lt;/h2&gt;

&lt;p&gt;Before doing anything else, decide on your tech stack.&lt;/p&gt;

&lt;p&gt;There are many ways to build a chatbot, and plenty of stacks you can choose from. Pick the one you are most comfortable with.&lt;/p&gt;

&lt;p&gt;For Radhika, I used TypeScript, which is a typed version of JavaScript. I built it using Next.js so both the frontend and backend live in the same project. This also makes deployment simpler since everything is deployed together. Simple and efficient.&lt;/p&gt;

&lt;p&gt;(To be honest, vibe coding NextJS apps is easier, and the AI tools do a great job)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Design it.
&lt;/h2&gt;

&lt;p&gt;If you're a designer, then design the bot in applications like &lt;a href="https://canva.com" rel="noopener noreferrer"&gt;Canva&lt;/a&gt; or &lt;a href="https://figma.com" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to see Radhika's design, please check this &lt;a href="https://www.figma.com/design/4L2393IapDT1r5yuZ2RpbK/RADHIKA?node-id=0-1&amp;amp;t=LdKYKSk4oXyFix9k-1" rel="noopener noreferrer"&gt;radhika_figma_design&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%2F5zksi7lq96nl6o3giv48.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%2F5zksi7lq96nl6o3giv48.png" alt="radhika-figma"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're not a designer, describe the prompt as much as you can with all the details you've in your mind. Don't think about the features, think about the design.&lt;/p&gt;

&lt;p&gt;Remember, our first target should either be the backend or the frontend. You can start with any of them, but I usually suggest creating the frontend first and then working on the backend. &lt;/p&gt;

&lt;p&gt;For a start, I'm adding a sample prompt for this, but before that I need to cover an important question, i.e., &lt;strong&gt;WHERE TO ADD THIS PROMPT?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can add the prompts to generate the frontend in these platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v0.app/" rel="noopener noreferrer"&gt;V0 by Vercel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://base44.com/" rel="noopener noreferrer"&gt;Base44&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But since we are going to create a full-stack chatbot, I suggest to use &lt;code&gt;claude-opus-4.5&lt;/code&gt; model in your IDE. And if you&lt;/p&gt;

&lt;p&gt;If you're a student, try to avail the &lt;a href="https://github.com/settings/education/benefits" rel="noopener noreferrer"&gt;Github's Student Pack&lt;/a&gt; and then use your IDE + Github Copilot. (you'll get a hell lot of free credits to most of the models, including &lt;code&gt;claude-opus-4.5&lt;/code&gt; create anything good.)&lt;/p&gt;

&lt;p&gt;Here's your GO TO PROMPT to build your first Chatbot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Agentic UI Replication Prompt (Design + Three.js + Maintainable Code)&lt;/span&gt;

You are a senior product designer and frontend engineer with strong experience in &lt;span class="gs"&gt;**scalable UI systems**&lt;/span&gt;, &lt;span class="gs"&gt;**Three.js**&lt;/span&gt;, and &lt;span class="gs"&gt;**long-term maintainable codebases**&lt;/span&gt;.

Your task is to replicate a &lt;span class="gs"&gt;**AI assistant ChatBot**&lt;/span&gt; with a &lt;span class="gs"&gt;**three-column layout**&lt;/span&gt;, glassmorphism, and subtle real-time visualizations, while keeping the implementation &lt;span class="gs"&gt;**clean, readable, and modular**&lt;/span&gt;.

&lt;span class="gu"&gt;## Core Principles&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Prioritize &lt;span class="gs"&gt;**readability over cleverness**&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; Small, focused files
&lt;span class="p"&gt;*&lt;/span&gt; Clear separation of concerns
&lt;span class="p"&gt;*&lt;/span&gt; No duplicated logic
&lt;span class="p"&gt;*&lt;/span&gt; All visuals, logic, and data flows should be easy to reason about

&lt;span class="gu"&gt;## Project Structure Guidelines&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Organize the codebase by &lt;span class="gs"&gt;**feature, not by file type**&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; Each major UI section should live in its own folder
&lt;span class="p"&gt;*&lt;/span&gt; Each folder should contain:
&lt;span class="p"&gt;
  *&lt;/span&gt; One main component
&lt;span class="p"&gt;  *&lt;/span&gt; One styles file
&lt;span class="p"&gt;  *&lt;/span&gt; Optional subcomponents
&lt;span class="p"&gt;  *&lt;/span&gt; A clear entry point
&lt;span class="p"&gt;*&lt;/span&gt; Three.js logic must be isolated from UI layout code
&lt;span class="p"&gt;*&lt;/span&gt; Avoid large monolithic components

&lt;span class="gu"&gt;## Overall Visual Style&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Dark navy to near-black gradient background
&lt;span class="p"&gt;*&lt;/span&gt; Glassmorphic cards with subtle blur and soft inner glow
&lt;span class="p"&gt;*&lt;/span&gt; Rounded corners throughout
&lt;span class="p"&gt;*&lt;/span&gt; Accent color: cyan / electric blue
&lt;span class="p"&gt;*&lt;/span&gt; Premium, calm, futuristic AI aesthetic
&lt;span class="p"&gt;*&lt;/span&gt; No harsh borders, no visual noise

&lt;span class="gu"&gt;## Left Sidebar (Assistant Identity + Modes)&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Fixed vertical glass panel
&lt;span class="p"&gt;*&lt;/span&gt; Sections split into small components:
&lt;span class="p"&gt;
  *&lt;/span&gt; Assistant identity header
&lt;span class="p"&gt;  *&lt;/span&gt; Mode selector list
&lt;span class="p"&gt;  *&lt;/span&gt; Unlock CTA card
&lt;span class="p"&gt;  *&lt;/span&gt; Quick actions list
&lt;span class="p"&gt;*&lt;/span&gt; Active mode visually highlighted with soft cyan glow
&lt;span class="p"&gt;*&lt;/span&gt; All icons and labels driven from a single config file

&lt;span class="gu"&gt;## Center Panel (Primary Interaction Area)&lt;/span&gt;

&lt;span class="gu"&gt;### Header&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Mode title
&lt;span class="p"&gt;*&lt;/span&gt; Model badge
&lt;span class="p"&gt;*&lt;/span&gt; Minimal action icons
&lt;span class="p"&gt;*&lt;/span&gt; Primary CTA button
&lt;span class="p"&gt;*&lt;/span&gt; Header logic isolated from content logic

&lt;span class="gu"&gt;### Core Visualization (Three.js)&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Use a dedicated Three.js scene module
&lt;span class="p"&gt;*&lt;/span&gt; Render an abstract &lt;span class="gs"&gt;**circular particle system**&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; Particles form a softly rotating sphere or neural cluster
&lt;span class="p"&gt;*&lt;/span&gt; Color palette limited to cyan, blue, and soft white
&lt;span class="p"&gt;*&lt;/span&gt; Animation:
&lt;span class="p"&gt;
  *&lt;/span&gt; Slow rotation
&lt;span class="p"&gt;  *&lt;/span&gt; Subtle breathing or noise-based movement
&lt;span class="p"&gt;*&lt;/span&gt; Interaction:
&lt;span class="p"&gt;
  *&lt;/span&gt; Light cursor-based parallax
&lt;span class="p"&gt;*&lt;/span&gt; The canvas must be:
&lt;span class="p"&gt;
  *&lt;/span&gt; Self-contained
&lt;span class="p"&gt;  *&lt;/span&gt; Easily removable or replaceable
&lt;span class="p"&gt;  *&lt;/span&gt; Not tightly coupled to UI state

&lt;span class="gu"&gt;### Main Content&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Headline and subtext in a simple content component
&lt;span class="p"&gt;*&lt;/span&gt; Quick action pills rendered from a data array
&lt;span class="p"&gt;*&lt;/span&gt; No hardcoded UI strings inside logic

&lt;span class="gu"&gt;### Input Section&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Input bar broken into:
&lt;span class="p"&gt;
  *&lt;/span&gt; Text input component
&lt;span class="p"&gt;  *&lt;/span&gt; Left action icons
&lt;span class="p"&gt;  *&lt;/span&gt; Right action icons
&lt;span class="p"&gt;*&lt;/span&gt; Icons reusable across the app
&lt;span class="p"&gt;*&lt;/span&gt; Keyboard behavior handled in a dedicated hook or utility

&lt;span class="gu"&gt;## Right Sidebar (Analytics &amp;amp; Activity)&lt;/span&gt;

&lt;span class="gu"&gt;### Activity Matrix (Three.js)&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Separate Three.js scene from layout code
&lt;span class="p"&gt;*&lt;/span&gt; Visualize activity using:
&lt;span class="p"&gt;
  *&lt;/span&gt; Nodes and connecting lines
&lt;span class="p"&gt;  *&lt;/span&gt; Temporal motion paths
&lt;span class="p"&gt;*&lt;/span&gt; Minimal neon wireframe aesthetic
&lt;span class="p"&gt;*&lt;/span&gt; Motion should feel ambient, not informational
&lt;span class="p"&gt;*&lt;/span&gt; Scene must support pausing when off-screen

&lt;span class="gu"&gt;### Stats &amp;amp; Mode Usage&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Each stat card as its own component
&lt;span class="p"&gt;*&lt;/span&gt; Mode usage bars driven by data, not hardcoded values
&lt;span class="p"&gt;*&lt;/span&gt; Visual styles shared via common tokens

&lt;span class="gu"&gt;### AI Status Section&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Reusable status row component
&lt;span class="p"&gt;*&lt;/span&gt; Indicator colors derived from state mapping
&lt;span class="p"&gt;*&lt;/span&gt; No inline conditional styling

&lt;span class="gu"&gt;## Three.js &amp;amp; Performance Constraints&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Keep particle counts low and configurable
&lt;span class="p"&gt;*&lt;/span&gt; Centralized animation loop management
&lt;span class="p"&gt;*&lt;/span&gt; Clean disposal of geometries and materials
&lt;span class="p"&gt;*&lt;/span&gt; requestAnimationFrame usage should be controlled and predictable
&lt;span class="p"&gt;*&lt;/span&gt; WebGL failure should gracefully fall back to static UI&lt;span class="sb"&gt;


&lt;/span&gt;&lt;span class="gu"&gt;## Maintainability Constraints&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; No inline styles for complex layouts
&lt;span class="p"&gt;*&lt;/span&gt; No deeply nested components without justification
&lt;span class="p"&gt;*&lt;/span&gt; Use clear naming conventions
&lt;span class="p"&gt;*&lt;/span&gt; Comments should explain intent, not obvious behavior
&lt;span class="p"&gt;*&lt;/span&gt; Any complex logic must be documented at the top of the file

&lt;span class="gu"&gt;## Final Goal&lt;/span&gt;

The result should feel like a &lt;span class="gs"&gt;**production-ready AI dashboard**&lt;/span&gt; that is:
&lt;span class="p"&gt;
*&lt;/span&gt; Visually calm
&lt;span class="p"&gt;*&lt;/span&gt; Technically elegant
&lt;span class="p"&gt;*&lt;/span&gt; Easy to extend
&lt;span class="p"&gt;*&lt;/span&gt; Easy for another engineer to understand within minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Make some iterations until you reach a satisfactory level. (Satisfaction doesn't mean you need the best out of the best. It should be something you think is good enough)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Start implementing the Core Features
&lt;/h2&gt;

&lt;p&gt;And since we are creating it through vibe coding, let's go through a little-little code only. Want no code? Skip this section.&lt;/p&gt;

&lt;p&gt;In your chatbot, you can add multi-provider support or you can choose only a single provider. In my case, I love to have multi-provider support because this allows the user to switch to any model they want.&lt;/p&gt;

&lt;p&gt;The following diagram represents the implementation I've done in Radhika:&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%2Fsz746i5xhmjc6o48zpce.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%2Fsz746i5xhmjc6o48zpce.png" alt="flowchart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the most important part than this is to parse the request sent by the user.&lt;/p&gt;

&lt;p&gt;The request handler begins by parsing the JSON body from the incoming POST request:&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;body&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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;general&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;groq&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/strong&gt;: The conversation history sent by the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/strong&gt;: Determines which system prompt to use (e.g., bff, learning, etc.). // totally depends on you if want to add multiple modes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/strong&gt;: Specifies the AI backend to use (&lt;code&gt;groq&lt;/code&gt;, &lt;code&gt;openai&lt;/code&gt;, &lt;code&gt;claude&lt;/code&gt;, &lt;code&gt;gemini&lt;/code&gt;, or whatever provider you're using).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;apiKey&lt;/code&gt;&lt;/strong&gt;: Required for OpenAI and Claude if a user key is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Assign the Prompt&lt;/strong&gt;&lt;br&gt;
Add a system prompt on how you want your chatbot should behave and talk about. You can also link it with a KB (knowledge base) or create your own mini knowledge base to make your bot more specific to something.&lt;/p&gt;

&lt;p&gt;I've not implemented this as I wanted my Radhika to be generic and serve as a good template for someone like you.&lt;/p&gt;

&lt;p&gt;If you're also adding multi-provider, then route to the correct provider. Each provider has custom logic to instantiate the model, handle errors, and stream the response using:&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;await&lt;/span&gt; &lt;span class="nf"&gt;streamText&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Looking for a prompt? Here it is: (add this in the same chat session or the create one)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Agentic Backend Architecture Prompt&lt;/span&gt;

You are a senior backend engineer designing a &lt;span class="gs"&gt;**production-ready AI chat backend**&lt;/span&gt; with &lt;span class="gs"&gt;**multi-provider model support**&lt;/span&gt;, clean architecture, and long-term maintainability.

Your goal is to build a backend that powers an AI assistant similar to &lt;span class="gs"&gt;**Radhika**&lt;/span&gt;, where users can switch models dynamically while keeping the system simple, extensible, and readable.

&lt;span class="gu"&gt;## Core Backend Principles&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Clear separation of responsibilities
&lt;span class="p"&gt;*&lt;/span&gt; No provider-specific logic inside request handlers
&lt;span class="p"&gt;*&lt;/span&gt; Easy to add or remove AI providers
&lt;span class="p"&gt;*&lt;/span&gt; Streaming responses by default
&lt;span class="p"&gt;*&lt;/span&gt; Minimal abstractions, no over-engineering
&lt;span class="p"&gt;*&lt;/span&gt; Code should read like documentation

&lt;span class="gu"&gt;## Request Handling Flow&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Use a single POST endpoint for chat interactions
&lt;span class="p"&gt;*&lt;/span&gt; Parse the incoming JSON request at the boundary

&lt;span class="sb"&gt;`'``ts
const body = await req.json();
const { messages, mode = "general", provider = "groq", apiKey } = body;
`&lt;/span&gt;'&lt;span class="sb"&gt;``

* `messages`: full conversation history from the client
* `mode`: determines which system prompt to apply
* `provider`: selected AI backend
* `apiKey`: optional user-supplied key for providers that require it

Validation should happen immediately after parsing and fail early with clear errors.

## Prompt Management

* System prompts must be centralized
* Store prompts in a dedicated module or folder
* Map prompts by mode name
* Avoid hardcoded prompt strings inside logic
* Allow future expansion into:

  * Knowledge base injection
  * Context enrichment
  * Mode-specific behavior tuning

If no custom knowledge base is attached, default to a generic assistant prompt suitable for broad usage.

## Provider Routing

* Use a provider router layer
* Route requests based on the `provider` field
* Each provider must live in its own isolated module
* No shared state between providers

Each provider module should:

* Instantiate its own client
* Normalize input messages
* Handle provider-specific errors
* Support streaming responses using:

`'``&lt;/span&gt;ts
await streamText({ ... })
&lt;span class="sb"&gt;`'``

The request handler should never know how a provider works internally.

## Streaming Architecture

* Streaming must be first-class, not optional
* Keep streaming logic abstracted behind a common interface
* Providers should emit tokens in a unified format
* Handle disconnects and stream cleanup gracefully

## File Organization Guidelines

* Organize by responsibility, not file type
* Suggested structure:

  * `&lt;/span&gt;/routes&lt;span class="sb"&gt;` for request handlers
  * `&lt;/span&gt;/providers&lt;span class="sb"&gt;` for AI provider implementations
  * `&lt;/span&gt;/prompts&lt;span class="sb"&gt;` for system and mode prompts
  * `&lt;/span&gt;/utils&lt;span class="sb"&gt;` for shared helpers
  * `&lt;/span&gt;/types&lt;span class="err"&gt;`&lt;/span&gt; for request and provider contracts
&lt;span class="p"&gt;*&lt;/span&gt; One provider per file
&lt;span class="p"&gt;*&lt;/span&gt; One responsibility per file
&lt;span class="p"&gt;*&lt;/span&gt; No oversized files

&lt;span class="gu"&gt;## Error Handling&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Normalize all provider errors
&lt;span class="p"&gt;*&lt;/span&gt; Never leak raw provider error messages to clients
&lt;span class="p"&gt;*&lt;/span&gt; Return consistent error shapes
&lt;span class="p"&gt;*&lt;/span&gt; Log provider-specific details internally

&lt;span class="gu"&gt;## Extensibility Rules&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Adding a new provider should require:
&lt;span class="p"&gt;
  *&lt;/span&gt; One new provider file
&lt;span class="p"&gt;  *&lt;/span&gt; One registration entry in the provider router
&lt;span class="p"&gt;*&lt;/span&gt; No changes to the core request handler
&lt;span class="p"&gt;*&lt;/span&gt; No breaking changes to existing providers

&lt;span class="gu"&gt;## Maintainability Constraints&lt;/span&gt;
&lt;span class="p"&gt;
*&lt;/span&gt; Avoid deeply nested conditionals
&lt;span class="p"&gt;*&lt;/span&gt; Prefer early returns
&lt;span class="p"&gt;*&lt;/span&gt; Use explicit naming over clever abstractions
&lt;span class="p"&gt;*&lt;/span&gt; Add comments only where intent is non-obvious
&lt;span class="p"&gt;*&lt;/span&gt; Keep configuration and logic separate

&lt;span class="gu"&gt;## Final Goal&lt;/span&gt;

The backend should feel like a &lt;span class="gs"&gt;**reference implementation**&lt;/span&gt; that:
&lt;span class="p"&gt;
*&lt;/span&gt; Supports multiple AI providers cleanly
&lt;span class="p"&gt;*&lt;/span&gt; Streams responses efficiently
&lt;span class="p"&gt;*&lt;/span&gt; Is easy for other developers to fork
&lt;span class="p"&gt;*&lt;/span&gt; Serves as a strong template for building AI chat systems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Adding a Database (optional)
&lt;/h2&gt;

&lt;p&gt;Though this is totally optional, if you want to add persistent storage to the user chats that can be retrieved later, then add a database. Or if you want to track your bot users, you can create a database.&lt;/p&gt;

&lt;p&gt;I used it to implement both.&lt;/p&gt;

&lt;p&gt;Initially, I was using the &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; free tier, but I was hitting the limits, and my app was becoming stale. Then I switched to &lt;a href="https://appwrite.io/" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt;. Both are totally different; one is SQL, while the latter one is NoSQL. Although use &lt;a href="https://www.npmjs.com/package/node-appwrite?activeTab=versions" rel="noopener noreferrer"&gt;&lt;code&gt;node-appwrite&lt;/code&gt;&lt;/a&gt; package to skip the manual schema add-ons.&lt;/p&gt;

&lt;p&gt;If you want to create something similar to what I've created, then modify or replicate &lt;a href="https://github.com/RS-labhub/Radhika/blob/master/scripts/setup-appwrite-schema.ts" rel="noopener noreferrer"&gt;setup_appwrite_schema&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking for a prompt? Think your logic first and write it, and then ask ChatGPT to convert it into an agentic prompt. You will enjoy this!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  You're so done!
&lt;/h2&gt;

&lt;p&gt;This is how simple to create a full-fledged chatbot with a professional codebase.&lt;/p&gt;

&lt;p&gt;Once done, you can upload it to &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and then host it on serverless platforms like &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If that's not enough to you, then start with Radhika and modify as much as you can.&lt;/p&gt;

&lt;p&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/RS-labhub" rel="noopener noreferrer"&gt;
        RS-labhub
      &lt;/a&gt; / &lt;a href="https://github.com/RS-labhub/Radhika" rel="noopener noreferrer"&gt;
        Radhika
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Radhika is a multi-model AI assistant built for your mood and friendship 💞
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/RS-labhub/Radhika/master/public/banner.png"&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%2FRS-labhub%2FRadhika%2Fmaster%2Fpublic%2Fbanner.png" alt="banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Radhika&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A modern AI assistant that adapts to how you work and think. Multiple modes, multiple models, one seamless chat experience. Features multiple LLM providers, image generation, voice interaction, and persistent chat history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try now&lt;/strong&gt;: &lt;a href="https://radhika-sharma.vercel.app" rel="nofollow noopener noreferrer"&gt;https://radhika-sharma.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Detailed Explanation&lt;/h2&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;Preview&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Description&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://dev.to/rohan_sharma/creating-a-chatbot-that-actually-stands-out-vibe-coded-version-draft-1ake" 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%2FRS-labhub%2FRadhika%2Fmaster%2Fpublic%2Fcover-image.png" alt="Blog Post"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Blog Post&lt;/strong&gt;&lt;br&gt;Read the blog for in-depth explanation.&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://radhika-sharma.vercel.app" 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%2FRS-labhub%2FRadhika%2Fmaster%2Fpublic%2Fyoutube-thumbnail.png" alt="YouTube Demo"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;YouTube Demo&lt;/strong&gt;&lt;br&gt;Coming soon.&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;strong&gt;6 Chat Modes&lt;/strong&gt;: General, Productivity, Wellness, Learning, Creative, BFF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Provider LLM&lt;/strong&gt;: Groq, Gemini, OpenAI, Claude&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Generation&lt;/strong&gt;: Pollinations, DALL·E 3, Hugging Face, Free alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice&lt;/strong&gt;: Speech-to-text input &amp;amp; text-to-speech output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth &amp;amp; Persistence&lt;/strong&gt;: Appwrite auth with chat history &amp;amp; favorites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI&lt;/strong&gt;: Light/dark themes, modern &amp;amp; pixel UI styles&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&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/RS-labhub/radhika.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; radhika
bun install   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or npm install&lt;/span&gt;
bun run dev   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or npm run dev&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open: &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;MIT License - see &lt;a href="https://github.com/RS-labhub/Radhika/LICENSE" rel="noopener noreferrer"&gt;LICENSE&lt;/a&gt;&lt;/p&gt;




&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Built with ❤️ by &lt;a href="https://github.com/RS-labhub" rel="noopener noreferrer"&gt;Rohan Sharma&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/RS-labhub/Radhika/public/Author.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FRS-labhub%2FRadhika%2Fpublic%2FAuthor.jpg" alt="author"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/RS-labhub/radhika" rel="noopener noreferrer"&gt;⭐ Star&lt;/a&gt; • &lt;a href="https://github.com/RS-labhub/radhika/issues" rel="noopener noreferrer"&gt;🐛 Issues&lt;/a&gt; • &lt;a href="https://github.com/RS-labhub/radhika/discussions" rel="noopener noreferrer"&gt;🗣️&lt;/a&gt;…&lt;/p&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/RS-labhub/Radhika" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;I have implemented a lot of other features like voice recognition and synthesis using WebKit and &lt;a href="https://elevenlabs.io/" rel="noopener noreferrer"&gt;Eleven Labs&lt;/a&gt;, image generation using pollination.ai, openai, gemini, huggingface models, etc,. (&lt;a href="https://pollinations.ai/" rel="noopener noreferrer"&gt;pollinations ai&lt;/a&gt; and HuggingFace models are free to generate images/videos/texts/etc,.)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;Creating a chatbot is super-easy and doesn't need much knowledge. It's just like texting messages to agents.&lt;/p&gt;

&lt;p&gt;However, you need prompting skills to get the product in a very less time. &lt;/p&gt;

&lt;p&gt;Want some prompting tips? Comment or reach out to me!&lt;/p&gt;

&lt;p&gt;Before sharing the ways to reaching me, I want you to star the GitHub repo of Radhika.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/RS-labhub/radhika" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Star Radhika on Github 🌠&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Find the Live Demo here: &lt;a href="https://radhika-sharma.vercel.app/" rel="noopener noreferrer"&gt;https://radhika-sharma.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to connect with me? Visit my &lt;a href="https://rohan-sharma-portfolio.vercel.app" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;, contact's page.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>2025 in Review: Growth, Grief, and the Cost of Momentum</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Wed, 31 Dec 2025 04:15:22 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/2025-in-review-growth-grief-and-the-cost-of-momentum-f8b</link>
      <guid>https://dev.to/rohan_sharma/2025-in-review-growth-grief-and-the-cost-of-momentum-f8b</guid>
      <description>&lt;p&gt;Hey there,&lt;/p&gt;

&lt;p&gt;I know, I know it's been a long time since I last posted or wrote anything. It might be possible that you are either pissed off at me or have literally forgotten me. In both cases, &lt;strong&gt;I apologize&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So, &lt;em&gt;why was I dead?&lt;/em&gt; Possible reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;being very very very busy at work&lt;/li&gt;
&lt;li&gt;being depressed&lt;/li&gt;
&lt;li&gt;lost willingness to write&lt;/li&gt;
&lt;li&gt;lose interest in everything&lt;/li&gt;
&lt;li&gt;no reasons, just trying to coverup myself with lies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you go ahead and read the rest of the blog, please select an option from above and write it down in the comment section. Let's see what you think!&lt;/p&gt;




&lt;p&gt;Let's start this blog by justifying myself.&lt;br&gt;
The actual reason for me being dead was -- &lt;strong&gt;several&lt;/strong&gt;. I will write my 2025 wrap-up and then wind up the reasons if you still didn't get it while reading it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting with January 2025.&lt;/strong&gt; The year began with a big change. I joined  &lt;strong&gt;&lt;a href="https://llmware.ai/" rel="noopener noreferrer"&gt;&lt;code&gt;LLMWare&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; as a devRel Engineer and am still serving to &lt;a href="https://quira.sh" rel="noopener noreferrer"&gt;&lt;code&gt;Quira&lt;/code&gt;&lt;/a&gt; as Community Moderator. February was already on my mind because of the GATE exam (a national exam in India for PG admissions). So, I also started to prepare for that. The weather stayed kind, which helped more than I realized at the time. Oh btw, I forgot, I went to college every day just to reach the 75% attendance milestone/.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;February 2025.&lt;/strong&gt; This was the month things started to feel real. I had the GATE exam in the first week, and once it was over, I shifted fully back to work. I had taken quite a few days off earlier and did not want to slow things down further. On February 8, 2025, I consciously decided to make &lt;code&gt;llmware&lt;/code&gt; my P0 and commit to it properly. A few days later, my university exams began. It was work during the day and exams around it. I managed. In the middle of all that, I lost something I can never get back - a friend. It was 16th Feb, 2025. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After a rough start, 2025 rolled into March.&lt;/strong&gt; Things began to move with more seriousness. I started giving more of my time to work. College was sucking, as usual. Staying busy became a way to escape the matrix of overthinking. Along the way, I missed a few family moments, and by the end of the month, my brothers left home for work. For the first time, the house was quiet. Not for a day, but for DAYS. Professionally, things were on track. Personally, I was starting to fall behind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;April 2025 started.&lt;/strong&gt; &lt;code&gt;llmware&lt;/code&gt; started gaining real momentum on &lt;a href="https://github.com/llmware-ai/llmware" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Work became my default state. I began keeping my distance from people and spending more time alone. During the month, I met the Founder &amp;amp; CEO of &lt;strong&gt;&lt;a href="https://discord.gg/deveco" rel="noopener noreferrer"&gt;devEco&lt;/a&gt;&lt;/strong&gt;. We had a few meaningful conversations, and I decided to take on part-time work with them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's May 2025 now.&lt;/strong&gt; Things accelerated at &lt;code&gt;llmware&lt;/code&gt;. I was putting in more hours than ever. Alongside that, I officially joined devEco as well. Suddenly, my days were split between &lt;code&gt;college&lt;/code&gt;, &lt;code&gt;llmware&lt;/code&gt;, &lt;code&gt;quira&lt;/code&gt;, and &lt;code&gt;devEco&lt;/code&gt;. Even then, most of the conversations were still with myself. With still some time left to spare, I pushed myself to participate in a &lt;a href="https://dev.to/challenges"&gt;DEV Challenge&lt;/a&gt;, the authorization challenge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, it's June 2025, the biggest month for me.&lt;/strong&gt; I pushed past every limit and worked relentlessly. On non-college days, I was putting in 14 to 15 hours. On college days, around 8 to 9. I led the documentation for &lt;code&gt;llmware&lt;/code&gt;’s major product announcement, &lt;strong&gt;Model HQ&lt;/strong&gt;. The work spanned two months, but most of it came together in June. I also won the DEV Challenge I had participated in the previous month.&lt;/p&gt;

&lt;p&gt;Professionally, I was at my peak. And it was at that peak that I started forgetting everything else. I barely ate because I simply did not think about it. The intensity was self-imposed. There was no pressure from either company. In fact, I was repeatedly asked to slow down and rest. I did not listen. During this stretch, I also wrote five blogs and scheduled them through early July.&lt;/p&gt;

&lt;p&gt;Sadness followed me through it all. When the Founder &amp;amp; CEO of Quira told me the company was winding down, it shook me deeply. Quira was my first job, and the place where I learned how to build and belong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;July 2025 started with university exams.&lt;/strong&gt; I slowed down at work, not because of the exams, but because I was quietly losing interest, even though I kept showing up and delivering. Exams themselves never bothered me much. What weighed heavier was going to college every day. I am a one nighter. I usually study for three to four hours and then sit for the exam. Somehow, I cleared everything with zero backlogs.&lt;/p&gt;

&lt;p&gt;Quira was officially closed now. I gifted the Founder &amp;amp; CEO with &lt;a href="https://quira-voices.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;this&lt;/strong&gt;&lt;/a&gt;. He loved it.&lt;/p&gt;

&lt;p&gt;Around the same time, one of my brothers decided to resign from his job. He was struggling with the food and climate of the region, and it had finally caught up with him.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;August 2025.&lt;/strong&gt; Happiness began to return, slowly. My brothers came back. One for good, to prepare for what was next, and the other just for the holidays. I was still hoping for a comeback from that friend, but it never happened. The hardest part was seeing each other every day in college, like strangers.&lt;/p&gt;

&lt;p&gt;I started working again like a normal human being, and for the first time in months, I had some spare time. Around then, a former DevRel from Quira reached out and asked if I could help at his current company. He was someone who had taught me a lot. I knew he did not really need help. He was trying to help me instead. I did not say no.&lt;/p&gt;

&lt;p&gt;That is how I joined &lt;strong&gt;&lt;a href="https://tessl.io" rel="noopener noreferrer"&gt;Tessl&lt;/a&gt;&lt;/strong&gt; as a part-time DevEx Engineer. Once again, I was working with three companies. This time, the work was different, harder, and more demanding in its own way. I stopped thinking too much about myself and kept moving forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My birthday month, September 2025.&lt;/strong&gt; I was born on September 1. Fun fact, World War II also officially began on that day. Strange coincidence. Overall, it was a good month. I enjoyed working at my new company, even though it was more demanding than anything I had done before. I had never worked with so many people at once. The team at &lt;code&gt;Tessl&lt;/code&gt; is filled with well-known names, and I genuinely loved being part of it. Life felt steady again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;October 2025.&lt;/strong&gt; This was the first month when I didn't work at &lt;code&gt;llmware&lt;/code&gt; at all. Things were moving internally, and we were all waiting. I ended up with a break, but I did not really stop. I started working on something else, still under wraps (yes, a secret). I also updated one of my projects, &lt;a href="https://radhika-sharma.vercel.app/" rel="noopener noreferrer"&gt;Radhika&lt;/a&gt;, and launched version 2.0. By the way, version 3.0 is coming in a few days as well. The month was also filled with festivals, and for once, I celebrated them properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And it's November 2025, another exam month.&lt;/strong&gt; I slowly resumed work with &lt;code&gt;llmware&lt;/code&gt;, &lt;code&gt;tessl&lt;/code&gt;, and &lt;code&gt;devEco&lt;/code&gt; continued as usual. But somewhere along the way, I lost interest in work itself. It started to feel boring. I had my 3rd university exam this month. Around this time, something shifted in me. I stopped feeling much of anything. No excitement, no fear. Just a quiet numbness. My circle became smaller than it had ever been. But overall, it was good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lastly, December 2025.&lt;/strong&gt; I was fully back at work, almost like before. This time, though, I had more holidays than usual. I am still on break until January 1, 2026. The time off did something unexpected. It forced me to notice what I had lost this year, what I wanted but never paused to ask for. Loneliness showed up quietly. Real FOMO too. Feelings I had avoided all year finally caught up.&lt;/p&gt;

&lt;p&gt;At this point, I cannot clearly say whether I am happy, sad, exhausted, lost, or simply alone. Maybe it is a mix of everything.&lt;/p&gt;

&lt;p&gt;Have you ever gone through a phase like this?&lt;/p&gt;




&lt;h2&gt;
  
  
  Now's let me write what you're most interested in reading
&lt;/h2&gt;

&lt;p&gt;Leaving personal life in a corner, let's talk about the professional growth I've achieved this year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building Community and Trust at &lt;a href="https://quira.sh" rel="noopener noreferrer"&gt;Quira&lt;/a&gt;:&lt;/strong&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%2F8scnz0edx2jy4badeff3.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%2F8scnz0edx2jy4badeff3.png" alt="rodrigo's recommendation" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engaged in activity and participation in Quests&lt;/li&gt;
&lt;li&gt;Handled the community in hard times.&lt;/li&gt;
&lt;li&gt;Helped many members get started and ship their first projects on &lt;code&gt;Quira&lt;/code&gt; through one-on-one sessions.&lt;/li&gt;
&lt;li&gt;Proposed ideas that significantly improved community participation, communication, and retention.&lt;/li&gt;
&lt;li&gt;Built a warm and approachable community space where members felt comfortable reaching out. I was never seen as a distant or formal figure, but as a trusted colleague, which I truly valued.&lt;/li&gt;
&lt;li&gt;Demonstrated strong developer advocacy by supporting both the product and the people using it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built and Shipped at &lt;a href="https://llmware.ai" rel="noopener noreferrer"&gt;LLMWare&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elevated &lt;code&gt;LLMWare&lt;/code&gt;'s GitHub activity. (6,500+ Stars and 2,000+ Forks Organic Farming in 6 months)&lt;/li&gt;
&lt;li&gt;Increased the awareness of SLMs.&lt;/li&gt;
&lt;li&gt;Created a whole new website. (A newer version is coming soon)&lt;/li&gt;
&lt;li&gt;Wrote documentation for Model HQ (a &lt;code&gt;llmware&lt;/code&gt;'s product) and hosted it. (got great feedback from senior developers)&lt;/li&gt;
&lt;li&gt;Involved in QA and testing of Model HQ.&lt;/li&gt;
&lt;li&gt;Delivered over 15 high-quality contents.&lt;/li&gt;
&lt;li&gt;Contributed to the social presence of &lt;code&gt;llmware&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Growing &lt;a href="https://discord.gg/deveco" rel="noopener noreferrer"&gt;devEco's &lt;/a&gt; Developer Presence:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed socials across multiple platforms for &lt;code&gt;devEco&lt;/code&gt;, &lt;code&gt;devEco products&lt;/code&gt;, and &lt;code&gt;devEco clients&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Achieved a great percentage of increase in activities like reactions, comments, reposts, and impressions.&lt;/li&gt;
&lt;li&gt;Sparked active conversations through thoughtful content, up from almost none.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengthening the Developer Ecosystem at &lt;a href="https://tessl.io" rel="noopener noreferrer"&gt;Tessl&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strengthened the &lt;a href="https://ainativedev.io/" rel="noopener noreferrer"&gt;AIND&lt;/a&gt; ecosystem by improving the Landscape platform, fixing major bugs, refining categories, and adding new tools consistently.&lt;/li&gt;
&lt;li&gt;Enhanced content operations through automation projects and streamlined publishing workflows.&lt;/li&gt;
&lt;li&gt;Delivered high-quality research, carousels, and weekly trending tool updates that improved visibility and engagement across developer channels.&lt;/li&gt;
&lt;li&gt;Provided cross-functional support to improve UX, data quality, scraping workflows, and overall product reliability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;I am sure I have not captured everything here, and that is okay. What matters is that I know how much I worked, and that I gave my best to everything I was part of. I do not know if I will continue on the same path, but for now, I am not worried about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things I loved the most!!!
&lt;/h2&gt;

&lt;p&gt;There were a lot of moments this year that I loved a lot. Let's start!&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;Quira&lt;/strong&gt;, I did not just meet people. I made a real friend circle. And I believe this deeply: when someone reaches out to you as a friend and shares their feelings and pain points, it means you have occupied a special place in their heart. That feeling is rare, and I will always value it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLMWare&lt;/strong&gt;. Ahh. I honestly do not have enough words for this one. I met some incredibly sharp senior developers through LLMWare. Since I am under NDA, I cannot share much, but this experience opened doors to many Silicon Valley giants for me. More importantly, this was the first time I worked on a real product at a very early-stage startup. Working closely with the CEO and CTO felt natural and calm. They are kind, thoughtful, and genuinely great people to work with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;devEco&lt;/strong&gt; filled me with sessions of laughter, joys, arguments, and whatnot! The founder is insanely cool and welcomes everyone with warmth. Becoming a core devEco member is a different kind of fun. He talks to me, teaches me, appreciates me when I do something right, and corrects me when I make mistakes. Interestingly, I didn't made much mistakes. I have 90% appreciation in my hands. Ehehe. But I must say, meet with this human once and you won't regret it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tessl&lt;/strong&gt; was the biggest surprise. I was honestly hesitant at first. There were a lot of people, and in the past, I had only worked with 3 or 4 at a time. Being a newbie in such an environment hits differently. But guess what. It was smooth. Really smooth. A huge thanks to the DevRel at Tessl. This guy taught me a lot and supported me constantly. He is the person I feel most comfortable with. I can even talk to him about my personal life with ease. He speaks, shares ideas, listens to ideas, has zero ego or arrogance, treats everyone equally, always helps others, travels way too much, and still manages everything.&lt;/p&gt;

&lt;p&gt;And not just him. The entire Tessl team is welcoming and amazing. I even got to work with the Father of DevOps himself, and he even appreciated my work(ehehe). That one stays with me.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Achieved!!!
&lt;/h2&gt;

&lt;p&gt;Well, I achieved a lot of things. But there are some things beyond work that matter just as much.&lt;/p&gt;

&lt;p&gt;I know most of you want to know &lt;strong&gt;how much money I made&lt;/strong&gt;. Of course, I am not going to tell that. But you can assume. Let me know in the comments. I will say this though. I earned a good amount. And now, I want more. I already have plans for 2026. Or maybe not. I am a moody guy. My plans change often.&lt;/p&gt;

&lt;p&gt;Apart from money, I gained a lot. We renovated our house. It is still not fully done. Two more months to go. We also bought a lot of furniture, although that part feels less special since we already have a family business around it.&lt;/p&gt;

&lt;p&gt;I also got my &lt;strong&gt;Aloo&lt;/strong&gt; (Mr. Potato). See below. Cute, right? Thanks to Cloudinary.&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%2Fzil7tvfr2bx0iex852v5.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%2Fzil7tvfr2bx0iex852v5.jpeg" alt="aloo" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond money and things, I earned something better. Respect. Trust. Value. Most importantly, I unlocked an intense learning mode. Once it switches on, it is hard to turn off.&lt;/p&gt;




&lt;p&gt;Seems like I told everything I needed to tell. For those who still want to know the actual reason for my being dead are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I lost my interest in almost everything.&lt;/li&gt;
&lt;li&gt;Doing work is now boring for me.&lt;/li&gt;
&lt;li&gt;I was a bit sad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I do not want to write everything again, and I do not want to summarize it either. But somewhere above, these were the reasons.&lt;/p&gt;

&lt;p&gt;Before ending, I want to thank my friends. I will not take names properly, but if you are reading this, you already know who you are.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thanks to my college friend, &lt;strong&gt;SK&lt;/strong&gt;. Without him, I would never have cleared my college exams or survived college life. We spent almost all our time together. Being single, searching for someone, then running away. He can be brainless, but not brain-rotted. A good guy with intense slang specialization.&lt;/li&gt;
&lt;li&gt;Thanks to &lt;strong&gt;HG&lt;/strong&gt;. A person I have never met in real life. But if you are not in a good mood, one single text can turn into World War III. Good, kind-hearted, always listens. Extra thin and weak human. I will not say much, else WW IV will start. But thank you for always being there.&lt;/li&gt;
&lt;li&gt;Thanks to &lt;strong&gt;Sam&lt;/strong&gt; for being Same Sam. Ultimate mad and animal human. I do not know what to say about you. Take care, you sick human. And thanks for being there.&lt;/li&gt;
&lt;li&gt;Extending my gratitude to &lt;strong&gt;Dishu&lt;/strong&gt; and &lt;strong&gt;Piliya&lt;/strong&gt;. Both are placed. Both are talkative. Both get angry for no reason. Both are kind and always text me for anything. Also, neither is a cute human. Thank you, guys.&lt;/li&gt;
&lt;li&gt;Thanks to my elderly sister &lt;strong&gt;NG&lt;/strong&gt; as well. Overaged person with professional traumas. Best in arguments and worst in winning them. LOL. Thank you.&lt;/li&gt;
&lt;li&gt;And the last guy, &lt;strong&gt;KOS&lt;/strong&gt;. I worked with him. We talked about work for 1% of the time and movies, series, and heroines for 99%. Thanks for helping me debug bugs that were already fixed.&lt;/li&gt;
&lt;li&gt;Thanks to &lt;strong&gt;SK&lt;/strong&gt; as well, whom I lost this year. You've helped me a lot. Those were the happy days. Happy life ahead!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, do not take my words too seriously. But if you do, you are already a great person 😂&lt;/p&gt;

&lt;p&gt;Thanks for being there.&lt;/p&gt;




&lt;p&gt;Before I wrap this up, one last thing.&lt;/p&gt;

&lt;p&gt;If you ever feel like knowing more about me, or just want to talk about work, life, random ideas, or nothing in particular, you can reach out to me anywhere below. I am usually around, and I genuinely enjoy conversations more than formal networking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My portfolio: &lt;a href="https://rohan-sharma-portfolio.vercel.app" rel="noopener noreferrer"&gt;https://rohan-sharma-portfolio.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;X: &lt;a href="https://x.com/rrs00179" rel="noopener noreferrer"&gt;https://x.com/rrs00179&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/rohan-sharma-9386rs/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/rohan-sharma-9386rs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/RS-labhub" rel="noopener noreferrer"&gt;https://github.com/RS-labhub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No pressure to follow or connect. Just putting this here.&lt;/p&gt;

&lt;p&gt;That is all from my side. Thank you so much for reading till here. I will be active from next year and keep delivering good content.&lt;/p&gt;

&lt;p&gt;I forgot to ask, &lt;strong&gt;how did your year go?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>career</category>
      <category>devrel</category>
    </item>
    <item>
      <title>How to Create a Local Chatbot Without Coding in Less Than 10 Minutes on AI PCs</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Wed, 02 Jul 2025 04:10:07 +0000</pubDate>
      <link>https://dev.to/llmware/how-to-create-a-local-chatbot-without-coding-in-less-than-10-minutes-on-ai-pcs-2ajl</link>
      <guid>https://dev.to/llmware/how-to-create-a-local-chatbot-without-coding-in-less-than-10-minutes-on-ai-pcs-2ajl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🔖 &lt;em&gt;No cloud. No internet. No coding.&lt;/em&gt; &lt;br&gt;
🔖 &lt;em&gt;Just you, your laptop, and 100+ powerful AI models running locally.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine building your own chatbot that can answer your questions, summarize documents, analyze images, and even understand tables, all without needing an internet connection.&lt;/p&gt;

&lt;p&gt;Sounds futuristic?&lt;/p&gt;

&lt;p&gt;Thanks to &lt;strong&gt;Model HQ&lt;/strong&gt;, this is now a reality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model HQ&lt;/strong&gt; developed by &lt;a href="http://llmware.ai" rel="noopener noreferrer"&gt;LLMWare&lt;/a&gt;, is an innovative application that allows you to create and run a chatbot locally on your PC or laptop &lt;strong&gt;without an internet connection&lt;/strong&gt;. Best of all, this can be done with &lt;strong&gt;NO CODE&lt;/strong&gt; in &lt;strong&gt;less than 10 minutes&lt;/strong&gt;, even on older laptops up to 5 years old, provided they have 16GB or more of RAM.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk you through how to create your own local chatbot using &lt;strong&gt;Model HQ&lt;/strong&gt; ; a revolutionary AI desktop app by &lt;a href="https://llmware.ai" rel="noopener noreferrer"&gt;LLMWare.ai&lt;/a&gt;. Whether you’re a student, developer, or a professional looking for a private and offline AI assistant, this tool puts the power of cutting-edge AI models &lt;strong&gt;directly on your laptop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;

&lt;p&gt;If you want to know about &lt;strong&gt;Model HQ in detail&lt;/strong&gt;, then read the blog below:&lt;br&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" class="crayons-story__hidden-navigation-link"&gt;How to Run AI Models Privately on Your AI PC with Model HQ; No Cloud, No Code&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 class="crayons-logo crayons-logo--l" href="/llmware"&gt;
            &lt;img alt="LLMWare logo" 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%2Forganization%2Fprofile_image%2F8208%2F4bf5768d-460d-460b-9ccc-a80499ca040e.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/rohan_sharma" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2F1936949%2Fa1fd5434-8c99-4531-9491-2d117d2e6996.jpg" alt="rohan_sharma profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rohan_sharma" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Rohan Sharma
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Rohan Sharma
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2629400" 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="/rohan_sharma" 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%2F1936949%2Fa1fd5434-8c99-4531-9491-2d117d2e6996.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Rohan Sharma&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;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/llmware" class="crayons-story__secondary fw-medium"&gt;LLMWare&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 27 '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/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" id="article-link-2629400"&gt;
          How to Run AI Models Privately on Your AI PC with Model HQ; No Cloud, No Code
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nocode"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nocode&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/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" 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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;80&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/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k#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;
            5 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;


&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Download Model HQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model HQ&lt;/strong&gt; is an AI desktop application that allows you to interact with over &lt;strong&gt;100+ top-performing AI models&lt;/strong&gt;, including large ones with up to &lt;strong&gt;32 billion parameters&lt;/strong&gt; — all running &lt;strong&gt;locally on your PC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike cloud-based tools, there’s &lt;strong&gt;no internet required&lt;/strong&gt;, and your data never leaves your machine. That means &lt;strong&gt;more privacy, better speed&lt;/strong&gt;, and zero cost for each query you run.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In this blog, we will be looking into the &lt;strong&gt;CHAT&lt;/strong&gt; feature of Model HQ that helps us to create a chatbot running locally on our machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, get the app.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://llmware-modelhq.checkoutpage.com/modelhq-client-app-for-windows" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Download or Buy Model HQ for Windows&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not ready to buy? No problem.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://llmware.ai/enterprise#developers-waitlist" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Join the 90-Day Free Developer Trial&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once installed, you’ll have access to an interface that feels like your own AI control panel.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Choosing the Right AI Model
&lt;/h2&gt;

&lt;p&gt;Once installation is done, open the ModelHQ application, and then you will be prompted to add a setup method. The setup guide is provided after buying the application.&lt;/p&gt;

&lt;p&gt;After this, you will land in the main menu. Now, click on the Chat button.&lt;/p&gt;

&lt;p&gt;You’ll be prompted to select an AI model. If you’re unsure which model to choose, you can click on “choose for me,” and the application will select a suitable model based on your needs. Model HQ comes up with 100+ models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Available Model Options:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Small Model&lt;/strong&gt;:&lt;br&gt;
~1– 3 billion parameters:- Fastest response time, suitable for basic chat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Medium Model&lt;/strong&gt;:&lt;br&gt;
~7– 8 billion parameters:- Balanced performance, ideal for chat, data analysis, and standard RAG tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Large Model&lt;/strong&gt;:&lt;br&gt;
~9 – up to 32 billion parameters:- Most powerful chat, RAG, and best for advanced and complex analytical workloads.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the way, Model HQ will pick a smart default based on your system and use case.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The size of the model you choose can significantly impact both speed and output quality. &lt;strong&gt;Smaller models are faster but may provide less detailed responses&lt;/strong&gt;. Follow this simple rule:&lt;/p&gt;
&lt;/blockquote&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%2Fvs5p0403z5nb9malw1g1.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%2Fvs5p0403z5nb9malw1g1.png" alt="table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Downloading Models
&lt;/h2&gt;

&lt;p&gt;For demonstration purposes, we are selecting the &lt;strong&gt;Small Model&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
If no models have been downloaded previously (e.g., in the &lt;strong&gt;No Setup&lt;/strong&gt;, &lt;strong&gt;Fast Setup&lt;/strong&gt;, or &lt;strong&gt;Full Setup&lt;/strong&gt; paths), the selected model will begin downloading automatically.&lt;br&gt;&lt;br&gt;
This process typically takes &lt;strong&gt;2–7 minutes&lt;/strong&gt;, depending on the model you selected and your internet speed. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is only a &lt;strong&gt;one-time internet requirement&lt;/strong&gt;; once the models are downloaded, you don’t need internet anymore.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Start Chatting
&lt;/h2&gt;

&lt;p&gt;Once you’ve selected a model, you can start a chat by typing in your questions. For example, you might ask a simple question like, “What are the top sites to see in Paris?” The model will generate a response based on its training data.&lt;/p&gt;
&lt;h3&gt;
  
  
  Customizing Your Chat Experience
&lt;/h3&gt;

&lt;p&gt;Model HQ allows you to customize your chat experience further. You can adjust settings such as the maximum output length and the randomness of the responses (known as temperature). By default, the app is set to generate up to 1,000 tokens, which is usually sufficient for smaller models. However, even if you’re using larger models, be cautious about increasing this limit, as it can consume more memory and take longer to generate responses. So, in short, you can adjust &lt;strong&gt;generation settings&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Max Tokens&lt;/strong&gt;: How long should the response be?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Temperature&lt;/strong&gt;: Should the answer be creative or precise?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stop/Restart&lt;/strong&gt;: Hit ❌ to stop a long generation anytime.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;     &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Integrating Sources for Enhanced Responses
&lt;/h2&gt;

&lt;p&gt;One of the standout features of Model HQ is its ability to integrate sources, such as documents and images, into your chat. To do this, simply click on the “source” button and upload a file, such as a PDF or Word document.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example: Using a Document as a Source
&lt;/h3&gt;

&lt;p&gt;For instance, if you upload an executive employment agreement, you can ask specific questions about the clauses within the document. The model will reference the uploaded document to provide accurate answers. This feature is invaluable for fact-checking and ensuring that you have the right information at your fingertips.&lt;/p&gt;
&lt;h3&gt;
  
  
  Chatting with Images
&lt;/h3&gt;

&lt;p&gt;Model HQ also allows you to chat with images. By uploading an image, the application can analyze the content and answer questions based on what it sees. This capability opens up a world of possibilities for multimedia processing, all done locally on your machine without any additional costs.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 6: Saving and Downloading Results
&lt;/h2&gt;

&lt;p&gt;After you’ve finished your session, you can save the chat results for future reference. This is particularly useful if you need to compile information for reports or presentations. Simply download the results, and you’ll have everything you need at your fingertips.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 7: Exploring Advanced Features
&lt;/h2&gt;

&lt;p&gt;As you become more comfortable with Model HQ, you can explore its advanced features. For example, you can experiment with different models to see how they perform with various types of queries. You can also adjust the generation settings to fine-tune the responses based on your specific needs.&lt;/p&gt;

&lt;p&gt;If you’re a visual learner, then watch this YouTube walkthrough:&lt;/p&gt;

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

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Future Updates and Community Engagement
&lt;/h3&gt;

&lt;p&gt;Stay engaged with the Model HQ community by following their updates and tutorials on platforms like YouTube. The &lt;a href="https://youtube.com/playlist?list=PL1-dn33KwsmBiKZDobr9QT-4xI8bNJvIU&amp;amp;si=dLdhu0kMQWwgBwTE" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Model HQ YouTube playlist&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; offers valuable insights and tips to help you maximize your experience with the application.&lt;/p&gt;

&lt;p&gt;Join the &lt;a href="https://discord.gg/bphreFK4NJ" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;LLMWare’s Official Discord Server&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; to interact with LLMWare’s great community of users and if you have any questions or feedback.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;Most AI apps require you to upload data to a cloud server. That’s slow, often expensive, and puts your privacy at risk.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Model HQ&lt;/strong&gt;, everything runs on your own machine with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ No internet needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ No Coding Required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ No API keys or credits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ No data leaves your PC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Zero cost per query&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s &lt;strong&gt;your personal AI lab&lt;/strong&gt;, fully private and offline.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Get Started with Model HQ Today!
&lt;/h2&gt;

&lt;p&gt;Creating a chatbot that runs locally without coding and an internet connection has never been easier. With Model HQ, you have access to a powerful AI tool that can enhance your productivity and streamline your workflow. &lt;/p&gt;

&lt;p&gt;Ready to experience the future of AI? Visit the &lt;a href="https://llmware.ai" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;LLMWare website&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; to learn more about Model HQ and its features. Don’t forget to sign up for the &lt;a href="https://llmware.ai/enterprise#developers-waitlist" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;90-day free trial for developers here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; and explore the application firsthand. When you’re ready to make the leap, you can &lt;a href="https://llmware-modelhq.checkoutpage.com/modelhq-client-app-for-windows" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;purchase Model HQ directly here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unlock the full potential of AI on your PC or laptop with Model HQ today, and take the first step towards creating your very own local chatbot!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nocode</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Here's how I created a Real-Time Discord Badge for Github Readme 🌠</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Tue, 01 Jul 2025 03:30:03 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/heres-how-i-created-a-real-time-discord-badge-for-github-readme-4adg</link>
      <guid>https://dev.to/rohan_sharma/heres-how-i-created-a-real-time-discord-badge-for-github-readme-4adg</guid>
      <description>&lt;p&gt;Hello all, I'm back with another project. This time, I built a Real-Time Discord badge that shows the total member count.&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%2F8yztmdptnhn446z4xeds.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%2F8yztmdptnhn446z4xeds.png" alt="badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this blog, I will share with you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did I build this?&lt;/li&gt;
&lt;li&gt;Why add a dynamic Discord badge to your GitHub Readme?&lt;/li&gt;
&lt;li&gt;A step-by-step guide to adding this badge to your GitHub README, including how to customize it.&lt;/li&gt;
&lt;li&gt;How I handled real-time Discord data, added Redis caching, managed rate limits, and made it fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, let's start. 3... 2... 1... 🌱&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Why did I build this?
&lt;/h2&gt;

&lt;p&gt;I want to tell you a super short story for this. The company for which I'm working wanted me to add a dynamic Discord badge to their GitHub README that shows the total member count.&lt;/p&gt;

&lt;p&gt;I tried searching on the web. After a lot of searching, I found that Discord already provides a "Server Widget JSON API". For this, you have to go to your Discord server settings &amp;gt; engagement, and then turn on the widget, and you will be able to find the API link and the Server ID.&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%2Fro0h159xjg6nrwpmiqc3.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%2Fro0h159xjg6nrwpmiqc3.png" alt="server widget"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can create a badge using this Server ID as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;![demo&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://img.shields.io/discord/YOUR_SERVER_ID?logo=discord&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;](https://discord.gg/INVITE_CODE)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But the thing is, &lt;strong&gt;it will only show the online members count and not all the members&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%2F300d01qxln8nn1gd3vfo.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%2F300d01qxln8nn1gd3vfo.png" alt="online count badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tried to search a lot about "how to show all members' count", but I wasn't able to find any.&lt;/p&gt;

&lt;p&gt;And thus, I decided to create one. It was super easy. When I built it for my company, I realized there may be more people who want this badge as well, so I made it public for the community.&lt;/p&gt;

&lt;p&gt;I don't know if such badges are already there in the market or not. I tried to find a lot, and the disappointment made me build it. &lt;strong&gt;If you know any such badges or methods to show dynamic Discord badges that update in real-time, then please let me know in the comment section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Why add &lt;code&gt;Discord Live Members Count Badge&lt;/code&gt; to your GitHub Readme?
&lt;/h2&gt;

&lt;p&gt;Many open-source projects and communities wanted to showcase their Discord server growth on their GitHub READMEs because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The bigger the community, the more trust it builds.&lt;/strong&gt; Thus, showing your total Discord members count will not only market your product, but also build trust in future users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time metrics make your README dynamic.&lt;/strong&gt; It gives a sense that the project is active and maintained.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attracts contributors and collaborators.&lt;/strong&gt; A growing community signals engagement, which can draw in more developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Helps community managers track growth.&lt;/strong&gt; Badges provide a quick glance at server stats without needing to log into Discord.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Encourages more users to join.&lt;/strong&gt; Seeing a badge with large numbers can trigger FOMO and boost Discord join rates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improves project credibility.&lt;/strong&gt; Just like stars and forks, community size becomes a social proof metric.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easier comparison between similar projects.&lt;/strong&gt; Potential users can quickly evaluate community support through visible numbers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the most important point, "&lt;strong&gt;SNEAK-PEEK YOUR RIVALS OR ENEMY, OR FRIEND DISCORD COMMUNITY MEMBERS&lt;/strong&gt;". I don't know about you, but I do it. All you need is their Server ID. Keep reading the blog, and I will tell you how to do this. (I'm not promoting any such activities. It's bad. Anyway, I don't care. 😂)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-Step Guide: Adding &lt;code&gt;Discord Live Members Count Badge&lt;/code&gt; to Your GitHub README
&lt;/h2&gt;

&lt;p&gt;Let's get your Discord badge up and running in less than 5 minutes!&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Add the &lt;code&gt;Live Count Bot&lt;/code&gt; to Your Server
&lt;/h3&gt;

&lt;p&gt;First, you need to invite my bot to your Discord server:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://discord.com/oauth2/authorize?client_id=1388440480102092860&amp;amp;permissions=1040&amp;amp;integration_type=0&amp;amp;scope=bot" rel="noopener noreferrer"&gt;🤖 Click here to add the bot&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bot needs minimal permissions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View Channels&lt;/strong&gt; (to access your server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Channels&lt;/strong&gt; (for member counting)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 2: Enable Server Widget
&lt;/h3&gt;

&lt;p&gt;This is crucial - without this step, your badges won't work!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click your server name → &lt;strong&gt;Server Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Engagement&lt;/strong&gt; → &lt;strong&gt;Server Widget&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toggle ON&lt;/strong&gt; the "Enable Server Widget" option&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy your Server ID&lt;/strong&gt; (you'll need this!)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Still facing difficulty? Follow the &lt;a href="https://discord-live-members-count-badge.vercel.app/documentation" rel="noopener noreferrer"&gt;&lt;strong&gt;Documentation here&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What if you're not a core member of the Discord server? The above option is present only for the server owner, admins, and moderators (sometimes). But if you're none of them and still want to add this badge? Remember, I told you above the "&lt;strong&gt;Sneak-Peek&lt;/strong&gt;" thing? We will apply it here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're not a core member&lt;/strong&gt; and still want to add this badge or want to sneak peek, then follow the steps below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your &lt;strong&gt;Users Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Advanced&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toggle ON&lt;/strong&gt; the "Developer Mode" option&lt;/li&gt;
&lt;li&gt;Now, right-click on any server and you will get an option to &lt;strong&gt;Copy Server ID&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;The Live Members Count must be present in that server.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Step 3. Customize your Badge
&lt;/h3&gt;

&lt;p&gt;Let's make it fast and as simple as possible.&lt;/p&gt;

&lt;p&gt;Copy this template, add your Server ID and Invite Link(optional, but important) in the corresponding places, and paste it in your GitHub Readme.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[![discord members](https://discord-live-members-count-badge.vercel.app/api/discord-members?guildId=YOUR_SERVER_ID_HERE)](https://discord.gg/YOUR_NEVER_EXPIRY_INVITE_CODE_HERE)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It will show the total Discord member counts (including the bots).&lt;/p&gt;

&lt;p&gt;I have made multiple endpoints, check it out here:&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%2Ft8el1cae3333gjz6mcv2.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%2Ft8el1cae3333gjz6mcv2.png" alt="endpoints"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check the endpoints using this link:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discord Members&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;  https://discord-live-members-count-badge.vercel.app/api/discord-members?guildId=YOUR_SERVER_ID_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2. &lt;strong&gt;Discord Bots&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  https://discord-live-members-count-badge.vercel.app/api/discord-bots?guildId=YOUR_SERVER_ID_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3. &lt;strong&gt;Discord Total&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  https://discord-live-members-count-badge.vercel.app/api/discord-total?guildId=YOUR_SERVER_ID_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;But, do you like to customize it more??&lt;/strong&gt;&lt;br&gt;
Well, I have this. I have included three extra parameters to make it more customizable for you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;color (optional) - Hex color without &lt;code&gt;#&lt;/code&gt; (default: 7289DA)&lt;/li&gt;
&lt;li&gt;label (optional) - Custom text label (default: varies by endpoint)&lt;/li&gt;
&lt;li&gt;scale (optional) - Size multiplier from 0.5 to 10.0 (default: 1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use them as:&lt;br&gt;
Badge Code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;![discord members&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://discord-live-members-count-badge.vercel.app/api/discord-members?guildId=YOUR_SERVER_ID&amp;amp;color=27ae60&amp;amp;label=Users&amp;amp;scale=2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;](https://discord.gg/your-invite)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Endpoint:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;https://discord-live-members-count-badge.vercel.app/api/discord-members?guildId=YOUR_SERVER_ID&amp;amp;color=27ae60&amp;amp;label=Users&amp;amp;scale=2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&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%2Fykgbh5rr3an78dgx9hw9.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%2Fykgbh5rr3an78dgx9hw9.png" alt="custom"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Same for other endpoints.&lt;/em&gt; Btw, pink is my favorite color. I don't know why I created a green badge. Maybe the devil made me do it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's a possibility that you might get frustrated because you have to change the color and scale multiple times to get your best. Each time, you have to wait for the page to reload or hit &lt;code&gt;enter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To become your HERO again, I built the website too.&lt;/strong&gt;&lt;br&gt;
&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://discord-live-members-count-badge.vercel.app/" 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%2Fdiscord-live-members-count-badge.vercel.app%2Fog-image.png" height="auto" class="m-0"&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://discord-live-members-count-badge.vercel.app/" rel="noopener noreferrer" class="c-link"&gt;
            Discord Badge
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Add beautiful, real-time Discord member count badges to your GitHub README
          &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%2Fdiscord-live-members-count-badge.vercel.app%2Ffavicon.ico"&gt;
          discord-live-members-count-badge.vercel.app
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;The interface is simple. But there are two things to be noticed:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Badge Generator
&lt;/h3&gt;

&lt;p&gt;This is simple, add your Server ID and Invite Link. Click on Generate, and your badges will be generated. Copy and paste it directly into the readme.&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%2F9fcrgftu347kixpwrr2y.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%2F9fcrgftu347kixpwrr2y.png" alt="generator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Interactive Playground
&lt;/h3&gt;

&lt;p&gt;Don't want to manually customize badges? I built an interactive playground where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🎨 Pick colors&lt;/strong&gt; from presets or use custom hex codes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📝 Edit labels&lt;/strong&gt; with live preview&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📏 Adjust scaling&lt;/strong&gt; with a visual slider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📋 Copy ready-to-use&lt;/strong&gt; markdown code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://discord-live-members-count-bot.vercel.app" rel="noopener noreferrer"&gt;🚀 Try the Playground&lt;/a&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%2F7jhigmj0gyo2qdbwoy72.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%2F7jhigmj0gyo2qdbwoy72.png" alt="Playground Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  How did I build it?
&lt;/h2&gt;

&lt;p&gt;In this section, I will try to explain how I built this web application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Creating the Discord Bot
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://discord.com/developers/applications" rel="noopener noreferrer"&gt;&lt;strong&gt;Discord Developer Portal&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a new application&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Bot&lt;/strong&gt; section&lt;/li&gt;
&lt;li&gt;Create a bot and copy the token&lt;/li&gt;
&lt;li&gt;Invite the bot to your server with these permissions:

&lt;ul&gt;
&lt;li&gt;View Channels&lt;/li&gt;
&lt;li&gt;Manage Channels&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In Privileged Gateway Intents, &lt;code&gt;Presence Intent&lt;/code&gt; and &lt;code&gt;Server Members Intent&lt;/code&gt; must be enabled.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Bot Permissions&lt;/strong&gt;&lt;br&gt;
For this case, the bot needs minimal permissions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View Channels&lt;/strong&gt; (1024)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Channels&lt;/strong&gt; (16)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total permission integer: &lt;code&gt;1040&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2. Routes and API
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;discord-members&lt;/code&gt; API
&lt;/h3&gt;

&lt;p&gt;It fetches the approximate member count using Discord's &lt;code&gt;/guilds/{guildId}?with_counts=true&lt;/code&gt; endpoint.&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;r&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;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://discord.com/api/v10/guilds/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;guildId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?with_counts=true`&lt;/span&gt;&lt;span class="p"&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;`Bot &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&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;DISCORD_BOT_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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;*&lt;em&gt;Caching *&lt;/em&gt; is not implemented in this route due to the approximate and fast nature of the API call.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;discord-bots&lt;/code&gt; API
&lt;/h3&gt;

&lt;p&gt;It counts bots in a guild using the &lt;code&gt;fetchAllMembers()&lt;/code&gt; utility.&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;members&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;fetchAllMembers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;guildId&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;botCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;members&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="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Key Points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calls Discord's &lt;code&gt;/guilds/{guildId}/members&lt;/code&gt; endpoint (paginated).&lt;/li&gt;
&lt;li&gt;Requires member intent (Privileged Intent must be enabled).&lt;/li&gt;
&lt;li&gt;Filters bot users using &lt;code&gt;m.user.bot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Uses caching to reduce repeated heavy calls. (in utils)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;discord-total&lt;/code&gt; API
&lt;/h3&gt;

&lt;p&gt;It combines both bot and human user counts.&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;members&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;fetchAllMembers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;guildId&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;botCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;members&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="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&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;humanCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;members&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;botCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Key Points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same logic and fetching as &lt;code&gt;discord-bots&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Shows combined info like &lt;code&gt;22 users, 5 bots&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;fetchAllMembers&lt;/code&gt; Utility
&lt;/h3&gt;

&lt;p&gt;Paginate through all members of a guild using Discord's API.&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;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keepFetching&lt;/span&gt;&lt;span class="p"&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;res&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;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://discord.com/api/v10/guilds/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;guildId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/members`&lt;/span&gt;&lt;span class="p"&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;`Bot &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;DISCORD_BOT_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="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;after&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;&lt;strong&gt;Caching:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tries Redis first using key &lt;code&gt;guild:{guildId}:members&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&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;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&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;cached&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`[Cache] HIT for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;guildId&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="k"&gt;return&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;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`[Cache] MISS for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;guildId&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="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="s2"&gt;`[Cache] Redis error on GET: &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="nx"&gt;message&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="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;On cache MISS, fetches from Discord and caches the result.&lt;/li&gt;
&lt;li&gt;TTL is controlled via &lt;code&gt;CACHE_TTL&lt;/code&gt; environment variable (default 300 seconds).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rate Limiting Handling:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If API responds with 429, waits for &lt;code&gt;retry_after&lt;/code&gt; seconds, and retries.&lt;/li&gt;
&lt;li&gt;Adds &lt;code&gt;setTimeout&lt;/code&gt; between requests to avoid hitting limits.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&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;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&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;retry_after&lt;/span&gt; &lt;span class="o"&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;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&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;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;continue&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;
  
  
  Badge Generation
&lt;/h3&gt;

&lt;p&gt;All routes use the &lt;code&gt;badge-maker&lt;/code&gt; package:&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;let&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeBadge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;logoBase64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`data:image/svg+xml;base64,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;discordLogoBase64&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Scaling:&lt;/strong&gt; Optional &lt;code&gt;scale&lt;/code&gt; param adjusts badge size.&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;svg&lt;/span&gt;&lt;span class="se"&gt;([^&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;?)&lt;/span&gt;&lt;span class="sr"&gt;width="&lt;/span&gt;&lt;span class="se"&gt;(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;" height="&lt;/span&gt;&lt;span class="se"&gt;(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&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="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;svg&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&amp;gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`$1&amp;lt;g transform="scale(&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)"&amp;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;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;svg&amp;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;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Error Handling:&lt;/strong&gt; If any call fails, a red "error" badge is returned.&lt;/p&gt;


&lt;h3&gt;
  
  
  Quick Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;discord-members&lt;/code&gt; = fast estimate, no intents.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;discord-bots&lt;/code&gt; &amp;amp; &lt;code&gt;discord-total&lt;/code&gt; = precise, uses member list and cache.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fetchAllMembers&lt;/code&gt; handles paging, rate limits, and caching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The setup supports scaling, CDN caching, and proper Discord rate limit compliance.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3. Create UI and Deploy.
&lt;/h2&gt;

&lt;p&gt;You can use any AI tool for creating the UI. I used V0 by Vercel. Also, for deploying my application, I used Vercel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord-live-members-count-badge.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;See it in Action&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the GitHub repository for the Source Code (liked this project? Star it 🌠)&lt;/strong&gt;:&lt;br&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/RS-labhub" rel="noopener noreferrer"&gt;
        RS-labhub
      &lt;/a&gt; / &lt;a href="https://github.com/RS-labhub/Discord-Live-Members-Count-Badge" rel="noopener noreferrer"&gt;
        Discord-Live-Members-Count-Badge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Add beautiful, real-time Discord member count badges to your GitHub README
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/RS-labhub/Discord-Live-Members-Count-Badge/master/public/og-image.png"&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%2FRS-labhub%2FDiscord-Live-Members-Count-Badge%2Fmaster%2Fpublic%2Fog-image.png" alt="banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🎯 Discord Live Members Count Badge&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Add beautiful, real-time Discord member count badges to your GitHub README&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://discord-live-members-count-badge.vercel.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f1ad8e741536392a9cc5f3af1607f02a39008eb552ccde501899c9d6948eac4a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6976652d536974652d627269676874677265656e2e737667" alt="Live Site"&gt;&lt;/a&gt;
&lt;a href="https://rohan-sharma-portfolio.vercel.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9c2042675a01a0cbaedb94325894b9cb3a2eaab934730c6238860f35b8ce572a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f7274666f6c696f2d526f68616e5f536861726d612d626c756576696f6c65742e737667" alt="Portfolio"&gt;&lt;/a&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;strong&gt;🔄 Real-time Updates&lt;/strong&gt; - Live member count with smart caching (5-minute intervals)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👥 Multiple Badge Types&lt;/strong&gt; - Total members, human-only, or bot-only counts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛡️ Safe &amp;amp; Secure&lt;/strong&gt; - Uses Discord API's &lt;code&gt;with_counts=true&lt;/code&gt; for public access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Serverless Ready&lt;/strong&gt; - Deploy to Vercel, Railway, Render, or any platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎨 Fully Customizable&lt;/strong&gt; - Custom colors, labels, and scaling options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📱 Mobile Responsive&lt;/strong&gt; - Optimized playground interface for all devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📦 Zero Config&lt;/strong&gt; - Just add your bot and start using&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Project Showcase&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Preview&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://youtu.be/jSLE3u_2vag" 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%2FRS-labhub%2FDiscord-Live-Members-Count-Badge%2Fmaster%2Fpublic%2Fthumbnail.png" alt="YouTube Demo"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🎬 &lt;strong&gt;YouTube Demo&lt;/strong&gt;&lt;br&gt;Click the image to watch the full demo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/rohan_sharma/heres-how-i-created-a-real-time-discord-badge-for-github-readme-4adg" 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%2FRS-labhub%2FDiscord-Live-Members-Count-Badge%2Fmaster%2Fpublic%2FblogCover.png" alt="Blog Post"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;📝 &lt;strong&gt;Blog Post&lt;/strong&gt;&lt;br&gt;Read the blog for in-depth explanation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Add Bot to Your Server&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;First, invite our bot to your Discord server:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://discord.com/oauth2/authorize?client_id=1388440480102092860&amp;amp;permissions=1040&amp;amp;integration_type=0&amp;amp;scope=bot" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;🤖 Add Bot to Server&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Enable Server Widget&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Go to…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/RS-labhub/Discord-Live-Members-Count-Badge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wait, wait, wait! Did you just ask for a Video Explanation?&lt;/strong&gt; I have it for you already. Check it out here:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/jSLE3u_2vag"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  [ ] PROMOTION:
&lt;/h2&gt;

&lt;p&gt;For the default badges on the website and the readme, I have used LLMWare's Discord Server with their consent. If you don't know, llmware just launched "&lt;strong&gt;Model HQ: Your Private AI Companion&lt;/strong&gt;". The interesting part is that it runs locally and without internet.&lt;/p&gt;

&lt;p&gt;Want to know more about it? Read it here&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" class="crayons-story__hidden-navigation-link"&gt;How to Run AI Models Privately on Your AI PC with Model HQ; No Cloud, No Code&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 class="crayons-logo crayons-logo--l" href="/llmware"&gt;
            &lt;img alt="LLMWare logo" 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%2Forganization%2Fprofile_image%2F8208%2F4bf5768d-460d-460b-9ccc-a80499ca040e.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/rohan_sharma" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2F1936949%2Fa1fd5434-8c99-4531-9491-2d117d2e6996.jpg" alt="rohan_sharma profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rohan_sharma" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Rohan Sharma
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Rohan Sharma
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2629400" 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="/rohan_sharma" 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%2F1936949%2Fa1fd5434-8c99-4531-9491-2d117d2e6996.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Rohan Sharma&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;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/llmware" class="crayons-story__secondary fw-medium"&gt;LLMWare&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 27 '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/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" id="article-link-2629400"&gt;
          How to Run AI Models Privately on Your AI PC with Model HQ; No Cloud, No Code
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nocode"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nocode&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/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k" 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="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;80&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/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k#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;
            5 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;


&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;In short, try this once and let me know your feedback. I don't usually say it, but save this blog for the future and star the GitHub Repository.&lt;/p&gt;

&lt;p&gt;All links in one place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord-live-members-count-badge.vercel.app/" rel="noopener noreferrer"&gt;Discord Live Members Count Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord-live-members-count-badge.vercel.app/documentation" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/RS-labhub/Discord-Live-Members-Count-Badge" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt; (&lt;strong&gt;star it&lt;/strong&gt; 🌠)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/jSLE3u_2vag" rel="noopener noreferrer"&gt;Video Explanation&lt;/a&gt; (&lt;strong&gt;like and subscribe&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want me to &lt;strong&gt;RAISE A PR for this badge on your GitHub repository&lt;/strong&gt;, then let me know in the comment section. &lt;/p&gt;

&lt;p&gt;Also, in case you want to know more about me, here's my &lt;a href="https://rohan-sharma-portfolio.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;Portfolio&lt;/strong&gt;&lt;/a&gt; (and yeah, &lt;strong&gt;try to find out the secret page&lt;/strong&gt;, it's still waiting for you.)&lt;/p&gt;

&lt;p&gt;Thanks for reading till here. You're awesomeeeeeeeeeee. Here's a hug from me 🫂. Keep growing. You're the best. 🫀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>How to Run AI Models Privately on Your AI PC with Model HQ; No Cloud, No Code</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Fri, 27 Jun 2025 04:20:58 +0000</pubDate>
      <link>https://dev.to/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k</link>
      <guid>https://dev.to/llmware/how-to-run-ai-models-privately-on-your-ai-pc-with-model-hq-no-cloud-no-code-3o9k</guid>
      <description>&lt;p&gt;In an era where efficiency and data privacy are paramount, &lt;strong&gt;Model HQ by&lt;/strong&gt; &lt;a href="https://llmware.ai" rel="noopener noreferrer"&gt;&lt;strong&gt;LLMWare&lt;/strong&gt;&lt;/a&gt; emerges as a game-changer for professionals and enthusiasts alike. Built by LLMWare, Model HQ is a groundbreaking desktop application that transforms your own PC or laptop into a fully private, high-performance AI workstation.&lt;/p&gt;

&lt;p&gt;Most AI tools rely on the cloud. &lt;strong&gt;Model HQ&lt;/strong&gt; doesn’t.&lt;/p&gt;

&lt;p&gt;No more cloud latency. No more vendor lock-in. Just &lt;strong&gt;100+ cutting-edge AI models&lt;/strong&gt;, blazing fast document search, and natural language tools; all running &lt;strong&gt;locally&lt;/strong&gt; on your machine.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What is Model HQ?
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;Model HQ&lt;/strong&gt; is a powerful, no-code desktop application that enables users to run enterprise-grade AI workflows &lt;strong&gt;locally&lt;/strong&gt;, &lt;strong&gt;securely&lt;/strong&gt;, and &lt;strong&gt;at scale,&lt;/strong&gt; right from their own PC or laptop. Designed for simplicity and performance, it provides point-and-click access to &lt;strong&gt;100+ state-of-the-art AI models&lt;/strong&gt;, ranging from &lt;strong&gt;1B to 32B parameters&lt;/strong&gt;, with built-in optimization for AI PCs and Intel hardware. Whether you’re building AI applications, analyzing documents, or querying data, Model HQ automatically adapts to your device’s specs to ensure &lt;strong&gt;fast, efficient inferencing,&lt;/strong&gt; even for large models that traditionally struggle on standard formats.&lt;/p&gt;

&lt;p&gt;What truly sets Model HQ apart is its &lt;strong&gt;privacy-first, offline capability&lt;/strong&gt;. Once models are downloaded, they can be used without Wi-Fi, keeping &lt;strong&gt;your data and sensitive information 100% on-device&lt;/strong&gt;. This makes it the fastest and most secure way to explore and deploy powerful AI tools without depending on the cloud or external APIs. From developers and researchers to enterprise teams, Model HQ delivers a &lt;strong&gt;seamless, cost-effective, and private AI experience&lt;/strong&gt;; all in one sleek, local platform.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What Model HQ can do?
&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%2Febpj6vk0qze2o2myp8qu.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%2Febpj6vk0qze2o2myp8qu.png" alt="model hq"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Chat:&lt;/strong&gt;&lt;br&gt;
The Chat feature allows users a fast way to start experimenting with chat models of various sizes, from Small (1–3 billion parameters), Medium (7–8 billion parameters) to Large (9 and above, up to 32 billion parameters).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Small Model&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
~1–3 billion parameters — Fastest response time, suitable for basic chat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Medium Model&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
~7–8 billion parameters — Balanced performance, ideal for chat, data analysis and standard RAG tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Large Model&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
~9 up to 32 billion parameters — Most powerful chat, RAG, and best for advanced and complex analytical workloads.   &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://youtu.be/6z3kyUpsGys?si=4kYvkPEBUJN81nT6" rel="noopener noreferrer"&gt;Watch Chat in Action&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;2. Agents&lt;/strong&gt;&lt;br&gt;
Agents in Model HQ are pre-configured or custom-built workflows that automate complex tasks using local AI models. They allow users to process files, extract insights, or perform multi-step operations; &lt;strong&gt;all with point-and-click simplicity&lt;/strong&gt; and no coding required.&lt;/p&gt;

&lt;p&gt;Users can &lt;strong&gt;build new agents from scratch&lt;/strong&gt;, &lt;strong&gt;load existing ones&lt;/strong&gt; (either from built-in templates or previously created workflows), and manage them through a simple dropdown interface. From editing or deleting agents to running &lt;strong&gt;batch operations&lt;/strong&gt; on multiple documents, the Agent system provides a flexible way to scale private, on-device AI workflows. Pre-created agents include powerful tools like &lt;strong&gt;Contract Analyzer&lt;/strong&gt;, &lt;strong&gt;Customer Support Bot&lt;/strong&gt;, &lt;strong&gt;Financial Data Extractor&lt;/strong&gt;, &lt;strong&gt;Image Tagger&lt;/strong&gt;, and more — each designed to handle specific tasks efficiently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/UTNQxspDi3I?si=yOaPilNSEqY1xLFy" rel="noopener noreferrer"&gt;Watch Agents in Action&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;3. Bots&lt;/strong&gt;&lt;br&gt;
The Bots feature allows users to create their own custom Chat and RAG bots seamlessly for either the AI PC/edge device use case (Fast Start Chatbot and Model HQ Biz Bot) or via API deployment (Model HQ API Server Biz Bot).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/uy53WKrMOXc?si=TAaS_hYj0AddXu2R" rel="noopener noreferrer"&gt;Watch Bots in Action&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;4. RAG&lt;/strong&gt;&lt;br&gt;
RAG combines retrieval-based techniques with generative AI to allow models to answer questions more accurately by retrieving relevant information from external sources or documents. With RAG in Model HQ, you can create knowledge bases that you can query in the chat section or via a custom bot by uploading documents. The RAG section is used only to create the knowledge base.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/FSjpAgIZnPM?si=5kMR_sXH_pCyNLvg" rel="noopener noreferrer"&gt;Watch Rag in Action&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;5. Models&lt;/strong&gt;&lt;br&gt;
The Models section allows you to explore, manage, and test models within Model HQ. You can discover new models, manage downloaded models, review inference history, and run benchmark tests; all from a single interface.&lt;/p&gt;

&lt;p&gt;And this all can be done, while keeping your &lt;strong&gt;data private, your workflows offline, and your AI performance fully optimized for your device&lt;/strong&gt; — no internet, no cloud, and no compromise. With its powerful features and user-friendly interface, Model HQ empowers you to leverage AI technology without compromising on security. Experience the future of AI today and transform the way you work!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  System Requirements
&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%2F1nqbehtpmqis291asyjc.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%2F1nqbehtpmqis291asyjc.png" alt="sys_req"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  Experience Model HQ Risk-Free
&lt;/h3&gt;

&lt;p&gt;We understand that trying new software can be a leap of faith. That’s why we’re offering a &lt;a href="https://llmware.ai/enterprise#developers-waitlist" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;90-day free trial for developers&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;. Experience the full capabilities of Model HQ without any commitment. Sign up for the trial here and discover how it can transform your workflow.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  A Powerful Collaboration with Intel
&lt;/h3&gt;

&lt;p&gt;LLMWare.ai has partnered with Intel to optimize Model HQ for peak performance on your devices. This collaboration ensures that you receive a reliable and efficient AI experience, making your tasks smoother and more productive. Learn more about this exciting partnership &lt;a href="https://llmware.ai/intel" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read the Intel Solution Brief here:&lt;br&gt;
&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://www.intel.com/content/www/us/en/content-details/854280/local-ai-no-code-more-secure-with-ai-pcs-and-the-private-cloud.html" 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%2Fwww.intel.com%2Fetc.clientlibs%2Fsettings%2Fwcm%2Fdesigns%2Fintel%2Fus%2Fen%2Fimages%2Fresources%2Fprintlogo.png" height="auto" class="m-0"&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://www.intel.com/content/www/us/en/content-details/854280/local-ai-no-code-more-secure-with-ai-pcs-and-the-private-cloud.html" rel="noopener noreferrer" class="c-link"&gt;
            Local AI—No Code, More Secure with AI PCs and the Private Cloud
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Bring secure, no-code GenAI to your enterprise with Intel® AI PCs and LLMWare’s Model HQ—run agents and RAG queries locally without exposing data or incurring cloud costs.
In this brief, learn how to scale private AI simply and affordably.
          &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%2Fwww.intel.com%2Fetc.clientlibs%2Fsettings%2Fwcm%2Fdesigns%2Fintel%2Fdefault%2Fresources%2Ffavicon-32x32.png"&gt;
          intel.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Take the Next Step Towards AI Empowerment
&lt;/h3&gt;

&lt;p&gt;Don’t miss the chance to elevate your productivity with Model HQ. Whether you’re a business professional, a developer, or a student, this application is designed to meet your needs and exceed your expectations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://llmware-modelhq.checkoutpage.com/modelhq-client-app-for-windows" rel="noopener noreferrer"&gt;&lt;strong&gt;Purchase Model HQ Today!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ready to unlock the full potential of AI on your PC or laptop? Buy Model HQ now by clicking here and take the first step towards a smarter, more efficient future.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Learn More About Model HQ
&lt;/h3&gt;

&lt;p&gt;For additional information about Model HQ, including detailed features and user guides, &lt;a href="https://llmware.ai" rel="noopener noreferrer"&gt;&lt;em&gt;visit our website&lt;/em&gt;&lt;/a&gt;. Don’t forget to check out our introductory video and explore our &lt;a href="https://youtube.com/playlist?list=PL1-dn33KwsmBiKZDobr9QT-4xI8bNJvIU&amp;amp;si=dLdhu0kMQWwgBwTE" rel="noopener noreferrer"&gt;&lt;em&gt;YouTube playlist&lt;/em&gt;&lt;/a&gt; for tutorials and tips.&lt;/p&gt;

&lt;p&gt;Join the &lt;a href="https://discord.gg/bphreFK4NJ" rel="noopener noreferrer"&gt;&lt;em&gt;LLMWare’s official Discord Server&lt;/em&gt;&lt;/a&gt; to interact with LLMWare's great community of users and if you have any questions or feedback.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Model HQ&lt;/strong&gt; isn’t just another AI app, it’s a complete, offline-first platform built for &lt;strong&gt;speed, privacy, and control&lt;/strong&gt;. Whether you’re chatting with LLMs, building agents, analyzing documents, or deploying custom bots, everything runs &lt;strong&gt;securely on your own PC or laptop&lt;/strong&gt;. With support for models up to &lt;strong&gt;32B parameters&lt;/strong&gt;, RAG-enabled document search, natural language SQL, and no-code workflows, Model HQ brings enterprise-grade AI directly to your desktop, no cloud required.&lt;/p&gt;

&lt;p&gt;As the world moves toward AI-powered productivity, Model HQ ensures you’re ahead of the curve with a faster, safer, and smarter way to work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>nocode</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Creating a Chatbot from Scratch and Vibe Coding the UI💃</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Sat, 21 Jun 2025 08:27:35 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/creating-a-chatbot-from-scratch-and-vibe-coding-the-ui-1bij</link>
      <guid>https://dev.to/rohan_sharma/creating-a-chatbot-from-scratch-and-vibe-coding-the-ui-1bij</guid>
      <description>&lt;p&gt;Hey all,&lt;/p&gt;

&lt;p&gt;I hope you remember me. (Yes?? LMK in the comment section.)&lt;/p&gt;

&lt;p&gt;In this blog, I will discuss Radhika: Adaptive Reasoning &amp;amp; Intelligence Assistant. It provides specialized assistance across six distinct modes: General, Productivity, Wellness, Learning, Creative, and BFF.&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://radhika-sharma.vercel.app/" 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/http%3A%2F%2Fradhika-sharma.vercel.app%2Fog-image.png" height="auto" class="m-0"&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://radhika-sharma.vercel.app/" rel="noopener noreferrer" class="c-link"&gt;
            Radhika
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Radhika is a versatile AI chatbot designed to assist with a wide range of tasks, from answering questions to providing recommendations and engaging in casual conversation.
          &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%2Fradhika-sharma.vercel.app%2Ffavicon.ico"&gt;
          radhika-sharma.vercel.app
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;(try it out, give feedback and suggestions, request changes)&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: Next.js 14 with App Router and React 18&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS with custom design system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Components&lt;/strong&gt;: shadcn/ui component library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt;: Lucide React icon library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3D Graphics&lt;/strong&gt;: Three.js for particle visualizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animations&lt;/strong&gt;: CSS transitions and keyframe animations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI &amp;amp; Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Vercel AI SDK for unified LLM access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Providers&lt;/strong&gt;: Groq, Google Gemini, OpenAI, Claude&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech&lt;/strong&gt;: WebKit Speech Recognition and Synthesis APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Browser localStorage for chat persistence and settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: Next.js API routes for secure LLM communication&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt;: TypeScript for type safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt;: Next.js build system with optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Vercel-ready with environment variable support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Optimized bundle splitting and lazy loading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Implementing Main Logic
&lt;/h2&gt;

&lt;p&gt;This section breaks down how the &lt;a href="https://github.com/RS-labhub/Radhika/blob/master/app/api/chat/route.ts" rel="noopener noreferrer"&gt;&lt;code&gt;app/api/chat/route.ts&lt;/code&gt;&lt;/a&gt; endpoint processes requests, selects models, applies system prompts, and streams responses using different AI providers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Parse Request
&lt;/h3&gt;

&lt;p&gt;The request handler begins by parsing the JSON body from the incoming POST request:&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;body&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;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;general&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;groq&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/strong&gt;: The conversation history sent by the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/strong&gt;: Determines which system prompt to use (e.g., &lt;code&gt;bff&lt;/code&gt;, &lt;code&gt;learning&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/strong&gt;: Specifies the AI backend to use (&lt;code&gt;groq&lt;/code&gt;, &lt;code&gt;openai&lt;/code&gt;, &lt;code&gt;claude&lt;/code&gt;, &lt;code&gt;gemini&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;apiKey&lt;/code&gt;&lt;/strong&gt;: Required for OpenAI and Claude if a user key is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code also validates whether the &lt;code&gt;messages&lt;/code&gt; array exists and is non-empty.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Assign System Prompt
&lt;/h3&gt;

&lt;p&gt;Based on the selected mode, a system prompt is selected to guide the assistant's personality and purpose:&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;systemPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SYSTEM_PROMPTS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;SYSTEM_PROMPTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;general&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Examples of modes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;productivity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;creative&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wellness&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Route to the Correct Provider
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;provider&lt;/code&gt; field determines which AI model backend to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; (&lt;code&gt;google&lt;/code&gt;): Uses Google's Gemini 2.0 model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt;: Uses GPT models (like &lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-3.5-turbo&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt;: Uses Anthropic models (like &lt;code&gt;claude-3-sonnet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq&lt;/strong&gt;: Defaults to models like &lt;code&gt;llama-3&lt;/code&gt; and &lt;code&gt;qwen&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each provider has custom logic to instantiate the model, handle errors, and stream the response using:&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;await&lt;/span&gt; &lt;span class="nf"&gt;streamText&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4. Model Selection (Groq Only)
&lt;/h3&gt;

&lt;p&gt;If the provider is &lt;code&gt;groq&lt;/code&gt;, model selection is dynamic. It analyzes the last message to determine the type of task:&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lastMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;analyze&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;lastMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;plan&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="nx"&gt;modelType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reasoning&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="k"&gt;else&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;lastMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;creative&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;lastMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;design&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="nx"&gt;modelType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;creative&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;modelType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fast&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;RADHIKA automatically selects the best model based on your query complexity:&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;// Determine which model to use based on conversation context&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;modelType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fast&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// llama-3.1-8b-instant for quick responses&lt;/span&gt;

&lt;span class="c1"&gt;// Use reasoning model for complex analytical tasks&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;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;analyze&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="s2"&gt;compare&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="s2"&gt;plan&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="s2"&gt;strategy&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="s2"&gt;decision&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="s2"&gt;problem&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="nx"&gt;modelType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reasoning&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// llama-3.3-70b-versatile&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Use creative model for artistic and innovative tasks&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;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;creative&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="s2"&gt;brainstorm&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="s2"&gt;idea&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="s2"&gt;write&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="s2"&gt;design&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="s2"&gt;story&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="nx"&gt;modelType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;creative&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// qwen/qwen3-32b&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;Model Configuration&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Customize model selection in the API route:&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;MODELS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;groq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama-3.1-8b-instant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama-3.3-70b-versatile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;creative&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;qwen/qwen3-32b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;gemini&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-2.0-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;claude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-3-5-sonnet-20241022&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then the appropriate model (&lt;code&gt;reasoning&lt;/code&gt;, &lt;code&gt;creative&lt;/code&gt;, or &lt;code&gt;fast&lt;/code&gt;) is selected and used for the response.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  📄 Multi-Provider Flow
&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%2Fhrcjqqlrevlqhvqh0l63.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%2Fhrcjqqlrevlqhvqh0l63.png" alt="diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach allows a single API route to serve multiple model providers and assistant personalities while maintaining clean, scalable logic.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;If you're interested in knowing about the other logics like voice recognition and speech synthesis, light/dark mode, etc,. then please go over the github repo:&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/RS-labhub" rel="noopener noreferrer"&gt;
        RS-labhub
      &lt;/a&gt; / &lt;a href="https://github.com/RS-labhub/Radhika" rel="noopener noreferrer"&gt;
        Radhika
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Radhika is a multi-model AI assistant built for your mood and friendship 💞
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/RS-labhub/Radhika/master/public/banner.png"&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%2FRS-labhub%2FRadhika%2Fmaster%2Fpublic%2Fbanner.png" alt="banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Radhika&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A modern AI assistant that adapts to how you work and think. Multiple modes, multiple models, one seamless chat experience. Features multiple LLM providers, image generation, voice interaction, and persistent chat history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try now&lt;/strong&gt;: &lt;a href="https://radhika-sharma.vercel.app" rel="nofollow noopener noreferrer"&gt;https://radhika-sharma.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Detailed Explanation&lt;/h2&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;Preview&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Description&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://dev.to/rohan_sharma/creating-a-chatbot-that-actually-stands-out-vibe-coded-version-draft-1ake" 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%2FRS-labhub%2FRadhika%2Fmaster%2Fpublic%2Fcover-image.png" alt="Blog Post"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Blog Post&lt;/strong&gt;&lt;br&gt;Read the blog for in-depth explanation.&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://radhika-sharma.vercel.app" 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%2FRS-labhub%2FRadhika%2Fmaster%2Fpublic%2Fyoutube-thumbnail.png" alt="YouTube Demo"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;YouTube Demo&lt;/strong&gt;&lt;br&gt;Coming soon.&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;strong&gt;6 Chat Modes&lt;/strong&gt;: General, Productivity, Wellness, Learning, Creative, BFF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Provider LLM&lt;/strong&gt;: Groq, Gemini, OpenAI, Claude&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Generation&lt;/strong&gt;: Pollinations, DALL·E 3, Hugging Face, Free alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice&lt;/strong&gt;: Speech-to-text input &amp;amp; text-to-speech output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth &amp;amp; Persistence&lt;/strong&gt;: Appwrite auth with chat history &amp;amp; favorites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI&lt;/strong&gt;: Light/dark themes, modern &amp;amp; pixel UI styles&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&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/RS-labhub/radhika.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; radhika
bun install   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or npm install&lt;/span&gt;
bun run dev   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or npm run dev&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open: &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;MIT License - see &lt;a href="https://github.com/RS-labhub/Radhika/LICENSE" rel="noopener noreferrer"&gt;LICENSE&lt;/a&gt;&lt;/p&gt;




&lt;div&gt;
&lt;p&gt;&lt;strong&gt;Built with ❤️ by &lt;a href="https://github.com/RS-labhub" rel="noopener noreferrer"&gt;Rohan Sharma&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/RS-labhub/Radhika/public/Author.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FRS-labhub%2FRadhika%2Fpublic%2FAuthor.jpg" alt="author"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/RS-labhub/radhika" rel="noopener noreferrer"&gt;⭐ Star&lt;/a&gt; • &lt;a href="https://github.com/RS-labhub/radhika/issues" rel="noopener noreferrer"&gt;🐛 Issues&lt;/a&gt; • &lt;a href="https://github.com/RS-labhub/radhika/discussions" rel="noopener noreferrer"&gt;🗣️&lt;/a&gt;…&lt;/p&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/RS-labhub/Radhika" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Vibe Coding the UI
&lt;/h2&gt;

&lt;p&gt;When you have successfully implemented the main logic of your application, use the AI tools like v0, lovable, or bolt to create an interface according to your "thoughts".&lt;/p&gt;

&lt;p&gt;I used v0 and ChatGPT. Prompting... Prompting... and never-ending prompting... Check out the video below to see a simple, short explanation of this project with features. However, you still have &lt;strong&gt;&lt;a href="https://radhika-sharma.vercel.app/" rel="noopener noreferrer"&gt;live access&lt;/a&gt;&lt;/strong&gt; to it!&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;If you like it, then please star the repo 🌠 and follow me on GH.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Key Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;Multi-Modal AI&lt;/strong&gt; - Six specialized assistant personalities in one app
&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Multi-Provider Support&lt;/strong&gt; - Groq, Gemini, OpenAI, and Claude integration
&lt;/li&gt;
&lt;li&gt;🎤 &lt;strong&gt;Advanced Voice&lt;/strong&gt; - Speech-to-text input and text-to-speech output
&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Dynamic 3D Visuals&lt;/strong&gt; - Interactive particle system with mode-based colors
&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Smart Persistence&lt;/strong&gt; - Automatic chat history saving per mode
&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Quick Actions&lt;/strong&gt; - One-click access to common tasks per mode
&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Real-time Analytics&lt;/strong&gt; - Live usage statistics and AI activity monitoring
&lt;/li&gt;
&lt;li&gt;🌙 &lt;strong&gt;Beautiful UI&lt;/strong&gt; - Responsive design with dark/light themes
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Modes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Productivity&lt;/strong&gt;: Task planning, project management, time optimization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wellness&lt;/strong&gt;: Health guidance, fitness routines, mental well-being support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning&lt;/strong&gt;: Educational assistance, study plans, skill development
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creative&lt;/strong&gt;: Brainstorming, content creation, artistic inspiration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General&lt;/strong&gt;: Problem-solving, decision-making, everyday conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BFF&lt;/strong&gt;: Emotional support, casual chats, GenZ-friendly interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for users who need a versatile AI assistant that adapts to different contexts, maintains conversation history across specialized domains, and provides an engaging visual experience with advanced voice capabilities.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;Radhika is a sophisticated AI-powered assistant built with Next.js and powered by multiple LLM providers including Groq, Gemini, OpenAI, and Claude. RADHIKA adapts to different modes of interaction, providing specialized assistance for productivity, wellness, learning, creative tasks, and even acts as your GenZ bestie!&lt;/p&gt;

&lt;p&gt;I personally suggest you try the "&lt;strong&gt;BFF&lt;/strong&gt;" mode. You will like it for sure.&lt;/p&gt;

&lt;p&gt;Once again, here are the links you don't want to miss out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://radhika-sharma.vercel.app/" rel="noopener noreferrer"&gt;https://radhika-sharma.vercel.app/&lt;/a&gt; (added modern/pixel UI options)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Github Repo&lt;/strong&gt;: &lt;a href="https://github.com/RS-labhub/Radhika" rel="noopener noreferrer"&gt;https://github.com/RS-labhub/Radhika&lt;/a&gt; (Give it a star 🌠)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Youtube Demo&lt;/strong&gt;: &lt;a href="https://www.youtube.com/watch?v=2FW6IJeOkzI" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=2FW6IJeOkzI&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading. You're wonderful. And I mean it. Ba-bye, see you in the next blog. (and PLEASE SPAM THE COMMENT SECTION AS ALWAYS)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vibecoding</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Find My Portfolio’s Secret Page; If You Can 🤫</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Fri, 13 Jun 2025 11:15:03 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/find-my-portfolios-secret-page-if-you-can-25j1</link>
      <guid>https://dev.to/rohan_sharma/find-my-portfolios-secret-page-if-you-can-25j1</guid>
      <description>&lt;p&gt;Did you miss me? I guess, yeah, you did. Sorry for that. I was so busy with my DevRel work at llmware. (not flaunting)&lt;/p&gt;

&lt;p&gt;Btw, finally I'm able to complete my portfolio website. And this is what I wanted to share with my dev.to fam.&lt;/p&gt;

&lt;p&gt;Thanks to AI tools that accelerated the process. Vibe coding is not that bad; it saves a lot of time.&lt;/p&gt;

&lt;p&gt;So, let's start this super mini blog.&lt;/p&gt;

&lt;p&gt;3... 2... 1... 🟢&lt;/p&gt;

&lt;h2&gt;
  
  
  Welcome to &lt;code&gt;RS PORTFOLIO&lt;/code&gt; 👋
&lt;/h2&gt;

&lt;p&gt;First of all, don't expect too much. It's just a normal portfolio. &lt;strong&gt;IS IT?&lt;/strong&gt; Who knows.&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%2Fw4d0bnmhw7epcyw0te0r.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%2Fw4d0bnmhw7epcyw0te0r.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Before discussing more about it, let me tell you the tech stack I have used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NextJs (frontend and backend)&lt;/li&gt;
&lt;li&gt;Radix UI (UI Enhancements)&lt;/li&gt;
&lt;li&gt;FormSpree (for creating free unlimited forms)&lt;/li&gt;
&lt;li&gt;Vercel (hosting)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And boom! These resources were enough to create a good-looking portfolio. Actually, my portfolio DP is the main reason for the clean UI. 🙂 (please say "yes")&lt;/p&gt;

&lt;p&gt;Btw, it's responsive also. BUT I SUGGEST YOU TAKE A LOOK AT A BIGGER SCREEN. Mobile view is not that great. (Of course, I'm NOT going to work on this again)&lt;/p&gt;

&lt;p&gt; &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://rohansrma.vercel.app/" 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%2Frohansrma.vercel.app%2Fog-image.jpg" height="auto" class="m-0"&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://rohansrma.vercel.app/" rel="noopener noreferrer" class="c-link"&gt;
            Rohan Sharma - Software Developer, Professional Blog Writer and UI/UX Designer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Explore the portfolio of Rohan Sharma, featuring cutting-edge software projects, insightful blogs, and creative UI/UX work.
          &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%2Frohansrma.vercel.app%2Ffavicon.ico"&gt;
          rohansrma.vercel.app
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What makes my PORTFOLIO UNIQUE?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Simple and Professional UI?&lt;/li&gt;
&lt;li&gt;Easy navigation?&lt;/li&gt;
&lt;li&gt;Adding "not available for work" label in the experience page?&lt;/li&gt;
&lt;li&gt;Printing Resume?&lt;/li&gt;
&lt;li&gt;SECRET BUTTON?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every portfolio is unique, and I can't judge them. (btw, I always judge them, an in-built feature)&lt;/p&gt;

&lt;p&gt;My portfolio is also like other portfolio/. You can judge it as well. I tried to &lt;strong&gt;WRITE AS MANY FAKE THINGS AND SHOWCASE FAKE EXPERTISE AS POSSIBLE&lt;/strong&gt;. What do you mean, everyone does it? 😂&lt;/p&gt;

&lt;p&gt;I don't want to emphasize more on the &lt;strong&gt;&lt;code&gt;SECRET BUTTON&lt;/code&gt;&lt;/strong&gt;. Because it is very unprofessional. But those who know me personally must have expected something like this from me. So, I have to stand on their beliefs.&lt;/p&gt;

&lt;p&gt;I, particularly, &lt;strong&gt;WANT YOU TO TAKE A LOOK AT MY PORTFOLIO, EXPLORE EVERY SECTION, AND GIVE ME FEEDBACK&lt;/strong&gt;. (Feedback is important, you know. Doesn't matter whether I will implement them or not. Even if I'm implementing then, I can't say about the timespan. It may take decades.)&lt;/p&gt;

&lt;p&gt;If you're a dark mode lover, I have added a dark mode functionality. TOTALLY AI DEPENDENT to implement this feature. I don't want to spend much time on color change.&lt;/p&gt;

&lt;p&gt;I mostly used chatGPT for bug fixes (those F*** hydration errors) and v0 to amplify building and improved UI/.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  The Mystery of SECRET BUTTON
&lt;/h2&gt;

&lt;p&gt;Again, before starting, I want to say, "Please don't go for it. It's just a random off-topic, unprofessional button, and made for fun".&lt;/p&gt;

&lt;p&gt;The secret button, as the name suggests, is very secret and so hidden. There's only one point to access that button. Yes, A SINGLE POINT.&lt;/p&gt;

&lt;p&gt;It can be present anywhere and in any section. If you want to see it, then you have to &lt;strong&gt;FIND IT BY YOURSELF&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;secret page&lt;/code&gt; consists of nothing but my personal space, where I'm trying to change my relationship status from SINGLE TO BEING MINGLE. It's boring as there are long essays and boring paragraphs. &lt;strong&gt;NOT DEVELOPER FRIENDLY&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A little glance of the &lt;code&gt;secret page&lt;/code&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%2F7fxd0l6b1591oxmh8etd.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%2F7fxd0l6b1591oxmh8etd.png" alt="secret page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What?? C'mon, I already told "A LITTLE". &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Jokes Apart, Time to Conclude
&lt;/h2&gt;

&lt;p&gt;Sorry for a short and promotional blog. I just wanted to share this with you guys. &lt;/p&gt;

&lt;p&gt;Upcoming blog, going to be very cool. And you'll like it for sure!&lt;/p&gt;

&lt;p&gt;Sharing again the Portfolio link: &lt;a href="https://rohan-sharma-portfolio.vercel.app/" rel="noopener noreferrer"&gt;https://rohan-sharma-portfolio.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you liked my portfolio, then comment. &lt;/li&gt;
&lt;li&gt;If you found any bugs, then comment.&lt;/li&gt;
&lt;li&gt;If you have any feedback, then comment.&lt;/li&gt;
&lt;li&gt;If you want me to build an MCP (of your choice), then comment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading and your support. You're the best. Keep loving me!&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>webdev</category>
      <category>vibecoding</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Access Granted!! Here's the recipe behind my AI DMS 🤞</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Sun, 04 May 2025 08:23:49 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/access-granted-heres-the-recipe-behind-my-ai-dms-351b</link>
      <guid>https://dev.to/rohan_sharma/access-granted-heres-the-recipe-behind-my-ai-dms-351b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/permit_io"&gt;Permit.io Authorization Challenge&lt;/a&gt;: AI Access Control&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Hey there,&lt;br&gt;
Welcome back! This is my &lt;strong&gt;2nd entry&lt;/strong&gt; for the Permit.io Authorization Challenge. (If you want to see the 1st one, here's the link: &lt;a href="https://dev.to/rohan_sharma/access-control-handled-heres-how-i-built-my-dms-212"&gt;https://dev.to/rohan_sharma/access-control-handled-heres-how-i-built-my-dms-212&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This project is not different than the last one. It's still a document management system, but it now has more powerful features and configurations.//..&lt;/p&gt;

&lt;p&gt;Welcome to &lt;strong&gt;Radhika's AI DocManager&lt;/strong&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%2Fubhjtb7j1f8qruwmffep.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%2Fubhjtb7j1f8qruwmffep.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Radhika's AI DocManager&lt;/strong&gt; is still a DMS, but now it's come with the power of AI, new settings and configurations, modern UI (best dark mode), and powerful features. Test it on your local machine now!!! 👾&lt;/p&gt;

&lt;p&gt;This project demonstrates how to implement fine-grained authorization for both users and AI agents in a Next.js application using Permit.io. It's a document management system where users can create, view, edit, and delete documents based on their roles and document ownership, and AI agents can assist with document management based on their assigned permissions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1️⃣ User Authorization
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role-Based Access Control (RBAC)&lt;/strong&gt;: Different roles (Admin, Editor, Viewer) have different permissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribute-Based Access Control (ABAC)&lt;/strong&gt;: Document owners have special privileges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-Grained Authorization&lt;/strong&gt;: Using Permit.io to implement complex authorization rules&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2️⃣ AI Authorization
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent Roles&lt;/strong&gt;: Define different AI agent roles with specific capabilities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission Levels&lt;/strong&gt;: Configure what AI agents can access and modify

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No Access&lt;/strong&gt;: AI agent cannot access the resource at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read Only&lt;/strong&gt;: AI agent can only read but not modify resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggest Only&lt;/strong&gt;: AI can suggest changes that require human approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Access&lt;/strong&gt;: AI has full access to read and modify resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval Workflows&lt;/strong&gt;: Require human approval for sensitive AI operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit and Monitoring&lt;/strong&gt;: Track all AI actions and approvals&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  3️⃣ Document Intelligence
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Document Analysis&lt;/strong&gt;: AI-powered analysis of document content and structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Summarization&lt;/strong&gt;: Generate concise summaries of documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Improvement&lt;/strong&gt;: AI suggestions for improving document content&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;h2&gt;
  
  
  Project Repo
&lt;/h2&gt;

&lt;p&gt;Github Repo: &lt;strong&gt;&lt;a href="https://github.com/RS-labhub/AI-DocManager" rel="noopener noreferrer"&gt;https://github.com/RS-labhub/AI-DocManager&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Documentation: &lt;strong&gt;&lt;a href="https://rs-labhub.github.io/AI-DocManager/" rel="noopener noreferrer"&gt;https://rs-labhub.github.io/AI-DocManager/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey
&lt;/h2&gt;

&lt;p&gt;As said in the last blog, it was quite difficult to create a DMS or document management system, as there are so many brainstorming behind this.&lt;/p&gt;

&lt;p&gt;Anyway, thanks to &lt;a href="https://www.permit.io/" rel="noopener noreferrer"&gt;Permit.io&lt;/a&gt; for saving a lot of my time while creating policies. It's easy to use and enough to say goodbye to the old methods where we die while writing the code.&lt;/p&gt;

&lt;p&gt;I used Permit.io to achieve these things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role-Based Access Control or RBAC&lt;/li&gt;
&lt;li&gt;Attribute-Based Access Control or ABAC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, implemented the roles the AI should have. Here's both RBAC and ABAC are used. I used &lt;a href="https://console.groq.com" rel="noopener noreferrer"&gt;GROQ Cloud&lt;/a&gt; for fast LLM inference and OpenAI compatibility.&lt;/p&gt;

&lt;p&gt;Overall, it was a fun experience building this project, and I enjoyed building it.&lt;/p&gt;

&lt;p&gt;If you want to see the whole implementation of the Permit.io, please read the project &lt;a href="https://github.com/RS-labhub/AI-DocManager/blob/main/README.md" rel="noopener noreferrer"&gt;Readme&lt;/a&gt; file!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Authorization for AI Applications with Permit.io
&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%2F07ghtyw8i6pe7v38m20d.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%2F07ghtyw8i6pe7v38m20d.png" alt="landing page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Authorization Model
&lt;/h3&gt;

&lt;h4&gt;
  
  
  User Authorization
&lt;/h4&gt;

&lt;p&gt;The application implements the following user authorization model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admin&lt;/strong&gt;: Can create, view, edit, and delete any document, and access the admin panel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor&lt;/strong&gt;: Can create, view, and edit documents, but can only delete their own documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viewer&lt;/strong&gt;: Can only view documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, document owners have full control over their own documents regardless of their role.&lt;/p&gt;

&lt;h4&gt;
  
  
  AI Authorization
&lt;/h4&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%2F25tfd48745mi2k6nchhb.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%2F25tfd48745mi2k6nchhb.png" alt="ai authz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application implements the following AI authorization model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI Agent Roles&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assistant&lt;/strong&gt;: Helps with document organization and basic tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor&lt;/strong&gt;: Can edit and improve document content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyzer&lt;/strong&gt;: Analyzes document content and provides insights&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;AI Capabilities&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;read_documents&lt;/strong&gt;: Ability to read document content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;suggest_edits&lt;/strong&gt;: Ability to suggest edits to documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;edit_documents&lt;/strong&gt;: Ability to directly edit documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;create_documents&lt;/strong&gt;: Ability to create new documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;delete_documents&lt;/strong&gt;: Ability to delete documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;analyze_content&lt;/strong&gt;: Ability to analyze document content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;summarize_content&lt;/strong&gt;: Ability to summarize documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;translate_content&lt;/strong&gt;: Ability to translate documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;generate_content&lt;/strong&gt;: Ability to generate new content&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Permission Levels&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NO_ACCESS&lt;/strong&gt;: AI agent cannot access the resource at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;READ_ONLY&lt;/strong&gt;: AI agent can only read but not modify resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SUGGEST_ONLY&lt;/strong&gt;: AI can suggest changes that require human approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FULL_ACCESS&lt;/strong&gt;: AI has full access to read and modify resources&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation Details
&lt;/h3&gt;

&lt;h4&gt;
  
  
  AI Authorization Implementation
&lt;/h4&gt;

&lt;p&gt;The application implements AI authorization through several key components:&lt;/p&gt;

&lt;h5&gt;
  
  
  1. AI Agent Management
&lt;/h5&gt;

&lt;p&gt;The &lt;code&gt;AIAgent&lt;/code&gt; interface defines the structure of AI agents:&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AIAgent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AIAgentRole&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AICapability&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;createdBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;Administrators can manage AI agents through the admin panel, defining their roles and capabilities.&lt;/p&gt;

&lt;h5&gt;
  
  
  2. Permission Levels
&lt;/h5&gt;

&lt;p&gt;The &lt;code&gt;AIPermissionLevel&lt;/code&gt; enum defines the different levels of access that AI agents can have:&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="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;AIPermissionLevel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;NO_ACCESS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no_access&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;READ_ONLY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read_only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;SUGGEST_ONLY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;suggest_only&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;FULL_ACCESS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;full_access&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  3. AI Actions
&lt;/h5&gt;

&lt;p&gt;The &lt;code&gt;AIAction&lt;/code&gt; interface defines the structure of actions that AI agents can perform:&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AIAction&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;actionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AIActionStatus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;requestedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completedAt&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;requestedBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;approvedBy&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;rejectedBy&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&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;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;any&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;h5&gt;
  
  
  4. Permission Checking
&lt;/h5&gt;

&lt;p&gt;The &lt;code&gt;checkAIPermission&lt;/code&gt; function checks if an AI agent has permission to perform an action:&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;function&lt;/span&gt; &lt;span class="nf"&gt;checkAIPermission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;permitted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;requiresApproval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;permissionLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AIPermissionLevel&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="c1"&gt;// Implementation details...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  5. Approval Workflow
&lt;/h5&gt;

&lt;p&gt;The application implements an approval workflow for AI actions that require human oversight:&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;requestAIAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;actionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;documentTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;documentContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&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;&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;action&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;AIAction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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="c1"&gt;// Implementation details...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&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;approveAIAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;actionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;action&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;AIAction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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="c1"&gt;// Implementation details...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&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;rejectAIAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;actionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;action&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;AIAction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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="c1"&gt;// Implementation details...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Integration with Permit.io
&lt;/h4&gt;

&lt;p&gt;The application integrates with Permit.io through the &lt;code&gt;permit.ts&lt;/code&gt; file, which provides functions for checking permissions:&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;Permit&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;permitio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Initialize Permit SDK&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;permit&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;Permit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;pdp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&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;PERMIT_PDP_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&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;PERMIT_SDK_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Check if a user can perform an action on a resource&lt;/span&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;checkPermission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;resourceAttributes&lt;/span&gt;&lt;span class="p"&gt;:&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;&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&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;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;permitted&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;permit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;resourceType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;resourceAttributes&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="nx"&gt;permitted&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;error&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Permission check failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;This project demonstrates how to implement fine-grained authorization for both users and AI agents in a Next.js application using Permit.io. By externalizing authorization, we can create more secure, maintainable, and flexible applications that can safely leverage AI capabilities while maintaining appropriate controls.&lt;/p&gt;

&lt;p&gt;Please try to run it locally on your machine and let me know the feedback!&lt;/p&gt;

&lt;p&gt;Thank you for taking your time to read this blog. I hope you enjoyed it. Your support means the world to me. Thank youuuuuuuuuuuuuuuuu! ❣️&lt;/p&gt;

</description>
      <category>permitchallenge</category>
      <category>webdev</category>
      <category>security</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Access Control? Handled. Here's How I Built My DMS 🌠</title>
      <dc:creator>Rohan Sharma</dc:creator>
      <pubDate>Tue, 29 Apr 2025 19:08:04 +0000</pubDate>
      <link>https://dev.to/rohan_sharma/access-control-handled-heres-how-i-built-my-dms-212</link>
      <guid>https://dev.to/rohan_sharma/access-control-handled-heres-how-i-built-my-dms-212</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/permit_io"&gt;Permit.io Authorization Challenge&lt;/a&gt;: Permissions Redefined&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Hi there! 👋&lt;br&gt;
Presenting to you "&lt;strong&gt;Radhika's DocManager&lt;/strong&gt;": A secure Document Management System (or DMS) with fine-grained authorization powered by Permit.io.&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%2Forbjajnchik2w3vtlmpn.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%2Forbjajnchik2w3vtlmpn.png" alt="logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the first version of Radhika's DocManager, which allows you to create, read, write, and delete documents based on their role and document ownership.&lt;/p&gt;
&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role-Based Access Control (RBAC)&lt;/strong&gt;: Different roles (Admin, Editor, Viewer) have different permissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribute-Based Access Control (ABAC)&lt;/strong&gt;: Document owners have special privileges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-Grained Authorization&lt;/strong&gt;: Using Permit.io to implement complex authorization rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js App Router&lt;/strong&gt;: Modern React application with server components and server actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive UI&lt;/strong&gt;: Using Tailwind CSS and shadcn/ui components&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Authorization Model
&lt;/h3&gt;

&lt;p&gt;The application implements the following authorization model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admin&lt;/strong&gt;: Can create, view, edit, and delete any document, and access the admin panel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor&lt;/strong&gt;: Can create, view, and edit documents, but can also delete their own documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viewer&lt;/strong&gt;: Can only view documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, document owners have full control over their own documents regardless of their role.&lt;/p&gt;

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

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

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Project Repo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/RS-labhub/Document_Management_System" rel="noopener noreferrer"&gt;https://github.com/RS-labhub/Document_Management_System&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey
&lt;/h2&gt;

&lt;p&gt;Creating a DMS was a very hectic job, especially while writing the access control. Thanks to Permit, which makes it easier and serves as a super time saver.&lt;/p&gt;

&lt;p&gt;The thing that focused more on this application is the "Use of Permit". This also proves how a simple application becomes so powerful by adding access controls.&lt;/p&gt;

&lt;p&gt;Anyway, the project is open-source. If you want to contribute, you're warmly welcome. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Using Permit.io for Authorization
&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%2Fqxxprkjk8oo9p56drh6l.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%2Fqxxprkjk8oo9p56drh6l.png" alt="permit use"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Permit&lt;/strong&gt; to achieve two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role-Based Access Control or RBAC&lt;/li&gt;
&lt;li&gt;Attribute-Based Access Control or ABAC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the RBAC policy, 3 roles are created: Admin, Editor, and Viewer. The properties/permissions of each role are mentioned in the image.&lt;/p&gt;

&lt;p&gt;In the ABAC policy, access is determined by document attributes and user context.&lt;/p&gt;

&lt;p&gt;If you want to see the whole implementation of the Permit, please read the project &lt;a href="https://github.com/RS-labhub/Document_Management_System/blob/main/README.md" rel="noopener noreferrer"&gt;Readme&lt;/a&gt; file!&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt;A huge thanks to &lt;a class="mentioned-user" href="https://dev.to/jennie_py"&gt;@jennie_py&lt;/a&gt; for their contribution to this project!&lt;/p&gt;

&lt;p&gt;This project demonstrates how to implement fine-grained authorization in a Next.js application using Permit.io. By externalizing authorization, we can create more secure, maintainable, and flexible applications.&lt;/p&gt;

&lt;p&gt;Thank you for reading this so far! Your support means the world to us. ❣️&lt;/p&gt;

</description>
      <category>permitchallenge</category>
      <category>webdev</category>
      <category>security</category>
      <category>devchallenge</category>
    </item>
  </channel>
</rss>
