<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kashif Manzer</title>
    <description>The latest articles on DEV Community by Kashif Manzer (@kashif_manzer).</description>
    <link>https://dev.to/kashif_manzer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4141917%2F22f6777f-adeb-4fe8-86bd-58fce72dfb78.png</url>
      <title>DEV Community: Kashif Manzer</title>
      <link>https://dev.to/kashif_manzer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kashif_manzer"/>
    <language>en</language>
    <item>
      <title>Two AI APIs die this weekend: Perplexity Sonar (Sep 27) and Appsmith AI (Sep 30)</title>
      <dc:creator>Kashif Manzer</dc:creator>
      <pubDate>Fri, 25 Sep 2026 03:05:29 +0000</pubDate>
      <link>https://dev.to/kashif_manzer/two-ai-apis-die-this-weekend-perplexity-sonar-sep-27-and-appsmith-ai-sep-30-599h</link>
      <guid>https://dev.to/kashif_manzer/two-ai-apis-die-this-weekend-perplexity-sonar-sep-27-and-appsmith-ai-sep-30-599h</guid>
      <description>&lt;h1&gt;
  
  
  Two AI APIs Die This Weekend: Perplexity Sonar (Sep 27) and Appsmith AI (Sep 30)
&lt;/h1&gt;

&lt;p&gt;Perplexity retires the Sonar API on September 27, 2026. Appsmith shuts down its managed Appsmith AI plugin on September 30. If you touch either one, this is your last week.&lt;/p&gt;

&lt;p&gt;Here is the fast version of what is happening and a 15-minute triage to find out whether you are exposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perplexity Sonar dies Sunday
&lt;/h2&gt;

&lt;p&gt;The announcement came in a Perplexity blog post on August 13: "On September 27, 2026, the Agent API becomes the main surface for this work, and Sonar tiers retire on the same date." Sonar calls will stop working if nothing changes.&lt;/p&gt;

&lt;p&gt;Here is the part that should make you check your vendor monitoring: the date is real but badly announced. It appears in the blog post and in the docs warning banner. It does NOT appear in the migration guide, which says Sonar "remains supported." It is not in the changelog either; the Sonar item is filed under July 2026 with no date. Perplexity's own FAQ tells you to watch the changelog for retirements. A team that follows that instruction exactly never finds this one. If your vendor monitoring diffs changelogs, this deadline is invisible to it.&lt;/p&gt;

&lt;p&gt;The replacement is the Agent API (canonical endpoint &lt;code&gt;/v1/agent&lt;/code&gt;, GA since February 2026). The preset mapping is one to one: &lt;code&gt;sonar&lt;/code&gt; to &lt;code&gt;fast&lt;/code&gt;, &lt;code&gt;sonar-pro&lt;/code&gt; to &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;sonar-reasoning-pro&lt;/code&gt; to &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;sonar-deep-research&lt;/code&gt; to &lt;code&gt;high&lt;/code&gt;, with &lt;code&gt;xhigh&lt;/code&gt; sitting above all four.&lt;/p&gt;

&lt;p&gt;Three things bite people on this migration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It is not a model-string swap. The endpoint path, the request body, and the response parsing all change. If your UI renders source citations, that is the highest-risk silent break: the UI renders, the sources are just wrong or empty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The cost model changes shape. Sonar billed tokens. The Agent API bills tokens plus per-tool-invocation billing: web_search $2.50, fetch_url $0.50, finance_search $5, people_search $5 per 1,000 invocations, with step budgets per preset (fast 1, low 5, medium/high 15, xhigh 100). Budget alerts calibrated on Sonar token prices will misfire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The rate-limit trap. Tiers are cumulative lifetime spend ($0 / $50 / $250 / $500 / $1,000 / $5,000), capped at 1/3/8/17/33/33 queries per second. Tier 5 ($5,000 cumulative) buys exactly the same throughput as Tier 4 ($1,000). If your plan assumes spending more lifts the ceiling, it stops lifting at Tier 4.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also: &lt;code&gt;sonar-pro&lt;/code&gt; has a 200K input window, the largest in the Sonar lineup. Perplexity publishes no context-window figure for the Agent API, only per-preset max output tokens. If you picked sonar-pro for the 200K path, you are migrating on an unknown. Get it in writing from Perplexity before you size the work.&lt;/p&gt;

&lt;p&gt;The Search API is not affected. It is a separate product with no deprecation notice. Customers with existing contractual commitments to Sonar are covered through the end of their current term.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appsmith AI dies three days later
&lt;/h2&gt;

&lt;p&gt;Since release 2.3, you can no longer create new Appsmith AI datasources or new queries against existing ones. The API rejects both with a clear 400 (&lt;code&gt;AE-DTS-4031&lt;/code&gt;). Existing datasources and queries keep working until September 30 and now show a non-dismissible deprecation banner with the date. Source: &lt;a href="https://github.com/appsmithorg/appsmith/pull/42015" rel="noopener noreferrer"&gt;https://github.com/appsmithorg/appsmith/pull/42015&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The migration path is BYOK: move to the OpenAI, Anthropic, or Google AI datasources with your own API keys. Managed Appsmith-owned credentials are revoked about 60 days after GA, which is the hard stop even if your instance upgrades late.&lt;/p&gt;

