<?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>Forem: Muhammad Syarwani</title>
    <description>The latest articles on Forem by Muhammad Syarwani (@ibnushahraa).</description>
    <link>https://forem.com/ibnushahraa</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%2F3546469%2Ffd626026-2c37-4b1a-a254-e0dfc7dabefb.jpeg</url>
      <title>Forem: Muhammad Syarwani</title>
      <link>https://forem.com/ibnushahraa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ibnushahraa"/>
    <language>en</language>
    <item>
      <title>Simple-proxy-id — A tiny yet secure proxy for Node.js (zero dependencies)</title>
      <dc:creator>Muhammad Syarwani</dc:creator>
      <pubDate>Sat, 18 Oct 2025 02:04:06 +0000</pubDate>
      <link>https://forem.com/ibnushahraa/simple-proxy-id-a-tiny-yet-secure-proxy-for-nodejs-zero-dependencies-1pk7</link>
      <guid>https://forem.com/ibnushahraa/simple-proxy-id-a-tiny-yet-secure-proxy-for-nodejs-zero-dependencies-1pk7</guid>
      <description>&lt;h2&gt;
  
  
  🧠 From a Small Frustration to a Tiny but Powerful Proxy
&lt;/h2&gt;

&lt;p&gt;A few weeks ago, I just needed a small proxy for testing local APIs.&lt;br&gt;
Something that &lt;em&gt;just works&lt;/em&gt; — no heavy setup, no extra dependencies, no magic.&lt;/p&gt;

&lt;p&gt;But as usual, once something works, developers can’t resist improving it 😅&lt;br&gt;
That’s how &lt;strong&gt;&lt;a href="https://github.com/ibnushahraa/simple-proxy-id" rel="noopener noreferrer"&gt;simple-proxy-id&lt;/a&gt;&lt;/strong&gt; was born.&lt;/p&gt;

&lt;p&gt;It’s a &lt;strong&gt;lightweight HTTP/HTTPS proxy for Node.js&lt;/strong&gt;,&lt;br&gt;
built &lt;strong&gt;with zero dependencies&lt;/strong&gt;, yet still secure, fast, and flexible.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Why I Built It
&lt;/h2&gt;

&lt;p&gt;While working with APIs, I noticed two extremes in most proxy libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They’re &lt;strong&gt;too flexible&lt;/strong&gt;, which often leads to open-proxy abuse.&lt;/li&gt;
&lt;li&gt;Or &lt;strong&gt;too limited&lt;/strong&gt;, making them hard to use in real server environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I aimed for something in between — &lt;strong&gt;secure, simple, but production-ready&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Quick Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createProxy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simple-proxy-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;createProxy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;changeOrigin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;pathRewrite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^/api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it — your proxy is up and running.&lt;br&gt;
No config files, no dependencies, no magic behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Key Features
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Fixed target&lt;/strong&gt; — cannot be changed by external requests (prevents open proxy abuse)&lt;br&gt;
✅ &lt;strong&gt;Path rewrite&lt;/strong&gt; — support for both pattern objects and custom functions&lt;br&gt;
✅ &lt;strong&gt;Plugins&lt;/strong&gt; — CORS, daily rotating logger, brute-force attack detection&lt;br&gt;
✅ &lt;strong&gt;Real IP detection&lt;/strong&gt; — supports Cloudflare Tunnel and X-Forwarded-For&lt;br&gt;
✅ &lt;strong&gt;Zero dependency, high performance&lt;/strong&gt; — ~1,660 req/sec (p50: 52 ms, p99: 138 ms)&lt;/p&gt;

&lt;p&gt;No frameworks, no dependencies — just pure Node.js, connection pooling,&lt;br&gt;
and a lot of small optimizations to make it perform well under load.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Why It Matters
&lt;/h2&gt;

&lt;p&gt;The project started from a small frustration —&lt;br&gt;
but sometimes that’s exactly where useful tools come from.&lt;/p&gt;

&lt;p&gt;If you often deal with API testing, debugging, or quick proxy setups,&lt;br&gt;
you might find this handy 👇&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ibnushahraa/simple-proxy-id" rel="noopener noreferrer"&gt;github.com/ibnushahraa/simple-proxy-id&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;NPM:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/simple-proxy-id" rel="noopener noreferrer"&gt;npmjs.com/package/simple-proxy-id&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Sometimes the best open-source projects don’t start with a plan —&lt;br&gt;
they start with &lt;em&gt;one small problem you just couldn’t ignore.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>node</category>
    </item>
    <item>
      <title>🌏 Nusantara-API 🇮🇩 — from MySQL dump to a tiny 420 KB library</title>
      <dc:creator>Muhammad Syarwani</dc:creator>
      <pubDate>Sat, 11 Oct 2025 01:26:30 +0000</pubDate>
      <link>https://forem.com/ibnushahraa/nusantara-api-from-mysql-dump-to-a-tiny-420-kb-library-44fo</link>
      <guid>https://forem.com/ibnushahraa/nusantara-api-from-mysql-dump-to-a-tiny-420-kb-library-44fo</guid>
      <description>&lt;p&gt;A while ago, I was looking for &lt;strong&gt;Indonesian regional data&lt;/strong&gt; for one of my projects.&lt;br&gt;&lt;br&gt;
