<?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: Abhigyan Saikia</title>
    <description>The latest articles on DEV Community by Abhigyan Saikia (@abhigyannsaikia).</description>
    <link>https://dev.to/abhigyannsaikia</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%2F4160981%2F74fa7ee7-47e6-416d-931b-26af8bc54473.jpg</url>
      <title>DEV Community: Abhigyan Saikia</title>
      <link>https://dev.to/abhigyannsaikia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhigyannsaikia"/>
    <language>en</language>
    <item>
      <title>17 OpenAI Models Shut Down Friday. Here’s the 10-Minute Check for Your Codebase.</title>
      <dc:creator>Abhigyan Saikia</dc:creator>
      <pubDate>Tue, 20 Oct 2026 18:16:04 +0000</pubDate>
      <link>https://dev.to/abhigyannsaikia/17-openai-models-shut-down-friday-heres-the-10-minute-check-for-your-codebase-1lff</link>
      <guid>https://dev.to/abhigyannsaikia/17-openai-models-shut-down-friday-heres-the-10-minute-check-for-your-codebase-1lff</guid>
      <description>&lt;p&gt;&lt;strong&gt;17 OpenAI Models to be shut down this Friday. Here's how to check your codebase in 10 minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenAI is slated to shut down 17 model IDs on Friday, 23rd October. This isn't just a deprecation notice - once a model is retired, API requests to its ID can fail and should not be assumed to work with any given replacement.&lt;/p&gt;

&lt;p&gt;If you pinned a model to use in 2024 for reproducibility, or have an automation in n8n, Make or Zapier that makes a call to one of these models, you're in danger of it breaking.&lt;/p&gt;

&lt;p&gt;It can be easy to miss out on a scheduled task or background queue that fails repeatedly until noticed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 11 base models listed on the 23rd of October
&lt;/h2&gt;

&lt;p&gt;| Model ID | Proposed replacement |&lt;/p&gt;

&lt;p&gt;|---|---|&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-3.5-turbo-0125&lt;/code&gt; and &lt;code&gt;gpt-3.5-turbo&lt;/code&gt; | &lt;code&gt;gpt-5.6-terra&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-4-0613&lt;/code&gt; and &lt;code&gt;gpt-4&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-4-1106-preview&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-4-turbo-2024-04-09&lt;/code&gt; and &lt;code&gt;gpt-4-turbo&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-4.1-nano-2025-04-14&lt;/code&gt; and &lt;code&gt;gpt-4.1-nano&lt;/code&gt; | &lt;code&gt;gpt-5.6-luna&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-4o-2024-05-13&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;gpt-image-1&lt;/code&gt; | &lt;code&gt;gpt-image-2.5&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;o1-2024-12-17&lt;/code&gt; and &lt;code&gt;o1&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;o1-pro-2025-03-19&lt;/code&gt; and &lt;code&gt;o1-pro&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;o3-mini-2025-01-31&lt;/code&gt; and &lt;code&gt;o3-mini&lt;/code&gt; | &lt;code&gt;gpt-5.6-sol&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;| &lt;code&gt;o4-mini-2025-04-16&lt;/code&gt; and &lt;code&gt;o4-mini&lt;/code&gt; | &lt;code&gt;gpt-5.6-terra&lt;/code&gt; |&lt;/p&gt;

&lt;p&gt;The original list of models also includes six fine-tuned variants. Make sure to check your fine-tuned model IDs individually rather than making assumptions about changing the base name being enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two traps that could break your migration
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Don't check only dated model IDs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your code might be calling &lt;code&gt;o4-mini&lt;/code&gt; rather than &lt;code&gt;o4-mini-2025-04-16&lt;/code&gt;. Make sure to search for both forms, including any aliases that might exist in environment variables and within your workflow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Similar names don't necessarily share a retirement date.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The supplied schedule differentiates between &lt;code&gt;gpt-4o&lt;/code&gt; and &lt;code&gt;gpt-4o-mini&lt;/code&gt;, and between &lt;code&gt;gpt-image-1&lt;/code&gt; and &lt;code&gt;gpt-image-1.5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is important - a careless find-and-replace can miss out on any calls affected or modify models which are currently in service.&lt;/p&gt;

&lt;p&gt;Make sure to confirm the actual retirement date for each model before changing production code.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 10-minute check
&lt;/h3&gt;

&lt;p&gt;Search through these locations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The application source code and shared libraries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; files and deployment configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;n8n, Make and Zapier workflow exports&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cron jobs, scheduled tasks and background workers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API request logs and monitoring dashboards&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fine-tuned model configurations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't just rely on a single text search - make sure to match both complete model IDs and any aliases to avoid false positives. Then verify each affected call with the official retirement schedule, select an appropriate supported replacement and test the migrated request.&lt;/p&gt;

&lt;p&gt;A replacement isn't always equivalent - make sure to check response formats, tool calling, image inputs, latency, cost and output quality before shipping the change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### I've built a free scanner for this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you'd rather not inspect everything manually, try out &lt;a href="https://abhigyansaikiaa.github.io/dead-model-check/" rel="noopener noreferrer"&gt;Dead Model Check&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Paste code, configuration or logs, and it'll identify model ID matches and associated retirement information.&lt;/p&gt;