&lt;p&gt;Two extra traps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uploaded files (file context) will not be available after the shutdown date. There is no transfer path. Re-upload or redesign now.&lt;/li&gt;
&lt;li&gt;A recent Appsmith change made the datasource plugins live-fetch current model lists, and saved Anthropic queries on hand-typed modern models (e.g. &lt;code&gt;claude-sonnet-4-*&lt;/code&gt;) now get the raw messages-API body instead of the old completion-shaped body. If any widget or JS object binds to a &lt;code&gt;completion&lt;/code&gt; field on those queries, update the binding. Source: &lt;a href="https://github.com/appsmithorg/appsmith/pull/42114" rel="noopener noreferrer"&gt;https://github.com/appsmithorg/appsmith/pull/42114&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 15-minute triage
&lt;/h2&gt;

&lt;p&gt;Run these in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Am I calling Sonar?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rnE&lt;/span&gt; &lt;span class="s1"&gt;'sonar(-pro|-reasoning-pro|-deep-research)?'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.py'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.js'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.ts'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.go'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.java'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.rb'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.yml'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.yaml'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.json'&lt;/span&gt; &lt;span class="nt"&gt;--include&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'*.env*'&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-viE&lt;/span&gt; &lt;span class="s1"&gt;'node_modules|dist/|build/|\.git/'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also grep prompt-template stores, feature-flag configs, and IaC. A hit means Track A applies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Do I parse Sonar responses or citations?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search for &lt;code&gt;choices[0].message.content&lt;/code&gt; and any code reading a citations array from Perplexity responses. Sonar's citation array is what most teams built source-attribution UI on; the Agent API response is a different shape. A hit means your parsing code needs rewriting, not just the model string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Do I depend on sonar-pro's 200K context?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If any request relies on the 200K input path, you have no published equivalent to plan against. Ask Perplexity in writing before you commit a sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Am I on Appsmith AI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In each Appsmith workspace, open Datasources and look for the Appsmith AI tile. If you see the non-dismissible deprecation callout on the datasource editor or any AI query editor, you are on the managed plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Do my Appsmith AI queries use uploaded files?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open each Appsmith AI query and check for file context. A hit means those files do not transfer; you must re-upload them against the new datasource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; hits in 1 or 2 mean a standard Sonar migration, roughly a day. A hit in 3 means you have an open question to settle first. A hit in 4 means the Appsmith track applies; a hit in 5 adds file-context rework.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full kit
&lt;/h2&gt;

&lt;p&gt;This article is the triage. If you have hits, I built the full migration kit for both tracks: the ordered migration checklists with per-step verification, the before/after call-shape patterns, six code-review prompts you can paste into any AI assistant or hand to a reviewer, the testing and verification plan, the honest rollback story (there is no post-Sep-27 rollback for Sonar; Appsmith gets a staged retreat), and a gotchas FAQ covering the badly-announced date, the blog's overstated cost claims, the Tier 4/5 trap, and the Anthropic binding change. Every date, price, and behavior was verified against vendor docs or the deprecation PR on the build date, and anything I could not verify is marked as unverified, not hidden. It is here: &lt;a href="https://kmanzer.gumroad.com/l/dsbde" rel="noopener noreferrer"&gt;https://kmanzer.gumroad.com/l/dsbde&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sunday is three days away. If the triage shows hits, do not wait for the quarter-end freeze to make the decision for you.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>GitHub Deleted Node 20 From Actions Runners: The 15-Minute Triage Checklist</title>
      <dc:creator>Kashif Manzer</dc:creator>
      <pubDate>Thu, 24 Sep 2026 20:41:04 +0000</pubDate>
      <link>https://dev.to/kashif_manzer/github-deleted-node-20-from-actions-runners-the-15-minute-triage-checklist-4gj1</link>
      <guid>https://dev.to/kashif_manzer/github-deleted-node-20-from-actions-runners-the-15-minute-triage-checklist-4gj1</guid>
      <description>&lt;p&gt;On September 23, 2026, GitHub removed the Node.js 20 runtime from Actions runners. Any JavaScript action whose &lt;code&gt;action.yml&lt;/code&gt; still declares &lt;code&gt;runs.using: node20&lt;/code&gt; can no longer start: the job fails at action startup, before your tests even run.&lt;/p&gt;

