<?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: Jamal Omotoyosi</title>
    <description>The latest articles on DEV Community by Jamal Omotoyosi (@bytepanda).</description>
    <link>https://dev.to/bytepanda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3842018%2F636f6f89-998f-4769-bca3-dc91fd439af4.png</url>
      <title>DEV Community: Jamal Omotoyosi</title>
      <link>https://dev.to/bytepanda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bytepanda"/>
    <language>en</language>
    <item>
      <title>Building a "Semantic" API Proxy: How I handled privacy and 200 OK "Lies"</title>
      <dc:creator>Jamal Omotoyosi</dc:creator>
      <pubDate>Fri, 27 Mar 2026 06:11:09 +0000</pubDate>
      <link>https://dev.to/bytepanda/building-a-semantic-api-proxy-how-i-handled-privacy-and-200-ok-lies-2d24</link>
      <guid>https://dev.to/bytepanda/building-a-semantic-api-proxy-how-i-handled-privacy-and-200-ok-lies-2d24</guid>
      <description>&lt;p&gt;I’ve spent the last few weeks building Inspekt, an AI-powered proxy that tells you why an API failed instead of just giving you raw logs. I hit 100 upvotes on Product Hunt today, and the "Day 1" feedback has already forced me to rethink my architecture.&lt;/p&gt;

&lt;p&gt;The "200 OK" Problem:&lt;br&gt;
Standard monitors only trigger on 4xx/5xx codes. But what about GraphQL or certain REST APIs that return a 200 OK with an errors array hidden in the payload?&lt;/p&gt;

&lt;p&gt;Inspekt solves this by analyzing the semantic meaning of the response. It doesn't just look at the status code; it audits the entire exchange.&lt;/p&gt;

&lt;p&gt;Update 01: The "Visibility &amp;amp; Trust" Patch&lt;/p&gt;

