<?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: Khairul Muhtadin</title>
    <description>The latest articles on DEV Community by Khairul Muhtadin (@khmuhtadin).</description>
    <link>https://dev.to/khmuhtadin</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%2F3796665%2F6f5c9229-982f-48e5-8082-05353adb9bee.png</url>
      <title>DEV Community: Khairul Muhtadin</title>
      <link>https://dev.to/khmuhtadin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khmuhtadin"/>
    <language>en</language>
    <item>
      <title>Text classification in n8n without a chat LLM: building a node for TypeSafe's Jev</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Mon, 21 Sep 2026 10:27:56 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/text-classification-in-n8n-without-a-chat-llm-building-a-node-for-typesafes-jev-5b2j</link>
      <guid>https://dev.to/khmuhtadin/text-classification-in-n8n-without-a-chat-llm-building-a-node-for-typesafes-jev-5b2j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhpu1yim6vadnfwsfur7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhpu1yim6vadnfwsfur7.png" alt=" " width="772" height="626"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://khmuhtadin.com/blog/i-built-an-n8n-node-for-jev-classification/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fkhmuhtadin.com%2Fimages%2Fblog%2Fjev-classification%2Fjev-routing-workflow.webp" height="478" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://khmuhtadin.com/blog/i-built-an-n8n-node-for-jev-classification/" rel="noopener noreferrer" class="c-link"&gt;
            I Built an n8n Node for Decisions, Not Text Generation - Khairul Muhtadin
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Why I built n8n-nodes-jev-classification for TypeSafe AI's Jev, how confidence-based routing works, and what I learned shipping it to npm.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fkhmuhtadin.com%2Ffavicon.svg" width="64" height="64"&gt;
          khmuhtadin.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>n8n</category>
      <category>automation</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Databases for durable state (sticky note vs filing cabinet)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Tue, 18 Aug 2026 11:00:02 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/databases-for-durable-state-sticky-note-vs-filing-cabinet-2h2m</link>
      <guid>https://dev.to/khmuhtadin/databases-for-durable-state-sticky-note-vs-filing-cabinet-2h2m</guid>
      <description>&lt;p&gt;Workflows forget. That is fine for drafts.&lt;/p&gt;

&lt;p&gt;It is fatal for orders, tickets, and retries. If state must survive the next run, sticky notes are not enough. You need a filing cabinet.&lt;/p&gt;

&lt;p&gt;Swipe for when to store durable state, a create-once flow, and three beginner rules so retries stop inventing duplicates.&lt;/p&gt;

&lt;p&gt;What is the one fact your flow keeps forgetting?&lt;/p&gt;

&lt;p&gt;Episode 17 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>AI that stays under control (smart intern, not CEO)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Sun, 16 Aug 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/ai-that-stays-under-control-smart-intern-not-ceo-2nk8</link>
      <guid>https://dev.to/khmuhtadin/ai-that-stays-under-control-smart-intern-not-ceo-2nk8</guid>
      <description>&lt;p&gt;AI in n8n is not a magic coworker.&lt;/p&gt;

&lt;p&gt;It is a smart intern. Without a job description, tools limits, and stop rules, it will improvise in production.&lt;/p&gt;

&lt;p&gt;Swipe for the intern analogy, three rails before the model, and a support-triage flow where refunds still need a gate.&lt;/p&gt;

&lt;p&gt;Where does your agent still have unlimited tools?&lt;/p&gt;

&lt;p&gt;Episode 16 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Wait, schedule, and time (alarm vs kitchen timer)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Fri, 14 Aug 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/wait-schedule-and-time-alarm-vs-kitchen-timer-16oi</link>
      <guid>https://dev.to/khmuhtadin/wait-schedule-and-time-alarm-vs-kitchen-timer-16oi</guid>
      <description>&lt;p&gt;Time in n8n is not “hope it runs later”.&lt;/p&gt;

&lt;p&gt;An alarm starts the kitchen. A timer pauses mid-recipe. Mixing those two is how people get double fires and silent delays.&lt;/p&gt;

&lt;p&gt;Swipe for a beginner map of Schedule vs Wait, a polite API loop, and three rules so time stays boring.&lt;/p&gt;

&lt;p&gt;Do you need a clock, or just a pause?&lt;/p&gt;

&lt;p&gt;Episode 15 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Secrets that stay secret (your API key is a house key)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Wed, 12 Aug 2026 11:00:01 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/secrets-that-stay-secret-your-api-key-is-a-house-key-2jj8</link>
      <guid>https://dev.to/khmuhtadin/secrets-that-stay-secret-your-api-key-is-a-house-key-2jj8</guid>
      <description>&lt;p&gt;Your API key is not “just config”.&lt;/p&gt;

&lt;p&gt;It is a house key. Leave it on the door and anyone walking by can open production.&lt;/p&gt;

