<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Mohd Hisyamudin — Blog</title>
    <link>https://mohdhisyamudin.com/blog/</link>
    <atom:link href="https://mohdhisyamudin.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Thoughts on AI automation, vibe coding, and building practical systems without a tech background.</description>
    <language>ms</language>
    <lastBuildDate>Thu, 22 Oct 2026 10:56:46 +0800</lastBuildDate>
    <generator>mohdhisyamudin.com</generator>
    <item>
      <title>KISEW MAHA 2026: 2,949 Leads Dalam 10 Hari — Full Breakdown</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=kisew-maha-2026-full-breakdown</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=kisew-maha-2026-full-breakdown</guid>
      <pubDate>Thu, 22 Oct 2026 08:00:00 +0800</pubDate>
      <category>Digital Solutions</category>
      <description>Mula dengan satu soalan yang salah Bila orang tanya &quot;berapa leads KISEW dapat?&quot;, jawapan aku selalu berubah ikut siapa yang tanya. Kalau vendor tanya, aku cakap 807.</description>
      <content:encoded><![CDATA[<h2>Mula dengan satu soalan yang salah</h2>

<p>Bila orang tanya "berapa leads KISEW dapat?", jawapan aku selalu berubah ikut siapa yang tanya. Kalau vendor tanya, aku cakap 807. Kalau bos tanya, aku cakap 2,949. Dua-dua betul — cuma satu tu angka hari keempat, satu lagi angka penuh sepuluh hari.</p>

<p>Dan itu sebenarnya masalah pertama yang aku hadapi bila nak tulis breakdown ni: <strong>angka sorang-sorang tak bermakna apa-apa tanpa konteks</strong>. Jadi biar aku cerita dari mula, bukan dari nombor.</p>

<p>MAHA 2026 di MAEPS Serdang, Sarawak Pavilion. Sepuluh hari. Aku dapat satu booth, satu skrin, dan satu andaian yang salah: "orang datang exhibition nak tengok produk, bukan main game."</p>

<p>Andaian tu pecah dalam masa empat jam pertama.</p>

<h2>Apa KISEW ni sebenarnya</h2>

<p>KISEW bukan satu app. Ia tiga benda yang berkongsi satu pangkalan data:</p>

<p><strong>Satu — kiosk.</strong> Skrin besar di booth. Orang datang, taip nama dan nombor telefon, kemudian tanya apa-apa pasal Sarawak kepada chatbot. Bilingual, BM dan English, sebab separuh pelawat datang dari luar.</p>

<p><strong>Dua — quiz.</strong> Sepuluh soalan pasal Sarawak. Passing mark tujuh. Dua cubaan. Kalau lulus, boleh spin gacha untuk menang hadiah.</p>

<p><strong>Tiga — redemption.</strong> Hadiah bukan dipegang di tangan. Ia masuk sebagai claim code dalam sistem. Pemenang pergi ke kaunter, staf scan, sistem sahkan, baru hadiah diserahkan.</p>

<p>Yang ketiga tu bunyi macam detail kecil. Ia sebenarnya sebab utama sistem ni tak jadi huru-hara.</p>

<h2>Kenapa gacha, bukan bagi hadiah terus</h2>

<p>Ini bukan keputusan marketing. Ini keputusan operasi.</p>

<p>Kalau kau bagi hadiah terus kepada sesiapa yang datang, kau akan habis stok dalam dua hari dan tak dapat apa-apa data. Kalau kau bagi hadiah selepas isi borang, orang isi borang dengan nombor telefon palsu.</p>

<p>Gacha buat satu benda: ia tukar <em>masa</em> dengan <em>data</em>. Orang sanggup duduk sepuluh minit jawab quiz sebab ada peluang menang. Dalam sepuluh minit tu, kau dapat nombor telefon yang betul (sebab ia diikat pada claim code), nama, dan satu rekod interaksi yang kau boleh guna kemudian.</p>

<p>Dan yang paling penting — kau dapat <strong>alasan untuk orang kembali</strong>. Setiap hari ada Happy Hour, sesi dua jam di mana kuota hadiah ditambah. Orang yang dah main semalam datang balik.</p>

<h2>Angka sebenar, sepuluh hari</h2>

<p>Ini angka yang aku verify terus dari Supabase production, bukan dari dashboard marketing:</p>

<p><strong>2,949 leads.</strong> Nombor telefon unik. Zero duplicate. Ini penting sebab kalau kau tak buat constraint pada nombor telefon, kau akan dapat 5,000 "leads" yang sebenarnya 1,800 orang.</p>

<p><strong>2,088 pemenang hadiah</strong> — setiap satu dengan claim code sendiri.</p>

<p><strong>1,989 hadiah ditebus.</strong> Kadar penebusan 95.3%.</p>

<p><strong>436 skor sempurna</strong> — orang yang jawab 10/10.</p>

<p><strong>1,344 soalan AI.</strong> Bukan "berapa kali chatbot dibuka" — ini soalan sebenar yang ditaip orang.</p>

<p>Dan angka hari keempat, yang aku selalu sebut dulu: 807 leads, 594 hadiah, 120 skor sempurna. Hari keempat sahaja mengalahkan gabungan tiga hari pertama dalam hampir semua metrik.</p>

<h2>Hari yang sistem hampir mati</h2>

<p>Hari keempat tu juga hari yang paling aku risau.</p>

<p>381 leads dalam satu hari. Bukan lead biasa — setiap satu melalui chatbot, quiz, gacha, dan redemption. 359 quiz siap, 291 hadiah keluar, 64 orang dapat 10/10.</p>

<p>Dua sesi Happy Hour hari tu: tengah hari dapat 132 leads, malam dapat 231. Yang malam tu adalah dua kali ganda sesi biasa. Sistem tak down. Tapi bukan sebab ia hebat — sebab aku dah buat keputusan dua minggu sebelum tu.</p>

<p>Keputusan tu: <strong>jangan simpan apa-apa yang boleh dikira dalam browser.</strong> Kuota hadiah, baki stok, status redemption — semua diurus dalam database dengan row locking. Kalau kau simpan baki stok dalam JavaScript, dua kiosk akan bagi hadiah yang sama pada masa yang sama.</p>

<h2>Benda yang aku tak jangka</h2>

<p>Bila aku baca balik 1,344 soalan AI tu, ada satu pola yang jelas: <strong>orang tanya benda yang boleh dicari di Google, tapi mereka tanya chatbot sebab mereka sedang berdiri di booth kau.</strong></p>

<p>Top lima soalan:</p>

<p>1. Resipi laksa Sarawak step-by-step — 43 kali<br>
2. Apa itu pua kumbu — 40 kali<br>
3. Muzium kucing di mana — 29 kali<br>
4. Orangutan Semenggoh — 27 kali<br>
5. Tarikh dan lokasi MAHA — 26 kali</p>

<p>Perhatikan nombor lima. <strong>Dua puluh enam orang tanya di mana event yang mereka sedang berada.</strong> Itu bukan kegagalan chatbot. Itu kegagalan signage.</p>

<p>Dari situ aku kenal pasti enam jurang knowledge base yang aku tak nampak masa tulis kandungan: resipi teknikal, logistik venue, sejarah dan tokoh, fakta ringkas, lokasi spesifik, dan dialek Sarawak. Semua enam tu aku tambah semasa event berjalan — dokumen KB naik dari 9 ke 15 dalam sepuluh hari.</p>

<h2>Benda yang tak jadi</h2>

<p>Kalau aku cuma cerita yang berjaya, artikel ni tak berguna.</p>

<p><strong>Satu — admin dashboard lambat.</strong> Selepas event, aku buka dashboard dan ia ambil masa berpuluh saat untuk load. Puncanya jelas bila aku periksa: kod ambil semua 2,949 baris lead, hantar ke browser, kemudian kira statistik dalam JavaScript. Setiap kali buka tab, 2,949 rows melintasi network.</p>

<p>Fix: satu fungsi database yang kira semua sekali di server, pulangkan satu objek kecil. Satu panggilan ganti puluhan. Dashboard jadi serta-merta.</p>

<p><strong>Dua — kuota Happy Hour tersangkut.</strong> Ada satu ketika kuota tak turun walaupun hadiah dah keluar. Puncanya bukan logik — ia migration lama yang ter-overwrite semasa deploy. Pelajaran yang aku bawa sampai sekarang: <strong>kalau migration dah di-apply, jangan edit balik. Buat migration baru.</strong></p>

<p><strong>Tiga — link event tersasar.</strong> Bila event ditukar dari satu ke event lain, ada tiga tempat dalam kod yang simpan slug event. Aku update dua, terlupa satu. Akibatnya QR code bawa orang ke event yang dah tamat. Tiga tempat. Sentiasa tiga tempat.</p>

<h2>Apa yang aku buat lain kali</h2>

<p>Kalau aku ulang projek ni, lima benda berubah:</p>

<p><strong>1. Angka jangan jadi satu-satunya ukuran.</strong> 2,949 leads nampak hebat sampai kau tanya "berapa yang convert jadi pelanggan sebenar?" Sistem ni tak jawab soalan tu. Versi seterusnya mesti ada post-event follow-up terbina dalam, bukan sebagai idea kemudian.</p>

<p><strong>2. Signage dulu, chatbot kemudian.</strong> Dua puluh enam orang tanya lokasi event melalui chatbot. Satu papan tanda yang betul akan jimat 26 interaksi dan beri jawapan lebih laju.</p>

<p><strong>3. Kuota hadiah mesti boleh diselaraskan dari luar.</strong> Sekarang ia perlu deploy. Sepatutnya ada satu skrin admin yang boleh tukar kuota dalam masa sepuluh saat, sebab keperluan event berubah setiap jam.</p>

<p><strong>4. Ujian dengan beban sebenar, bukan beban andaian.</strong> Aku uji dengan 50 concurrent user. Realitinya 381 leads sehari bermakna berpuluh orang berdiri menunggu skrin yang sama. Ujian seterusnya mesti simulate orang beratur, bukan orang duduk.</p>

<p><strong>5. Data lead mesti keluar dalam format yang boleh diguna.</strong> CSV dengan 2,949 baris tak berguna kalau tiada konteks: siapa datang hari apa, main berapa kali, dapat hadiah apa, tanya apa. Versi seterusnya eksport satu profil per orang, bukan satu baris per transaksi.</p>

<h2>Kenapa aku tulis ni</h2>

<p>Bukan untuk tunjuk sistem ni hebat. Sistem ni berfungsi, dan itu punca ia dipakai 2,949 kali.</p>

<p>Aku tulis sebab kebanyakan case study yang aku baca cerita hasil, bukan keputusan. Dan keputusan yang paling penting dalam projek ni bukan teknikal — ia satu soalan masa minggu kedua: <em>nak tambah feature, atau nak pastikan yang sedia ada tak pecah?</em></p>

<p>Aku pilih yang kedua. Setiap kali.</p>

<p>Kalau kau sedang bina sesuatu yang akan digunakan orang ramai dalam masa terdekat, satu nasihat: <strong>sistem yang membosankan tapi tak pecah lebih bernilai dari sistem menarik yang perlu kau restart tengah hari.</strong></p>

<p>KISEW tak menarik dari segi teknikal. Ia cuma tak mati.</p>]]></content:encoded>
    </item>
    <item>
      <title>VPS 8GB: Bila Swap Jadi Penyelamat (Dan Bila Ia Menipu Kau)</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=vps-8gb-bila-swap-jadi-penyelamat</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=vps-8gb-bila-swap-jadi-penyelamat</guid>
      <pubDate>Wed, 21 Oct 2026 08:00:00 +0800</pubDate>
      <category>DevOps &amp; Deployment</category>
      <description>Satu malam, build mati tanpa sebab Ia bukan error. Tiada stack trace. Tiada mesej merah. Cuma satu baris: exit 255 , selepas 52 saat.</description>
      <content:encoded><![CDATA[<h2>Satu malam, build mati tanpa sebab</h2>

<p>Ia bukan error. Tiada stack trace. Tiada mesej merah.</p>

<p>Cuma satu baris: <code>exit 255</code>, selepas 52 saat.</p>

<p>Aku buka log Coolify, scroll dari atas ke bawah tiga kali. Kosong. Aku jalankan build yang sama pada Mac mini — lulus, tiga minit, tiada masalah. Aku push semula. Gagal lagi. Sama, 52 saat.</p>

<p>Masa tu aku dah mula salahkan kod. Mungkin dependency baru. Mungkin Next.js 16 dengan Turbopack ada bug. Aku baca issue GitHub selama dua jam.</p>

<p>Kemudian aku tanya soalan yang sepatutnya aku tanya dari awal: <strong>apa yang berubah pada server, bukan pada kod?</strong></p>

<h2>Jawapannya ada dalam satu command</h2>

<pre><code>free -h</code></pre>

<pre><code>               total        used        free      shared  buff/cache
Mem:           7.8Gi       3.9Gi       1.2Gi       112Mi       2.7Gi
Swap:          4.0Gi       3.3Gi       0.7Gi</code></pre>

<p>Swap <strong>83% penuh</strong>. Mesin ni bukan kekurangan RAM sedikit — ia tercekik.</p>

<p>Dan bila mesin tercekik, benda pertama yang mati ialah proses yang paling lapar RAM. Dalam kes aku, itu <code>next build</code>.</p>

<p>Bukan kod aku salah. Mesin tu cuma tak cukup nafas.</p>

<h2>Apa sebenarnya ada dalam VPS 8GB tu</h2>

<p>Ini senarai servis yang berjalan pada satu box, pada masa tu:</p>

<p>— Coolify sendiri (dashboard + proxy + builder)<br>
— Kembara AI (Next.js app + Postgres + Redis + Evolution API + Socket.io)<br>
— n8n (main process + task runner)<br>
— Temporal (untuk workflow panjang)<br>
— MySQL<br>
— Apache<br>
— Postiz (social scheduler)<br>
— WordPress (projek lama)</p>

<p>Sembilan benda. Lapan gigabait.</p>

<p>Setiap satu munasabah bila berdiri sendiri. Digabung, ia satu mesin yang bekerja pada had setiap minit, sepanjang hari.</p>

<h2>Kenapa swap bukan penyelesaian</h2>

<p>Reaksi pertama orang bila swap penuh: tambah swap lagi.</p>

<p>Itu yang aku buat. Tambah <code>/swapfile2</code> 2GB, total jadi 6GB. Build lulus. Masalah selesai — untuk seminggu.</p>

<p>Kenapa ia bukan penyelesaian sebenar:</p>

<p><strong>Swap ialah disk, bukan RAM.</strong> Bila sistem terpaksa swap, ia baca dan tulis ke SSD. SSD lebih lambat 100 hingga 1,000 kali dari RAM. Jadi bila swap penuh, kau bukan "kekurangan memori sikit" — kau buat mesin berjalan pada kelajuan disk.</p>

<p><strong>Ia menangguhkan masalah, bukan selesaikan.</strong> Setiap servis baru yang kau tambah akan makan ruang yang kau baru bagi. Dalam sebulan, swap penuh balik.</p>

<p><strong>Ia menyembunyikan punca sebenar.</strong> Selagi build lulus, kau takkan tanya "kenapa aku letak sembilan servis dalam satu mesin?"</p>

<p>Swap menyelamatkan kau hari ini. Ia tak menyelamatkan kau bulan depan.</p>

<h2>Apa yang aku buat selepas tu</h2>

<p>Aku tak upgrade RAM. Aku buat tiga benda lain dulu, dalam susunan ni:</p>

<h3>1. Buang yang tak perlu</h3>

<p>Aku matikan WordPress dan Postiz. Kedua-duanya projek lama yang tak aktif. Volume simpan, container stop.</p>

<p>Hasil: RAM turun dari <strong>5.0GB ke 1.9GB</strong>. Swap dari <strong>2.8GB ke sifar</strong>.</p>

<p>Itu bukan penambahbaikan kecil. Itu satu mesin yang berhenti tercekik.</p>

<h3>2. Kemas build cache</h3>

<p>Seminggu kemudian disk naik mendadak. Aku semak:</p>

<pre><code>docker system df</code></pre>

<p>Build cache: <strong>7.35GB</strong>. Semua reclaimable. Sifar aktif.</p>

<p>Setiap build menyimpan layer untuk build seterusnya lebih laju. Bagus. Tapi bila kau push 40 kali dalam seminggu, ia jadi sampah yang membesar senyap.</p>

<p>Satu command, tiga puluh saat, 7GB balik.</p>

<h3>3. Tetapkan n8n supaya berhenti menyimpan sejarah</h3>

<p>n8n simpan setiap execution. Database SQLite naik ke <strong>2.0GB</strong>.</p>

<p>Bila aku siasat, data sebenar cuma <strong>34MB</strong>. Selebihnya free pages — ruang yang pernah dipakai, kemudian dipadam, tapi tak dipulangkan ke disk.</p>

<p>Fix: prune execution lama, kemudian VACUUM. Database turun dari 2.0GB ke <strong>26MB</strong>.</p>

<p>Dan yang lebih penting — aku set retention supaya ia tak membesar balik:</p>

<pre><code>EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168
EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none</code></pre>

<h2>Bila kau patut upgrade, bukan optimize</h2>

<p>Ini bahagian yang orang selalu tanya, dan jawapan aku tak popular: <strong>kalau kau tanya soalan tu, kau mungkin memang patut upgrade.</strong></p>

<p>Aku optimize sebab masa tu aku masih ada benda jelas untuk dibuang. Tapi bila kau dah buang semua yang patut dibuang, dan mesin masih tercekik — itu bukan masalah konfigurasi lagi. Itu kapasiti.</p>

<p>Petunjuk yang kau dah sampai had:</p>

<p>— Swap kekal penuh walaupun selepas cleanup<br>
— Build gagal secara rawak (kadang lulus, kadang tidak, kod sama)<br>
— Kau mula menolak servis baru sebab "nanti mesin tak cukup"<br>
— Kau restart servis setiap hari sebagai rutin, bukan sebagai kejadian</p>

<p>Bila empat perkara ni berlaku, tambah swap lagi takkan tolong. Kau cuma beli masa.</p>

<h2>Pilihan yang aku tak ambil (dan kenapa)</h2>

<p><strong>Upgrade ke 16GB.</strong> Selesaikan masalah selama enam bulan. Tapi kos bulanan naik dua kali ganda untuk mesin yang separuh isinya tak perlu ada.</p>

<p><strong>Pecah ke dua VPS.</strong> Satu untuk automation stack, satu untuk app production. Ini yang aku rasa betul jangka panjang, tapi ia kerja — pindah data, tukar DNS, test semula. Aku belum buat.</p>

<p><strong>Pindah ke managed service.</strong> Mahal dengan cepat. Untuk lapan projek, satu Postgres managed sahaja dah lebih dari kos VPS sekarang.</p>

<p>Aku pilih: buang yang tak perlu dulu, ukur semula, baru putuskan. Ternyata buang WordPress dan Postiz dah cukup untuk sementara.</p>

<h2>Tiga perkara yang aku buat setiap kali VPS rasa perlahan</h2>

<p><strong>Satu — semak memori dulu, bukan CPU.</strong></p>

<pre><code>free -h
ps aux --sort=-%mem | head -10</code></pre>

<p>Kalau swap tinggi, jawapannya ada di situ, bukan di graf CPU.</p>

<p><strong>Dua — semak disk guna satu command.</strong></p>

<pre><code>docker system df</code></pre>

<p>Empat baris tu bagi kau gambar penuh: images, containers, volumes, build cache. Aku dah jumpa ber-GB sampah setiap kali guna command ni.</p>

<p><strong>Tiga — semak servis yang berjalan, bukan yang patut berjalan.</strong></p>

<pre><code>docker ps --format '{{.Names}}\t{{.Status}}'</code></pre>

<p>Kadang kau akan jumpa servis yang kau ingat dah mati, masih hidup. Atau sebaliknya.</p>

<h2>Penutup</h2>

<p>VPS 8GB tu masih berjalan hari ini. Masih dengan swap yang kadang naik bila aku deploy serentak. Masih dengan sembilan servis yang aku tak sempat pecahkan.</p>

<p>Tapi ia tak mati lagi. Dan perbezaan antara "VPS yang buat aku bangun tengah malam" dengan "VPS yang aku tak fikir langsung" bukan RAM — ia keputusan untuk berhenti tambah benda, dan mula buang benda.</p>

<p>Kalau kau mengurus server sendiri, satu tabiat yang paling berbaloi: <strong>sebulan sekali, buka <code>docker system df</code> dan <code>free -h</code>. Bukan bila masalah datang. Sebelum.</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>Coolify: Self-Hosting Tanpa Sakit Kepala</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=coolify-self-hosting-tanpa-sakit-kepala</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=coolify-self-hosting-tanpa-sakit-kepala</guid>
      <pubDate>Tue, 20 Oct 2026 08:00:00 +0800</pubDate>
      <category>DevOps &amp; Deployment</category>
      <description>Aku bukan DevOps Biar aku mulakan dengan pengakuan: aku tak ada latar belakang DevOps. Aku tak tahu apa itu Kubernetes masa mula.</description>
      <content:encoded><![CDATA[<h2>Aku bukan DevOps</h2>

<p>Biar aku mulakan dengan pengakuan: aku tak ada latar belakang DevOps. Aku tak tahu apa itu Kubernetes masa mula. Aku belajar Docker sebab satu build mati dan aku terpaksa faham kenapa.</p>

<p>Tapi hari ini, semua projek aku berjalan atas satu VPS 8GB yang aku uruskan sendiri, dengan Coolify sebagai lapisan atas. Bukan sebab aku nak jadi sysadmin. Sebab alternatifnya — bayar satu managed platform untuk setiap projek — tak masuk akal bila kau ada lapan projek dan separuh daripadanya belum hasilkan duit.</p>

<p>Artikel ni bukan tutorial pemasangan. Ia cerita apa yang aku belajar selepas setahun guna, termasuk lubang yang aku jatuh masuk.</p>

<h2>Apa Coolify buat, dalam satu ayat</h2>

<p>Coolify ialah <strong>dashboard untuk Docker</strong> yang faham Git.</p>

<p>Kau sambung repo GitHub, dia pull, build, jalankan container, urus SSL, dan tunjuk log. Benda yang biasanya kau taip dalam terminal selama dua jam, dia buat dalam satu klik — atau automatik bila kau push.</p>

<p>Yang penting: ia bukan platform berbayar. Ia software yang kau jalankan atas server sendiri. Jadi kos bulanan kau = kos VPS sahaja.</p>

<h2>Kenapa aku pilih self-host, bukan Vercel untuk semua</h2>

<p>Sebenarnya aku guna dua-dua. Ini bukan pilihan ideologi, ini pilihan kos dan keperluan.</p>

<p><strong>Vercel untuk static dan Next.js ringkas.</strong> Push, siap. Tiada server untuk difikir. Percuma untuk projek kecil.</p>

<p><strong>Coolify untuk yang perlukan VPS sebenar.</strong> Bila projek kau perlukan:</p>

<p>— Container yang jalan 24 jam (Evolution API untuk WhatsApp, n8n untuk workflow)<br>
— Postgres yang kau nak backup sendiri<br>
— Redis untuk queue<br>
— WebSocket yang perlu state kekal</p>

<p>Vercel tak bagi benda-benda ni. Bukan sebab ia teruk — ia memang direka untuk serverless. Kalau kau paksa serverless buat kerja yang perlukan process kekal, kau akan menangis.</p>

<h2>Enam perkara yang aku belajar dengan menyakitkan</h2>

<h3>1. Jangan stop service guna <code>docker stop</code></h3>

<p>Ini kesilapan pertama dan paling memalukan.</p>

<p>Aku nak jimat RAM, jadi aku taip <code>docker stop postiz</code> melalui SSH. Container mati. Dua minit kemudian ia hidup balik.</p>

<p>Puncanya: Coolify ada watchdog yang pastikan setiap service yang sepatutnya jalan, jalan. Kalau kau matikan dari luar, ia anggap itu crash dan restart.</p>

<p><strong>Betul:</strong> stop dari UI Coolify. Baru ia tak dilawan.</p>

<h3>2. Edit <code>.env</code> sahaja tak ubah apa-apa</h3>

<p>Aku ubah satu env variable n8n untuk prune execution data. Simpan. Restart. Tiada perubahan.</p>

<p>Selepas sejam barulah aku faham: container tu guna <code>env_file: .env</code> dalam docker-compose. Env dibaca masa container <em>dicipta</em>, bukan masa ia <em>dimulakan</em>. Restart tak baca semula fail.</p>

<p><strong>Betul:</strong></p>

<pre><code>docker compose up -d --force-recreate</code></pre>

<p>Bukan <code>restart</code>. <code>force-recreate</code>.</p>

<h3>3. Build cache boleh makan 7GB tanpa kau sedar</h3>

<p>Disk naik 10GB dalam satu hari. Aku ingat ada log yang membengkak atau container yang menulis sampah.</p>

<p>Rupanya build cache. <strong>7.346GB</strong>, 93 entries, sifar aktif.</p>

<p>Setiap kali Coolify build, ia simpan layer untuk build seterusnya lebih laju. Bagus untuk kelajuan. Tapi kalau kau push 40 kali dalam seminggu (macam aku masa kejar bug), ia terkumpul jadi sampah.</p>

<p><strong>Betul:</strong> semak <code>docker system df</code> setiap kali disk naik mendadak. Kalau build cache besar dan semua <em>reclaimable</em>, buang:</p>

<pre><code>docker builder prune -f</code></pre>

<p>Aku buat ni semasa VPS dalam keadaan kritikal dan dapat balik 7GB dalam masa tiga puluh saat.</p>

<h3>4. Build mati senyap biasanya bukan salah kod</h3>

<p>Build gagal dengan <code>exit 255</code>. Log tunjuk ia mati dalam <code>next build</code> selepas ~52 saat. Tiada error message. Tiada stack trace. Cuma berhenti.</p>

<p>Kod yang sama lulus pada laptop aku.</p>

<p>Puncanya bukan kod. Puncanya <strong>RAM</strong>. Turbopack dalam Next.js 16 makan RAM lebih banyak dari yang VPS 8GB boleh bagi bila empat container lain sedang berjalan.</p>

<p><strong>Betul:</strong> bila build mati senyap tanpa error, semak RAM dan swap dulu, bukan kod. Kalau swap penuh, itu jawapannya.</p>

<h3>5. Verify deployment kena tengok chunk yang betul</h3>

<p>Aku push fix, deploy kata berjaya, tapi perubahan tak nampak.</p>

<p>Sebabnya: aku grep string baru dalam bundle, tapi aku grep dalam chunk yang salah. Next.js pecahkan app jadi banyak chunk. Chunk login tak sama dengan chunk dashboard. Aku jumpa string lama dalam chunk yang memang tak sepatutnya berubah, dan ingat deploy gagal.</p>

<p><strong>Betul:</strong> cari string yang <em>unik</em> pada page yang kau ubah, dan sahkan ia ada dalam chunk yang load untuk page itu. Atau lebih mudah — buka page, hard refresh, tengok sendiri.</p>

<h3>6. API token akan expire, dan kau akan lupa</h3>

<p>Aku setup satu automation yang guna Coolify API untuk monitor deployment. Ia berjalan selama sebulan. Kemudian senyap.</p>

<p>Token expire. Semua request pulang <code>401</code>. Tiada notifikasi, tiada amaran — automation cuma berhenti buat kerja.</p>

<p><strong>Betul:</strong> apa-apa automation yang guna token, kena ada semakan yang akan <em>lapor bila ia gagal</em>, bukan cuma bila ia berjaya.</p>

<h2>Apa yang aku tak buat, dan tak akan buat</h2>

<p><strong>Satu — auto-deploy untuk semua branch.</strong> Auto-deploy hanya pada <code>main</code>. Branch lain manual. Sebab kalau setiap branch deploy, VPS kau akan build sepuluh versi app yang tak pernah dilihat orang.</p>

<p><strong>Dua — monitoring berlapis.</strong> Aku tak pasang Prometheus, Grafana, Loki, atau apa-apa stack observability. Untuk skala aku, ia lebih banyak kos (RAM) dari manfaat. Aku guna <code>docker stats</code> bila ada masalah, dan uptime check ringkas untuk servis kritikal.</p>

<p><strong>Tiga — Kubernetes.</strong> Tidak. Satu VPS dengan Docker Compose dah cukup untuk lapan projek. Kubernetes selesaikan masalah yang aku tak ada.</p>

<h2>Nasihat paling jujur</h2>

<p>Kalau kau baru mula dan tak ada latar DevOps: <strong>jangan mula dengan Coolify</strong>.</p>

<p>Mula dengan satu VPS, satu Dockerfile, satu <code>docker compose up</code>. Faham dulu apa itu image, container, volume, dan network. Sebab Coolify sembunyikan semua tu — dan bila sesuatu rosak, kau takkan tahu apa yang rosak.</p>

<p>Baru lepas kau faham asas, pasang Coolify. Masa tu ia jadi alat yang mempercepat kerja, bukan kotak hitam yang kau takut sentuh.</p>

<p>Dan satu lagi: <strong>tulis down semua command yang kau guna untuk fix sesuatu.</strong> Bukan dalam kepala. Dalam fail. Sebab enam bulan kemudian, kau akan hadap masalah yang sama dan kau takkan ingat apa yang kau buat.</p>

<p>Aku ada satu fail bernama <code>TOOLS.md</code>. Ia menyelamatkan aku lebih banyak kali dari apa-apa dokumentasi rasmi.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 Kesilapan Beginner Vibe Coding (Aku Pernah Buat Semua)</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=10-kesilapan-beginner-vibe-coding</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=10-kesilapan-beginner-vibe-coding</guid>
      <pubDate>Wed, 23 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Artikel ini ditulis dari luka, bukan dari buku Tiada satu pun kesilapan dalam senarai ni adalah teori.</description>
      <content:encoded><![CDATA[<h2>Artikel ini ditulis dari luka, bukan dari buku</h2>

<p>Tiada satu pun kesilapan dalam senarai ni adalah teori. Semua adalah perbuatan aku sendiri — setiap satu memakan masa aku dari beberapa jam hingga beberapa minggu. Kalau satu je dapat mengelakkan satu malam tak tidur boss, artikel ni dah berbaloi.</p>

<h2>1. Terima code tanpa faham</h2>

<p>Yang pertama, yang paling klasik. Code dah jalan, feature dah nampak — terus deploy. Bulan kemudian ada masalah, dan aku sedar aku tak faham pun code yang aku "tulis". Bila kamu tak faham code kamu, kamu bukan pemilik sistem — kamu tukang gawai. Sekarang, setiap code yang masuk production, aku mampu explain kenapa ia ditulis begitu. Kalau tak mampu, aku tanya AI sampai faham. Itu bukan kelemahan. Itu kerja.</p>

<h2>2. Prompt terus code, tanpa bertanya reka bentuk dulu</h2>

<p>"Buatkan dashboard" menghasilkan dashboard — mungkin dengan arah yang salah sepenuhnya. Kesilapan mahal bukan error; kesilapan paling mahal ialah sistem yang betul dibina untuk masalah yang salah. Sekarang, prompt pertama aku selalu minta AI berhenti dan bertanya dahulu.</p>

<h2>3. Tidak bertanya "siapa boleh buat apa" sejak awal</h2>

<p>Sistem pertama aku dibina dengan penuh keghairahan — features bertambah-tambah, keselamatan "nanti". "Nanti" tu berminggu-minggu. Aku pernah jumpa satu pintu terbuka yang membenarkan mana-mana user meluluskan sendiri permohonan mereka. Niat baik yang tidak dilaksanakan adalah risiko yang hanya menunggu waktu.</p>

<h2>4. Minta AI buat semua sekali gus</h2>

<p>"Bina sistem lengkap dengan login, dashboard, notifikasi dan laporan" — AI akan cuba. Hasilnya: dinding code besar yang separuh betul, dan kamu tak tahu yang mana yang separuh itu. Satu feature dulu. Kecil. Berjalan. Kemudian tambah.</p>

<h2>5. Skip version control sebab "projek kecil je"</h2>

<p>Projek yang aku fikir "kecil je" ialah projek yang aku paling banyak menangis. Git bukan untuk projek besar — ia untuk bila AI buat perubahan yang rosakkan semuanya pada jam 1 pagi, dan kamu perlukan jalan pulang dalam 30 saat. Aku pernah nyaris hilang kerja sebab satu sequence git yang salah. Sekarang: commit sebelum setiap langkah berani. Sentiasa.</p>

<h2>6. Terus deploy tanpa build test lokal</h2>

<p>"Jalankan je di production, tengok jadi tak." Satu hari, build gagal di server kerana kehabisan memori — bukan sebab code salah, tapi sebab aku tak pernah test binaan dalam persekitaran yang sama. Lokal test dulu, deploy kemudian. Dan bila deploy gagal, jangan assume code — semak server juga. Kadang-kadang masalahnya bukan dalam repo; ia dalam memori yang tak cukup.</p>

<h2>7. Ambil "Success" sebagai "Betul"</h2>

<p>Deployment pipeline kata berjaya, aku kata siap, dan terus tutup laptop. Kemudian boss tanya "kenapa belum ada?" — rupanya deployment lama yang masih lari. Kini aku sentiasa sahkan perubahan di production dengan mata: buka page yang betul, periksa bundle yang betul. Pipeline yang selesai bukan sama dengan hasil yang betul.</p>

<h2>8. Biarkan API key terbocor dalam client code</h2>

<p>Kunci yang berawalan <code>VITE_</code> atau hidup dalam frontend akan sampai ke tangan orang lain — itu bukan sekret, itu alamat. Satu hari aku sedar satu kunci automasi boleh diambil dari browser oleh sesiapa yang tahu cara. Nasib baik risikonya terkawal, tapi pelajaran tetap: sekret hidup di server. Kunci yang sampai ke browser sudah dianggap awam.</p>

<h2>9. Kejar tool baru setiap minggu</h2>

<p>Dua minggu dengan satu tool, ganti ke tool lain, ganti lagi. Hasilnya: tiada satu pun dikuasai. Tool akan sentiasa bertambah — itu industri ini. Tapi asasnya tidak berubah: kebolehan menjelaskan masalah, memahami sistem, dan menghantar dengan disiplin. Tool yang lama kamu kuasai mengalahkan tool baru yang kamu sentuh seminggu.</p>

<h2>10. Bina sendirian tanpa tunjuk orang</h2>

<p>Kesilapan yang paling senyap: sistem siap, hebat, tak pernah ditunjuk kepada pengguna sebenar sampai hari pelancaran. Mereka guna dengan cara yang aku tak pernah jangka, dan separuh aliran yang aku banggakan tak pernah disentuh. Sekarang: tunjuk awal, tunjang kasar, biar mereka kata "eh, aku tak guna ni pun". Lebih baik dengar tu bulan pertama daripada hari pelancaran.</p>

<h2>Pesanan terakhir</h2>

<p>Semua sepuluh ni aku buat. Ada yang sekali, ada yang berkali-kali sampai dia jadi peraturan bertulis. Kesilapan dalam vibe coding bukan tanda kamu tak layak — ia tanda kamu sedang melalui fasa yang semua orang lalui, cuma ramai yang tak bercerita.</p>

<p>Beza yang berjaya dan yang berputus asa? Yang berjaya buat kesilapan sekali, catat, dan tak ulang. Mulakan senarai kamu sendiri hari ni.</p>]]></content:encoded>
    </item>
    <item>
      <title>Testing &amp; Deploy: Disiplin Yang Masih Wajib Walaupun AI Yang Code</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=testing-deploy-disiplin-walaupun-ai-code</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=testing-deploy-disiplin-walaupun-ai-code</guid>
      <pubDate>Sun, 20 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Alert jam 6:45 petang yang mengubah cara aku release Hari ketiga satu event besar.</description>
      <content:encoded><![CDATA[<h2>Alert jam 6:45 petang yang mengubah cara aku release</h2>

<p>Hari ketiga satu event besar. Booth penuh orang, queue panjang, dan sistem tengah menelan deretan leads pada kadar yang belum pernah berlaku. Tepat jam 6:45 petang, satu alert masuk: 231 leads dalam satu jam — rekod. Dan di bawahnya, satu notis kecil yang buat nafas aku sekejap: satu perubahan yang aku deploy pagi tadi sedang bertindak dengan cara yang aku tak jangka.</p>

<p>Nasib baik: perubahan itu kecil, dan ada jalan kembali. Tapi detik tu tetap terukir — <strong>sistem yang diguna oleh ratusan orang sebenar tidak tahu maksud "nanti aku test".</strong></p>

<p>Code yang ditulis oleh AI menjadikan penulisan code lebih pantas. Ia tidak mengubah satu benda: tanggungjawab atas apa yang berlaku di production masih pada manusia yang tekan butang deploy. Itu diri kamu.</p>

<h2>Ritual empat langkah sebelum setiap release</h2>

<p>Selepas satu hari tersebut, aku tetapkan satu ritual yang aku tak langgar walaupun tergesa-gesa. Empat langkah, lima belas minit, setiap kali.</p>

<p><strong>Langkah 1: Biar mesin cek yang boleh dicek mesin.</strong> Type check, build, lint. Tiga command, dua minit. Ia tak akan jumpa bug logic — tapi ia jumpa 80% kesilapan bodoh sebelum dia sampai ke mata user. Dan penting: jumlah error perlu sama sebelum dan selepas perubahan. Kalau tsc keluar 16 error sebelum dan 16 selepas, itu baseline lama, bukan regression kamu. 16 jadi 17? Ada yang baru masuk. Cari dia.</p>

<p><strong>Langkah 2: Test yang kamu tak boleh test mesin — test dengan mata.</strong> Buka app, tekan flow yang berubah, masuk sebagai user biasa dan sebagai admin. Sembilan puluh peratus bug UX tak nampak dalam automated test — mereka nampak bila kamu berlakulah sebagai pengguna yang malas dan tergesa. Buka page tu dengan telefon juga, bukan desktop sahaja. Separuh dunia online hidup dalam skrin 6 inci.</p>

<p><strong>Langkah 3: Deploy kecil, kerap, dan satu arah.</strong> Release besar adalah kutukan. Sepuluh feature dalam satu deploy bermaksud bila ada yang pecah, kamu ada sepuluh suspek. Aku punya aturan: satu commit, satu tujuan, deploy terus. Kalau ada masalah, aku tahu dengan tepat commit mana — dan rollback dalam masa satu minit. Versi lama sentiasa ada di sisi untuk rollback sekejap.</p>

<p><strong>Langkah 4: Verify production, jangan assume.</strong> Ini langkah yang paling kerap di-skip dan paling bahaya. Deployment kata "success" — tapi adakah perubahan betul-betul live? Aku belajar cara susahnya: dua kali dalam sehari, aku monitor deployment dan tarik kesimpulan salah sebab aku memeriksa fail yang betul di halaman yang salah. "Success" pada pipeline bermakna proses selesai — bukan bermakna keputusannya betul. Grep pada bundle yang betul, buka page yang betul, sahkan dengan mata.</p>

<h2>Yang AI takkan buat untuk kamu</h2>

<p>AI akan tulis code. AI akan jalankan build. Tapi AI tidak akan rasa takut bila 231 leads masuk dalam satu jam. Ia tidak akan tahu bahawa esok ada event besar dan malam ni bukan malam untuk eksperimen berani. Ia tidak akan anggung tanggungjawab bila pelanggan telefon.</p>

<p>Itu sisa di bahu kamu. Dan jujurnya? Itu berita baik. Sebab bila code boleh ditulis pantas, nilai kamu bukan lagi di kelajuan menaip — ia di disiplin kamu menghantar.</p>

<p>Siapa pun boleh build pantas dengan AI sekarang. Yang jarang ialah orang yang build pantas <em>dan</em> tidur lena selepas deploy.</p>]]></content:encoded>
    </item>
    <item>
      <title>Dari Excel ke Sistem: Formula Vibe Coding Untuk Organisasi Manual</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=dari-excel-ke-sistem-formula-vibe-coding</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=dari-excel-ke-sistem-formula-vibe-coding</guid>
      <pubDate>Thu, 17 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Semua bermula dengan satu fail Excel yang dikongsi 11 orang Ada satu fail Excel dalam satu organisasi yang aku kenal.</description>
      <content:encoded><![CDATA[<h2>Semua bermula dengan satu fail Excel yang dikongsi 11 orang</h2>

<p>Ada satu fail Excel dalam satu organisasi yang aku kenal. Nama failnya penuh dengan version number: <em>FINAL</em>, <em>FINAL_v2</em>, <em>FINAL_BETUL_INI</em>, <em>JANGAN_SENTAH_INI</em>. Sebelas orang kongsinya. Setiap pagi ada satu soalan yang berlegar: "yang mana versi betul ni?"</p>

<p>Booking bilik mesyuarat dibuat melalui WhatsApp group. Kelulusan melalui tanda tangan kertas. Status kerja melalui "boss, dah settle tu" — tanpa rekod, tanpa jejak.</p>

<p>Tiada siapa salah di sini. Orang-orang tu rajin, jujur, dan buat yang terbaik dengan alat yang ada. Masalahnya bukan orang — masalahnya sistem tidak wujud.</p>

<p>Dari pengalaman membina beberapa sistem untuk organisasi macam ni, aku dah nampak satu formula yang berulang. Ini dia.</p>

<h2>Langkah 1: Jangan automatikkan kekacauan — kekalkan dulu, fahami dulu</h2>

<p>Godaan pertama: terus bina sistem digital yang mirror proses lama. Jangan. Excel yang berselirat tu selalunya mengandungi proses yang dah lapuk — langkah yang tiada siapa ingat kenapa wujud, kolum yang tak pernah dipakai, kelulusan yang sebenarnya tak dilaksanakan.</p>

<p>Yang aku buat: duduk dengan pengguna sebenar selama satu jam. Tanya tiga soalan — apa yang paling membosankan? apa yang paling kerap salah? apa yang paling menakutkan kalau hilang? Jawapan tiga soalan tu adalah blueprint sebenar sistem. Bukan kolum Excel. Ia sakit sebenar pengguna.</p>

<h2>Langkah 2: Satu proses dulu, bukan semua</h2>

<p>Kesilapan klasik transformasi digital: cuba digitalkan segalanya sekali gus. Tiga bulan kemudian: sistem separuh siap, orang dah penat, Excel masih raja.</p>

<p>Formula aku: pilih <strong>satu proses yang paling sakit dan paling kerap berlaku</strong>. Untuk organisasi yang aku sebut tadi, itu booking bilik mesyuarat — kerap, menyusahkan, dan statusnya sentiasa kabur. Sistem pertama hanya buat tu. Satu benda, dibuat betul.</p>

<p>Hasil minggu pertama? Orang nampak sendiri: mereka taip sekali, status terus nampak, tiada lagi "versi betul". Itu pembelian keyakinan yang tak boleh dibeli dengan powerpoint.</p>

<h2>Langkah 3: Vibe coding menjadikan kos tak lagi alasan</h2>

<p>Dulu, jawapan kepada "kita patut buat sistem" ialah "tiada budget". Sekarang? Sebuah sistem booking dengan workflow kelulusan, notification, audit trail — dibina dalam beberapa petang, tanpa team IT, tanpa lesen beribu.</p>

<p>Bukan sebab AI magic. Sebab formula tu dah berubah: dulu kos terbesar ialah menulis code. Sekarang kos terbesar ialah <strong>memahami masalah</strong> — dan itu boleh dibuat oleh orang dalam, malam ini, dengan bantuan AI.</p>

<h2>Langkah 3.5 (yang sering dilupakan): Keselamatan dari hari pertama</h2>

<p>Salah satu kesilapan yang paling mahal: bina sistem, kemudian fikir tentang siapa boleh buat apa. Jangan. Dari hari pertama, setiap tindakan perlu ada jawapan: siapa boleh buat apa, dan bagaimana database itu sendiri menolak apa yang tak patut. UI boleh dikelabu — peraturan pada peringkat data tidak.</p>

<h2>Langkah 4: Angkat Excel jadi backup, bukan musuh</h2>

<p>Jangan perang dengan Excel. Ia menang. Yang betul: jadikan sistem baharu tempat kerja berlaku, dan export Excel tetap ada untuk mereka yang nak melihat. Mentalitanya bukan "bunuh Excel" — ia "Excel bukan lagi tempat keputusan dibuat". Dalam enam bulan, peranannya mengecil dengan sendirinya.</p>

<h2>Langkah 5: Ukur satu nombor yang orang sayang</h2>

<p>Jangan ukur kejayaan dengan "sistem dah live". Ukur dengan nombor yang pengguna peduli: masa menunggu kelulusan dari 2 hari ke 5 minit. "Siapa booking bilik?" dari 3 telefon ke 1 tapisan. Satu nombor yang berubah — itu cerita yang membuatkan orang lain mahu ikut.</p>

<h2>Penghujungnya</h2>

<p>Organisasi yang manual bukan kekal sebagai manual sebab mereka bodho. Ia sebab tiada siapa bina jambatan yang muat dengan kaki mereka. Vibe coding bina jambatan tu lebih murah dan lebih cepat dari sebelum ini — tapi formula tetap sama: dengar sakit yang sebenar, buat satu benda dulu, buat dia betul, biarkan hasil jualan yang bawa sisanya.</p>

<p>Excel tak akan hilang malam ini. Tapi minggu depan, ia boleh mula kehilangan kuasa.</p>]]></content:encoded>
    </item>
    <item>
      <title>Bila AI Silap: Macam Mana Aku Debug Code Yang AI Generate</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=bila-ai-silap-debug-code-ai-generate</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=bila-ai-silap-debug-code-ai-generate</guid>
      <pubDate>Mon, 14 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Butang yang tak berfungsi, dan pelajaran yang datang bersamanya Ada hari yang memalukan sikit: admin tekan satu butang &quot;Print&quot; dalam sistem yang aku bina — dan skrin…</description>
      <content:encoded><![CDATA[<h2>Butang yang tak berfungsi, dan pelajaran yang datang bersamanya</h2>

<p>Ada hari yang memalukan sikit: admin tekan satu butang "Print" dalam sistem yang aku bina — dan skrin keluar error. Bukan error cantik. Crash.</p>

<p>Code tu ditulis oleh AI, direview oleh aku, dan dah berlari dalam production berminggu-minggu. Macam mana boleh terlepas?</p>

<p>Sebabnya buat aku tersenyum bila sedar: fungsi tu <em>wujud</em> dalam code, tapi tak pernah dihubungkan. Ada mesin, tapi kabel tak dipasang. Build lulus, semua test hijau — kerana tiada apa yang test fungsi yang tak pernah dipanggil.</p>

<p>Itu hari aku tulis peraturan debug pertama untuk code AI-generated.</p>

<h2>Peraturan 1: Baca error sebenar, bukan rasa error</h2>

<p>"Tak berfungsi" ialah deskripsi perasaan, bukan maklumat. Yang AI perlukan ialah error message penuh — line number, stack trace, dan apa yang boss buat sebelum error tu muncul.</p>

<p>Contoh nyata dari hari yang sama: satu build gagal dengan exit code 255 dan tiada error jelas. Kalau aku tulis "build gagal, fix", AI akan guess. Tapi bila aku selidiki — log tunjuk build mati senyap 52 saat dalam langkah build paling berat — tekaan pertama aku terus betul: VPS kehabisan memori. Perbetulkan swap, deploy berjaya dalam lima minit. Diagnosis yang tepat separuh daripada penyelesaian.</p>

<h2>Peraturan 2: reproduksi dulu, teori kemudian</h2>

<p>Sebelum tanya AI kenapa, aku pastikan aku boleh buat bug tu muncul dengan sengaja. Langkah apa, data apa, bila ia berlaku. Bug yang boleh di-reproduce ialah bug yang 80% selesai — sebab sekarang setiap cadangan fix boleh disahkan terus.</p>

<p>Bug yang "kadang-kadang jadi"? Itu yang makan masa. Tapi malah itulah yang patut diberi paling banyak konteks kepada AI: bila ia jadi, bila tak jadi, apa yang berbeza.</p>

<h2>Peraturan 3: AI debugging, kamu yang sahkan</h2>

<p>Ada satu kegodaan berbahaya bila AI debug: menerima jawapan pertama yang bunyi betul. Aku kena tipu dengan ni dulu — AI bagi penjelasan yang logik, aku terima, masalah sebenarnya masih ada dua langkah lebih dalam.</p>

<p>Sekarang ritual aku: AI cadangkan punca → aku verify punca tu wujud (buka code, letak log, test) → baru fix. Cadangan tanpa verifikasi ialah teori. Teori yang belum dibayar.</p>

<h2>Peraturan 4: satu perubahan pada satu masa</h2>

<p>Godaan terbesar bila debug: tukar tiga benda serentak sebab "mesti ni pun salah jugak". Jangan. Satu perubahan, satu test. Kalau tiga benda ditukar dan error hilang, kamu tak tahu yang mana yang membetulkan — dan yang mana yang merosakkan benda lain sambil menyelamatkan yang satu.</p>

<p>Aku pernah tengok satu bug "settle" selepas lima perubahan serentak — dua minggu kemudian bug yang sama datang balik bawa kawan. Empat masalah, satu yang diperbetulkan, tiga yang ditanam.</p>

<h2>Peraturan 5: simpan kesilapan AI untuk jadi bahan ajar</h2>

<p>Setiap bug yang AI buat — dan cara ia akhirnya diselesaikan — aku tulis dalam fail log mudah dalam repo. "Simptom, punca, fix, pelajaran."</p>

<p>Hasilnya? Pattern mula nampak. AI dalam projek ini kerap silap pada tempat yang sama — biasanya lupa expose sesuatu dari hook, atau assume field yang tak wujud dalam database. Dengan log tu, prompt seterusnya dah jaga perangkap-perangkap lama. Kesilapan berbayar sekali je.</p>

<h2>Penutup: silap itu normal, buta itu bahaya</h2>

<p>AI akan terus membuat kesilapan — kadang-kadang cara yang manusia tak sangka. Itu bukan alasan untuk tak guna AI. Ia sebab untuk guna dia dengan cara yang betul: kamu pemilik keputusan, AI ialah pelaksana yang pantas tapi kadang tersasar.</p>

<p>Yang membezakan developer yang matang dengan yang baru ialah bukan jumlah bug yang diterima — semua orang terima bug. Ia kelajuan dan kejujuran cara kamu mencarinya.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cursor/Claude Code: Setup Yang Buat Aku 3x Lebih Productive</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=cursor-claude-code-setup-3x-productive</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=cursor-claude-code-setup-3x-productive</guid>
      <pubDate>Fri, 11 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Perbezaan antara guna AI dan partner dengannya Dua orang boleh guna AI coding tool yang sama, dengan model yang sama — tapi satu hasilnya slow dan penuh kesilapan, yang…</description>
      <content:encoded><![CDATA[<h2>Perbezaan antara guna AI dan partner dengannya</h2>

<p>Dua orang boleh guna AI coding tool yang sama, dengan model yang sama — tapi satu hasilnya slow dan penuh kesilapan, yang satu lagi siapkan sistem dalam masa separuh. Bezanya bukan model. Bukan prompt magic. Ia <strong>setup</strong>.</p>

<p>Selepas membina lebih sepuluh sistem dengan AI — dari booking system sampai SaaS multi-tenant — ni setup yang aku settlekan, dan kenapa.</p>

<h2>1. Rules file: jaga mula bumi</h2>

<p>Fail paling berharga dalam setup aku bukan code. Ia satu file markdown pendek yang letak di root projek: <code>CLAUDE.md</code> / <code>AGENTS.md</code>.</p>

<p>Isinya? Peraturan tetap projek. Contoh dari sistem terbaru aku:</p>

<p><em>"Setiap table ada tenantId. Setiap API route filter dengan tenantId. Tiada pengecualian. Baca workflows/ sebelum buat kerja. Jangan overwrite workflows tanpa bertanya."</em></p>

<p>Tanpa file ni, aku kena ulang peraturan ni setiap conversation baru. Dengan file tu, AI baca sekali dan faham — bermula setiap sesi sudah tahu peraturan rumah. Ia macam onboarding dokumen untuk rakan kerja yang lupa semula setiap pagi. Tulis sekali, jimat selamanya.</p>

<h2>2. Struktur folder yang AI boleh "baca niatnya"</h2>

<p>Aku belajar ni cara yang susah: bila folder kucar-kacir, AI guess di mana letak code baru — dan guess salah. Sekarang setiap projek aku ada struktur yang sama: <code>src/app</code> untuk pages, <code>src/lib</code> untuk logic, <code>src/components</code> untuk UI, <code>docs</code> untuk keputusan, <code>workflows/</code> untuk SOP.</p>

<p>Bila struktur tu konsisten, AI tak perlu ditanya "letak ni kat mana" — ia dah tahu, sebab semua projek lain ikut konvensyen yang sama.</p>

<h2>3. Konteks berperingkat, bukan dump semua</h2>

<p>Kesilapan awal aku: masukkan seluruh codebase dalam context dan harap AI faham. Hasilnya: jawapan generic, token terbakar, dan kadang-kadang AI "halusinasi" fail yang tak wujud.</p>

<p>Sekarang aku bagi AI hanya yang relevan: fail yang akan diubah, fail yang berkaitan, dan rules file. Untuk kerja besar, aku delegate pada sub-agent dengan task jelas dan scope tertutup — "baca struktur ni, laporkan balik, jangan ubah apa-apa". Maklumat yang tepat masuk, keputusan yang tepat keluar.</p>

<h2>4. Git commit sebelum setiap langkah berani</h2>

<p>Ini bukan tip AI — ni tip survival. Sebelum aku minta AI buat refactor besar atau upgrade dependencies, satu commit. Bila hasilnya tak seperti diharap, satu command kembali. Aku pernah buat kesilapan: satu commit yang sepatutnya bawa dua fail perubahan ternyata stage hampir seratus fail deletion — sebab sequence git yang salah. Berbalik ke snapshot dalam 30 saat. Tanpa git, malam tu aku akan mula dari kosong.</p>

<h2>5. Satu tab soalan berasingan dari kerja</h2>

<p>Bunyi kecil tapi besar kesannya: aku pisahkan conversation "buat kerja" dan conversation "bertanya". Bila aku minta AI explain konsep atau semak pendekatan aku, aku tak nak jawapan dia tercampur dengan code yang sedang separuh siap. Kekacauan context menjadikan jawapan kurang tajam.</p>

<h2>Yang tak berbaloi (jangan buang masa)</h2>

<p>Aku juga pernah cuba benda yang akhirnya aku buang: prompt library gergasi dengan ratusan template (aku guna enam pattern je sebenarnya), custom agents untuk setiap micro-task (overhead lebih dari hasil), dan memory systems yang rumit (markdown file pendek cukup).</p>

<p>Sebab setup yang baik bukan yang paling kompleks. Ia yang membuatkan kamu <strong>lupa dia wujud</strong> — kamu cuma terus membina.</p>

<p>Kalau boss baru nak mula serius dengan AI coding: jangan sibuk tool terbaru. Sediakan rules file projek anda hari ni. Itu satu jam yang akan berbaloi sepanjang tahun.</p>]]></content:encoded>
    </item>
    <item>
      <title>Macam Mana Aku Fix 18 Vulnerabilities Dalam Satu Petang</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=fix-18-vulnerabilities-dalam-satu-petang</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=fix-18-vulnerabilities-dalam-satu-petang</guid>
      <pubDate>Tue, 08 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Mula dengan satu soalan: &quot;ada apa-apa lagi yang kita kena update?&quot; Pagi Isnin, selepas selesai satu feature kecil, aku tanya soalan tu pada diri aku sendiri.</description>
      <content:encoded><![CDATA[<h2>Mula dengan satu soalan: "ada apa-apa lagi yang kita kena update?"</h2>

<p>Pagi Isnin, selepas selesai satu feature kecil, aku tanya soalan tu pada diri aku sendiri. Sistem dah lari stabil, user happy — tapi ada satu rasa tak sedap yang aku tak boleh explain. Bila last kali aku betul-betul audit keselamatan sistem ni?</p>

<p>Jawapannya: lama. Terlalu lama.</p>

<p>Tiga puluh minit kemudian, skrin aku tunjuk nombor yang buat aku duduk tegak: <strong>18 vulnerabilities. 2 critical. 9 high.</strong></p>

<h2>Lubang yang paling menakutkan bukan yang paling teknikal</h2>

<p>Dari 18 tu, satu yang buat aku terkejut paling sangat: <code>@auth/core</code> — otak sistem login sendiri. Bayangkan kunci pintu rumah anda adalah kunci yang orang lain dah ada salinannya. Itu rasa dia.</p>

<p>Yang kedua: satu rule Firestore yang membenarkan mana-mana user yang login untuk update <em>apa-apa field</em> booking mereka sendiri — termasuk status. Maksudnya, user yang faham API boleh approve sendiri booking mereka, lansung tanpa pengetahuan admin.</p>

<p>Sistem tu memang direka dengan workflow kelulusan yang rapi di UI. Tapi di peringkat database, pintu belakang terbuka luas.</p>

<h2>Renungan: kenapa lubang ni wujud?</h2>

<p>Bukan sebab aku tak ambil peduli. Ia wujud sebab tiada siapa cuba pecah masuk. Sistem kecil yang tak terkenal jarang diserang — dan itu justru bahayanya. Kami rasa selamat sebab tiada insiden. Padahal kebetulan je belum ada yang masuk.</p>

<p>Dan ada satu lagi: lubang tu tertulis dalam comment sebagai "contoh: cancel" — niat baik, tapi tak pernah disekat betul-betul. Niat baik tanpa enforcement cuma harapan, bukan keselamatan.</p>

<h2>Anatomi fix dalam satu petang</h2>

<p>Aturan aku masa fix semua ni:</p>

<p><strong>1. Rules dulu, sebab dia paling bahaya.</strong> Setiap user hanya boleh batalkan booking sendiri — dan bukan apa-apa field pun. Status mesti bertukar ke "cancelled", medan identiti (bilik, masa, jenis) dikunci, dan hanya medan metadata pembatalan yang boleh berubah. Self-approve? Ditolak oleh database itu sendiri, bukan bergantung pada UI.</p>

<p><strong>2. Dependencies kemudian.</strong> <code>npm audit fix</code> dulu untuk yang selamat, kemudian <code>--force</code> untuk yang perlukan upgrade besar — Next.js melompat satu minor version kerana tujuh advisories. Risiko upgrade? Ada. Tapi risiko biarkan DoS dan cache poisoning dalam production? Lebih besar.</p>

<p><strong>3. Build dan test selepas setiap langkah.</strong> Bukan sekali di hujung. Setiap kali. Sebab kalau ada yang pecah, aku nak tahu sebab mana — bukan cari dalam lima belas perubahan.</p>

<p>Dua jam kemudian: <strong>0 vulnerabilities.</strong> Dan yang penting — tiada apa-apa yang rosak.</p>

<h2>Pelajaran yang aku bawa balik</h2>

<p>Pertama: keselamatan bukan satu projek. Ia satu ritme. Setiap bulan, satu audit ringkas. Satu jam je — tapi ia jumpa benda yang bulan-bulan tersembunyi.</p>

<p>Kedua: UI yang betul bukan keselamatan. Yang betul ialah apabila database itu sendiri menolak apa yang tak patut. UI boleh dikelabu; rules tak boleh.</p>

<p>Ketiga, dan yang paling aku rasa: <strong>sistem yang tak diserang bukan bermakna selamat.</strong> Ia cuma bermakna belum ada yang datang. Jangan tunggu tetamu tak dijemput untuk sedar kunci tak dipasang.</p>

<p>Bila kali terakhir boss audit sistem boss sendiri? Kalau jawapannya "tak ingat" — itu jawapannya. Mula dengan satu command: <code>npm audit</code>. Tengok apa keluar. Kemudian beralanlah dari sana.</p>]]></content:encoded>
    </item>
    <item>
      <title>Prompt Patterns Yang Aku Guna Untuk Build e-RUAI</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=prompt-patterns-untuk-build-sistem</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=prompt-patterns-untuk-build-sistem</guid>
      <pubDate>Sat, 05 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Ada satu malam aku perasan sesuatu Masa aku scroll balik sejarah conversation aku dengan AI untuk e-RUAI, aku perasan satu pattern: dari ratusan prompt aku, ada enam…</description>
      <content:encoded><![CDATA[<h2>Ada satu malam aku perasan sesuatu</h2>

<p>Masa aku scroll balik sejarah conversation aku dengan AI untuk e-RUAI, aku perasan satu pattern: dari ratusan prompt aku, ada enam bentuk yang aku ulang lagi dan lagi. Enam je. Sepanjang build sistem yang urus ribuan booking setahun.</p>

<p>Itu masa aku sedar — vibe coding ni bukan pasal pandai menulis prompt panjang. Ia pasal ada beberapa pattern yang betul-betul berkesan, dan guna dia macam tukang kunci guna kunci yang sama pada setiap pintu.</p>

<p>Ni enam patterns tu. Aku guna semua ni hari ni juga, pada setiap projek.</p>

<h2>Pattern 1: "Berlakulah sebagai architect dulu, jangan contractor"</h2>

<p>Sebelum minta code, aku mula dengan: "Kau adalah software architect. Ini masalah pengguna: [masalah]. Cadangkan 2-3 pendekatan berbeza dengan trade-offs masing-masing. Jangan tulis code lagi."</p>

<p>Kenapa? Sebab kalau terus minta code, AI jadi contractor — buat apa yang diminta. Tapi bila minta ia fikir macam architect dulu, aku dapat pilihan dan trade-offs. Masa build sistem tempahan bilik mesyuarat, pattern ni yang menyelamatkan aku dari satu keputusan besar: real-time sync vs polling. AI cadangkan tiga opsyen, aku pilih yang paling sesuai dengan realiti organisasi.</p>

<h2>Pattern 2: "Contoh data sebelum code"</h2>

<p>Sebelum AI tulis satu pun logic, aku bagi contoh data: "Booking ada field ni: userId, roomId, startTime, endTime, status. Nilai status: pending, approved, rejected, cancelled."</p>

<p>Kedengaran remeh, tapi ni yang elakkan bug paling mahal — salah faham struktur data. AI yang faham data anda akan tulis logic yang betul pada percubaan pertama. Yang tak faham akan tulis code cantik untuk struktur yang salah.</p>

<h2>Pattern 3: "Error full context, bukan summary"</h2>

<p>Bila ada error, jangan taip "tak jadi, fix". Copy seluruh error message — termasuk line number dan stack trace — dan paste.</p>

<p>Semalam aku paste satu error TypeScript: <code>TS2552: Cannot find name 'setMaintenancePrintData'</code>. Dalam masa 30 saat, AI jumpa punca: setter tu wujud dalam hook tapi tak exposed dalam return object. Fix dua baris. Kalau aku taip "button tak berfungsi, fix", ia akan guess — dan guess memakan masa.</p>

<h2>Pattern 4: "Guard rails dulu, features kemudian"</h2>

<p>"Sebelum kita tambah feature ni, tulis dulu Firestore rules untuk pastikan user tak boleh approve booking sendiri."</p>

<p>Pattern ni aku belajar cara yang mahal. Sistem pertama aku, aku biarkan rules longgar dengan niat "nanti kita ketatkan". Bulan-bulan kemudian, lubang tu masih ada. Sekarang, setiap feature baru bermula dengan soalan security dulu — siapa boleh buat apa, dan apa yang tak boleh.</p>

<h2>Pattern 5: "Tanya sebelum assumption"</h2>

<p>"Sebelum code, tanya aku 3 soalan kalau ada apa-apa yang tak pasti."</p>

<p>Satu baris ni menjimatkan berpuluh jam. AI dengan assumption yang salah akan build sistem yang salah dengan penuh keyakinan. AI yang bertanya dulu akan build yang betul pada percubaan pertama.</p>

<h2>Pattern 6: "Iterate dalam kecil, commit dalam besar"</h2>

<p>"Ubah sahaja fungsi ni, jangan sentuh yang lain. Tunjuk diff sebelum apply."</p>

<p>Bila AI faham scope — ubah sikit, bukan tulis semula — risiko merosakkan benda yang dah jadi jadi hampir sifar. Dan aku sentiasa commit git sebelum setiap perubahan besar. Bila ada yang rosak, aku boleh kembali dalam satu command.</p>

<h2>Akhir kata</h2>

<p>Enam pattern ni bukan magic. Ia hanya disiplin — cara yang sama, ulang setiap kali, sampai jadi refleks. e-RUAI, KISEW, Kembara — semuanya dibina dengan pattern yang sama.</p>

<p>Yang best-nya? Pattern ni tak berubah bila AI bertukar model. Pattern tu tentang cara berfikir dan berkomunikasi jelas. Model datang dan pergi, tapi kebolehan menjelaskan masalah dengan jelas — itu kekal.</p>]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding Workflow Aku: Dari Idea ke Production dalam Berapa Jam</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=vibe-coding-workflow-dari-idea-ke-production</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=vibe-coding-workflow-dari-idea-ke-production</guid>
      <pubDate>Wed, 02 Sep 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Malam tu, semua bermula dengan satu soalan &quot;Abang, boleh tak kita tahu sapa yang dah booking bilik mesyuarat, tanpa aku kena tanya orang lain?&quot; Soalan tu datang dari…</description>
      <content:encoded><![CDATA[<h2>Malam tu, semua bermula dengan satu soalan</h2>

<p>"Abang, boleh tak kita tahu sapa yang dah booking bilik mesyuarat, tanpa aku kena tanya orang lain?"</p>

<p>Soalan tu datang dari seorang staff pada suatu petang. Biasa, jawapan aku akan jadi macam ni: "boleh, kita kena buat sistem. Kena cari developer, kena budget, kena tunggu." Tapi hari tu, jawapan aku lain. Aku balik rumah, buka laptop, dan jam 11 malam aku mula menulis prompt pertama.</p>

<p>Jam 2 pagi, versi pertama sistem mesyuarat tu dah live. Bukan prototype. Bukan wireframe. Sistem yang betul-betul boleh guna.</p>

<p>Itulah vibe coding. Dan hari ni aku nak kongsi workflow yang aku guna setiap kali — bukan teori, tapi yang terbukti pada lebih sepuluh sistem yang dah lari dalam production.</p>

<h2>Langkah 1: Tulis masalah, bukan solution</h2>

<p>Kesilapan paling besar orang mula vibe coding: mereka tulis "buatkan saya dashboard React dengan sidebar dan dark mode". Itu solution. AI boleh hasilkan, tapi ia akan jadi sistem yang cantik tapi tak menyelesaikan apa-apa.</p>

<p>Apa yang aku tulis selalunya macam ni: "Admin perlu nampak semua booking hari ini, boleh approve atau reject, dan user dapat tahu status dalam masa 5 minit." Itu masalah. AI akan cadangkan solution sendiri — dan biasanya pilihannya tak sangka-sangka bagus.</p>

<h2>Langkah 2: Biar AI cadangkan struktur, aku kekal yang decide</h2>

<p>Selepas prompt pertama, aku tak terus terima code. Aku tanya AI cadangkan architecture dulu: database apa, struktur data macam mana, flow user macam mana. Aku baca macam baca proposal kontraktor — ada yang masuk akal, ada yang over-engineered.</p>

<p>Contoh sebenar: masa build e-RUAI, AI cadangkan real-time sync dengan WebSocket untuk semua data. Aku tolak — polling 3 saat cukup untuk use case kami, dan server kami tak perlu tanggung beban tu. Keputusan tu jimat berbulan-bulan maintenance. AI bagi pilihan; aku yang faham konteks, jadi aku yang pilih.</p>

<h2>Langkah 3: Build kecik, test cepat, ulang</h2>

<p>Aku tak pernah minta AI buat seluruh sistem sekali gus. Satu feature dulu. Build, test, tengok hasil. Kalau jalan, sambung. Kalau tak, aku tanya balik dengan error message yang jelas.</p>

<p>Ni yang membezakan orang yang berjaya dengan vibe coding dan yang frustrated. Yang frustrated cakap "tak jadi, buat balik semua". Yang berjaya cakap "line 47 ni error TS2552 — setter ni tak exposed dari hook. Fix dengan tambah dalam return object". Makin specific, makin cepat settle.</p>

<h2>Langkah 4: Hardening — bahagian yang tak boleh skip</h2>

<p>Code dah jalan bukan maksud siap. Setiap sistem yang aku deliver lalu pipeline yang sama: security audit (rules, permissions, API keys), error handling, dan deployment test. Hari tu saja aku audit satu sistem dan jumpa 18 vulnerabilities — semua tertutup dalam satu petang sebab pipeline ni dah jadi rutin.</p>

<p>Vibe coding bukan bermaksud "biar AI buat semua, aku tidur". Ia bermaksud aku fokus pada keputusan yang penting, dan biar AI buat kerja mengtaip yang membosankan.</p>

<h2>Hasilnya?</h2>

<p>Sistem mesyuarat tu? Hari ni ia urus ribuan booking setahun. Mula dari satu soalan petang tu.</p>

<p>Kalau boss ada idea yang dah lama tergantung dalam kepala — jangan tunggu "ada masa". Masa tu takkan datang. Tapi dengan workflow yang betul, idea tu boleh jadi sistem live sebelum minggu ni habis.</p>

<p>Dalam artikel seterusnya, aku kongsi prompt patterns spesifik yang aku guna — yang sama aku ulang pada setiap projek. Jangan miss.</p>]]></content:encoded>
    </item>
    <item>
      <title>n8n, API dan Node: Faham Guna Konsep Waiter, Dapur dan Pelanggan</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=n8n-api-node-restaurant-analogy</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=n8n-api-node-restaurant-analogy</guid>
      <pubDate>Sat, 04 Apr 2026 08:00:00 +0800</pubDate>
      <category>n8n Automation</category>
      <description>Kalau istilah n8n, API dan node buat anda blur, cuba faham guna analogi restoran. Artikel ini pecahkan konsep kepada langkah mudah supaya beginner boleh terus mula bina workflow.</description>
      <content:encoded><![CDATA[<p>Kalau anda baru masuk dunia automasi, istilah macam <strong>n8n</strong>, <strong>API</strong>, dan <strong>node</strong> memang boleh nampak serabut. Jadi saya nak simplify dengan analogi restoran supaya lebih senang faham.</p><h2>Bayangkan operasi restoran</h2><ul><li><strong>Pelanggan</strong> = user atau sistem yang hantar request</li><li><strong>Waiter</strong> = n8n yang terima dan bawa request ke tempat betul</li><li><strong>Dapur</strong> = servis/API yang proses kerja</li><li><strong>Resipi</strong> = workflow anda</li><li><strong>Bahan</strong> = data yang anda hantar ke API</li></ul><h2>Apa itu node dalam n8n?</h2><p><strong>Node</strong> ialah satu langkah kerja dalam workflow. Setiap node ada peranan berbeza. Contohnya webhook node terima data, HTTP Request node hantar data ke API, IF node buat keputusan ikut syarat, dan set/code node kemas data.</p><p>Jadi node bukan sistem penuh. Node cuma satu step dalam “resepi” automasi anda.</p><h2>Workflow ialah resipi</h2><p>Dalam masakan, anda ikut urutan. Dalam n8n pun sama. Anda tak boleh campak semua step sekali gus dan harap hasil jadi cantik.</p><ol><li>Terima data</li><li>Semak format</li><li>Kemas data</li><li>Hantar ke API</li><li>Simpan log</li><li>Beri respons</li></ol><p>Itu workflow. Bila urutan jelas, hasil lebih stabil.</p><h2>API ialah bahan dalam resipi</h2><p>API bukan sekadar URL. API ialah kontrak data. Macam dapur perlukan bahan yang betul, API pun perlukan field yang betul.</p><p>Contoh API WhatsApp perlukan <code>phone</code>, <code>message</code>, dan <code>token</code>. Kalau satu pun salah, order tak jalan.</p><h2>Kenapa kena baca API documentation?</h2><p>Documentation API adalah manual dapur. Dalam tu ada endpoint, method (GET/POST), auth, required fields, dan contoh response.</p><p>Kalau tak baca, biasa akan kena error:</p><ul><li>Unauthorized</li><li>Invalid payload</li><li>Missing field</li><li>Rate limit</li></ul><p>Kebanyakan masa, masalah bukan pada n8n. Masalah pada input yang tak ikut requirement API.</p><h2>Sekarang AI mudahkan proses</h2><p>Dulu nak connect API ambil masa lama. Sekarang anda boleh guna AI untuk percepatkan.</p><p>Cara paling practical:</p><ol><li>Beri AI objective anda</li><li>Paste endpoint + sample docs</li><li>Minta step setup node (method, headers, body)</li><li>Minta fallback untuk error handling</li></ol><p>AI tak gantikan logik anda, tapi AI sangat bantu untuk kurangkan trial and error.</p><h2>Framework simple sebelum pergi besar</h2><ol><li><strong>Define objective</strong> dulu</li><li><strong>Build flow kecil</strong> dan test end to end</li><li><strong>Validate dengan data real</strong></li><li><strong>Add retry + logging</strong></li><li><strong>Scale perlahan-lahan</strong></li></ol><h2>Penutup</h2><p>Bila anda faham konsep waiter, dapur, pelanggan, n8n jadi jauh lebih mudah.</p><p>Workflow ialah resipi. API ialah bahan. Node ialah langkah kerja.</p><p>Start simple dulu. Bila stabil, baru pergi besar.</p>]]></content:encoded>
    </item>
    <item>
      <title>SAFE Framework: Playbook Premium AI Untuk Orang Bukan IT</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=safe-framework-intro</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=safe-framework-intro</guid>
      <pubDate>Fri, 03 Apr 2026 08:00:00 +0800</pubDate>
      <category>SAFE Playbook</category>
      <description>Ramai orang ingat AI ni untuk IT people je. Tapi hakikatnya, kalau ko tau cara describe apa yang ko nak — ko dah layak guna AI. SAFE Framework bukan freebie biasa, tapi playbook premium yang disusun dari pengalaman sebenar bina sistem automasi AI.</description>
      <content:encoded><![CDATA[<p>Bila orang tanya aku macam mana aku boleh build sistem-sistem ni tanpa background IT formal, jawapan aku selalu sama — <strong>describe dengan jelas, iterate dengan pantas, deliver dengan confidence.</strong></p><p>SAFE Framework bermaksud <strong>Systematic AI For Everyone</strong>. Ia bukan satu software, bukan satu app — ia satu <em>cara berfikir</em> tentang macam mana nak guna AI tools secara practical dalam kerja harian.</p><h2>Kenapa SAFE Framework?</h2><p>Aku nampak satu pattern di sekeliling aku — ramai rakan sekerja dan entrepreneur yang tau AI tu berguna, tapi tak tau dari mana nak mula. Diorang rasa intimidated. Rasa macam AI ni untuk orang lain.</p><p>SAFE Framework hadir untuk break that barrier. Dengan 4 prinsip mudah:</p><ul><li><strong>S</strong>tart with the problem, bukan the tool</li><li><strong>A</strong>sk clearly, get clearly</li><li><strong>F</strong>eedback loop — iterate sampai dapat output yang ko nak</li><li><strong>E</strong>mbed into your workflow — buat jadi habit</li></ul><h2>Siapa yang boleh guna?</h2><p>Government officers. Usahawan. Guru. Event managers. Basically sesiapa yang ada kerja berulang yang makan masa. Kalau ko boleh type WhatsApp message, ko boleh guna AI.</p><h2>Ini bukan sekadar bahan percuma</h2><p>Cuba pergi ke <a href='https://safe.mohdhisyamudin.com' target='_blank'>safe.mohdhisyamudin.com</a> untuk explore full playbook. SAFE ialah <strong>playbook premium bernilai</strong>, dibina daripada trial-and-error sebenar supaya anda boleh terus implement sistem AI dengan lebih cepat, teratur, dan kurang risiko.</p>]]></content:encoded>
    </item>
    <item>
      <title>eRUAI 1.0 → 3.0: Dari Excel Manual ke Sistem Mesyuarat Yang Betul-Betul Berfungsi</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=eruai-from-manual-to-system</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=eruai-from-manual-to-system</guid>
      <pubDate>Fri, 03 Apr 2026 08:00:00 +0800</pubDate>
      <category>System Building</category>
      <description>eRUAI bukan lahir terus perfect. Ia bermula dengan Excel, naik ke semi-manual (PDF + auto email), dan akhirnya jadi web app logic-driven. Ini cerita sebenar kenapa saya bina sistem ini — dan apa yang saya belajar semasa sistem digunakan orang sebenar.</description>
      <content:encoded><![CDATA[<p>Masalah meeting dalam organisasi biasanya bukan sebab orang malas. Masalah utama datang bila sistem tak mampu nampak beban sebenar — siapa request, siapa approve, dan slot mana yang dah conflict.</p><p>Itulah asal cerita eRUAI untuk saya. Mula-mula nampak macam isu kecil: meeting clash, approval lambat, semua jadi last minute. Tapi bila dibiarkan, ia jadi culture — semua orang firefighting.</p><h2>Versi 1.0: Excel (manual)</h2><p>Saya bermula dengan cara paling asas — Excel. Masa tu niatnya cuma satu: sekurang-kurangnya ada rekod. Tapi bila volume meningkat, manual update jadi perlahan. Bila ramai orang sentuh data yang sama, error mula berlaku.</p><ul><li>Slot meeting overlap</li><li>Status approval tak konsisten</li><li>Sukar audit siapa buat apa</li></ul><h2>Versi 2.0: Semi-manual (PDF + Auto Email)</h2><p>Saya cuba improve. Saya introduce semi-manual flow: generate PDF dan automate email untuk maklumkan status. Hasilnya memang lebih baik dari Excel. Tapi bila requirement jadi kompleks, flow ni mula tunjuk limit.</p><p>Masalah tak hilang, cuma beralih tempat: orang masih tanya status, masih ada bottleneck pada admin, dan meeting clash masih berlaku dalam situasi tertentu.</p><h2>Turning point: Janji upgrade sebelum saya keluar admin</h2><p>Ada satu janji yang saya pegang: sebelum saya keluar dari role admin, saya nak tinggalkan sistem yang lebih baik daripada asal. Saya cuba naikkan 2.0 dengan Google Sheet integration, tapi tak dapat response yang cukup untuk momentum.</p><p>Jadi saya decide buat 3.0 — web app sebenar dengan logic yang lebih kukuh. Di sinilah saya nampak kuasa vibe coding: bukan tunggu sempurna, tapi bina iteratif sampai orang nampak nilai.</p><h2>Versi 3.0: Web App (React + Tailwind + Firebase)</h2><p>Stack yang saya guna: <strong>React, Tailwind, Firebase</strong>. Fokus utama bukan design cantik dulu — fokus utama ialah logic anti-clash meeting.</p><p>Untuk saya, itu MVP sebenar: solve pain paling sakit dahulu.</p><h3>Apa yang saya sengaja tangguh</h3><ul><li>Email CC automatik</li><li>Auto reminder</li><li>Auto online meeting ID</li></ul><p>Bukan sebab tak penting — tapi sebab saya tak nak overbuild awal. Saya pilih untuk launch fungsi paling kritikal dulu.</p><h2>Status semasa: stabil, tapi saya still jujur tentang gap</h2><p>eRUAI sekarang dalam keadaan stabil. Tapi saya tak suka cerita seolah-olah semuanya perfect. Masih ada 2-3 incident clash, terutama bila:</p><ul><li>Sistem belum ada logic combine room untuk attendance lebih besar</li><li>Admin terlepas special request disebabkan bug tertentu</li></ul><p>Bagi saya, ini bukan failure. Ini signal untuk next iteration.</p><h2>Framework praktikal yang saya guna</h2><ol><li><strong>See the main problem</strong> — jangan solve benda kosmetik dulu.</li><li><strong>Solve the bottleneck</strong> — bina logic minimum yang terus kurangkan pain.</li><li><strong>Deploy, observe, improve</strong> — data penggunaan sebenar lebih bernilai dari assumption.</li></ol><h2>Checklist action (kalau anda nak bina sistem sendiri)</h2><ul><li>Senaraikan 3 pain paling mahal (masa, conflict, visibility).</li><li>Pilih 1 pain paling kritikal untuk jadi MVP.</li><li>Bina versi kecil, release cepat kepada user sebenar.</li><li>Track incident, bukan sekadar feedback umum.</li><li>Iterate mengikut bug/usage, bukan ikut ego builder.</li></ul><h2>Penutup</h2><p>Kalau ada satu lesson dari eRUAI, ini dia: <strong>jangan tunggu sempurna untuk mula.</strong> Sistem yang baik selalunya lahir dari versi yang jujur, bukan versi yang pura-pura flawless.</p><p>Mulakan kecil, tapi konsisten improve. Itu yang bezakan project “cantik” dengan sistem yang betul-betul dipakai.</p>]]></content:encoded>
    </item>
    <item>
      <title>Why MELI? Bila Data Vendor Berserabut, Sistem Kena Jadi Single Source of Truth</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=meli-why-meli</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=meli-why-meli</guid>
      <pubDate>Fri, 03 Apr 2026 08:00:00 +0800</pubDate>
      <category>Product Strategy</category>
      <description>MELI wujud bukan sebab nak buat platform cantik. MELI wujud sebab team vendor perlukan satu tempat yang jelas untuk data, status, dan tindakan. Ini cerita Why MELI dari konteks sebenar lapangan event.</description>
      <content:encoded><![CDATA[<p>Bila saya tengok operasi vendor semasa RWMF2025, satu perkara jelas: data ada, tapi tak berpusat. Registration di satu tempat, info lain di tempat lain, dan status pula bergantung pada siapa yang sempat jawab dulu.</p><p>Masalah ni bukan sekadar “nampak serabut”. Ia bagi kesan terus pada execution — team jadi lambat, vendor jadi blur, dan deadline mula tertekan.</p><h2>Kenapa MELI dibina?</h2><p><strong>MELI</strong> dibina sebagai platform untuk kumpul vendor yang berminat join sebagai service provider semasa event STB. Fokus utamanya ialah satu: jadikan data vendor <strong>teratur, boleh audit, dan mudah ditindak</strong>.</p><p>Nama MELI sendiri datang dari slang Sarawak yang dekat dengan maksud “selling”. Bagi saya, itu identiti yang cantik — lokal, relevan, dan ada karakter.</p><h2>Masalah yang MELI cuba hentikan</h2><ul><li>Data vendor bertebaran di banyak saluran</li><li>Status tak jelas, jadi vendor asyik follow-up soalan sama</li><li>Team terpaksa check manual berulang kali</li><li>Deadline management jadi rapuh bila info tak sinkron</li></ul><h2>Design principle MELI (yang saya pegang)</h2><h3>1) Auditable</h3><p>Setiap perubahan status mesti boleh dijejak. Bila ada pertikaian, kita rujuk data — bukan memory.</p><h3>2) Simple</h3><p>User tak perlu training panjang. Kalau UI terlalu kompleks, adoption jatuh.</p><h3>3) Menyahut digitalisation</h3><p>MELI bukan sekadar app. Ia sebahagian budaya kerja yang lebih cepat, lebih jelas, dan kurang friction.</p><h2>Apa impak paling ketara setakat ini?</h2><ul><li><strong>Deadline lebih terkawal</strong></li><li><strong>User boleh semak status sendiri</strong> (kurang tanya team berulang kali)</li><li><strong>Kurang workload checking manual</strong> untuk admin/team</li></ul><p>Bila sistem buat kerja tracking asas dengan baik, team boleh fokus pada kerja keputusan (decision-making), bukan kerja clerical yang berulang.</p><h2>Roadmap MELI (next phase)</h2><ul><li>Integrasi <strong>POS</strong></li><li>Modul <strong>Sales Revenue</strong></li><li>Lebih banyak <strong>admin features</strong> untuk operasi skala lebih besar</li></ul><p>Tapi prinsip saya kekal: add bila perlu, bukan sebab “nampak canggih”.</p><h2>Risiko terbesar: Security</h2><p>Saya paling risau tentang security. Dari pengalaman sistem terdahulu, saya dah awal-awal hardening MELI dengan panduan AI — dari access control, sanitization, hingga audit approach.</p><p>Bagi saya, sistem vendor bukan sekadar tempat simpan data — ia trust infrastructure. Kalau trust jatuh, sistem takkan dipakai walau secanggih mana pun.</p><h2>Framework praktikal (untuk builder lain)</h2><ol><li><strong>Problem to solve</strong> — jelaskan pain sebenar dengan spesifik.</li><li><strong>Validate</strong> — release versi kecil kepada user sebenar.</li><li><strong>Improve</strong> — upgrade ikut feedback dan data penggunaan.</li></ol><h2>Checklist action (untuk anda)</h2><ul><li>Definisikan 1 objective utama sistem (contoh: status visibility).</li><li>Pastikan setiap field dalam form ada tujuan operasi jelas.</li><li>Bina dashboard status yang user boleh semak sendiri.</li><li>Track bottleneck paling kerap (bukan yang paling bising).</li><li>Upgrade secara berperingkat, jangan “buat semua” serentak.</li></ul><h2>Penutup</h2><p>Kalau saya boleh ringkaskan Why MELI dalam satu ayat: <strong>sebab team perlukan satu sumber kebenaran yang boleh dipercayai.</strong></p><p>Dan lesson paling penting: <strong>jangan buat semua dari awal. Start small, then scale with confidence.</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>n8n Tips: Mula Dengan Automasi Simple Dulu Sebelum Pergi Besar</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=n8n-simple-automation-before-you-go-big</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=n8n-simple-automation-before-you-go-big</guid>
      <pubDate>Fri, 03 Apr 2026 08:00:00 +0800</pubDate>
      <category>n8n Automation</category>
      <description>Ramai orang nak bina flow besar terus, tapi sistem production yang tahan lama biasanya bermula dengan flow kecil yang stabil. Ini tips n8n practical dari pengalaman lapangan sebelum anda scale.</description>
      <content:encoded><![CDATA[<p>Kebanyakan orang yang baru guna n8n terus nak bina sistem gergasi: banyak branch, banyak integrations, AI layer, reporting layer — semua dalam satu flow. Saya pun pernah berada di situ. Result dia? Penat, fragile, dan susah debug.</p><p>Kalau nak elak burn masa, ini prinsip yang saya pegang: <strong>mula kecil, stabilkan, baru scale.</strong></p><h2>Kenapa “simple first” lebih laju?</h2><p>Sebab automasi sebenar hidup dalam environment sebenar: internet down, API timeout, webhook delay, data format berubah, dan manusia typo input. Flow kecil lebih cepat dibaiki bila real-world issue muncul.</p><h2>5 Tips n8n sebelum anda pergi besar</h2><h3>1) Satu flow = satu objective</h3><p>Contoh objective: “Lead baru masuk form → hantar WhatsApp welcome”. Jangan campur sekali dengan invois, reminder, analytics, dan CRM sync dalam flow sama. Pisahkan.</p><h3>2) Design fallback dari awal</h3><p>Dari pengalaman kita, ada masa provider WhatsApp boleh down. Kalau tiada fallback, team panik dan kembali manual. Letak branch fallback (log + notify admin) supaya anda nampak bila flow tak berjalan.</p><h3>3) Normalize data seawal mungkin</h3><p>Contoh phone number: user isi "012..." atau "6012...". Standardize dulu (trim, remove spaces, add 6 jika perlu) sebelum hantar ke API. Ini kurangkan error pelik di hujung flow.</p><h3>4) Log minimal tapi bermakna</h3><p>Log benda penting sahaja: timestamp, input id, status step, error ringkas. Log yang terlalu detail tanpa struktur akan jadi noise dan susah audit.</p><h3>5) Test dengan data real, bukan sample cantik</h3><p>Uji dengan data yang messy: nama pelik, nombor tak lengkap, email typo, duplicate submit. Sistem production rosak bukan sebab data cantik — rosak sebab data sebenar.</p><h2>Template progression (yang saya guna)</h2><ol><li><strong>Version 0.1:</strong> Flow asas jalan end-to-end.</li><li><strong>Version 0.2:</strong> Tambah validation + fallback.</li><li><strong>Version 0.3:</strong> Tambah logging + notification.</li><li><strong>Version 1.0:</strong> Stabil 7–14 hari tanpa incident besar.</li><li><strong>Version 2.0:</strong> Baru scale (extra branch/integration/AI).</li></ol><h2>Checklist sebelum scale</h2><ul><li>✅ Error rate rendah dan boleh dijelaskan.</li><li>✅ Fallback path sudah diuji.</li><li>✅ Manual override ada (jika urgent).</li><li>✅ Team tahu baca log asas.</li><li>✅ Anda tahu bottleneck sebenar, bukan sekadar sangkaan.</li></ul><h2>Penutup</h2><p>Automasi yang bagus bukan yang paling kompleks. Ia yang paling <strong>boleh dipercayai</strong>. Bila flow kecil dah stabil, anda akan scale dengan lebih tenang — bukan dengan harapan semata-mata.</p><p>Mulakan simple. Menang konsisten. Kemudian baru pergi besar.</p>]]></content:encoded>
    </item>
    <item>
      <title>Apa Itu n8n? Penerangan Simple Untuk Beginner</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=apa-itu-n8n-beginner</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=apa-itu-n8n-beginner</guid>
      <pubDate>Fri, 03 Apr 2026 08:00:00 +0800</pubDate>
      <category>n8n Automation</category>
      <description>Kalau anda baru kenal n8n dan AI automation, artikel ini akan bagi gambaran mudah tanpa jargon teknikal. Siap dengan chapter video dan langkah mula paling praktikal.</description>
      <content:encoded><![CDATA[<p>Ramai orang dengar nama <strong>n8n</strong>, tapi masih blur apa sebenarnya platform ni buat. Saya pun bermula dari zero, tanpa background coding formal. Artikel ni saya ringkaskan berdasarkan video perkongsian saya, supaya beginner boleh faham dengan cepat.</p><h2>🔥 Apa anda akan pelajari</h2><ul><li>Apa itu AI automation</li><li>Fungsi n8n untuk beginner</li><li>Contoh automasi kerja sebenar</li><li>Perjalanan saya dari zero tanpa coding</li></ul><h2>Video: Apa Itu n8n?</h2><p>Anda boleh tonton video penuh di bawah:</p><iframe width="560" height="315" src="https://www.youtube.com/embed/1NKbgR8qi_0?si=ivc5SAuw8VoC3EVd" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><h2>Chapter ringkas video</h2><ul><li><strong>00:00</strong> — Intro & Siapa Saya</li><li><strong>00:30</strong> — Kenapa Saya Mula Belajar AI</li><li><strong>01:00</strong> — Jumpa ChatGPT & AI Agent</li><li><strong>01:32</strong> — Platform n8n: Apa & Kenapa</li><li><strong>02:44</strong> — Apa Yang Akan Anda Pelajari</li><li><strong>04:18</strong> — Ajak Join Journey</li></ul><h2>Apa itu AI automation dalam bahasa mudah?</h2><p>AI automation ialah bila kita gabungkan proses kerja berulang dengan automasi dan AI supaya kerja lebih cepat, kurang manual, dan kurang error. Bukan bermaksud robot ambil alih semua kerja. Ia lebih kepada bantu manusia fokus pada kerja yang lebih penting.</p><h2>Kenapa n8n sesuai untuk beginner?</h2><p>Sebab n8n benarkan anda bina flow secara visual. Anda nampak step by step dari trigger hingga action. Untuk orang yang baru mula, ini sangat membantu sebab kita boleh faham logik proses dulu sebelum fikir benda kompleks.</p><h2>Contoh automasi kerja sebenar</h2><ul><li>Form masuk lead baru → simpan data → hantar notifikasi WhatsApp/email</li><li>Mesej pelanggan masuk → classify intent → balas ikut template</li><li>Data status kerja update → team terus dapat alert</li></ul><p>Flow begini nampak kecil, tapi impak dia besar bila dibuat konsisten.</p><h2>Perjalanan saya dari zero</h2><p>Saya bermula dengan rasa blur juga. Saya tak tunggu jadi programmer baru nak mula. Saya belajar satu flow kecil dulu, test, gagal, baiki, dan ulang. Dari situ saya nampak satu perkara penting: <strong>yang penting bukan hafal code, tapi faham problem dan susun langkah penyelesaian.</strong></p><h2>Checklist action untuk beginner</h2><ul><li>Pilih satu kerja berulang yang paling menyusahkan anda sekarang</li><li>Lukis flow mudah atas kertas dulu</li><li>Bina flow minimum dalam n8n</li><li>Test dengan data real</li><li>Tambah baik sikit demi sikit</li></ul><p>Mulakan simple. Bila flow kecil dah stabil, barulah pergi ke automasi yang lebih besar.</p>]]></content:encoded>
    </item>
    <item>
      <title>Macam Mana Aku Build WhatsApp Chatbot untuk RWMF dalam 2 Minggu</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=rwmf-chatbot-story</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=rwmf-chatbot-story</guid>
      <pubDate>Sun, 15 Mar 2026 08:00:00 +0800</pubDate>
      <category>AI Automation</category>
      <description>RWMF 2025 — salah satu festival muzik terbesar Asia. Dan aku ada 2 minggu untuk deploy AI chatbot yang boleh handle ribuan pertanyaan visitor dan vendor. Ini cerita sebenar — tools, decisions, dan pelajaran yang aku ambil.</description>
      <content:encoded><![CDATA[<p>Timeline: <strong>2 minggu.</strong> Scope: Deploy WhatsApp chatbot untuk Rainforest World Music Festival yang boleh handle FAQ dari ribuan visitor dan vendor. Zero existing infrastructure. Go.</p><p>Ni bukan exaggeration — itulah constraint sebenar yang aku hadapi. Dan aku nak share exactly macam mana ia jadi, termasuk bahagian-bahagian yang tak smooth.</p><h2>Stack yang aku guna</h2><ul><li><strong>n8n</strong> — automation backbone, self-hosted</li><li><strong>WhatsApp Business API</strong> via third-party provider</li><li><strong>Google Sheets</strong> — knowledge base yang boleh di-update real-time</li><li><strong>LLM (Claude API)</strong> — untuk understand questions dan generate natural answers</li></ul><h2>Week 1: Setup & Knowledge Base</h2><p>Hari pertama bukan coding — hari pertama adalah <em>knowledge gathering</em>. Aku pergi ke team RWMF dan kumpul semua FAQ yang biasa diorang dapat: parking, lineup, vendor requirements, ticketing, accessibility.</p><p>Semua masuk dalam Google Sheet. Simple. Tapi ini adalah the most important part — garbage in, garbage out.</p><h2>Week 2: Testing & Go-Live</h2><p>n8n workflow dia: WhatsApp message masuk → extract intent → cari dalam knowledge base → LLM polish the answer → reply. Kalau tak jumpa answer → escalate ke human.</p><p>Result? Lebih 70% queries answered automatically. Team aku boleh focus pada high-value interactions je.</p><p>Lesson terbesar: <strong>Start simple. Ship fast. Iterate.</strong> Chatbot pertama aku bukan perfect — tapi ia functional, dan functional beats perfect every time.</p>]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding: Cara Aku Build Apps Tanpa Hafal Syntax</title>
      <link>https://mohdhisyamudin.com/blog/post.html?id=vibe-coding-explained</link>
      <guid isPermaLink="true">https://mohdhisyamudin.com/blog/post.html?id=vibe-coding-explained</guid>
      <pubDate>Fri, 20 Feb 2026 08:00:00 +0800</pubDate>
      <category>Vibe Coding</category>
      <description>Orang selalu terkejut bila tau aku tak ada degree IT. &#x27;Tapi macam mana ko build semua sistem tu?&#x27; Jawapannya: Vibe Coding. Bukan buzzword — ini adalah skill sebenar yang boleh dipelajari oleh sesiapa sahaja.</description>
      <content:encoded><![CDATA[<p>Vibe Coding bukan bermaksud ko main agak-agak je dalam coding. Ia adalah satu <strong>deliberate approach</strong> di mana ko guna AI sebagai co-pilot — dan tugas ko adalah jadi navigator yang bagus.</p><h2>Apa yang dimaksudkan dengan 'Vibe'?</h2><p>Bila ko describe sesuatu sistem kepada AI, ko perlu convey bukan sahaja <em>apa</em> yang ko nak, tapi juga <em>feel</em> dan <em>context</em> dia. Macam brief kepada designer — semakin jelas brief, semakin bagus output.</p><p>Contoh weak prompt: <em>'Buat dashboard'</em></p><p>Contoh vibe prompt: <em>'Buat dashboard untuk track project submissions dalam organisasi kerajaan. User adalah manager yang tak IT-savvy. Kena ada status indicator, filter by department, dan export to PDF. Dark theme, clean, no clutter.'</em></p><p>Nampak perbezaan? Yang kedua ada context, ada user persona, ada constraints, ada aesthetic direction.</p><h2>3 Kemahiran Core Vibe Coding</h2><ul><li><strong>Context Engineering</strong> — Bagi AI semua maklumat yang dia perlukan upfront</li><li><strong>Iterative Prompting</strong> — Refine output step by step, jangan expect perfect on first try</li><li><strong>Error Interpretation</strong> — Bila ada error, describe error kepada AI dan tanya solution</li></ul><h2>Boleh ke orang bukan-IT belajar ni?</h2><p>100% boleh. Malah, kadang-kadang orang bukan-IT lebih bagus dalam Vibe Coding sebab diorang focus kepada <em>business problem</em>, bukan kepada technical implementation. Diorang describe apa yang user perlukan — dan itulah sebenarnya yang paling penting.</p><p>Mulakan dengan satu masalah kecil dalam kerja harian ko. Describe kepada Claude atau ChatGPT. Iterate. Deploy. Ulangi.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
