Pola untuk Membuat HTML Tools yang Berguna
(simonwillison.net)- Merangkum pola desain yang berulang berdasarkan pengalaman membuat HTML tools yang menjalankan HTML·JavaScript·CSS dalam satu berkas
- Menjelaskan secara konkret, berfokus pada contoh nyata, bagaimana lebih dari 150 alat kecil dibuat dan dipelihara selama 2 tahun
- Dengan struktur tanpa tahap build dan pemanfaatan CDN, alur pengembangan berbasis copy-paste terbentuk secara alami
- Memperluas cakupan yang bisa dilakukan hanya dengan fitur browser, dari URL·localStorage·membuka berkas·unduhan·Pyodide hingga WebAssembly
- Melalui pencatatan prompt dan hasil, serta penggabungan ulang alat yang sudah ada, alurnya makin menguat sehingga koleksi alat itu sendiri menjadi fondasi pengembangan
Konsep dan contoh HTML tools
- Alat web kecil yang bisa langsung dijalankan dengan menaruh JavaScript dan CSS bersama dalam satu berkas HTML disebut HTML tools
- Selama 2 tahun terakhir, lebih dari 150 alat telah dibuat, dan sebagian besar tersusun dari kode yang ditulis LLM
- Contoh utama
- svg-render: mengubah kode SVG menjadi gambar PNG·JPEG
- pypi-changelog: membuat diff perubahan antar rilis paket PyPI
- bluesky-thread: menampilkan thread diskusi Bluesky dalam struktur bertingkat
- Seluruh kumpulan alat dapat dilihat di tools.simonwillison.net, dan alur pembuatannya bisa ditelusuri lewat tampilan bulanan
- Kode sumber GitHub dan catatan prompt atau transkrip untuk sebagian besar alat juga dibuka
Struktur dasar HTML tool
- Terdiri dari satu berkas HTML dengan JavaScript dan CSS yang disisipkan secara inline
- Tidak memakai React yang memerlukan build JSX, sehingga penyalinan dan redistribusi menjadi sederhana
- Library yang dibutuhkan dimuat langsung dari CDN seperti CDNjs atau jsDelivr, dengan dependensi seminimal mungkin
- Ukuran kode dijaga di kisaran ratusan baris agar beban perawatan rendah dan tetap mudah dibaca serta dimodifikasi LLM dengan cepat
Prototyping berbasis Canvas·Artifacts
- Menggunakan ChatGPT Canvas, Claude Artifacts, dan Gemini Canvas untuk langsung menjalankan HTML tool sambil membentuk versi awalnya
- Menambahkan syarat “No React” agar kode yang dihasilkan bisa langsung berjalan tanpa tahap build
- Contoh konversi JSON yang ditempel menjadi YAML
- Hasil ChatGPT Canvas: JSON to YAML (ChatGPT), seluruh percakapan
- Hasil Claude Artifact: JSON to YAML (Claude), seluruh percakapan
- Hasil Gemini Canvas: JSON to YAML (Gemini), seluruh percakapan
Beralih ke coding agent saat makin kompleks
- Dengan Claude Code atau Codex CLI, pekerjaan berulang termasuk pengujian browser memakai Playwright bisa diotomatisasi
- Untuk alat yang lebih kompleks, seperti penampil thread Bluesky, pendekatan yang dipakai adalah “upgrade” ke agent semacam ini
- PR dapat dibuat langsung ke repo simonw/tools untuk menambah atau memperbarui alat
- Repositori: github.com/simonw/tools
- Catatan PR nyata: daftar PR tertutup
- Proses kerja dengan agent berbasis web dapat dilihat di video penggunaan Claude Code for web
Manajemen dependensi berbasis CDN
- Saat memakai library tambahan, semuanya dimuat dari CDN
- Karena Artifacts/Canvas milik LLM memiliki CDN allow-list, instruksi seperti “gunakan PDF.js” dapat membentuk konfigurasi URL secara otomatis
- Jika perlu, URL dicari di cdnjs·jsDelivr lalu ditempelkan ke chat
- Bekerja hanya dengan satu berkas HTML tanpa proses instalasi npm atau build
- npm+langkah build menurunkan produktivitas untuk mengoprek alat secara cepat dan melakukan self-hosting tiap alat
- URL CDN menyertakan versi sehingga reproduktibilitas jangka panjang tetap terjaga
Hosting statis eksternal
- Hosting internal di platform LLM sering punya banyak batasan sandbox, sehingga pemuatan data/gambar dari URL eksternal atau fitur tautan keluar bisa terblokir
- Dari sisi pengalaman pengguna, bisa muncul masalah seperti pesan peringatan, loading tambahan, atau promosi platform
- Kombinasi “No React + CDN” membuatnya mudah diunggah ke mana saja tanpa build
- Jika berkas HTML diunggah ke GitHub Pages, ia langsung bisa diakses lewat URL tetap
- Panduan GitHub Pages: docs.github.com/pages
- Sebagian besar alat dikelola di repo simonw/tools dan disajikan melalui tools.simonwillison.net
Input-output berpusat pada copy-paste
- Banyak alat menjadikan mekanisme inti berupa mengubah input yang ditempel lalu membuat hasilnya bisa disalin ke clipboard
- Karena copy-paste tidak nyaman di perangkat mobile, tombol “Copy to clipboard” sering ditambahkan
- Clipboard OS dapat menyimpan beberapa format sekaligus, dan event paste JavaScript juga bisa mengakses data “rich” semacam ini
- Contoh alat
- hacker-news-thread-export: mengubah thread HN menjadi teks untuk input LLM
- paste-rich-text: mengekstrak HTML dari rich text yang ditempel
- alt-text-extractor: mengekstrak alt text setelah gambar ditempel
Alat debugging
- Membuat alat khusus untuk memeriksa struktur data nyata yang ditangani di browser
- clipboard-viewer: menampilkan seluruh data clipboard seperti teks·rich text·gambar·berkas
- Alat tambahan
Menyimpan status di URL
- Banyak status dapat disimpan di URL tanpa DB server
- Pola ini disukai untuk alat yang dirancang agar mudah di-bookmark dan dibagikan
- icon-editor: mempertahankan status edit ikon 24×24 langsung di URL
Memanfaatkan localStorage
- localStorage adalah API browser yang menyimpan data secara persisten di perangkat pengguna tanpa mengeksposnya ke server
- Digunakan untuk menyimpan status besar yang sulit dimasukkan ke URL atau nilai rahasia seperti API key, guna menghindari risiko terekspos di log server host statis
- word-counter: menyimpan otomatis teks yang sedang ditulis
- render-markdown: mempertahankan isi saat menulis Markdown
- haiku: menyimpan API key di localStorage untuk membuat haiku berdasarkan gambar webcam
Memanfaatkan API yang mendukung CORS
- CORS (Cross-origin resource sharing) adalah mekanisme yang mengatur apakah JavaScript di browser dapat memanggil API dari domain lain
- API dengan header CORS terbuka adalah sumber daya yang sangat cocok untuk HTML tools, dan daftar seperti ini layak terus dikumpulkan seiring waktu
- Contohnya iNaturalist, PyPI, GitHub (konten repo publik bisa diakses anonim lewat raw.githubusercontent.com), Bluesky, Mastodon, dan lainnya
- Contoh alat
Memanggil API LLM secara langsung
- OpenAI·Anthropic·Gemini JSON API dapat dipanggil langsung dari browser lewat CORS
- Jika API key ditanam langsung di HTML, ada risiko pencurian dan tagihan, sehingga dipakai “pola secrets” dengan menyimpannya di localStorage
- Dari sisi pengalaman pengguna, proses menerbitkan dan menempel API key cukup menimbulkan gesekan, tetapi tetap bisa dijalankan
- Contoh alat
Jangan takut membuka berkas
- Dengan
<input type="file">, berkas bisa dibaca dan dipakai langsung di browser tanpa harus diunggah ke server - ocr: memakai PDF.js dan Tesseract.js untuk mengubah PDF menjadi gambar per halaman lalu menjalankan OCR di browser
- social-media-cropper: mendukung crop ke rasio media sosial seperti Twitter/LinkedIn 2:1, Substack 1.4:1, dan lain-lain setelah gambar dibuka/ditempel
- ffmpeg-crop: membuat perintah ffmpeg untuk crop video
Menyediakan berkas unduhan
- Browser dapat membuat berkas dan menyediakannya untuk diunduh tanpa server
- Ekosistem JavaScript memiliki beragam library untuk membuat berbagai format berkas
- Contoh alat
- svg-render: merender SVG dan menyediakan unduhan PNG/JPEG
- social-media-cropper: menyediakan unduhan gambar hasil crop
- open-sauce-2025: membuat jadwal dan menyediakan unduhan berkas ICS yang bisa ditambahkan ke kalender
Pyodide dan WebAssembly
- Pyodide adalah distribusi yang mengompilasi Python ke WebAssembly agar dapat berjalan di browser
- Karena bisa dimuat dengan rapi dari CDN, hampir tidak ada alasan untuk tidak memakainya di HTML tools
- Melalui micropip, paket Python murni dari PyPI dapat dimuat tambahan lewat CORS
- Contoh alat
Memperluas lebih jauh dengan WebAssembly
- Fondasi yang memungkinkan Pyodide adalah WebAssembly, dan ini juga memungkinkan perangkat lunak yang ditulis dalam bahasa lain dimuat di browser
- Squoosh.app menyediakan berbagai library kompresi gambar langsung di browser
- Contoh alat
- ocr : Tesseract.js memanfaatkan port WebAssembly dari mesin Tesseract OCR yang sudah ada
- sloccount**: utilitas SLOCCount karya David Wheeler yang ditulis dalam Perl dan C dipindahkan ke browser. Penjelasan detail.
- micropython** : @micropython/micropython-webassembly-pyscript
Menggabungkan ulang alat sebelumnya
- Jika ada lebih dari 100 alat dalam satu koleksi publik, LLM bisa dengan mudah menggabungkan ulang alat-alat itu, dan ini menjadi keuntungan tambahan
- Kadang alat lama ditempel ke konteks, dan pada coding agent alat tersebut dirujuk berdasarkan nama atau dicari sebagai contoh
- Kode sumber dari alat yang benar-benar berfungsi juga berperan sebagai dokumentasi, termasuk pola penggunaan library editing, sehingga meningkatkan peluang keberhasilan LLM
- Catatan lengkap proses pembuatan pypi-changelog: transkrip prompt
- Prompt disusun dengan cara mengarahkan untuk melihat alat “pypi package explorer”, lalu membaca source zip-wheel-explorer, mengambil wheel dari API PyPI, merender diff antar versi, dan membuat alat baru yang menyediakan tombol Copy
- Lihat juga menjalankan OCR di browser
Mencatat prompt·transkrip
- Menyimpan dan membuka catatan penggunaan LLM menjadi kebiasaan yang dapat meningkatkan kemampuan pemanfaatannya sendiri
- Untuk alat yang dibuat di platform LLM berbasis chat, fitur share digunakan sebagai sarana pencatatan
- Saat memakai agent seperti Claude Code·Codex CLI, seluruh transkrip terminal disalin lalu log diubah menjadi HTML dengan terminal-to-html dan dibagikan sebagai Gist
- Saat menyimpan alat jadi ke repo, tautan transkrip disertakan dalam commit message - kumpulan catatan: tools.simonwillison.net/colophon
Penutup
- Selama satu setengah tahun terakhir, eksplorasi LLM dan HTML tool dengan cara ini terasa sangat menyenangkan, dan sangat membantu memahami sejauh apa HTML bisa digunakan serta kemampuan LLM
- Untuk memulai koleksi alat sendiri, cukup buat repo GitHub lalu aktifkan GitHub Pages dan salin berkas .html ke dalamnya
- Sebagai bonus, tersedia tautan transkrip yang menambahkan screenshot artikel ini memakai Claude Code dan shot-scraper
3 komentar
Kelihatannya menarik.
Keren sekali
Pola HTML yang berguna