&lt;p&gt;Swipe for a beginner map of n8n secrets: what counts as a secret, why hardcoding breaks you, and the simple habit that keeps keys in a vault instead of on the canvas.&lt;/p&gt;

&lt;p&gt;Where do your live keys live today: credentials, or still inside a node?&lt;/p&gt;

&lt;p&gt;Episode 14 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Loops that finish (empty checks, no double-loop)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/loops-that-finish-empty-checks-no-double-loop-14j</link>
      <guid>https://dev.to/khmuhtadin/loops-that-finish-empty-checks-no-double-loop-14j</guid>
      <description>&lt;p&gt;Loops feel powerful until one never ends.&lt;/p&gt;

&lt;p&gt;Missing exits, stacked pagination, side effects with no cap.&lt;/p&gt;

&lt;p&gt;Swipe for a batch that actually finishes — and the double-loop trap.&lt;/p&gt;

&lt;p&gt;Which loop in production would you not want running unsupervised tonight?&lt;/p&gt;

&lt;p&gt;Episode 13 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Branching without chaos (normalize first, then decide)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Sat, 08 Aug 2026 11:00:01 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/branching-without-chaos-normalize-first-then-decide-1pek</link>
      <guid>https://dev.to/khmuhtadin/branching-without-chaos-normalize-first-then-decide-1pek</guid>
      <description>&lt;p&gt;Branching is where readable workflows go to die.&lt;/p&gt;

&lt;p&gt;Nested IFs, no fallback, different shapes per arm, then a hopeful Merge.&lt;/p&gt;

&lt;p&gt;Swipe for how I keep routes readable — normalize first, decide once, merge with a contract.&lt;/p&gt;

&lt;p&gt;How many nested IFs are in your messiest production flow?&lt;/p&gt;

&lt;p&gt;Episode 12 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Failure paths on purpose (happy path is half the design)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Thu, 06 Aug 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/failure-paths-on-purpose-happy-path-is-half-the-design-1ol5</link>
      <guid>https://dev.to/khmuhtadin/failure-paths-on-purpose-happy-path-is-half-the-design-1ol5</guid>
      <description>&lt;p&gt;Happy path is not a full design.&lt;/p&gt;

&lt;p&gt;If money or customer-facing steps can fail silently, you have hope — not production.&lt;/p&gt;

&lt;p&gt;Swipe for how I wire failure on purpose, without the full node lecture in the caption.&lt;/p&gt;

&lt;p&gt;Which of your critical workflows still fails quietly?&lt;/p&gt;

&lt;p&gt;Episode 11 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>APIs in production (rate limits, retries, Arc A milestone)</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Tue, 04 Aug 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/apis-in-production-rate-limits-retries-arc-a-milestone-3a8l</link>
      <guid>https://dev.to/khmuhtadin/apis-in-production-rate-limits-retries-arc-a-milestone-3a8l</guid>
      <description>&lt;p&gt;Connecting an API in the editor is easy.&lt;/p&gt;

&lt;p&gt;Surviving rate limits, expired tokens, and retries is the real skill.&lt;/p&gt;

&lt;p&gt;Swipe for batch+wait patterns, idempotent upserts, and an Arc A milestone check.&lt;/p&gt;

&lt;p&gt;Would your flakiest integration survive a token refresh right now?&lt;/p&gt;

&lt;p&gt;Episode 10 of Ship with n8n: 20 builder skills.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Build n8n Workflows with Indonesian Public Data Using the API Indonesia Community Node</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Fri, 24 Jul 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/build-n8n-workflows-with-indonesian-public-data-using-the-api-indonesia-community-node-e63</link>
      <guid>https://dev.to/khmuhtadin/build-n8n-workflows-with-indonesian-public-data-using-the-api-indonesia-community-node-e63</guid>
      <description>&lt;h1&gt;
  
  
  Build n8n Workflows with Indonesian Public Data Using the API Indonesia Community Node
&lt;/h1&gt;

&lt;p&gt;Using an API in n8n is easy. Rebuilding the same HTTP Request setup for every workflow is the repetitive part: URLs, headers, API keys, parameters, and response mapping.&lt;br&gt;
The API Indonesia community node packages that work into a native n8n node. Instead of starting from a generic HTTP Request node, you select a resource and operation, configure its fields, and continue building your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the node supports
&lt;/h2&gt;