&lt;p&gt;It runs in your browser (your pasted content is not uploaded by this scanner). The goal is to make model migrations easier to plan, including any future retirement dates, rather than finding a broken API call after a deadline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Need help with the affected code?
&lt;/h3&gt;

&lt;p&gt;If the scan identifies retired model calls in your production code, and you don't have the time to fix them, I offer a fixed-fee migration service.&lt;/p&gt;

&lt;p&gt;$149 - Model Migration and Verification&lt;/p&gt;

&lt;p&gt;The scope is simple: identify the affected calls, update them to appropriate supported models and verify the changes. The exact scope of work would depend on your codebase and the number of affected integrations.&lt;/p&gt;

&lt;p&gt;More information is available on the [Dead Model Check page]&lt;a href="https://abhigyansaikiaa.github.io/dead-model-check/" rel="noopener noreferrer"&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;### One more thing to check&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Model retirements aren't the only source of breakage. Deprecation of API endpoints can require significantly more work than just replacing a model ID.&lt;/p&gt;

&lt;p&gt;If your application uses the Assistants API, make sure to check its official retirement schedule separately. Migration of a model name won't fix an API that's itself been retired.&lt;/p&gt;

&lt;p&gt;The takeaway: spend ten minutes identifying the affected model calls now and then verify the dates, migrate deliberately and test before the deadline.&lt;/p&gt;

&lt;p&gt;Always confirm retirement dates and replacement models against the official OpenAI documentation before deploying any changes.&lt;/p&gt;

</description>
      <category>openai</category>
      <category>ai</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Compress an Image to an Exact KB Size in the Browser (Free, No Upload)</title>
      <dc:creator>Abhigyan Saikia</dc:creator>
      <pubDate>Sun, 04 Oct 2026 06:13:49 +0000</pubDate>
      <link>https://dev.to/abhigyannsaikia/how-to-compress-an-image-to-an-exact-kb-size-in-the-browser-free-no-upload-8be</link>
      <guid>https://dev.to/abhigyannsaikia/how-to-compress-an-image-to-an-exact-kb-size-in-the-browser-free-no-upload-8be</guid>
      <description>&lt;p&gt;Upload forms don't ask for "80% quality". They ask for "photo under 50KB". And every mainstream compressor hands you a quality slider and wishes you luck — compress, check size, adjust, repeat.&lt;br&gt;
There are three ways to hit an exact KB target. Here's all of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: ImageMagick (one line)&lt;/strong&gt;&lt;br&gt;
If you're on a machine with ImageMagick installed:&lt;br&gt;
magick input.jpg -define jpeg:extent=50KB output.jpg&lt;br&gt;
The jpeg:extent define binary-searches the quality for you. Change 50KB to whatever the form wants. Fast, scriptable, exact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Do it in the browser with Canvas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same binary-search idea works client-side. Sketch of the approach:&lt;br&gt;
async function compressToKB(file, targetKB) {&lt;br&gt;
  const bitmap = await createImageBitmap(file);&lt;br&gt;
  const canvas = document.createElement('canvas');&lt;br&gt;
  canvas.width = bitmap.width;&lt;br&gt;
  canvas.height = bitmap.height;&lt;br&gt;
  canvas.getContext('2d').drawImage(bitmap, 0, 0);&lt;/p&gt;

&lt;p&gt;let low = 0.05, high = 0.95, best = null;&lt;br&gt;
  for (let i = 0; i &amp;lt; 8; i++) {           // 8 rounds is plenty&lt;br&gt;
    const q = (low + high) / 2;&lt;br&gt;
    const blob = await new Promise(r =&amp;gt; canvas.toBlob(r, 'image/jpeg', q));&lt;br&gt;
    if (blob.size &amp;lt;= targetKB * 1024) { best = blob; low = q; }&lt;br&gt;
    else { high = q; }&lt;br&gt;
  }&lt;br&gt;
  // If quality alone can't reach it, shrink dimensions and repeat.&lt;br&gt;
  return best;&lt;br&gt;
}&lt;br&gt;
Eight iterations converge fast. If the lowest quality still overshoots, halve the dimensions and run again — pixel count dominates file size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3: Use a tool that does this already (disclosure: I built it)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I got tired of doing the slider dance for exam forms, so I built ToolKB — you type the exact KB target (20KB, 50KB, 100KB, anything up to 10MB) and it runs the binary search above entirely in your browser.&lt;br&gt;
Why in-browser matters: these are identity documents — passport photos, signatures. Nothing uploads anywhere; you can watch the Network tab and see zero outgoing transfers. No signup, no watermark, no daily limit.&lt;br&gt;
Handy presets if you're filling Indian exam forms:&lt;br&gt;
Signature to 20KB — SSC/IBPS signature spec (10–20KB)&lt;br&gt;
Photo to 50KB — SSC GD / IBPS photo range&lt;br&gt;
Photo to 200KB — UPSC photo spec&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule of thumb&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;File size ≈ pixels × quality. If your 12MP phone photo won't squeeze into 50KB without turning to mush, don't just crush the quality — halve the dimensions first (that quarters the pixels), then compress. Sharper result, same file size.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