&lt;p&gt;Timeline (from the &lt;a href="https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/" rel="noopener noreferrer"&gt;official changelog&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2025-09-19&lt;/strong&gt;: deprecation announced&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026-06-16&lt;/strong&gt;: node20 actions force-run on Node 24 with a warning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2026-09-23&lt;/strong&gt;: Node 20 removed entirely (revised up from Sept 16)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your CI went red yesterday and you haven't touched anything: this is why. Here's how to triage it in 15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 1: Confirm you're hit (1 min)
&lt;/h2&gt;

&lt;p&gt;Open your latest workflow run logs and search for: &lt;code&gt;Node.js 20 actions are deprecated&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hit = your pins are stale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 2: Inventory every action pin (5 min)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rhoE&lt;/span&gt; &lt;span class="s1"&gt;'uses:[[:space:]]*[^[:space:]#]+'&lt;/span&gt; .github/workflows/&lt;span class="k"&gt;*&lt;/span&gt;.yml .github/actions/&lt;span class="k"&gt;*&lt;/span&gt;/action.yml 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the second path: composite actions live in &lt;code&gt;.github/actions/&lt;/code&gt; and are &lt;strong&gt;invisible to Dependabot-style tag scans&lt;/strong&gt;. You must grep them separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 3: Resolve each pin's actual runtime (5 min)
&lt;/h2&gt;

&lt;p&gt;Do not trust tag names. The node24 boundary is not uniform across majors: &lt;code&gt;upload-artifact&lt;/code&gt; only moved to node24 at v6, &lt;code&gt;download-artifact&lt;/code&gt; at v7. For each third-party pin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh api &lt;span class="s1"&gt;'repos/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;/contents/action.yml?ref=&amp;lt;ref&amp;gt;'&lt;/span&gt; &lt;span class="nt"&gt;--jq&lt;/span&gt; &lt;span class="s1"&gt;'.content'&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A1&lt;/span&gt; &lt;span class="s1"&gt;'^runs:'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;using: node20&lt;/code&gt; = broken. &lt;code&gt;using: node24&lt;/code&gt; = safe. &lt;code&gt;using: composite&lt;/code&gt; or &lt;code&gt;using: docker&lt;/code&gt; = unaffected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check 4: Self-hosted runners: check the floor (2 min)
&lt;/h2&gt;

&lt;p&gt;node24 actions require runner &lt;strong&gt;&amp;gt;= 2.327.1&lt;/strong&gt;. Below that, bumped actions fail even with correct pins. Also: Node 24 doesn't run on macOS &amp;lt;= 13.4 or ARM32 at all: those jobs need a different plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bumps everyone hits
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Broken pin&lt;/th&gt;
&lt;th&gt;Minimal node24 major&lt;/th&gt;
&lt;th&gt;Watch out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;actions/checkout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;v5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v6 moves credentials out of &lt;code&gt;.git/config&lt;/code&gt;; v7 blocks fork-PR checkout by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;actions/setup-node&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;v5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v5 enables package-manager caching &lt;strong&gt;by default&lt;/strong&gt;: disable with &lt;code&gt;package-manager-cache: false&lt;/code&gt; in privileged workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;actions/setup-python&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;v6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clean bump, runtime only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;actions/setup-go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;v6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v6 honors the &lt;code&gt;toolchain&lt;/code&gt; directive and defaults &lt;code&gt;GOTOOLCHAIN=local&lt;/code&gt;: use &lt;code&gt;go-version-file: 'go.mod'&lt;/code&gt; or builds break&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;actions/upload-artifact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;v6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Do NOT stop at v5: it still runs node20 by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;actions/download-artifact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;v7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v5 changed single-artifact download paths; pair with upload v6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prefer the &lt;strong&gt;minimal&lt;/strong&gt; node24 major: each extra major crossed is unrelated breaking change you absorb for nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two gotchas that bite backend repos hardest
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;setup-go@v6 silently changes which Go you build with.&lt;/strong&gt; v6 honors the &lt;code&gt;toolchain&lt;/code&gt; directive in &lt;code&gt;go.mod&lt;/code&gt; (v5 ignored it) and defaults &lt;code&gt;GOTOOLCHAIN=local&lt;/code&gt;, which forbids the silent toolchain downloads v5 allowed. If your workflow pins &lt;code&gt;go-version: 1.24&lt;/code&gt; but &lt;code&gt;go.mod&lt;/code&gt; says &lt;code&gt;go 1.25&lt;/code&gt;, builds fail. Fix: &lt;code&gt;go-version-file: 'go.mod'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is no rollback to node20.&lt;/strong&gt; The runtime is gone: &lt;code&gt;FORCE_JAVASCRIPT_ACTIONS_TO_NODE24&lt;/code&gt; and friends do nothing now. "Rollback" means retreating to a &lt;em&gt;different&lt;/em&gt; node24 major, never back to the old pin.&lt;/p&gt;




&lt;p&gt;I spent today turning this into a complete one-afternoon migration kit: all 19 actions in the pin-bump map with landmines, the ordered 7-step migration, 6 code-review prompts, a testing/verification plan, the honest rollback plan, and every gotcha above sourced. It's $39 here: &lt;a href="https://kmanzer.gumroad.com/l/sreej" rel="noopener noreferrer"&gt;https://kmanzer.gumroad.com/l/sreej&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every version number in it was verified against upstream release notes or real migration reports on the build date. Good luck out there: and check your composite actions.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