Most of the datasets I found came as large &lt;strong&gt;MySQL dumps&lt;/strong&gt;, which required importing into a database just to access provinces or districts.&lt;/p&gt;

&lt;p&gt;Then I found the file &lt;a href="https://github.com/cahyadsn/wilayah/blob/master/db/wilayah.sql" rel="noopener noreferrer"&gt;&lt;code&gt;wilayah.sql&lt;/code&gt;&lt;/a&gt; from &lt;a href="https://github.com/cahyadsn/wilayah" rel="noopener noreferrer"&gt;&lt;strong&gt;cahyadsn/wilayah&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
It contains complete administrative data — provinces, cities, districts, and villages across Indonesia.&lt;/p&gt;

&lt;p&gt;I tried to process it so developers could use it directly — no database setup, no SQL import.&lt;br&gt;&lt;br&gt;
After cleaning and compressing it with &lt;strong&gt;Brotli&lt;/strong&gt;, the raw data size went from &lt;strong&gt;~2.5 MB&lt;/strong&gt; down to only &lt;strong&gt;~420 KB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;&lt;a href="https://github.com/ibnushahraa/nusantara-api" rel="noopener noreferrer"&gt;Nusantara-API 🚀&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A small library for accessing Indonesian regional data — usable in &lt;strong&gt;Node.js&lt;/strong&gt;, &lt;strong&gt;frontend&lt;/strong&gt;, or directly via &lt;strong&gt;CDN&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ibnushahraa/nusantara-api" rel="noopener noreferrer"&gt;github.com/ibnushahraa/nusantara-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source DB (MySQL dump):&lt;/strong&gt; &lt;a href="https://github.com/cahyadsn/wilayah/blob/master/db/wilayah.sql" rel="noopener noreferrer"&gt;github.com/cahyadsn/wilayah&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/nusantara-api" rel="noopener noreferrer"&gt;npmjs.com/package/nusantara-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://ibnushahraa.github.io/nusantara-api" rel="noopener noreferrer"&gt;ibnushahraa.github.io/nusantara-api&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Sometimes small experiments end up becoming something useful for others.&lt;br&gt;&lt;br&gt;
This project started as a simple curiosity — and turned into a compact, shareable dataset for developers who just need quick access to Indonesian regions.&lt;/p&gt;

&lt;p&gt;If you find it helpful or have ideas for improvement, feel free to open an issue or contribute on GitHub 🙌  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>mysql</category>
    </item>
    <item>
      <title>🧮 Introducing number-to-words-id — Convert Numbers to Words in 3 Languages</title>
      <dc:creator>Muhammad Syarwani</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:46:30 +0000</pubDate>
      <link>https://forem.com/ibnushahraa/introducing-number-to-words-id-convert-numbers-to-words-in-3-languages-4bnc</link>
      <guid>https://forem.com/ibnushahraa/introducing-number-to-words-id-convert-numbers-to-words-in-3-languages-4bnc</guid>
      <description>&lt;h1&gt;
  
  
  🧮 I Built a Library to Convert Numbers into Words in 3 Languages
&lt;/h1&gt;

&lt;p&gt;Have you ever needed a &lt;em&gt;“terbilang”&lt;/em&gt; function in your project?&lt;br&gt;
When I worked on billing and invoice systems, I realized that most libraries only support English — none for Indonesian or Malay.&lt;br&gt;
So I decided to create &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/number-to-words-id" rel="noopener noreferrer"&gt;&lt;code&gt;number-to-words-id&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s a lightweight Node.js library that converts numbers into words in &lt;strong&gt;Indonesian&lt;/strong&gt;, &lt;strong&gt;Malay&lt;/strong&gt;, and &lt;strong&gt;English&lt;/strong&gt; — all offline, no dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Quick Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;toWords&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number-to-words-id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toWords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;75000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; 
&lt;span class="c1"&gt;// "tujuh puluh lima ribu"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toWords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;75000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="c1"&gt;// "seventy-five thousand"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toWords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;75000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="c1"&gt;// "tujuh puluh lima ribu"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🇮🇩 Indonesian, 🇲🇾 Malay, 🇬🇧 English&lt;/li&gt;
&lt;li&gt;Currency and ordinal support&lt;/li&gt;
&lt;li&gt;Clean, dependency-free JavaScript&lt;/li&gt;
&lt;li&gt;Tiny size and fast performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Why I Built It
&lt;/h2&gt;

&lt;p&gt;Because every time I saw &lt;code&gt;terbilang(12345)&lt;/code&gt; in projects, it was always a custom function someone copied from StackOverflow 😅&lt;br&gt;
Now, we have a proper open-source version — tested, maintained, and versioned on npm.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 npm: &lt;a href="https://www.npmjs.com/package/number-to-words-id" rel="noopener noreferrer"&gt;number-to-words-id&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub: &lt;a href="https://github.com/ibnushahraa/number-to-words-id" rel="noopener noreferrer"&gt;github.com/ibnushahraa/number-to-words-id&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you find it useful, please give it a ⭐ on GitHub — it’ll help more developers discover it!&lt;br&gt;
I’d also love to hear feedback or feature ideas.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #nodejs #javascript #npm #opensource #indonesia&lt;/p&gt;

</description>
      <category>npm</category>
      <category>showdev</category>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
