Blog Minimum Viable (Minimum viable blog)
(ostwilkens.se)- Tujuannya adalah implementasi minimal untuk membangun blog pribadi sebagai halaman statis di atas domain yang sudah dimiliki, sekaligus memenuhi kebutuhan penambahan konten dan SEO dasar
- Implementasinya berjalan sederhana dengan
template.htmlkecil,markdown2,render.pyyang dibuat dengan meminta O1, serta penulisan artikel dalam Markdown - Templat hanya menggunakan HTML/CSS dasar seperti
system-ui, lebar maksimum70ch,color-scheme: light dark,viewport, danUTF-8 render.pymengonversi./posts/{post}/eng.mdmenjadi HTML, menyesuaikan path gambar, lalu membuat./blog/{post}.htmldanindex.html- Menunjukkan bahwa tanpa Jekyll, Ghost, atau WordPress pun, kita bisa membuat blog yang dapat dioperasikan hanya dengan rendering statis dan hosting
Kebutuhan blog minimal dan susunan nyatanya
- Titik awalnya adalah empat kebutuhan
- Menggunakan domain yang sudah dimiliki
- Mengikuti standar web modern dan memiliki SEO yang layak
- Penambahan konten baru sangat mudah
- Semua halaman dibangun secara statis
- Alur implementasi nyatanya sederhana
- Menulis
template.htmlkecil - Menjalankan
pip install markdown2 - Meminta O1 membuat skrip
render.py - Menulis artikel, lalu melakukan rendering dan hosting
- Menulis
- Tidak menggunakan engine blog yang sudah ada seperti Jekyll, Ghost, atau WordPress
Templat dan skrip rendering
template.htmlhanya berisi struktur dokumen HTML dasar dan CSS minimal- Menentukan skema warna terang/gelap dengan
color-scheme: light dark - Gaya isi halaman diatur dengan
system-ui,sans-serif, lebar maksimum70ch, tinggi baris1.5, dan ukuran font1.25em - Menggunakan tautan ke beranda dengan
id="head-link"dan placeholder{{ content }}
- Menentukan skema warna terang/gelap dengan
render.pymengonversi artikel Markdown menjadi HTML denganmarkdown2- Direktori input adalah
./posts, dan direktori output adalah./blog - Setiap artikel dibaca dari
./posts/{post_directory}/eng.md - Header
#pertama digunakan sebagai judul artikel - Markdown dikonversi dengan opsi
fenced-code-blocksdanheader-ids <img src="pada path gambar diubah agar mengacu ke/posts/{post_code}/{{ content }}pada templat diganti dengan HTML hasil konversi, dan string judul juga diganti dengan judul artikel
- Direktori input adalah
- Halaman indeks juga dibuat oleh skrip yang sama
greetings.mdterlebih dahulu dikonversi menjadi HTML- Judul tiap artikel dibaca, lalu daftar tautan ke
/blog/{post_code}.htmlditambahkan - Hasil akhirnya disimpan sebagai
index.html
- Artikel ditulis secara manual pada 2025-03-31
5 komentar
Saat ini saya juga mengelola blog saya persis seperti di atas. Saya membuat dan menggunakan SSG yang memenuhi kebutuhan pribadi saya. Demi memanfaatkan fitur gambar thumbnail, kategori, dan tag, saya menambahkan fungsi kustom satu per satu. Gambar yang dilampirkan juga secara otomatis dikonversi ke webp lalu dirujuk, dan berkat itu saya sangat puas dengan kecepatan rendering-nya.
Oh, jadi fitur kustom seperti itu Anda tambahkan sendiri sambil menulis kodenya? Saya juga selalu ingin melakukannya sendiri, tetapi sering ragu karena fitur ekstensi dan plugin yang disediakan framework blog SSG yang selama ini saya gunakan.
Kalau mengurangi ambisi dan hanya menyisakan yang benar-benar perlu, sisanya tidak terlalu sulit. Bahkan untuk SSG, kalau diminta ke AI, kodenya akan dituliskan semuanya, dan kalau diminta menambahkan fitur, sebenarnya semuanya juga bisa ditambahkan haha
Kalau cuma pilih font yang bagus, ternyata lumayan enak dilihat.
Opini Hacker News
Saya teringat bagan dari tulisan blog ini: https://molodtsov.me/2023/02/how-to-start-your-blog-in-2023/
Setelah terperosok ke rawa static site generator (SSG), sebagian besar waktu saya malah dihabiskan untuk menulis dan mengutak-atik SSG itu sendiri, alih-alih menulis hal yang semula ingin saya tulis atau mengerjakan hal yang semula ingin saya lakukan
Akhirnya saya membuang SSG, memasang WordPress, lalu berhenti memikirkannya, dan rasanya sangat membebaskan
Kalau tujuannya memang mengutak-atik dan menulis tentang prosesnya, itu tidak masalah; orang yang tidak terganggu menulisnya oleh kegiatan mengutak-atik juga tidak masalah, tetapi saya bukan orang seperti itu
Hal terakhir yang dibutuhkan saat ingin menulis adalah alasan untuk menunda
WordPress dan semua pluginnya bisa diretas jika tidak terus diperbarui, dan BDFL adalah orang yang bisa memblokir pengiriman update keamanan atau akses untuk menerimanya hanya karena alasan pribadi yang sepele
Situs statis tidak punya kerentanan keamanan yang perlu dipatch, jadi meski proyek SSG benar-benar runtuh karena masalah pengelolanya, itu tidak terlalu berpengaruh; tetapi di WordPress hal ini menjadi sangat penting
Karena perlu cara agar pengunjung bisa meninggalkan komentar, saya menambahkan Disqus, dan akhirnya menjadi campuran berantakan dari berbagai layanan dan banyak JavaScript
Beberapa tahun lalu, demi memiliki data sendiri lagi dan tidak bergantung pada layanan eksternal, saya mengekspor komentar Disqus, sempat mengutak-atik Serendipity, lalu akhirnya menetap di WordPress
Saya bisa mengimpor komentar dan halaman Markdown, dan ada juga plugin yang menerbitkan semuanya ke Fediverse
Setelah membuatnya berjalan dengan SQLite dan menyalakan update otomatis, pada dasarnya hampir tidak perlu pemeliharaan
Terlalu banyak pemeliharaan yang dibutuhkan untuk fitur-fitur yang kemungkinan besar tidak diperlukan. Jika tidak dijaga tetap terbaru, situs bisa menjadi bagian dari botnet
Untuk kebanyakan blog, static site generator sudah cukup, dan kalaupun perlu pemeliharaan, saya bisa melakukannya pada waktu yang saya inginkan
Yang benar-benar saya inginkan hanyalah satu perintah untuk menerbitkan dan cara mudah menyeret gambar ke dalam tulisan; yang pertama berjalan baik, dan yang kedua bisa dilakukan lewat fitur penerbitan Jupyter Notebook
Yang sama sekali tidak saya inginkan adalah beban seperti database hanya untuk “mengirim HTML ke klien”
Bagus, tetapi agar bisa disebut blog, saya merasa perlu dua fitur kecil lagi
Pertama, tulisan harus diurutkan berdasarkan tanggal dengan tulisan terbaru di depan, dan tanggalnya harus ditampilkan di suatu tempat. Untuk tetap menjaga konfigurasi minimal, cukup gunakan metadata dari file tulisan, misalnya waktu pembuatan
Kedua, tentu saja perlu feed RSS. Dengan skrip yang sudah ada dan template RSS minimal, sepertinya mudah membuat feed sederhana yang hanya berisi tautan dan judul
“Diikuti” tidak selalu baik, dan bisa menimbulkan tekanan untuk menyesuaikan diri dengan pembaca. Itulah faktor yang membuat media sosial menjadi buruk
Untuk nomor 1, saya cenderung membuat file berisi metadata dalam format seperti TOML secara otomatis
Untuk nomor 2, RSS pasti akan saya tambahkan, tetapi bergantung pada nomor 1 :-)
Saya selalu menyukai situs web independen, dan situs saya sendiri juga dimulai dengan cara yang mirip sekitar 25 tahun lalu
Saat itu satu-satunya teknologi yang layak yang saya tahu hanyalah Classic ASP, jadi saya membuatnya sesederhana mungkin hanya dengan ASP
Sekarang situsnya berjalan sebagai situs yang digenerasikan secara statis dengan Common Lisp, dan sepertinya konfigurasi ini akan menjadi pengaturan jangka panjang: https://github.com/susam/susam.net/blob/main/site.lisp
Memulai dengan sekumpulan halaman sederhana adalah cara yang baik untuk membuat situs web minimum viable, tetapi seiring waktu saya jadi membutuhkan fitur seperti feed RSS, daftar blog berdasarkan tanggal, indeks per tag, dukungan untuk konten non-blog seperti alat·game·demo, dan komentar tanpa pihak ketiga
Setiap kali kebutuhan bertambah, source-nya juga ikut membesar; kode yang dulu hanya beberapa ratus baris kini menjadi sekitar 1300 baris Common Lisp
Meski begitu, saya ingin tetap menjaganya pada level di mana seluruh kode masih bisa ditampung di kepala sekaligus, dan jika ada bug saya bisa menalar serta memperbaikinya dalam 10 menit
Belakangan ini saya tergoda menambahkan blogroll yang menyediakan daftar tulisan dari para blogger favorit saya. Mungkin saja itu bisa menggantikan feed reader, tetapi saya berusaha berhati-hati agar tidak membesar menjadi sesuatu yang bahkan membaca email
Source code-nya ada di sini: https://github.com/brilee/modern-descartes-v2/blob/master/ma...
Termasuk feed RSS, daftar blog berdasarkan tanggal, sistem tagging, dan server pengembangan lokal dengan file watching dan recompilation
Versi saat ini dipertahankan sebagai skrip Python kurang dari 1000 baris: https://github.com/llimllib/obsidian_notes/blob/c93b9b5c46fe...
Saya membuat halaman turunan seperti kumpulan tulisan, indeks, dan slideshow, serta variasi tag untuk orang dan video game
Saya juga bisa mengendalikan sepenuhnya tampilan dan nuansa widget umum seperti galeri thumbnail atau kotak kutipan
Ini mungkin bisa menjadi referensi tingkat tinggi
Ke depan saya mungkin juga ingin menyematkan shader dan web game, tetapi saya berharap kompleksitasnya tidak terlalu membengkak
Akan menyenangkan kalau browser mendukung text/markdown dan text/gemini secara native
Kalau browser bisa merender PDF, rasanya tidak terlalu sulit untuk memasukkan formatter sederhana untuk konten Markdown/Gemini dan stylesheet yang bisa ditentukan pengguna
Saat ini pun kita bisa menulis blog text/plain, tetapi itu bukan hypertext sungguhan dan merugikan dari sisi SEO. Mungkin bisa saja ada semacam keajaiban lewat header link
Mendukung format lain akan menurunkan hambatan untuk menerbitkan dengan rapi dan mengembalikan kendali kepada pengguna
Pertama, browser-browser harus sepakat varian dan ekstensi Markdown mana yang akan dipakai. Markdown hampir seperti CSV di dunia format teks, karena semua orang memakainya dengan cara masing-masing
Kalau terlalu minimal, akan ada keluhan bahwa itu tidak berguna; kalau memilih ekstensi, akan ada keluhan bahwa itu terlalu bengkak
Bahkan jika mencoba membahas pro dan kontra jangka pendek maupun panjang secara hati-hati, pembicaraan bisa terhenti dengan ungkapan “jangan biarkan yang sempurna menjadi musuh yang baik”
Kalaupun disepakati satu set fitur tertentu, masih patut dipertanyakan apakah itu benar-benar sepadan
Membaca PDF langsung di browser memang cukup umum, tetapi manfaat membaca Markdown langsung kemungkinan hanya dirasakan oleh sebagian pengembang software di seluruh dunia dan kira-kira lima orang aneh
Jadi saya rasa saya tidak akan terkejut jika seumur hidup tidak melihat rendering Markdown native di browser
Ada juga library untuk XSLT yang bisa dipakai saat membutuhkan versi baru alih-alih dukungan native browser, dan ada library untuk berbagai format seperti jpegxl
Kalau
html_content = html_content.replace('Minimum viable blog', title), apakah setiap kali stringMinimum viable blogmuncul di tulisan, itu akan diganti dengan judul tulisan saat ini? Bukankah itu bug?Kode di tulisan itu adalah draf pertama yang dibuat O1, dan string tersebut sudah diganti menjadi
{{ title }}Saya sudah bereksperimen dengan blog minimalis selama sekitar 15 tahun, dan ada beberapa trik yang saya pelajari
Sesuatu seperti
const title = lines.match(/# (.+)/)[1]saja sudah cukup, sehingga frontmatter bisa dihindariBlog-blog saya tidak pernah punya tulisan sebanyak itu sampai membutuhkan pagination, tag, kategori, atau pengurutan
JSX cukup bagus sebagai builder string sisi server murni kalau memakai hack mencurigakan seperti https://immaculata.dev/guides/enabling-jsx.html
Sekarang GitHub Pages juga sudah memudahkan penggunaan langkah build arbitrer alih-alih Jekyll dengan hal seperti https://immaculata.dev/guides/using-gh-pages.html
highlight.js bisa dibilang raja syntax highlighting kode yang sangat mudah karena cukup menambahkan tiga baris ke HTML, sedangkan shiki keren tetapi lambat
Menggunakan framework blog statis standar seperti Hugo/Zola + Cloudflare Pages itu mudah
Blog saya juga merupakan konfigurasi minimal di bawah 100KB dan memenuhi semua kriteria yang dicantumkan penulis asli
Saya memakai tema Hugo Blog Awesome, mengikuti panduan 512kb, memeriksa ukuran halaman, serta menghapus gambar dan JS yang tidak perlu. Dari awal memang tidak banyak
Referensi: https://512kb.club, https://radar.cloudflare.com/scan
Saya sempat menjalankan “MVB” untuk beberapa waktu, tetapi punya saya lebih sederhana
Hanya satu halaman HTML, tulisan ditulis sebagai file
.txt, dan beranda diperbarui secara manualMemang cukup bertele-tele, tetapi menurut saya tetap lebih mudah daripada berurusan dengan web modern
Setelah itu saya pindah ke pendekatan yang lebih canggih, dan sekarang memakai Astro untuk situs pribadi dan blog; benar-benar luar biasa
Di landing page-nya, Astro mengklaim sebagai platform terbaik untuk “situs yang berfokus pada konten”, dan setelah memakainya 6 bulan saya jadi setuju
Astro menyediakan konvensi yang jelas dan mudah diikuti untuk hampir semua hal yang dibutuhkan dalam membuat blog, serta memangkas bagian-bagian yang tidak perlu
Saya pernah bereksperimen di beberapa situs dengan Bun JS dan cara menaruh HTML di dalam string JavaScript
Bun punya flag
—hotyang membuat HTML statis dibuat ulang saat ada perubahanIntelliJ IDE mendeteksi komentar
// language=htmldi atas string, lalu memformat HTML di dalamnya dan memberi penyorotan sintaksDengan memakai fungsi JavaScript murni alih-alih bahasa templating, kita bisa menulis langsung logika yang dibutuhkan tanpa harus mencari tahu bagaimana melakukannya di bahasa templating
Karena muak dengan situs web yang terlalu gemuk dan lama dimuat, saya juga memakai pendekatan yang sangat mirip untuk blog saya: https://blog.borrego.dev
Sumber: https://github.com/agubelu/blog