- Format file arsip HTML tunggal yang memungkinkan browser web melakukan lazy-loading secara efisien, sehingga dapat merangkum semua aset sekaligus mencapai sifat statis, tunggal, dan efisien secara bersamaan
- Menggabungkan HTML asli dan aset dalam bentuk tarball di belakang header HTML dan JavaScript, lalu JS hanya memuat bagian yang diperlukan melalui permintaan HTTP Range
- Solusi lama seperti SingleFile atau MHTML memiliki sifat statis dan satu file, tetapi kurang efisien; Gwtar menyelesaikan masalah ini
- Bekerja hanya dengan fitur standar browser tanpa konfigurasi tambahan di sisi server, dan pada beberapa lingkungan seperti Cloudflare ditangani dengan tipe MIME
x-gwtar
- Menjaga preservasi dan aksesibilitas halaman HTML berukuran besar secara bersamaan, sehingga berguna untuk pengarsipan web jangka panjang dan penyimpanan materi riset yang dapat direproduksi
Ikhtisar Gwtar
- Gwtar adalah format arsip polyglot baru yang terdiri dari satu file HTML, di mana browser hanya memuat bagian yang diperlukan melalui permintaan HTTP Range
- Digunakan untuk menyediakan arsip HTML besar di Gwern.net
- JS pada header HTML menghentikan unduhan seluruh file, lalu memuat hanya aset yang diperlukan melalui permintaan parsial (range request)
- Hasilnya, server hanya menyediakan satu file HTML, tetapi pengguna hanya mengunduh aset yang dibutuhkan
- Semua fungsi diimplementasikan dengan fitur browser standar sehingga kompatibilitas masa depan tetap terjaga
Trilema arsip HTML
- Arsip HTML memiliki keterbatasan lama: dari sifat statis, satu file, dan efisiensi, biasanya hanya dua yang bisa dipenuhi sekaligus
- Contoh: SingleFile bersifat statis dan satu file tetapi tidak efisien, sedangkan WARC statis dan efisien tetapi bukan satu file
- Snapshot yang dibuat dengan SingleFile memberikan halaman statis yang lengkap, tetapi semua aset di-inline dalam Base64 sehingga ukuran file bisa membengkak hingga ratusan MB
- Akibatnya, pengguna harus mengunduh seluruh file meskipun hanya melihat sebagian halaman
- Untuk mengatasi hal ini, Gwern.net sempat memisahkan aset dengan deconstruct_singlefile.php, tetapi konsekuensinya kehilangan sifat satu file
Pendekatan teknis Gwtar
- Memanfaatkan permintaan HTTP Range agar hanya sebagian file dapat diunduh secara selektif
- Mengadopsi struktur arsip konkatenasi yang menggabungkan HTML + header JS dengan tarball di belakangnya
- Dengan perintah
window.stop() di JS, unduhan setelah header dihentikan dan hanya aset yang diperlukan yang diminta
- Browser merendernya seperti HTML biasa, sementara JS mencegat permintaan aset dan mengubahnya menjadi permintaan Range
Pembuatan dan implementasi
- File HTML SingleFile dapat dikonversi menjadi Gwtar dengan skrip PHP deconstruct_singlefile.php
- Mendukung rekompresi JPG/PNG/GIF dan penambahan data PAR2 FEC (forward error correction)
- Setelah JS dijalankan, browser hanya memuat aset yang diperlukan melalui permintaan Range; jika JS dinonaktifkan, mekanisme ini digantikan dengan unduhan seluruh file
- Karena berbasis standar, tidak memerlukan konfigurasi server atau perangkat lunak tambahan, dan dapat dipulihkan dari satu file kembali menjadi HTML multi-file
Kinerja dan kompatibilitas
- Jika permintaan Range tidak didukung, seluruh file akan diunduh, tetapi kecepatan masih bisa dibantu dengan kompresi gzip/Brotli
- Cloudflare menghapus header Range pada respons
text/html, sehingga Gwern.net mengatasinya dengan menetapkan tipe MIME x-gwtar
- Tidak bisa dilihat sebagai file lokal :
- Hal ini juga berlaku untuk SingleFileZ, karena kebijakan keamanan browser (seperti CORS) memblokir permintaan JS
- Ini dianggap sebagai trade-off yang dapat diterima, dan penelusuran lokal dapat diatasi dengan mengonversinya ke file yang tidak bergantung pada JS
Fitur ekstensi
- Di akhir file Gwtar dapat dilampirkan data biner tambahan (misalnya FEC, tanda tangan, metadata)
- Dengan PAR2, file dapat dipulihkan jika sebagian data rusak
- Tanda tangan GPG dapat disisipkan dalam bentuk komentar HTML untuk verifikasi integritas
- Pada versi mendatang direncanakan verifikasi hash aset, prefetch otomatis, kompresi bawaan, dan dukungan multi-halaman
Potensi penggunaan
- Cocok untuk halaman HTML besar atau penelitian ilmiah yang dapat direproduksi dengan menyertakan dataset riset (misalnya SQLite3)
- Database dapat dimuat langsung di browser melalui permintaan Range untuk dianalisis
- Diusulkan sebagai format pengarsipan web yang sekaligus menjamin preservasi jangka panjang dan aksesibilitas
Lisensi dan pengembangan selanjutnya
- Dokumentasi dan kode Gwtar dirilis ke domain publik CC-0
- Pada versi mendatang (v2), sedang dipertimbangkan FEC wajib, kompresi bawaan, dukungan multi-dokumen, dan peningkatan deduplikasi
1 komentar
Komentar Hacker News
Hari ini saya baru pertama kali tahu tentang window.stop()
Fungsi ini menghentikan browser agar tidak lagi memuat resource
Browser-browser utama sudah mendukungnya lebih dari 10 tahun (dokumentasi MDN, Can I Use)
Contoh penggunaannya bisa dilihat di screenshot ini
Detail lebih lanjut saya rangkum di postingan blog saya
Namun, ini bisa menjadi pendekatan menarik jika Anda ingin mengimplementasikan download atau lazy-loading sendiri dengan logika yang berpusat di server
Kecuali untuk situasi khusus seperti skrip inisialisasi atau redirect, sulit untuk merekomendasikannya
Saya menerbitkan file dalam bentuk chunk base64 terkompresi melalui bundler buatan saya sendiri, dan caranya mirip
Jika ini bekerja di lingkungan berbagi file tunggal seperti itu, saya jadi berpikir platform mungkin akan memblokirnya
PHP punya fitur serupa, __halt_compiler(), dan saya pernah memakainya untuk menaruh dokumentasi atau data di akhir file tanpa komentar
Awalnya ini terasa menarik, tetapi saya mulai ragu ketika melihat format ini tidak bisa dibuka langsung dari file lokal
Jika ini format untuk pengarsipan, akses lokal seharusnya menjadi salah satu use case utamanya
Tetapi jika tidak bisa langsung dibuka secara lokal, banyak kelebihannya jadi berkurang (lihat konsep backdoor pilot)
Gambar, CSS, dan JS semuanya bisa di-inline sebagai data-uri, begitu juga font
Malah rasanya format dokumen pengolah kata akan lebih fleksibel jika memakai HTML
python -m http.serverbisa menyelesaikannya dengan mudahBisa juga lewat perintah Claude
Jika penulis membaca ini, saya berharap format arsipnya menambahkan field screenshot BASE64, field deskripsi, dan timestamp ISO
Lebih ideal lagi jika bisa menyimpan beberapa versi dari URL yang sama dan memiliki fitur deduplikasi aset
Saya tidak paham kenapa penulis memandang WARC secara negatif
Justru Gwtar terlihat lebih rumit dan kurang fleksibel
Saya penasaran kenapa format polyglot ZIP/HTML milik SingleFile disebut “statis dan tunggal tetapi tidak efisien”
Saya ingin tahu dalam hal apa ia kurang efisien dibandingkan Gwtar
Intinya adalah apakah browser bisa mengambil bagian yang diperlukan dengan range request saat diminta, tanpa harus menerima seluruh file lebih dulu
Ini ide yang sangat keren
Saya pikir web app HTML satu file adalah bentuk perangkat lunak yang paling tahan lama
Contoh yang saya buat adalah FuzzyGraph dan HyperVault
Saya juga pernah berpikir untuk mengimplementasikan sesuatu yang mirip di level Service Worker
Halamannya dibiarkan apa adanya, lalu semua request HTTP dicegat
Seperti window.stop(), hanya sebagian HTML yang diterima dan sisanya diperlakukan sebagai blob aset
Jika Service Worker itu sendiri dimasukkan sebagai dataURI, hasilnya bisa menjadi file tunggal yang sepenuhnya mandiri
Menarik, tetapi saya kurang paham kenapa lazy load diperlukan untuk file lokal
Apakah filenya akan sebesar itu? Atau apakah tujuannya mempertahankan fitur yang sudah ada?
range request diperlukan agar bagian yang dibutuhkan bisa diminta tanpa mengambil semuanya dari jaringan
Tentu saja membaginya menjadi beberapa file lebih umum, tetapi kadang lebih praktis mengelola satu file saja
Mungkin ini juga terkait dengan struktur situs Gwern berbasis MediaWiki
Dulu saya juga pernah membuat sesuatu yang mirip — proyek bernama Zundler, pendekatannya cukup hacky
Ini juga bekerja secara lokal, tetapi seluruh arsip harus diekstrak lebih dulu di awal
Namun, saya penasaran bagaimana ia melewati pembatasan keamanan
Penjelasannya hanya menyebut soal single-origin, jadi saya masih belum benar-benar memahaminya