Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
500 artikel
- 19.52backend
Footer Berubah, JSON-LD Tidak: Jebakan Boot Cache Settings API
Menulis baris settings langsung ke database tidak mengubah respons API yang menyimpan snapshot saat boot. Urutan debug tiga lapis dan aturan restart.
TL;DR: Update settings langsung lewat SQL memang masuk di database, tapi endpoint masih balikin nilai lama soalnya API cuma baca snapshot in-memory yang dibuat pas boot. Nulis SQL itu nggak lewat jalur yang bisa refresh snapshot, makanya datanya kelihatan aman tapi nggak pernah kepakai. Solusinya gampang: habis nulis langsung ke DB, tinggal restart API-nya.
#caching#cache-invalidation#debugging - 16.57testing
Istilah Lama Harus Tetap Pensiun setelah Rebrand
Rename besar bukan satu perintah cari-ganti: tiap permukaan punya aturan aman sendiri, dan legacy-guard test menjaga istilah yang pensiun tidak kembali.
TL;DR: Jadi rename Duta Muda dan Jelajah Kota ke PESONA ternyata bukan cuma cari-ganti biasa, stringnya nempel di banyak tempat kayak metadata SEO, label admin, sama tabel pengaturan. Tiap permukaan beda penanganan, ada yang lewat SQL, ada yang harus cek test assertion biar nggak gagal. Biar istilah lama nggak balik, dipasang negative test yang jalan terus di CI.
#testing#vitest#nextjs - 15.33devops
Tiga Commit Merah yang Tidak Boleh Ditulis Ulang
Checker gate baru menandai tiga commit index lama karena tak punya trailer Task. Menulis ulang sejarah bukan jawabannya; grandfather by record adalah jalan ketiga.
TL;DR: Commit lama kena FAIL gara-gara aturan baru minta trailer Task:, padahal commitnya lahir sebelum aturan itu ada. Rewrite sejarah bukan solusi, karena ubah satu commit bikin semua hash setelahnya ikut berubah dan merusak CI, cache, dll. Jadi aturannya grandfather by record: tiga hash itu dicatat sebagai pengecualian lengkap dengan alasannya, dan trailer ditegakkan cuma buat commit ke depan.
#git#hooks#commit-convention - 12.51frontend
Satu Stop Warna, Dua Nilai Kontras
Kontrak warna mengunci dua nilai dalam satu hue: teks aksen di stop 800, fill CTA tetap 600. Ambang kontras WCAG yang menentukan, bukan selera.
TL;DR: Ganti accent text ke text-emerald-800 cuma lewat satu perintah sed, ternyata kena 409 kemunculan di 115 file. Satu hue butuh dua stop beda: teks wajib lolos 4,5 banding 1, fill button cukup 3 banding 1, jadi nggak bisa disatukan. Verifikasinya dua lapis, skrip kontras plus census CSS bundle, hasil akhirnya nilai hex lama nol.
#css#tailwind#accessibility - 11.52frontend
Palet Kosong dari JSON yang Valid
Kunci backgroundColor dan pembaca yang mencari background-color, dua-duanya legal tapi tidak pernah bertemu. Palet kosong tanpa satu pun error.
TL;DR: Bug-nya sepele tapi siluman: capture nulis key JSON gaya camelCase, sedangkan consumer bacanya pakai kebab-case, jadi lookup-nya gagal total. Nilainya nggak error, cuma string kosong, makanya palette sama font tampil kosong padahal build sukses dan screenshot jelas berwarna. Solusinya satu arah: capture nulis kebab-case plus script validasi sebelum file ditulis.
#css#json#javascript - 00.33frontend
Deep-Link Video di Mega Menu: URL, State, dan Preload yang Benar
Mega panel video butuh tiga lapisan URL: path identitas, query state UI, hash timestamp. State video butuh sync manual ke hash. Preload metadata + poster, bukan auto. Prefetch route matikan auto, pakai hover.
TL;DR: Gunakan path URL untuk ID video, query buat state panel, dan hash (#t=) buat timestamp video. Set video preload='metadata' plus poster biar hemat bandwidth, prefetch route pakai hover manual bukan auto. Sinkronin manual currentTime ke hash pas seek biar bookmark dan share tetap work.
#frontend#performance#nextjs - 00.42frontend
Mengapa Kartu Artikel Populer Video Tanpa Thumbnail
Kartu marquee cuma cek thumbnail eksplisit. Video item fallback ke gradient. Fix: rantai thumbnail → i.ytimg hqdefault → gradient. hqdefault selalu ada untuk video publik.
TL;DR: Halaman KotaPortal rusak. Video YouTube cuma tampil gradient biru-ungu. Sekarang sudah diperbaiki dengan rantai fallback.
#frontend#performance#nextjs - 00.34frontend
Mengapa Marquee Populer Tiga Pilar Kosong — dan Cara Mengisinya
Marquee populer 3 pilar (olahraga/kebudayaan/kepemudaan) kosong di pilar muda. Fix: parallel fetch popular + random, mergePopularWithRandom dedupe by id, popular priority, slice 9.
TL;DR: Pilar muda di KotaPortal punya marquee setengah kosong. Perbaikan dilakukan dengan parallel fetch dan merge dedupe. Marquee sekarang selalu penuh 9 item.
#frontend#performance#nextjs - 00.24backend
Mengapa "Artikel Populer" Tetap Menampilkan Item Lama
Query sort=popular pakai view_count total bikin artikel lama selalu menang. Perbaikan: skor 7 hari rolling + tiebreak deterministik + random filler limit 9.
TL;DR: KotaPortal punya masalah di artikel populer. Skor total bukan skor sekarang. Perbaikan pakai skor 7 hari rolling.
#database#performance#mysql