Kage - वेबसाइट से JavaScript हटाकर उसे ऑफ़लाइन आर्काइव करने का टूल
(github.com/tamnd)- headless Chrome से पेज रेंडर करके, इंसान को दिखने वाला अंतिम DOM स्नैपशॉट लिया जाता है; फिर सारा JavaScript हटाकर CSS·इमेज·फ़ॉन्ट को लोकल पाथ पर डाउनलोड किया जाता है, ताकि बिना कोड के चलने वाली स्थिर कॉपी बन सके
- "Save As" से सेव किए गए पेज समय के साथ खाली स्क्रीन, रुका हुआ स्पिनर, या गायब analytics सर्वर से कनेक्ट करने की कोशिश जैसी वजहों से टूट जाने की समस्या का समाधान
- ट्रैकिंग, नेटवर्क कॉल, या अप्रत्याशित व्यवहार के बिना, डिस्क से सीधे खुलने वाली
.htmlफ़ाइल प्रदान करता है
- ट्रैकिंग, नेटवर्क कॉल, या अप्रत्याशित व्यवहार के बिना, डिस्क से सीधे खुलने वाली
- breadth-first crawling के ज़रिए
robots.txtपढ़ता है,sitemap.xmlसे शुरुआती बिंदु तय करता है, और seed host के भीतर ही रहता है- idempotent गुण के कारण http·https या trailing slash होने-न होने से फ़र्क नहीं पड़ता, वही पेज केवल एक बार लाया जाता है
- Ctrl-C पर स्थिति सहेजता है और दोबारा चलाने पर वहीं से जारी रखता है;
--refreshसे फिर से रेंडर करता है,--forceसे नई शुरुआत करता है
--max-pages,--max-depth,--scope-prefix,--subdomains,--scroll,--workersआदि crawl scope और behavior control flags उपलब्धkage packसे कॉपी को एक फ़ाइल में पैक किया जा सकता है; विकल्प हैं ZIM archive या साइट की तरह चलने वाला standalone executable- ZIM, Kiwix ecosystem के साथ संगत है, इसलिए
kiwix-serveया Kiwix desktop·mobile app में भी देखा जा सकता है - standalone binary में पाने वाले को कुछ भी इंस्टॉल करने की ज़रूरत नहीं होती, और
--baseसे दूसरे OS के लिए viewer बनाया जा सकता है (लगभग 13 MiB + साइट आकार)
- ZIM, Kiwix ecosystem के साथ संगत है, इसलिए
- deterministic packing के कारण एक ही कॉपी से हमेशा byte-identical फ़ाइल बनती है; archive UUID कंटेंट से निकाला जाता है, इसलिए checksum·cache के लिए सुरक्षित है
webviewटैग के साथ बिल्ड करने पर OS WebView(WKWebView·WebView2·WebKitGTK) का उपयोग होता है, जिससे यह ब्राउज़र टैब के बजाय अपनी अलग विंडो में खुलता है- प्रोसेसिंग पाइपलाइन: seed URL → headless Chrome rendering → final DOM snapshot → strip JS → asset localization → डिस्क पर सहेजना
- MIT लाइसेंस
1 टिप्पणियां
Hacker News टिप्पणियाँ
README का demo GIF कैसे बनाया गया, यह देखने में दिलचस्पी हुई: https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63...
पता चला कि इसमें उसी लेखक का एक दूसरा प्रोजेक्ट https://github.com/tamnd/ascii-gif इस्तेमाल हुआ है
demo में इस्तेमाल की गई script https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63... में है, और इसे चलाने का तरीका भी comment में दिया गया है:
ascii-gif render docs/demo/kage.tape -o docs/static/demo.gifयह https://github.com/charmbracelet/vhs के ऊपर काफ़ी मज़बूती से opinionated wrapper जैसा लगता है
$HOME/bin/में भी इस तरह के काफ़ी personal binaries हैं।delete-all-npm,clean-rust-cache,download-youtube-playlist,get-markdownजैसी चीज़ें, और अच्छा यह है कि commands याद नहीं रखने पड़तेकभी-कभी coding agents खुद ही पता लगा लेते हैं कि इन tools को कैसे invoke करना है
अगर आप कंपनी wiki को offline में भी आसानी से उपलब्ध कराना चाहते हैं, तो यह काम आ सकता है। जैसे, किसी ऐसे field site पर जहाँ mobile signal न हो, wiki में उपयोगी documentation हो सकती है
पूरी site को एक single binary में बाँध सकना बढ़िया है, लेकिन अगर ऐसा version हो जिसमें अलग serving process की ज़रूरत न पड़े, तो और भी अच्छा होगा
site content archive को, संभव हो तो embedded रूप में, थोड़ी-सी JavaScript के साथ searchable बनाने वाले single HTML entrypoint shim जैसी कोई चीज़ भी संभव लगती है
मेरे दिमाग में पहले से एक script/program है जो HTML को Markdown में बदलता है, इसलिए व्यवहार में मैं सब कुछ डिस्क पर Markdown files के folder के रूप में रखकर उसे Git repository में commit भी कर सकता हूँ
यह शानदार है। मैं Lovable जैसी किसी चीज़ में बने किसी के prototype को offline copy के रूप में लेना चाहता था, ताकि version control और sharing ज़्यादा आसान format में हो सके
हमने जो तरीका अपनाया, वह यहाँ लिखा है: https://productnow.ai/blogs/extracting-html-from-ai-prototyp...
अब मैं इसे देखूँगा और देखूँगा कि क्या इसमें से कुछ बदला जा सकता है। offline mirror का idea मुझे पसंद है, और collaboration से जुड़े use cases बहुत सरल हो जाते हैं
यहाँ
kage serve $HOME/data/kage/paulgraham.comलिखा है, लेकिन अगर output static है, तो server की ज़रूरत क्यों है, समझ नहीं आता। क्या इसे browser में सीधे खोलने लायक नहीं बनाया जा सकता?उदाहरण के लिए, अगर
$ firefox $HOME/data/kage/paulgraham.comजैसा कुछ संभव हो, तो ऐसी machine जहाँ kage install नहीं है वहाँ भी output इस्तेमाल किया जा सकता हैpython -m http.serverइस्तेमाल किया जा सकता है, शायद। मैंने अभी तक इसे आज़माया नहीं है, लेकिन चलना चाहिएअसल में Kage दो हिस्सों से बना है। एक crawler है जो Chrome/Chromium rendering के बाद DOM को capture करता है, pages को crawl करता है और उन्हें साफ़ HTML में बदलता है, और दूसरा pack/serve component है जो output को Kiwix के लिए ZIM file या executable में package करता है
मुझे लगता है SingleFile [0] इसका कहीं ज़्यादा मज़बूत वर्ज़न है
यह JavaScript भी पूरी तरह हटा देता है, लेकिन सब कुछ एक single HTML file में पैक कर देता है जिसे शेयर करना आसान होता है। web fonts या images जैसी binary assets को base64 strings के रूप में शामिल किया जाता है
इसका एक Puppeteer-आधारित CLI भी है [1]
[0]: https://github.com/gildas-lormeau/singlefile
[1]: https://github.com/gildas-lormeau/single-file-cli
यहाँ जो implement किया जा रहा है वह पूरी website mirroring है, जिसमें subpages भी शामिल हैं, इसलिए offline रहते हुए भी सब कुछ browse किया जा सकता है। उदाहरण के लिए paulgraham.com के सभी essays
लेकिन अगर Kage, SingleFile जैसी reproduction quality और HTTrack-स्टाइल spidering approach को जोड़ पाए, तो यह काफ़ी promising लगेगा। single-page apps को archive करना थोड़ा मुश्किल होता है, इसलिए यह देखना दिलचस्प होगा कि Kage उन्हें कितना अच्छी तरह संभालता है
File -> Save asकरने से कैसे अलग है?मैंने HTTP, यानी HTTPS नहीं, वाली site को clone करने की कोशिश की, लेकिन
navigation failed: net::ERR_NAME_NOT_RESOLVEDमिला।http://के साथ protocol साफ़ तौर पर लिखने पर भी यही हुआमैं फ्लाइट में पढ़ने के लिए wiki डाउनलोड करते समय httrack(https://www.httrack.com) इस्तेमाल करता रहा हूँ। यह परफ़ेक्ट तो नहीं है, लेकिन पहले जो चीज़ें मिलीं उनसे बेहतर था
इसे भी आज़माऊँगा, और अगर नतीजे अच्छे रहे तो सच में बहुत खुशी होगी
https://wiki.openzim.org/wiki/Build_your_ZIM_file
EDIT: https://get.kiwix.org/en/solutions/applications/kiwix-reader...
मैंने वर्षों में पुराने websites के archives काफ़ी जमा किए हैं। दिलचस्प बात यह रही कि बदसूरत HTML dumps “perfect” archives की तुलना में ज़्यादा उपयोगी निकले
समय के साथ RSS मुझे और ज़्यादा पसंद आने लगा, इसका एक कारण यही है। करीब 10 साल पुराने feeds आज भी कई बार उन बड़ी मेहनत से सुरक्षित रखी गई app-जैसी websites की तुलना में इस्तेमाल करने में आसान होते हैं
थोड़ा व्यवस्थित करने के बाद इसे जल्द ही open source के रूप में जारी करने वाला हूँ
लगता है यह किसी site पर काफ़ी बड़ा लोड डाल सकता है। क्या clone speed को नियंत्रित करने या images/videos से बचने की कोई setting है?
यह भी जानना चाहता हूँ कि क्या website का सिर्फ एक हिस्सा लेने का कोई तरीका है
बढ़िया प्रोजेक्ट है और आइडिया पसंद आया
जल्दी से पढ़ने पर देखा कि Chrome को
--no-sandboxके साथ चलाया जा रहा है, क्या इसके पीछे कोई वजह है? security के लिहाज़ से यह शायद अच्छा विचार नहीं है। अगर कोई ठोस कारण नहीं है, तो sandbox चालू रखने की सलाह दूँगाफिर भी, शानदार काम है
--no-sandboxDocker में ज़रूरी होता है। शायद यह मान लिया गया होगा कि ज़्यादातर लोग इसे Docker में चलाएँगे?