09 // catatan rilis
Catatan Rilis
Semua yang berubah di situs ini — satu entri per pengerjaan, ditulis apa adanya. Kalau tidak tertulis di sini, berarti belum dikerjakan.
- Produksi 2026.1522 Sep
Audit menyeluruh: perbaikan API v1 + metric + guard dependensi
Bug API publik v1 (ditemukan audit live)
- 6 dari 10 detail studi 404 di live: file
public/api/v1/studies/*.jsonuntuk studi baru 2026.12 (didong-code, kms-spbe, niu-dash, niu-lkh, niu-oss-dashboard, sapa-ai) dihasilkangen-api.mjstetapi terlewat commit, padahalindex.jsonmengiklankan endpoint-nya. Kini dilacak — kontrak API utuh kembali (90 repo + 10 studi + 7 indeks = 107 endpoint, angka generator). - Endpoint yatim dihapus:
repos/dotfiles.json(repo lama 2024, tidak ada di indeks) selama ini masih dilayani live dengan data basi.
Metric studi niu-oss-dashboard disegarkan
- "endpoint API publik" 102 → 107; "halaman statis" 208 → 214 (value + prosa id+en, API diregenerasi). Metric publik kini cocok dengan bukti build/generator saat ini.
Guard rantai dependensi
react/react-domdipin^19.2.8→~19.2.8— react 19.3.0 sudah rilis dan akan melanggar peer fiber 9.7.0 (>=19 <19.3) bila dependabot menaikkannya. Kembalikan ke^saat fiber mendukung (T3).
Docs
- "91 repo" → 90 di AGENTS.md + README.md (fakta repos.json/GitHub).
- `docs/AUDIT-2026.15.md`: hasil audit dua sisi lengkap — 22 rute live, header, JSON-LD, sitemap, bobot, ekspor statis, temuan & rekomendasi.
- Rekomendasi ops: trigger Lighthouse CI manual (gagal 21 Sep sebelum fix kontras 2026.13; jadwal mingguan berikutnya baru 28 Sep).
- 6 dari 10 detail studi 404 di live: file
- Produksi 2026.1422 Sep
Fase 2: mode densitas + PWA offline penuh + share target
Mode densitas (/repositories)
- Toggle tampilan ringkas vs kartu di toolbar (Rows3/LayoutGrid, aria-pressed, sr-only) — preferensi di localStorage
niu-density, dimuat di useEffect (default kartu, aman hydration). - Ringkas: baris padat — nama, bahasa, deskripsi 1 baris, badge arsip, stars/demo, tanggal push. Pembaca cepat vs penjelajah.
PWA offline penuh
- sw.js v3: precache diperluas ke halaman populer — /repositories, /studies, /now, /changelog, /status — siap dibaca tanpa jaringan sejak SW terpasang.
- Halaman offline kaya:
OfflineCacheListmembaca Cache API langsung dari browser — menampilkan halaman yang BENAR-BENAR tersimpan (bukan daftar statis), dengan fallback halaman inti.
Share target PWA
manifest.share_target(GET, ramah ekspor statis) → halaman/share: tautan repo GitHub Niumination ditawarkan dibuka sebagai halaman /repo/<nama>; tautan lain bisa dibuka/disalin; tanpa tautan → pesan ramah. Suspense + useSearchParams sesuai pola statis.
Verifikasi
- Toggle tampilan ringkas vs kartu di toolbar (Rows3/LayoutGrid, aria-pressed, sr-only) — preferensi di localStorage
- Produksi 2026.1322 Sep
Fase 1 tuntas (SEO) + Fase 2 mulai (a11y & onboarding)
SEO konten (menuntaskan Fase 1)
- JSON-LD `Article` per studi: headline, seksi kind, datePublished/dateModified dari createdAt/pushedAt repo sumber — melengkapi BreadcrumbList; terkonfirmasi di HTML build.
- `/feed-studies.xml` — RSS katalog studi (pubDate faktual: tanggal repo dibuat); terdaftar di layout alternates + footer.
Aksesibilitas (Fase 2 — pas pertama)
- Kontras label mikro naik: text-cream/25→/35, /30→/40 di 15 berkas (~26 titik) — persentase, nomor statistik, hint keyboard, hitungan filter kini berkontras memadai (WCAG 2.2 AA).
- Fokus keyboard: sudah terjangkau
:focus-visibleglobal — diverifikasi.
Onboarding halus (Fase 2)
- HintCard pertama-kunjung: kartu kecil pintasan '/' dan Ctrl+K; ditutup permanen via localStorage; pengguna yang menekan pintasan dianggap paham (auto-tutup). Aman hydration (render null di server).
- Pintasan `/` baru: buka command palette dari halaman mana pun (dikecualikan saat sedang mengetik di form).
Verifikasi
- Produksi 2026.1222 Sep
Katalog studi kasus 4 → 10 (ROADMAP Fase 1)
Studi baru (6) — semua berbasis riset README repositori publik
- KMS SPBE — rumah pengetahuan instansi (Next.js + Supabase, 5 modul inti, tanpa server dikelola sendiri).
- SAPA Smart AI — asisten data statistik Aceh Tengah: satu sumber (API SPLP), jawaban berbukti (indikator/nilai/satuan/tahun/OPD), arsitektur minimal, 10+ dokumen serah terima — termasuk catatan jujur layanan tanya-jawab yang sengaja dimatikan.
- Didong-Code — agentic dev environment desktop (Electron + React) dengan identitas seni Didong Gayo.
- Niu-LKH — laporan kegiatan harian: bukti terkompresi otomatis, localStorage + sinkronisasi Google Sheets, ekspor PDF/Excel/CSV.
- NIU-DASH — kakak dari situs ini: dasbor 112 proyek, vanilla JS, GitHub Pages — peta konsep yang memicu penerusnya.
- Niu-OSS-Dashboard — studi meta: situs yang mengaudit dirinya (208→212 halaman statis, uptime GitOps, CSP, E2E, API v1).
Perbaikan ikutan
- Jumlah studi kini dinamis
{n}(home + /studies) — tak akan basi lagi saat katalog bertambah. - Sentinel test changelog dibuat tahan-masa-depan (hapus pin versi — terima kasih Hermes atas bump 8be031f, kini tak perlu lagi).
- API publik v1 di-regenerasi (107 file JSON; +6 detail studi).
Verifikasi
- Produksi 2026.1122 Sep
Fase 1 konten: /now + /changelog, kalender GraphQL, quick wins
Fix: kalender kontribusi 12 bulan akhirnya menyala
- Bug kembar `9c820d3` terlewat di `lib/insights.ts`: env
GITHUB_OWNERstring kosong + operator??→ GraphQLuser(login:"")→ null → diam-diam fallback events (±90 hari) meski token T1 sudah hidup. Live 22 Sep masih menampilkan "±90 hari (events)". Fix: pola?.trim() ||+scripts/gen-mock.mjs. Setelah deploy,/systemmenampilkan kalender penuh 12 bulan.
Halaman baru (ROADMAP Fase 1)
- `/now` — papan kerja: repo dengan push terbanyak 30 hari terakhir + linimasa aktivitas per hari, dari events publik snapshot.
lib/now.tsmurni + 5 unit test; tanggal diformat saat build (deterministik, aman hydration). - `/changelog` — CHANGELOG.md di-render sebagai timeline. Parser khusus ke struktur React murni: TANPA
dangerouslySetInnerHTML(permukaan XSS nol — berbeda dari README repo pihak ketiga yang tetap lewat sanitasi browser). 5 unit test termasuk validasi 21 entri asli.
Quick wins (antrian cepat ROADMAP)
not-found: tombol "Kembali" (history.back, fallback beranda) + saran "cari di repositori".RepoCard: chip topik kini tautan ke pencarian ter-filter (/repositories?q=…)./status: legenda warna strip 30 hari untuk pengunjung baru.- Command palette: aksi "salin tautan halaman ini".
Verifikasi
- Bug kembar `9c820d3` terlewat di `lib/insights.ts`: env
- Produksi 2026.1022 Sep
Kebersihan docs + humanisasi salinan UI
Kebersihan docs
- Hapus fragmen token dari 4 berkas publik (PANDUAN-OPS, AGENTS.md, CHANGELOG 2026.9, BACKLOG) — fragmen tidak bisa dipakai masuk, tapi kebiasaan menulis bagian rahasia apa pun di repo publik wajib dihilangkan.
- Catat kebijakan pause: sejumlah deployment tampil DOWN di /status karena pemiliknya sengaja me-pause proyek di Vercel (bukan insiden) — didokumentasikan di AGENTS.md agar audit berikutnya tidak salah menandai.
Humanisasi salinan UI (37 kunci i18n × 2 bahasa)
- Arah suara: dari bahasa dashboard yang kaku menjadi suara pembuatnya — konkret, hangat, sedikit jenaka; formal "Anda" di halaman jasa, "kamu" di momen santai (404/offline/empty state). Tagline "Sistem terbuka, dibangun di depan umum" dipertahankan (identitas brand).
- Contoh perubahan (id): - hero: "Pengembang full-stack & engineer AI tooling…" → "Saya bikin sistem untuk dipakai, bukan dipamerkan… angkanya dihitung live dari API GitHub, bukan hasil ketikan." - audit: "…plus peta perbaikannya" → "…daftar temuan berurutan prioritas yang benar-benar dikerjakan, bukan PDF yang disimpan lupa." - proses jasa: "Kode di-review bersama, commit terlihat" → "progresnya kelihatan, bukan menghilang dua minggu."
- Fix faktual ikut: "tiga studi kasus" → empat (test: 4 studi); meta description "91 repositori" basi → dihapus (hero menghitung dinamis dari API).
- 6 metadata halaman +
SITE.descriptionikut disegarkan. - Nilai terkunci test dipertahankan (
nav.home,status.badge, interpolasi{var}semua kunci — dijaga script pengganti). - Verifikasi: tsc 0 · vitest 52/52 · build 206 halaman statis · copy baru terkonfirmasi di HTML hasil build.
- Produksi 2026.922 Sep
T1 GITHUB_TOKEN live: perbaikan GITHUB_OWNER kosong
T1 — data live GitHub API aktif untuk pertama kalinya
- Gejala:
/api/github/summaryselalulive: false,source: fallback-cachedi semua deployment sejak go-live — meskiGITHUB_TOKENsudah terpasang (dua token berbeda dicoba, keduanya lolos verifikasi API 200 OK lewat debug route). - Akar masalah (terbukti via route debug `/api/github/snap`): env
GITHUB_OWNERdi Vercel berisi string kosong (""), bukanundefined. Kode lama memakaiprocess.env.GITHUB_OWNER ?? 'Niumination'— operator??hanya menggantikannull/undefined, sehinggaOWNER = ''→ fetch/users//repos→ 404 → seluruhgetGithubSnapshotjatuh ke fallback. Token tidak pernah bermasalah. - Fix (`9c820d3`):
process.env.GITHUB_OWNER?.trim() || 'Niumination'— pola yang sama denganNEXT_PUBLIC_CONTACT_*dilib/site.config.ts(patch arenac60387f). - Token: fine-grained PAT (read-only, public repositories) — terpasang di Production + Preview (
1336ee7). - Verifikasi (22 Sep 2026):
curl -s https://niumination.web.id/api/github/summary→live: true,source: github-api,totalRepos: 90,updatedAt= waktu nyata.
Lainnya
www.niumination.web.idditambahkan ke project (vercel domains add) + CNAMEcname.vercel-dns.comdi zona Vercel DNS — verifiedconfigured-correctly.- Insiden kecil
47e1ac4(data/repos.jsontertimpa error 404 API) dipulihkan sendiri lewat revert65a352ddalam <1 menit.
- Gejala:
- Produksi 2026.821 Sep
Pemulihan uptime + aturan emas Git
Insiden: data uptime beku ±26 jam (post-mortem singkat)
- Gejala:
data/uptime.jsonbeku di 20 Sep 14:51 UTC; domain produksi belum masuk pantauan; run cron #11–16 (20–21 Sep) semuasuccessTANPA komit baru — terlihat misterius. - Akar masalah (terbukti): run #12–#15 berjalan di
head_sha0ee958b0/2f3f37e2/ac672e7a/a916430d— SHA yang tidak ada di silsilah `main`. Artinya komit uptime *memang* dibuat & dipush saat itu, lalu ter-orphan karena patch agen diterapkan dari snapshot basi dan dipush menimpamain(efek force-push). Cron tidak bersalah; alur sinkronisasi manual-lah yang memotong komitnya. - Faktor kedua (platform): cron
*/15aktual berjalan 2–7 jam sekali (delay antrian GitHub Actions) — 16 run dalam ±2 hari.
Perbaikan
- Refresh uptime manual (workaround cron):
uptime-check.mjsdijalankan lokal — domain `niumination.web.id` kini terpantau (OK, 176 ms) + 10 situs ekosistem; 3 terdeteksi down:kune-ya.com(status ≥500),mata-aihackfest-2026(timeout),cc-acehtengah(status ≥500).data/uptime.json+lib/uptime-data.ts+public/api/v1/uptime.jsondiperbarui →/statusdan API segar lagi setelah deploy. - Harden `.github/workflows/uptime.yml`:
concurrency: uptime(anti run tumpang-tindih) +git pull --rebase origin mainsebelum push (komit cron selalu naik kemainterbaru, tidak pernah butuh force). - Aturan emas anti-force-push didokumentasikan di docs/PANDUAN-OPS.md (cara aman menerapkan patch) + pitfall AGENTS.md (bukti
head_sha) — mencegah repeat.
Verifikasi
- Gejala:
- Stack 2026.721 Sep
T2 CSP report-only + T6 schema repo + T4 audit bundel
Keamanan (T2 fase 1)
- `Content-Security-Policy-Report-Only` di
next.config.ts(catch-all):default-src 'self', script/style dengan inline (flight Next + Snap.js Midtrans di-allowlist),object-src 'none',base-uri/form-action'self',frame-ancestors *(kebijakan embed dipertahankan). Halaman statik murni → nonce per-request tak memungkinkan; jalur bertahap report-only → enforcement (panduan: docs/PANDUAN-OPS.md §C). - `app/api/csp-report/route.ts` (baru): titik kumpul laporan browser (format lama
csp-report+ baruReport-To) → log Functions Vercel, field dipotong anti-banjir. Teruji: POST → 204 + log[csp] ….
SEO (T6)
- `SoftwareSourceCode` JSON-LD di
/repo/[slug](bahasa, lisensi SPDX, statistik star/fork via InteractionCounter, dateModified). Halaman repo kini membawa Person + WebSite + BreadcrumbList + SoftwareSourceCode.
Audit bundel (T4 — angka dasar untuk pemantauan)
- Initial JS
/= 915 KB (13 chunk, pra-gzip); framework react + react-dom 386 KB; framer-motion+cmdk 248 KB (kandidat pangkas via T3); three.js 882 KB terkonfirmasi lazy (tidak dimuat di initial/). DOMPurify 73 KB hanya di rute repo;qrcodeserver-side.
Dokumentasi
- docs/PANDUAN-OPS.md (baru): panduan langkah-demi-langkah bagian pemilik — T1 GITHUB_TOKEN, varian www, prosedur CSP → enforce, Analytics, ritual verifikasi deploy, status antrian audit.
Verifikasi
- `Content-Security-Policy-Report-Only` di
- Produksi 2026.621 Sep
Domain live + observabilitas uptime
Konteks
Observabilitas
- `scripts/uptime-check.mjs`:
niumination.web.idkini situs pertama yang dipantau permanen (cron tiap 15 menit); situs turunan repo dikurangi jadi 9 agar total tetap 10. Melengkapi item BACKLOG Fase 4.
Catatan ops pasca-pointing
www.niumination.web.id: A record ada di zona DNS Vercel tapi sertifikat belum mencakup www — aktifkan via Vercel → Domains (langkah: PANDUAN-OPS §B).- Data build masih jalur
fallback-cache— snapshot mingguan (cron 21 Sep 08:25 WIB) membuat data tetap segar;GITHUB_TOKEN(AUDIT-2026.5 §T1) tetap disarankan agar data segar per-deploy tanpa menunggu cron.
Koreksi dokumentasi DNS (21 Sep 2026, malam)
- `scripts/uptime-check.mjs`:
- Stack 2026.521 Sep
Audit kualitas 2026 + SEO & polish
Konteks
SEO
- `BreadcrumbList` JSON-LD di
/repo/[slug]dan/studies/[slug](hierarki Beranda → daftar → detail) — memperkaya rich result Google. - Avatar NavBar → `next/image`: satu-satunya
<img>manual tersisa kini ikut optimasi otomatis (AVIF/WebP, dimensi presisi → CLS aman). Mode export statis tetap aman (images.unoptimizedsudah ditanganiscripts/export-static.mjs).
Keputusan dependensi (disengaja, bukan ketinggalan)
- react/react-dom tetap 19.2.8: React 19.3 (9 Sep 2026) sudah rilis, tetapi
@react-three/fiber@9.7.0(terbaru) masih peer>=19 <19.3— hero 3D lebih penting daripada fitur baru. Dijadwalkan ulang saat fiber mendukung (lihat AUDIT-2026.5 §T3: View Transitions menggantikan sebagian framer-motion). - next 16.3.5 = versi stabil terbaru;
npm audit0 temuan.
Verifikasi
- `BreadcrumbList` JSON-LD di
- Stack 2026.420 Sep
FASE 0 roadmap: CI hidrasi E2E, guard #418, budget, dependabot
E2E hidrasi masuk CI (otomatis, bukan manual lagi)
- `tests/e2e/hydration.mjs` (baru): 10 rute (slug dinamis ditemukan otomatis dari API statis + HTML — tanpa hardcode), uji WebGL-gagal → hero degrade lite, uji pintasan
/+ Esc. Exit code jelas untuk CI. - `ci.yml`: job
e2ebaru (build → guard → Chromium Playwright →next start→ skrip E2E → server selalu dimatikan).
Guard arsitektur #418
- `scripts/check-static.mjs` (baru): baca
prerender-manifest.json— SEMUA rute halaman wajib tanpainitialRevalidateSecondsangka (ISR); route API live dicetak sebagai info. Dijalankan CI setelah build. Teruji dua arah: lolos pada build bersih, gagal pada ISR simulasi.
Anggaran Lighthouse diketatkan (terkalibrasi pengukuran nyata)
lighthouserc.json: a11y ≥ 0.95 (terukur 100) · CLS ≤ 0.05 (terukur 0) · perf ≥ 0.80 · LCP error 3.800 ms + warn 2.500 ms (target F1).- Bonus perf nyata: animasi masuk hero (H1 = elemen LCP) dipersingkat 0.6 → 0.35 dtk → TBT 430 → 240 ms, skor performa 79 → 87.
Keterbaruan data & dependensi
- "snapshot data per-deploy" (banner /repositories) + chip /system kini menaut ke
/api/github/summary(API live). .github/dependabot.yml(baru): npm + github-actions mingguan, grup minor-patch, major Next/React/three di-ignore (evaluasi manual).
Diverifikasi
- `tests/e2e/hydration.mjs` (baru): 10 rute (slug dinamis ditemukan otomatis dari API statis + HTML — tanpa hardcode), uji WebGL-gagal → hero degrade lite, uji pintasan
- Stack 2026.320 Sep
audit #3: keamanan/SW/test, roadmap tingkat lanjut
Audit #3 (area yang belum diperdalam) — temuan & perbaikan
- Readme.tsx (XSS jalur error): fallback saat
markedmelempar menyuntik potongan markdown MENTAH kedangeringlySetInnerHTMLtanpa sanitasi — kini di-escape entitas HTML terlebih dulu. - sw.js v2: instalasi precache tidak lagi all-or-nothing (
addAll→ per-item, tahan jaringan goyang); cache runtime DIBATASI 60 entri (approx-LRU) — tidak lagi membengkak tanpa batas dari navigasi. - Skeleton a11y:
role="status"+ label pada skeleton grid (pembaca layar kini tahu sedang memuat). - +11 unit test (52 total):
tests/uptime.test.tsbaru (uptimePct, avgMs, lastCheck, lastIncident, overall) + determinismenowpadacomputeSummary(regresi #418 lintas-hari).
Rencana pengembangan tingkat lanjut
- `docs/ROADMAP.md` disusun ulang jadi fase 0–5 (rumah tangga → konten → a11y → API/data → observabilitas → komunitas) dengan KPI, risiko-mitigasi, antrian quick-win, dan pemetaan riwayat fase lama; README ikut diselaraskan.
Diverifikasi
- Readme.tsx (XSS jalur error): fallback saat
- Stack 2026.220 Sep
audit pasca-fix #418, hardening 3D & UX ramah pengguna
Audit mendalam pasca-fix (4 bug laten ditemukan & diperbaiki)
- `lib/insights.ts`: fetch GraphQL kontribusi masih
revalidate: 3600→ di Vercel (denganGITHUB_TOKEN) halaman/systemmewarisi ISR lagi (kambuh #418). Kinicache: 'force-cache'. (Lokal tak terdeteksi: tanpa token, fetch tak pernah jalan.) - `lib/summary.ts` + `DashboardMetrics`:
Date.now()/new Date()di render komponen klien → heatmap & bar aktivitas bergeser sehari setelah deploy → hydration mismatch pasti kambuh di/system. Kini "sekarang" deterministik =snapshot.updatedAt(dibuktikan: Playwright Clock maju 3 hari → 0 error; pra-fix pasti gagal). - `RepoGrid`: fallback
new Date()pada tanggal banner dihapus.
Hardening rantai 3D adaptif (task tertunda)
- `ErrorBoundary` v2:
resetKeys(penyembuhan otomatis saat kunci berubah),onError(hook strategi degrade), fallback default aksesibel (role="alert") + tombol "Coba lagi" tanpa reload. - Hero3D: error scene → degrade permanen ke SceneLite via
onError+resetKeys={[mode]}(bukan spinner selamanya). - Scene3D:
webglcontextlostdicegah default-nya → degrade ke lite;fallbackCanvas kini memicu degrade (dibuktikan uji: WebGL di-stub gagal → badgelite · css/canvas, canvas 2D aktif, 0 error). - Canvas dekoratif
aria-hidden(pembaca layar).
UX ramah pengguna (riset referensi: GitHub, Linear, pola filter/microcopy)
- Pintasan `/` memfokuskan pencarian repositori (ala GitHub) + hint kbd di input;
Escmengosongkan. - Chip "Reset" di toolbar saat ada filter/pencarian aktif (pola "Clear all"); empty state kini bermakna: pesan + saran + aksi.
- Banner data jujur: "snapshot data per-deploy ({tanggal})" menggantikan bahasa "mode offline / ISR 5 menit" yang sudah tidak akurat — pengunjung paham kapan data dibekukan & di mana data termutakhir (API).
- `ScrollTop` — tombol kembali-ke-atas untuk halaman panjang (muncul setelah ±1,5 layar, hormati reduced-motion).
sys.snaplabel sistem menyelaraskan: "snapshot per-deploy · {date}".
Diverifikasi
- Hidrasi Playwright 11 rute = 0 error; uji lintas-midnight (+3 hari) = 0 error; uji WebGL-gagal = degrade lite, 0 error; jalur 3D sehat (3d → lite); smoke 14 rute 200; OG PNG 1200×630; SSR ID; vitest 41/41; tsc 0; export:static OK (RAM 2 GB: server wajib dimatikan dulu); npm audit 0.
- `lib/insights.ts`: fetch GraphQL kontribusi masih
- Stack 2026.119 Sep
fix hydration #418 produksi: halaman statis murni (audit mendalam 3D adaptif)
Diagnosis (audit mendalam, direproduksi 100%)
- Gejala: di https://niu-oss.vercel.app semua halaman melempar
Minified React error #418(hydration mismatch) → React membuang HTML server dan me-render ulang seluruh pohon di klien — hero 3D ikut tampak glitch/restart (dilaporkan sebagai "bug di 3d adaptif"). Jalur 3D itu sendiri sehat: terukur 35–63 fps, auto-degrade ke SceneLite bekerja. - Akar masalah:
revalidate(halaman &fetch) memicu regenerasi ISR di Vercel; dokumen ter-cache terbukti mencampur generasi render — DOM (feed event segar: "22 hari lalu") berbeda dengan payload flight RSC yang dihidrasi (event basi dari build: "2 hari lalu", bahkan set event berbeda). Bukti: HTML yang diterima browser ≠ HTML yang diterima curl pada detik yang sama; bypass cache (?v=<unik>) tetap gagal;/offline(statis murni) hidrasi bersih; build lokal webpack & Turbopack selalu bersih. - Metode: mirror penuh situs live ke server statis lokal (HTML + 17 aset) → #418 tetap muncul → bedah DOM vs payload flight → inkonsistensi internal terbukti; jam browser dimajukan/mundurkan (Playwright Clock) mengeliminasi teori waktu-relatif; uji Intl Node 20 = Node 22 = Chrome mengeliminasi teori format angka/tanggal.
Diperbaiki
- Semua halaman kini statis murni —
export const revalidatedihapus dari 10 file (9 halaman + OG image repo);getGithubSnapshot()fetchcache: 'force-cache'saat render halaman → dokumen HTML + flight selalu dari SATU render build (pencampuran generasi mustahil). Data halaman diperbarui per deploy — cron mingguanrefresh-datapush data → deploy. - Route API live tetap ISR:
/api/github/{user,repos,summary}memanggilgetGithubSnapshot({ live: true })(revalidate 300, data bergerak, tanpa hidrasi — aman). - `components/TimeAgo.tsx` baru: label waktu relatif aman-hidrasi (
suppressHydrationWarning) + berdetak tiap 60 dtk agar tetap segar di halaman statis; dipakai di feed beranda (2 situs) dan RepoCard.timeAgo(iso, now?)dilib/utils.tsmenerima referensi waktu opsional.
Diverifikasi
- Playwright headless (Chromium + SwiftShader WebGL): 10/10 rute hidrasi 0 error (pra-fix: 8/8 gagal #418); jalur 3D:
3d · 35 fps→ degradelitesesuai desain;npm audit0; vitest 41/41; tsc bersih; build Turbopack 205 halaman; export:static OK. - 4 error jaringan di
/system= URL demo live eksternal yang memang down (sapa-ai, kune-ya, cc-acehtengah, watchdog-mata) — data status, bukan bug.
- Gejala: di https://niu-oss.vercel.app semua halaman melempar
- Stack 202619 Sep
upgrade mayor ke stack terkini: Next.js 16, React 19.2, TypeScript 7
Diubah (akar masalah deploy Vercel)
- `next` 15.3.3 → 16.3.5 — 15.3.3 ditandai deprecated + rentan oleh npm (CVE-2025-66478, "This version has a security vulnerability"); setelah upgrade:
npm audit0 temuan. Build Vercel kini Turbopack default (Node ≥ 20.9 — default Vercel Node 22 memenuhi). - `react`/`react-dom` 19.1.0 → 19.2.8 (versi integrasi Next 16; 19.3.0 ditolak peer
@react-three/fiber>=19 <19.3). - `typescript` 5.8.3 → 7.0.2 · `vitest` 4.1.11 → 5.0.1 (41/41 lulus) ·
framer-motion13.4 ·lucide-react1.47 ·three0.186 ·@react-three/fiber9.7 ·@react-three/drei10.7 ·@types/node22. - `engines.node` `>=20` → `>=20.9` (syarat Next 16); CI & snippet README naik ke Node 22.
Diperbaiki / disesuaikan
- `@vercel/og` dihapus — 3 file OG (
app/opengraph-image.tsx,app/repo/[slug]/opengraph-image.tsx,app/api/og/[...slug]/route.tsx) bermigrasi ke `next/og` bawaan. Header cache OG terverifikasi utuh. - Ikon `Github` lucide-react dihapus upstream (1.x) — diganti komponen
components/GithubMark.tsx(SVG octicon resmi, APIclassNameserupa) di 5 komponen (CommandMenu, Footer, NavBar, PaymentModal, studies-ui). next.config.ts: kuncieslintdibuang (next lint dihapus di Next 16); idem pada config yang ditulisscripts/export-static.mjs.scripts/export-static.mjs: build memakainext build --webpack(Turbopack OOM di lingkungan RAM < ~4 GB; hasil setara). Script barunpm run build:webpackuntuk verifikasi lokal/CI kecil.package.jsonname:niumination→niu-oss-dashboard(selaras repo); deskripsi diperbarui. Lockfile di-regenerate (npm 11;npm cidiverifikasi kompatibel npm 10 bawaan Node 22 di CI/Vercel).
Catatan
- Verifikasi: vitest 41/41 ·
tsc --noEmitbersih (TS 7) · build 205 halaman webpack (SITE_URL kosong dan web.id — pitfall Vercel tertutup) · export:static OK · smoke 14 rute + API v1 + OG image PNG 1200×630 · SSR ID. - Tailwind sengaja tetap 3.4.17 (maintenance, stabil): migrasi v4 (CSS-first) menunggu verifikasi visual — dicatat di BACKLOG/AGENTS.
- `next` 15.3.3 → 16.3.5 — 15.3.3 ditandai deprecated + rentan oleh npm (CVE-2025-66478, "This version has a security vulnerability"); setelah upgrade:
- Fix deploy19 Sep
build Vercel gagal karena `SITE_URL` kosong
Diperbaiki
- `ERR_INVALID_URL` saat build Vercel (
Failed to collect page data for /_not-found): env varSITE_URLyang ada tapi kosong lolos dariprocess.env.SITE_URL ?? 'https://niumination.web.id'(operator??hanya menangkapundefined/null), sehingganew URL('')diapp/layout.tsxmelempar error dan build gagal. Di mesin lokal gejalanya tidak muncul karena variabelnya tidak diset sama sekali. - Sumber tunggal baru:
siteUrldilib/env.ts—process.env.SITE_URL?.trim() || 'https://niumination.web.id'(menutup kasus kosong dan spasi). Dipakai diapp/layout.tsx,app/robots.ts,app/sitemap.ts,app/feed.xml/route.ts,app/studies/[slug]/page.tsx,app/repo/[slug]/page.tsx. app/api/pay/stripe/route.ts: fallback kenew URL(req.url).originkini juga menanganiSITE_URLkosong.
Catatan
- Verifikasi:
SITE_URL= npm run build(kondisi Vercel direplikasi lokal) exit 0;npm run typecheckexit 0;npm test41/41. - Set
SITE_URLdi Vercel kehttps://niumination.web.idsaat domain aktif; nilai kosong kini aman (jatuh ke default), tapi canonical/OG akan memakai default.
- `ERR_INVALID_URL` saat build Vercel (
- Fase 3.219 Sep
persiapan produksi Vercel + domain, ID penuh, roadmap
Diubah
- Target produksi: Vercel + domain `niumination.web.id` (idwebhost) — semua fallback URL beralih dari github.io; README Deployment A kini berisi langkah lengkap pemasangan domain (record A/CNAME idwebhost → Vercel).
- Route `/api/v1/[...resource]` Vercel-safe: file JSON di-import saat build (ter-bundle & ter-trace) — tidak lagi membaca
public/viafssaat runtime (filesystem lambda Vercel tidak memuat public/).
Diperbaiki (cakupan bahasa ID)
- Label kategori kini Indonesia: Aplikasi Web, Konfigurasi Sistem, Utilitas, Dokumentasi & Lainnya (kamus
cat.*.labeluntuk EN tersedia). - Judul metadata default: "Niumination — Dasbor OSS" (sebelumnya "OSS Dashboard").
- Ringkasan event feed kini ID penuh: "3 commit", "rilis v1", "menghapus gh-pages" (sebelumnya "3 commits", "release v1", "delete").
- Metrik studi AI-First-OS: "agen" (konsisten dengan isi studi).
Ditambahkan
docs/ROADMAP.md— rencana pengembangan fase 4–8 (go-live, konten, distribusi, kualitas, monetisasi) + backlog riset.
- Fase 3.119 Sep
i18n penuh, dokumentasi API, deskripsi repo EN
Ditambahkan
- i18n dashboard internal penuh (
id/en):/system(DashboardMetrics, StatusMonitor, InsightsPanel, CategoryDonut),/repositories(RepoGrid, RepoCard, CloneBox),/servicespenuh (kartu paket, 4 langkah proses, metode pembayaran, ServicesCtas), dan detail repo (statistik, catatan README, repo terkait, 404 repo). - `/developers` — halaman dokumentasi API publik v1 (bilingual): prinsip GitOps/CORS/pembaruan, tabel 9 endpoint dengan tautan live, contoh
fetchnyata. Tercantum di footer, command palette, sitemap. - Deskripsi repositori EN:
data/repo-descriptions.en.json(12 overlay untuk deskripsi berbahasa Indonesia) +lib/repo-i18n.ts(localizedDescription) — dipakai kartu repo, halaman detail, dan API publik v1 (fielddescriptionEn). - 3 unit test baru (overlay EN valid, pass-through, null-safe) → 41 total.
Sengaja tidak diterjemahkan
PaymentModal(alur pembayaran lokal: QRIS/VA/denominasi IDR) — klien internasional dilayani Stripe hosted link yang berbahasa Inggris.
- i18n dashboard internal penuh (
- Fase 319 Sep
i18n, PWA, API publik v1, QR share
Ditambahkan
- i18n id/en infrastruktur: kamus tunggal
lib/i18n.ts,LocaleProvider+ tombol ID | EN di navbar (localStorage,<html lang>sinkron). Pola:<T k>(server) /useLocale()(client). Cakupan awal: kerangka situs, beranda, /status, studi kasus (fieldendidata/studies.json), 404/error/offline, command palette. Paritas kunci ditegakkantests/i18n.test.ts. - PWA:
app/manifest.ts(force-static), ikon 192/512/maskable tanpa dependensi (scripts/gen-icons.mjs), service workerpublic/sw.js(precache shell, navigasi network-first, aset stale-while-revalidate), halaman/offline. - API publik v1:
scripts/gen-api.mjs→ 101 file JSON statis dipublic/api/v1/(index/user/repos/repos-{name}/events/summary/uptime/ studies/studies-{slug}); mirror serverapp/api/v1/[...resource]/route.ts+ header CORS dinext.config.ts; regenerasi otomatis olehrefresh-data.yml(mingguan),uptime.yml(15 menit),export:static. - QR share:
components/QrCard.tsx(paketqrcode, SVG + unduh data-URI) di detail repo & detail studi kasus. - Konten studi kasus dipindah ke
data/studies.json(sumber tunggal UI + API) dengan terjemahan EN.
Ditunda
- PPR — target deploy utama GitHub Pages (statis) tidak diuntungkan; pola shell-statis + lubang dinamis client sudah dipakai. Diputuskan mengukur p50/p95 dari
/api/vitalsdulu bila pindah ke Vercel.
- i18n id/en infrastruktur: kamus tunggal
- Fase 218 Sep
status GitOps, insight, studi kasus, observabilitas
Ditambahkan
- `/status` — halaman status ala Upptime:
uptime.yml(cron 15 menit) →scripts/uptime-check.mjs(10 deployment publik teratas) → commitdata/uptime.json+lib/uptime-data.ts. History 30 hari, uptime %, latensi rata-rata; auditabel penuh lewat git. - Pola kontribusi ala OSS Insight (
/system): grafik 12 bulan, distribusi hari-dalam-minggu, 5 repo teratas. GraphQLcontributionsCalendarbila adaGITHUB_TOKEN; fallback events ±90 hari dengan catatan sumber jujur. - `/studies` — 3 studi kasus (Pemdi Aceh Tengah, Flame ADE, AI-First OS): masalah → pendekatan → hasil + metrik, navigasi prev/next, fakta repo live, teaser di beranda, tercantum di sitemap.
- Observabilitas:
<WebVitals/>→POST /api/vitals(log Functions); Lighthouse CI mingguan (lighthouse.yml+lighthouserc.json, budget: perf ≥ 0.75, a11y/bp/seo ≥ 0.9, CLS < 0.15);SENTRY_DSNopsional.
- `/status` — halaman status ala Upptime:
- Fase 118 Sep
pembayaran sungguhan, feed & GitOps
Ditambahkan
- Pembayaran server-side:
POST /api/pay/midtrans(Snap API v1, order_idnium-<ts36>-<rand>, 10k–10M IDR),POST /api/pay/stripe(Checkout Session, IDR zero-decimal), webhook Midtrans dengan verifikasi SHA-512,/api/pay/config(boolean metode aktif), deposit 50% untuk booking jasa. Kunci rahasia tidak pernah terekspos ke client. - `.github/FUNDING.yml` — tombol Sponsor + Buy Me a Coffee di semua repo.
- Feed rilis — seksi "Rilisan Terbaru" via satu request GraphQL (
getRecentReleases, fallback ReleaseEvent) + RSS `/feed.xml` (aktif juga di static export). - Pencarian fuzzy Fuse.js — salah ketik tetap menemukan; skor + limit 60 hasil,
useDeferredValueagar tetap 60 fps. - CI & data GitOps:
ci.yml(vitest → tsc → build),refresh-data.yml(snapshot mingguan otomatis),Dockerfilemulti-stage, 28 unit test.
- Pembayaran server-side:
- Lokalisasi & polesan17 Sep
Ditambahkan
- Bahasa Indonesia sebagai default seluruh UI, metadata, JSON-LD, OG image.
- Detail repo: README markdown tersanitasi (
marked+ DOMPurify) dariraw.githubusercontent.comdengan fallback nama file; kotak clone interaktif; topik bisa diklik →/repositories?q=…`; ukuran KB/MB. - Dashboard: donat kategori SVG, feed event ber-ikon, StatusMonitor dengan waktu periksa terakhir + auto-refresh 5 menit.
- Audit & hardening17 Sep
Keamanan
- Header keamanan (
nosniff, Referrer-Policy, Permissions-Policy, COOP),X-Frame-Optionssengaja tidak diset (agar bisa di-embed). - Timeout 10 dtk per request GitHub (AbortController); error jaringan = fallback snapshot; cleanup semua timer saat unmount.
- Header keamanan (
- Rilis awal17 Sep
landing + dashboard interaktif
Ditambahkan
- Landing page hero 3D performance-aware (R3F; auto-degrade ke mode CSS/Canvas saat low-end / <45 fps), marquee tech stack, kartu featured.
- Dashboard: agregator 91 repositori (kategori otomatis, filter, sortir), heatmap commit 26 minggu, monitor deployment live, command palette Ctrl+K (cmdk), modal monetisasi.
- SEO & OG: metadata + JSON-LD, sitemap, robots, dynamic OG image satori (home + per repo), 91 halaman detail pre-render.
di-render saat build dari CHANGELOG.md — berkas yang sama dengan repo