- यह एक single HTML archive file format है जिसे वेब ब्राउज़र lazy-loading के साथ कुशलतापूर्वक लोड कर सकते हैं; यह सभी assets को शामिल करते हुए भी स्थिरता, single-file संरचना और दक्षता तीनों को साथ में हासिल करता है
- HTML और JavaScript header के बाद tarball रूप में मूल HTML और assets को जोड़ा जाता है, और JS HTTP Range requests के ज़रिए केवल ज़रूरी हिस्से लोड करता है
- मौजूदा SingleFile या MHTML जैसे फ़ॉर्मैट स्थिरता और single-file गुण तो देते हैं, लेकिन दक्षता में कमी रहती है; Gwtar इस समस्या को हल करता है
- सर्वर-साइड अतिरिक्त सेटअप के बिना यह सिर्फ standard browser features पर काम करता है, और Cloudflare जैसे कुछ environments में MIME type
x-gwtar का उपयोग किया जाता है
- बड़े HTML पेजों की दीर्घकालिक संरक्षितता और accessibility दोनों सुनिश्चित करने के कारण यह long-term web archiving और reproducible research materials के संरक्षण में उपयोगी है
Gwtar का अवलोकन
- Gwtar एक नया polyglot archive format है जो single HTML file से बना होता है, और ब्राउज़र HTTP Range requests के माध्यम से केवल ज़रूरी हिस्से लोड करता है
- इसका उपयोग Gwern.net के बड़े HTML archives उपलब्ध कराने में किया जाता है
- HTML header का JS पूरी फ़ाइल का डाउनलोड रोक देता है और ज़रूरी assets को partial requests (range request) के ज़रिए लाता है
- परिणामस्वरूप सर्वर केवल एक single HTML file देता है, लेकिन उपयोगकर्ता सिर्फ आवश्यक assets ही डाउनलोड करता है
- सारी functionality standard browser features से लागू की गई है, जिससे future compatibility सुनिश्चित होती है
HTML archive की त्रि-दुविधा
- HTML archives में स्थिरता, single-file होना, और दक्षता—इनमें से सामान्यतः केवल दो ही गुण एक साथ मिल पाते थे
- उदाहरण: SingleFile स्थिर और single-file है, लेकिन अक्षम है; WARC स्थिर और कुशल है, लेकिन single-file नहीं है
- SingleFile से बने snapshots पूरी तरह स्थिर पेज तो देते हैं, लेकिन सभी assets को Base64 में inline करने के कारण फ़ाइल का आकार सैकड़ों MB तक बढ़ जाता है
- उपयोगकर्ता पेज का केवल एक हिस्सा देखे तब भी पूरी फ़ाइल डाउनलोड करनी पड़ती है, जिससे अक्षम्यता पैदा होती है
- Gwern.net ने इसे हल करने के लिए deconstruct_singlefile.php से assets अलग किए, लेकिन इससे single-file गुण खो गया
Gwtar का तकनीकी दृष्टिकोण
- HTTP Range requests का उपयोग कर फ़ाइल के केवल कुछ हिस्सों को चुनकर डाउनलोड किया जा सकता है
- HTML + JS header के बाद tarball जोड़ने वाली concatenated archive structure अपनाई गई है
- JS का
window.stop() कमांड header के बाद डाउनलोड रोकता है और फिर केवल ज़रूरी assets मंगाए जाते हैं
- ब्राउज़र इसे सामान्य HTML की तरह render करता है, और JS asset requests को intercept करके उन्हें Range requests में बदल देता है
निर्माण और implementation
- PHP script deconstruct_singlefile.php के ज़रिए SingleFile HTML को Gwtar में बदला जा सकता है
- JPG/PNG/GIF recompression और PAR2 FEC (forward error correction) data जोड़ने का समर्थन भी है
- JS चलने के बाद ब्राउज़र सिर्फ ज़रूरी assets को Range requests से लाता है, और JS disabled होने पर पूरी फ़ाइल डाउनलोड करने पर fallback हो जाता है
- यह standard-based है, इसलिए server settings या अतिरिक्त software की आवश्यकता नहीं होती, और single file से वापस multi-file HTML में restore भी किया जा सकता है
प्रदर्शन और compatibility
- यदि Range requests समर्थित न हों, तो पूरी फ़ाइल डाउनलोड होती है, लेकिन gzip/Brotli compression से गति की भरपाई की जा सकती है
- Cloudflare
text/html responses से Range header हटा देता है, इसलिए Gwern.net इसे bypass करने के लिए MIME type x-gwtar सेट करता है
- लोकल में फ़ाइल देखना संभव नहीं है :
- यह SingleFileZ की तरह ही है, क्योंकि browser security policies (जैसे CORS) JS requests को ब्लॉक कर देती हैं
- इसे खेदजनक लेकिन स्वीकार्य trade-off माना गया है, और local browsing को JS-निर्भर न रहने वाली फ़ाइल में बदलकर संभाला जा सकता है
विस्तारित सुविधाएँ
- Gwtar फ़ाइल के अंत में अतिरिक्त binary data (जैसे FEC, signatures, metadata) जोड़ा जा सकता है
- PAR2 की मदद से फ़ाइल के कुछ हिस्से खराब होने पर recovery संभव है
- GPG signature को HTML comment के रूप में डालकर integrity verification की जा सकती है
- भविष्य के versions में asset hash verification, automatic prefetch, built-in compression, multi-page support जैसी सुविधाएँ नियोजित हैं
उपयोग की संभावनाएँ
- बड़े HTML pages या research datasets (जैसे SQLite3) को शामिल करने वाले reproducible scientific research के लिए यह उपयुक्त है
- ब्राउज़र में सीधे database को Range requests के माध्यम से लोड करके analysis किया जा सकता है
- इसे web archiving format के रूप में प्रस्तावित किया गया है, जो long-term preservation और accessibility दोनों सुनिश्चित करता है
लाइसेंस और आगे का विकास
- Gwtar के documents और code को CC-0 public domain के रूप में जारी किया गया है
- भविष्य के version (v2) में FEC को अनिवार्य बनाना, built-in compression, multi-document support, और deduplication में सुधार जैसे बिंदुओं पर विचार किया जा रहा है
1 टिप्पणियां
Hacker News टिप्पणियाँ
आज पहली बार window.stop() के बारे में पता चला
यह फ़ंक्शन ब्राउज़र को आगे कोई resource लोड करने से रोकता है
बड़े ब्राउज़र इसे पहले से 10 साल से ज़्यादा समय से support कर रहे हैं (MDN दस्तावेज़, Can I Use)
इसका उपयोग उदाहरण इस screenshot में देखा जा सकता है
अधिक विवरण मेरी blog post में है
लेकिन server-केंद्रित logic में download या lazy-loading को सीधे implement करना हो, तो यह एक दिलचस्प तरीका हो सकता है
initialization या redirect script जैसी खास परिस्थितियों को छोड़ दें, तो इसे recommend करना कठिन है
मैं अपने बनाए bundler के ज़रिए files को compressed base64 chunks के रूप में publish करता हूँ, तो यह तरीका काफ़ी मिलता-जुलता है
अगर यह ऐसे single-file sharing environment में काम करता है, तो लगता है platform इसे block भी कर सकता है
PHP में भी ऐसा ही __halt_compiler() फीचर है, और मैंने इसका उपयोग file के अंत में documentation या data को बिना comment के जोड़ने के लिए किया है
शुरुआत में यह दिलचस्प लगा, लेकिन जब पता चला कि यह format local files से सीधे नहीं खुलता, तो थोड़ा संदेह हुआ
अगर यह archival format है, तो local access उसके मुख्य use case में से एक होना चाहिए
लेकिन अगर यह local में सीधे नहीं खुलता, तो इसका फ़ायदा काफ़ी कम हो जाता है (backdoor pilot की अवधारणा देखें)
image, CSS, JS सब कुछ data-uri के रूप में inline किया जा सकता है, और fonts भी ऐसे ही
बल्कि अगर word processor document formats ने HTML का उपयोग किया होता, तो वे शायद ज़्यादा flexible होते
python -m http.serverजैसे command से local server चलाकर इसे आसानी से हल किया जा सकता हैClaude command से भी यह संभव है
अगर लेखक यह पोस्ट देख रहे हों, तो अच्छा होगा कि archive format में BASE64 screenshot field, description field, और ISO timestamp जोड़े जाएँ
आगे चलकर अगर एक ही URL के कई versions store किए जा सकें और deduplicated assets की सुविधा हो, तो वह आदर्श होगा
समझ नहीं आता कि लेखक ने WARC को नकारात्मक रूप में क्यों देखा
उल्टा Gwtar ज़्यादा complex और कम flexible लगता है
जानना चाहता हूँ कि SingleFile की ZIP/HTML polyglot format को “static और single है, लेकिन inefficient” क्यों कहा गया
Gwtar की तुलना में यह किस तरह inefficient है?
मुख्य बात यह है कि browser request के समय पूरा file लिए बिना, range request के माध्यम से केवल ज़रूरी हिस्से ला सके या नहीं
यह सच में शानदार विचार है
मुझे लगता है कि single-file HTML webapp सॉफ़्टवेयर का सबसे लंबे समय तक टिकने वाला रूप है
मेरे बनाए उदाहरणों में FuzzyGraph और HyperVault शामिल हैं
मैंने भी कुछ ऐसा Service Worker स्तर पर implement करने के बारे में सोचा था
यानी page को वैसा ही रहने देना, और सभी HTTP requests को intercept करना
window.stop() की तरह सिर्फ़ HTML का एक हिस्सा लेना और बाकी को asset blob के रूप में संभालना
अगर Service Worker को ही dataURI के रूप में डाल दिया जाए, तो यह पूरी तरह single file बन सकता है
दिलचस्प है, लेकिन समझ नहीं आता कि local file में lazy load की ज़रूरत क्यों होगी
क्या file इतनी बड़ी होने वाली है? या पहले से बने features को जस का तस रखना है?
network से पूरा file लिए बिना केवल ज़रूरी हिस्से माँगने के लिए range request चाहिए
बेशक कई files में बाँटना ज़्यादा सामान्य तरीका है, लेकिन कभी-कभी single-file management ज़्यादा सुविधाजनक होता है
संभव है कि इसका संबंध Gwern के MediaWiki-आधारित site की संरचना से हो
मैंने पहले भी कुछ ऐसा बनाया था — Zundler नाम का एक project, जो काफ़ी hacky approach था
यह local में भी काम करता है, लेकिन शुरुआत में पूरा archive extract करना पड़ता है
हालांकि यह security restrictions को कैसे bypass करता है, यह जानने की उत्सुकता है
description में केवल single-origin का उल्लेख है, इसलिए पूरी तरह समझना थोड़ा कठिन है