&lt;p&gt;The node exposes Indonesian public-data resources such as administrative regions, prayer times, earthquakes, weather, exchange rates, public holidays, postal codes, schools, universities, and hospitals.&lt;br&gt;
It also includes Quran, Bible, KBBI, vehicle plates, minimum wages, halal certification, BPOM products, Hijri calendar data, astronomy, OJK investment products, early warnings, Bank Indonesia exchange rates, validators, and utility endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install the community node
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open n8n.&lt;/li&gt;
&lt;li&gt;Go to Settings, then Community Nodes.&lt;/li&gt;
&lt;li&gt;Select Install.&lt;/li&gt;
&lt;li&gt;Enter n8n-nodes-api-indonesia.
After installation, search for &lt;strong&gt;API Indonesia&lt;/strong&gt; when adding a node to a workflow.
## Create credentials once
Open the API Indonesia dashboard and create or copy an API key. Then, in n8n, create a credential of type &lt;strong&gt;API Indonesia API&lt;/strong&gt; and paste the key. Production keys start with aip_live_.
The default base URL is &lt;a href="https://use.apiindonesia.id" rel="noopener noreferrer"&gt;https://use.apiindonesia.id&lt;/a&gt;. You only need to change it when working against a development or staging environment.
## Example: retrieve the latest earthquakes
A minimal workflow can be:
&lt;strong&gt;Manual Trigger → API Indonesia → next action&lt;/strong&gt;
In the API Indonesia node, choose the &lt;strong&gt;Gempa&lt;/strong&gt; resource and the operation for the latest earthquakes. The node returns the latest records, ready to send to a chat alert, database, dashboard, or a filtering step.
That is the important difference from a demo-only integration: the node output is normal n8n data, so it can continue through the same workflow patterns you already use.
## Where this is useful
Use it when a workflow needs Indonesian public data without manually recreating a request every time. Examples include daily prayer-time notifications, earthquake alerts, regional onboarding forms, weather-aware operations, halal product discovery, and enrichment flows for education or healthcare data.
Start small. Pick one resource, run it from a Manual Trigger, inspect the output, then connect it to the next useful action.
## Resources
Community node package: &lt;a href="https://www.npmjs.com/package/n8n-nodes-api-indonesia" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/n8n-nodes-api-indonesia&lt;/a&gt;
API documentation: &lt;a href="https://docs.apiindonesia.id/" rel="noopener noreferrer"&gt;https://docs.apiindonesia.id/&lt;/a&gt;
API key dashboard: &lt;a href="https://dashboard.apiindonesia.id/" rel="noopener noreferrer"&gt;https://dashboard.apiindonesia.id/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>automation</category>
      <category>api</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
    <item>
      <title>API Indonesia is now available on RapidAPI</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Mon, 20 Jul 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/api-indonesia-is-now-available-on-rapidapi-5a9d</link>
      <guid>https://dev.to/khmuhtadin/api-indonesia-is-now-available-on-rapidapi-5a9d</guid>
      <description>&lt;p&gt;API Indonesia is now available on RapidAPI.&lt;br&gt;
If you prefer discovering and testing APIs through a marketplace workflow, you can explore it there. The listing covers Indonesian public data endpoints such as regions, postal codes, public holidays, prayer times, earthquakes, exchange rates, and format validation utilities.&lt;br&gt;
If you prefer the full self-serve path, the main site and docs remain the primary entry points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apiindonesia.id/" rel="noopener noreferrer"&gt;https://apiindonesia.id/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.apiindonesia.id/" rel="noopener noreferrer"&gt;https://docs.apiindonesia.id/&lt;/a&gt;
RapidAPI listing:
&lt;a href="https://rapidapi.com/contactmuhtadin/api/api-indonesia" rel="noopener noreferrer"&gt;https://rapidapi.com/contactmuhtadin/api/api-indonesia&lt;/a&gt;
This is a distribution update. Existing production base URL and API keys on the main platform stay the same.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>indonesia</category>
      <category>tools</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Per-product landing pages for API Indonesia</title>
      <dc:creator>Khairul Muhtadin</dc:creator>
      <pubDate>Fri, 17 Jul 2026 03:45:37 +0000</pubDate>
      <link>https://dev.to/khmuhtadin/per-product-landing-pages-for-api-indonesia-53ko</link>
      <guid>https://dev.to/khmuhtadin/per-product-landing-pages-for-api-indonesia-53ko</guid>
      <description>&lt;p&gt;API Indonesia now has a product catalog and per-API landing pages.&lt;/p&gt;

&lt;p&gt;Instead of forcing every visitor straight into a long docs page, each dataset has its own page under /produk. There are Indonesian and English versions.&lt;/p&gt;

&lt;p&gt;Coverage snapshot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;23+ API products&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;280K+ data records&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Regions, weather, Bank Indonesia rates, validation, halal, BPOM, Hijri calendar, schools, earthquakes, and more&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What this is for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;discover which public datasets exist&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;understand use cases before reading the full reference&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jump into the right docs section faster&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Catalog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apiindonesia.id/produk/" rel="noopener noreferrer"&gt;https://apiindonesia.id/produk/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apiindonesia.id/produk/wilayah" rel="noopener noreferrer"&gt;https://apiindonesia.id/produk/wilayah&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a discovery and onboarding update. It does not change the production API base URL or existing API keys.&lt;/p&gt;

</description>
      <category>api</category>
      <category>indonesia</category>
      <category>documentation</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