&lt;p&gt;Based on community feedback today, I just pushed a major update to the proxy logic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Local Privacy Scrubbing
I realized I shouldn't be sending raw Authorization or Cookie headers to an LLM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: I implemented a local scrub() utility. Before the data leaves the server for analysis, it redacts sensitive keys. Your credentials stay on the proxy; the AI only sees [REDACTED].&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transparent Response Schema
I refactored the response object to be more "Axios-idiomatic" and transparent. The developer now gets the Full HTTP Exchange alongside the AI’s diagnosis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The New Schema:&lt;br&gt;
JSON&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "success": true,&lt;br&gt;
  "data": {&lt;br&gt;
    "response": {&lt;br&gt;
      "status": 200,&lt;br&gt;
      "headers": { "content-type": "application/json" },&lt;br&gt;
      "data": { /* Raw API response from target */ }&lt;br&gt;
    },&lt;br&gt;
    "analysis": {&lt;br&gt;
      "summary": "One sentence description of what happened",&lt;br&gt;
      "status": { "code": 200, "meaning": "OK", "expected": true },&lt;br&gt;
      "diagnosis": "Why the server responded this way",&lt;br&gt;
      "issues": [],&lt;br&gt;
      "fixes": [],&lt;br&gt;
      "headers": {&lt;br&gt;
        "notable": [],&lt;br&gt;
        "missing": [],&lt;br&gt;
        "security_flags": []&lt;br&gt;
      },&lt;br&gt;
      "body": {&lt;br&gt;
        "explanation": "What the body contains and means",&lt;br&gt;
        "anomalies": []&lt;br&gt;
      },&lt;br&gt;
      "performance_flags": [],&lt;br&gt;
      "severity": "ok"&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Technical Challenges:&lt;/p&gt;

&lt;p&gt;Context Windows: Handling massive JSON payloads by implementing a custom truncation utility to keep the analysis under 8,000 characters.&lt;/p&gt;

&lt;p&gt;Metadata Integrity: Ensuring the analysis object stays mapped to the correct response data even under high load.&lt;/p&gt;

&lt;p&gt;I’m still figuring out the "production-grade" side of backend architecture, so I’m looking for some critical feedback.&lt;/p&gt;

&lt;p&gt;How are you guys handling sensitive data when passing request context to LLMs? Is a "Deny-List" enough, or should I be looking at Regex for the response data too?&lt;/p&gt;

&lt;p&gt;Check the Repo: &lt;a href="https://github.com/jamaldeen09/inspekt-api" rel="noopener noreferrer"&gt;https://github.com/jamaldeen09/inspekt-api&lt;/a&gt;&lt;br&gt;
See the PH Launch: &lt;a href="https://www.producthunt.com/products/inspekt" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/inspekt&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>I built an AI-powered API Proxy to explain 4xx errors in plain English</title>
      <dc:creator>Jamal Omotoyosi</dc:creator>
      <pubDate>Thu, 26 Mar 2026 18:19:37 +0000</pubDate>
      <link>https://dev.to/bytepanda/i-built-an-ai-powered-api-proxy-to-explain-4xx-errors-in-plain-english-2927</link>
      <guid>https://dev.to/bytepanda/i-built-an-ai-powered-api-proxy-to-explain-4xx-errors-in-plain-english-2927</guid>
      <description>&lt;p&gt;Let’s be honest: 422 Unprocessable Entity is a nightmare when you're in the flow. I got tired of it, so I built Inspekt.&lt;/p&gt;

&lt;p&gt;It’s a headless proxy that intercepts failed API requests and injects human-readable AI fixes directly into the JSON response.&lt;/p&gt;

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

&lt;p&gt;Next.js (App Router) for the landing and dashboard.&lt;br&gt;
Vercel Edge Runtime for low-latency proxying.&lt;br&gt;
OpenAI SDK to generate the "Diagnosis" field in real-time.&lt;br&gt;
TypeScript for everything (obviously).&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Instead of hitting your API directly, you hit the Inspekt proxy. If your API returns a success, it passes through. If it fails? Inspekt catches the error, asks an LLM what went wrong based on the schema/payload, and appends a _diagnosis field to the response.&lt;/p&gt;

&lt;p&gt;We are live on Product Hunt today and I’d love to hear your thoughts on the proxy architecture!&lt;/p&gt;

&lt;p&gt;Product Hunt: &lt;a href="https://www.producthunt.com/posts/inspekt" rel="noopener noreferrer"&gt;https://www.producthunt.com/posts/inspekt&lt;/a&gt;&lt;br&gt;
Live Site: &lt;a href="https://inspekt-api.vercel.app" rel="noopener noreferrer"&gt;https://inspekt-api.vercel.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jamal Omotoyosi</dc:creator>
      <pubDate>Wed, 25 Mar 2026 13:17:31 +0000</pubDate>
      <link>https://dev.to/bytepanda/-3cgo</link>
      <guid>https://dev.to/bytepanda/-3cgo</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p" class="crayons-story__hidden-navigation-link"&gt;I rebuilt a failed SaaS as a free API in one day, here's what changed&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/bytepanda" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3842018%2F636f6f89-998f-4769-bca3-dc91fd439af4.png" alt="bytepanda profile" class="crayons-avatar__image" width="800" height="854"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/bytepanda" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jamal Omotoyosi
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jamal Omotoyosi
                
              
              &lt;div id="story-author-preview-content-3402665" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/bytepanda" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3842018%2F636f6f89-998f-4769-bca3-dc91fd439af4.png" class="crayons-avatar__image" alt="" width="800" height="854"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jamal Omotoyosi&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p" id="article-link-3402665"&gt;
          I rebuilt a failed SaaS as a free API in one day, here's what changed
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/backend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;backend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/node"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;node&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/saas"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;saas&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

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

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

&lt;/div&gt;


</description>
      <category>backend</category>
      <category>api</category>
      <category>node</category>
      <category>saas</category>
    </item>
    <item>
      <title>I rebuilt a failed SaaS as a free API in one day, here's what changed</title>
      <dc:creator>Jamal Omotoyosi</dc:creator>
      <pubDate>Wed, 25 Mar 2026 13:15:40 +0000</pubDate>
      <link>https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p</link>
      <guid>https://dev.to/bytepanda/i-rebuilt-a-failed-saas-as-a-free-api-in-one-day-heres-what-changed-4c5p</guid>
      <description>&lt;p&gt;A year ago I built a tool called RespAi. It was an API testing app with AI-powered response analysis, basically Postman but with an AI layer that explained why your API responded the way it did.&lt;/p&gt;

&lt;p&gt;It failed immediately. I was competing directly with Postman which has millions of users and brand recognition I'll never touch. Classic mistake.&lt;/p&gt;

&lt;p&gt;But the core idea was solid. Developers waste real time manually reading through cryptic 4xx and 5xx responses trying to figure out what went wrong. That problem didn't go away just because my first product failed.&lt;/p&gt;

&lt;p&gt;So yesterday I stripped it down to its simplest possible form and shipped it as a single API endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Inspekt does
&lt;/h2&gt;

&lt;p&gt;You send it a request. It proxies it to your target URL and returns two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The raw response from the API you're testing&lt;/li&gt;
&lt;li&gt;A structured AI analysis of what happened and why&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The analysis looks like this:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "summary": "POST request to Google's homepage returned 405 Method Not Allowed because the root URL does not support POST.",&lt;br&gt;
  "status": {&lt;br&gt;
    "code": 405,&lt;br&gt;
    "meaning": "Method Not Allowed",&lt;br&gt;
    "expected": false&lt;br&gt;
  },&lt;br&gt;
  "diagnosis": "The root endpoint '/' is configured for GET requests only.",&lt;br&gt;
  "issues": ["HTTP method mismatch: POST used instead of GET"],&lt;br&gt;
  "fixes": ["Change the request method to GET"],&lt;br&gt;
  "headers": {&lt;br&gt;
    "security_flags": ["x-powered-by header exposes server stack"]&lt;br&gt;
  },&lt;br&gt;
  "severity": "warning"&lt;br&gt;
}&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an API and not a GUI tool
&lt;/h2&gt;

&lt;p&gt;Because developers already have Postman for GUI testing. What they don't have is something they can call programmatically, from a script, a CI pipeline, a monitoring job that gives them an intelligent explanation of what went wrong without manual inspection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Free, no auth needed:&lt;/p&gt;

&lt;p&gt;curl -X POST &lt;a href="https://inspekt-api-production.up.railway.app/api/v1/analyze" rel="noopener noreferrer"&gt;https://inspekt-api-production.up.railway.app/api/v1/analyze&lt;/a&gt; \&lt;br&gt;
  -H "Content-Type: application/json" \&lt;br&gt;
  -d '{"url": "&lt;a href="https://jsonplaceholder.typicode.com/posts/1" rel="noopener noreferrer"&gt;https://jsonplaceholder.typicode.com/posts/1&lt;/a&gt;", "method": "GET"}'&lt;/p&gt;

&lt;p&gt;Repo: github.com/jamaldeen09/inspekt-api&lt;/p&gt;

&lt;p&gt;Would love brutal feedback from anyone who tries it.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>api</category>
      <category>node</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
