अपडेट पर वापस जाएँ
UpdatedAug 8, 2026

foxcage — Updated!

रूटलेस पॉडमैन कंटेनर में फ़ायरफ़ॉक्स चलाएँ, जिसमें कैपेबिलिटीज़ हटाई गई हों, नेटवर्किंग आइसोलेटेड हो और स्टोरेज एफ़ेमरल हो, ताकि सैंडबॉक्स एस्केप को सीमित किया जा सके और होस्ट से छेड़छाड़ को रोका जा सके।

साझा करें

foxcage icon foxcage

सुरक्षा अलगाव के लिए Firefox को रूटलेस Podman कंटेनर में चलाएँ। आपका ब्राउज़र लगभग बिना किसी Linux क्षमता के, अपने स्वयं के उपयोगकर्ता और नेटवर्क नेमस्पेस में, होस्ट से अलग चलता है — जबकि उसे पूर्ण GPU त्वरण, ऑडियो और DRM समर्थन मिलता है।

foxcage क्यों?

Firefox के पास पहले से ही एक मल्टी-प्रोसेस सैंडबॉक्स है जो Linux नेमस्पेस और seccomp-bpf का उपयोग करके वेब कंटेंट रेंडरर्स को अलग करता है। अधिकांश खतरों के लिए, यह प्रभावी है। foxcage एक दूसरी दीवार जोड़ता है: यदि कोई हमलावर Firefox के सैंडबॉक्स से बाहर निकलने वाली किसी भेद्यता का शोषण करता है (ऐसा होता है — इसके लिए CVEs मौजूद हैं), तो वे आपके पूर्ण उपयोगकर्ता सत्र के बजाय एक लॉक-डाउन कंटेनर के अंदर पहुँचते हैं।

foxcage किससे सुरक्षा करता है

  • पोस्ट-एक्सप्लॉइट फ़ाइल पहुँच। बेयर Firefox पर सैंडबॉक्स एस्केप से वह सब कुछ उपलब्ध हो जाता है जो आपका उपयोगकर्ता पढ़ सकता है: ~/.ssh, ~/.gnupg, अन्य ब्राउज़रों के लिए ब्राउज़र प्रोफ़ाइल, पासवर्ड मैनेजर डेटाबेस, दस्तावेज़, सोर्स कोड। foxcage में, हमलावर केवल वही देख पाता है जो आपने स्पष्ट रूप से माउंट किया है।
  • डिस्क पर ट्रैकिंग अवशेष। @tmp अस्थायी केज विंडो बंद होने के बाद डिस्क पर शून्य निशान छोड़ता है — जिसमें एक्सटेंशन, HSTS स्थिति, TLS सत्र कैश, और DNS कैश शामिल हैं जिन्हें Firefox की प्राइवेट ब्राउज़िंग अभी भी संग्रहीत करती है। कई @tmp केज एक साथ एक-दूसरे में हस्तक्षेप किए बिना चलते हैं।
  • स्थिरता। बेयर Firefox पर, मैलवेयर रिबूट के बाद बचने के लिए ~/.config/autostart, ~/.bashrc, cron, या कहीं और लिख सकता है। foxcage का अस्थायी कंटेनर (--rm) का अर्थ है कि जब तक आपने इसे बाइंड-माउंट नहीं किया है, कुछ भी स्थायी नहीं रहता।
  • पार्श्व नेटवर्क संचलन। डिफ़ॉल्ट रूप से, कंटेनर localhost पर सेवाओं की जाँच नहीं कर सकता। बेयर Firefox पर, सैंडबॉक्स एस्केप के पास पूर्ण नेटवर्क पहुँच होती है। (यदि किसी केज को localhost पहुँच चाहिए, तो [network] mode = "host" का उपयोग करें, जैसे कि स्थानीय विकास के लिए — लेकिन "नेटवर्किंग" के अंतर्गत चेतावनी देखें: होस्ट मोड होस्ट के अमूर्त यूनिक्स सॉकेट्स भी उजागर करता है।)
  • विशेषाधिकार वृद्धि। कंटेनर CAP_SYS_CHROOT को छोड़कर सभी Linux क्षमताओं को हटा देता है और नए विशेषाधिकार अधिग्रहण को रोकता है। Setuid बाइनरी, अस्पष्ट syscalls के माध्यम से कर्नेल शोषण, और समान वृद्धि पथ काट दिए जाते हैं।

foxcage किससे सुरक्षा नहीं करता

  • ब्राउज़र-स्तरीय हमले। फ़िशिंग, दुर्भावनापूर्ण एक्सटेंशन, और वह सब जो Firefox की सामान्य कार्यक्षमता के भीतर संचालित होता है, प्रभावित नहीं होता — foxcage कंटेनर को होस्ट से अलग करता है, उपयोगकर्ता को ब्राउज़र से नहीं।
  • बाइंड-माउंटेड निर्देशिकाएँ। आप जो कुछ भी माउंट करते हैं (profile, downloads_dir, अतिरिक्त बाइंड माउंट) एक समझौता किए गए ब्राउज़र के लिए पूरी तरह सुलभ होता है। यदि आप होस्ट प्रोफ़ाइल निर्देशिका माउंट करते हैं, तो एक हमलावर बेयर Firefox की तरह ही उसके साथ छेड़छाड़ कर सकता है।
  • PulseAudio के माध्यम से ऑडियो कैप्चर। PulseAudio सॉकेट कंटेनर में बाइंड-माउंटेड है। हालाँकि यह फाइलसिस्टम स्तर पर केवल-पठनीय माउंट किया गया है, यूनिक्स डोमेन सॉकेट द्विदिश होते हैं — एक समझौता प्रक्रिया फिर भी सॉकेट के माध्यम से रिकॉर्डिंग अनुरोध भेज सकती है। ब्राउज़र सैंडबॉक्स एस्केप संभावित रूप से होस्ट माइक्रोफ़ोन से ऑडियो रिकॉर्ड कर सकता है।
  • Wayland कम्पोज़िटर शोषण। Wayland सॉकेट पास-थ्रू किया जाता है। Wayland कम्पोज़िटर डिज़ाइन द्वारा क्लाइंट्स को एक-दूसरे से अलग करते हैं, लेकिन कम्पोज़िटर में ही कोई भेद्यता पहुँच योग्य होगी।

सुरक्षा कॉन्फ़िगरेशन

कंटेनर निम्नलिखित के साथ चलता है:

  • सभी Linux क्षमताएँ हटा दी गईं (केवल Firefox के कंटेंट सैंडबॉक्स के लिए CAP_SYS_CHROOT वापस जोड़ा गया; CAP_SETUID/CAP_SETGID अस्थायी रूप से तब जोड़ा गया जब init.root कॉन्फ़िगर किया गया हो)
  • विशेषाधिकार वृद्धि रोकने के लिए no-new-privileges
  • रूटलेस उपयोगकर्ता नेमस्पेस (--userns keep-id)
  • निजी /dev/shm (होस्ट के साथ साझा नहीं) — shm_size के माध्यम से कॉन्फ़िगर करने योग्य आकार
  • होस्ट लूपबैक को डिफ़ॉल्ट रूप से अवरुद्ध करने के साथ pasta के माध्यम से पृथक नेटवर्किंग
  • DNS डिफ़ॉल्ट रूप से होस्ट DNS का उपयोग करता है (network.dns के माध्यम से कॉन्फ़िगर करने योग्य)
  • XDG_RUNTIME_DIR से केवल विशिष्ट सॉकेट्स ही बाइंड-माउंट किए जाते हैं (Wayland, PulseAudio, PipeWire, और फ़िल्टर किया गया D-Bus प्रॉक्सी) — पूरी होस्ट रनटाइम निर्देशिका कभी उजागर नहीं होती
  • होस्ट के D-Bus सत्र बस तक पहुँच हमेशा होस्ट पर चलने वाले फ़िल्टर किए गए xdg-dbus-proxy द्वारा मध्यस्थ की जाती है। केवल org.freedesktop.Notifications, org.freedesktop.portal.Desktop, org.mozilla.*, और (फोर्क्स के लिए) फोर्क का अपना नेमस्पेस (जैसे org.librewolf.*) पहुँच योग्य हैं — कीरिंग और SSH/GPG एजेंट जैसी सत्र सेवाएँ अवरुद्ध हैं
  • पोर्टल पहुँच व्यापक है। org.freedesktop.portal.Desktop को समग्र रूप से अनुमति है, क्योंकि फ़ाइल पिकर, "किसी अन्य ऐप में लिंक खोलें", और स्क्रीन शेयरिंग इसी तरह काम करते हैं। यह RemoteDesktop (पूरे सत्र के लिए सिंथेटिक कीबोर्ड/माउस), Camera और Location को भी उजागर करता है। वे foxcage के बजाय आपके डेस्कटॉप के स्वयं के अनुमोदन संवादों द्वारा नियंत्रित होते हैं — और RemoteDesktop प्रॉम्प्ट स्क्रीन-शेयर प्रॉम्प्ट जैसा दिखता है, इसलिए उन्हें स्वीकार करने से पहले अनुमोदन संवाद पढ़ें। xdg-dbus-proxy में "किसी एक इंटरफ़ेस को अस्वीकार करें" नियम नहीं है, इसलिए इसे संकीर्ण करने का अर्थ है Firefox को आवश्यक प्रत्येक इंटरफ़ेस की गणना करना; यह डिफ़ॉल्ट रूप से क्यों नहीं किया जाता है, इसके लिए docs/DESIGN.md देखें
  • सभी बाइंड माउंट (profile, downloads_dir, अतिरिक्त [mounts] bind) nosuid,noexec का उपयोग करते हैं
  • ब्राउज़र डाउनलोड GPG हस्ताक्षरों के विरुद्ध सत्यापित: Firefox को Mozilla के हस्ताक्षरित SHA-512 चेकसम के विरुद्ध, LibreWolf को LibreWolf मेंटेनर्स की अलग की गई हस्ताक्षर और सहयोगी SHA-256 के विरुद्ध। सत्यापन gpg --verify से अधिक कठोर है, जो निरस्त कुंजी द्वारा बनाए गए हस्ताक्षर और कीरिंग में किसी भी कुंजी के लिए 0 के साथ बाहर निकलता है। foxcage अतिरिक्त रूप से आवश्यकता रखता है कि हस्ताक्षर पिन की गई प्राथमिक कुंजी से श्रृंखलाबद्ध हो, और किसी भी रिलीज़ को अस्वीकार करता है जो ऐसी उपकुंजी द्वारा हस्ताक्षरित है जिसे उसके स्वामी ने समझौता किए जाने पर निरस्त कर दिया था — निरस्त हस्ताक्षर कुंजियाँ देखें
  • अस्थायी कंटेनर (--rm) — फाइलसिस्टम लेखन बाहर निकलने पर खो जाते हैं
  • कोई होस्ट डिवाइस (वेबकैम, सुरक्षा कुंजियाँ, प्रिंटर) स्पष्ट रूप से सक्षम किए बिना पास-थ्रू नहीं किए जाते

आपके द्वारा सक्षम किया गया प्रत्येक [network] और [mounts] विकल्प सुविधा के लिए कुछ अलगाव का व्यापार करता है। डिफ़ॉल्ट सबसे प्रतिबंधात्मक कॉन्फ़िगरेशन है जो फिर भी आपको उपयोग योग्य ब्राउज़र देता है।

आवश्यकताएँ

  • Python 3.11+
  • Podman (रूटलेस)
  • Wayland कम्पोज़िटर (X11 समर्थित नहीं है)
  • pasta (sudo apt install passt) — जब तक network.mode = "host" न हो
  • xdg-dbus-proxy (sudo apt install xdg-dbus-proxy)
  • PulseAudio या PipeWire जिसमें PulseAudio संगतता हो (ऑडियो के लिए)
  • DRI समर्थन वाला GPU — वैकल्पिक; /dev/dri के बिना foxcage चेतावनी देता है और Firefox सॉफ़्टवेयर में रेंडर करता है

foxcage को अपने सामान्य डेस्कटॉप उपयोगकर्ता के रूप में चलाएँ, रूट के रूप में या sudo के माध्यम से नहीं — सैंडबॉक्स आपके उपयोगकर्ता को कंटेनर में मैप करता है, और रूट के रूप में चलाने से वह अलगाव समाप्त हो जाता है जिसे प्रदान करने के लिए foxcage अस्तित्व में है। यह रूट के रूप में शुरू होने से इनकार करता है।

परीक्षित वातावरण: GNOME 3 के साथ Debian 13 (Trixie)। अन्य Linux वितरण और Wayland कम्पोज़िटर काम कर सकते हैं लेकिन परीक्षण नहीं किए गए हैं।

स्थापना

foxcage एक एकल Python स्क्रिप्ट है जिसकी Python मानक पुस्तकालय के बाहर कोई निर्भरता नहीं है। इसे अपने PATH में एक निर्देशिका में कॉपी करें:```sh sudo cp foxcage /usr/local/bin/foxcage

या उपयोगकर्ता-स्थानीय स्थापना के लिए:```sh
cp foxcage ~/.local/bin/foxcage

सुनिश्चित करें कि स्क्रिप्ट executable है (chmod +x foxcage)।

जाँचें कि आपके पास कौन सा revision है foxcage --version — किसी समस्या की रिपोर्ट करते समय उपयोगी, क्योंकि foxcage एक एकल फ़ाइल की कॉपी करके इंस्टॉल किया जाता है।

उपयोग```sh

./foxcage

पहली बार चलाने पर स्क्रिप्ट कंटेनर इमेज बनाती है (Mozilla से Firefox डाउनलोड करती है, न्यूनतम Debian निर्भरताएँ इंस्टॉल करती है) और फिर Firefox शुरू करती है। बाद के रनों में, foxcage Firefox अपडेट की जाँच करता है और जब कोई नया संस्करण उपलब्ध होता है तो इमेज को स्वचालित रूप से फिर से बनाता है। सिस्टम पैकेज अपडेट लेने के लिए इमेज को समय-समय पर (डिफ़ॉल्ट रूप से हर 7 दिन में) भी फिर से बनाया जाता है। यदि अपडेट जाँच विफल हो जाती है (नेटवर्क त्रुटि, टाइमआउट), तो एक चेतावनी लॉग की जाती है और मौजूदा इमेज का उपयोग किया जाता है — स्टार्टअप कभी अवरुद्ध नहीं होता।

तर्कों को Firefox तक पास करें:```sh
./foxcage https://example.com

नामित cage को Firefox फ़्लैग्स के साथ संयोजित करें:```sh ./foxcage @work --kiosk https://example.com

यदि कोई cage पहले से चल रहा है, तो URL दूसरा कंटेनर शुरू करने के बजाय मौजूदा ब्राउज़र में एक नए टैब में खुलता है। बिना URL के किसी चल रहे cage के विरुद्ध `foxcage` (या `foxcage @cage`) चलाने पर "cage is already running" संदेश के साथ साफ़ रूप से बाहर निकल जाता है — foxcage मौजूदा Wayland विंडो को कंटेनर के बाहर से सामने नहीं ला सकता, इसलिए वह कोशिश नहीं करता।

प्रति-लॉन्च फ़्लैग तब लागू **नहीं** होते जब कोई cage पहले से चल रहा हो। `--dns`, `--ipv4-only`, `--lifetime`, `--color` और `--fork` कंटेनर शुरू होने पर उपयोग किए जाते हैं, और चल रहे कंटेनर की सेटिंग्स को बाहर से बदला नहीं जा सकता, इसलिए उन्हें चेतावनी के साथ अनदेखा किया जाता है। उन्हें लागू करने के लिए cage को बंद करें और दोबारा चलाएँ।

> निजी-मोड सत्रों के लिए `private_browsing` config कुंजी का उपयोग करें — *नहीं* Firefox के कच्चे `--private-window` CLI फ़्लैग का। config कुंजी सत्र-व्यापी निजी मोड (`browser.privatebrowsing.autostart`) सेट करती है, इसलिए बाद के `foxcage @cage URL` आह्वान टैब में फिर से खोल सकते हैं। Firefox passthrough के रूप में `--private-window` केवल पहली विंडो को निजी बनाएगा और ऊपर दिए गए टैब-में-फिर-खोलने के व्यवहार को तोड़ देगा।
>
> **ध्यान दें:** `private_browsing = true` के माध्यम से सक्षम सत्र Firefox के सामान्य निजी-विंडो UI संकेत (बैंगनी एक्सेंट बार, मास्क आइकन, शीर्षक में "(Private Browsing)") नहीं दिखाते। ऐसा इसलिए है क्योंकि सत्र में हर विंडो निजी है, इसलिए Firefox के पास कोई गैर-निजी विंडो नहीं है जिसके विपरीत वह दृश्य रूप से अंतर दिखा सके — वह संकेतक को दबा देता है। सत्र *वास्तव में* निजी है; यदि आप चाहें तो cage में `about:privatebrowsing` पर जाकर (मानक Private Browsing जानकारी पृष्ठ दिखाता है) या `about:config` और `browser.privatebrowsing.autostart = true` की जाँच करके सत्यापित कर सकते हैं।

### `@tmp` के साथ क्षणिक ब्राउज़िंग

ऐसे एक-बार के लिंक के लिए जिन्हें कोई निशान नहीं छोड़ना चाहिए, आरक्षित `tmp` cage का उपयोग करें:```sh
./foxcage @tmp https://somewhere-suspicious.example

हर @tmp लॉन्च एक नया, डिस्पोजेबल Firefox होता है जिसमें कोई स्थायी प्रोफ़ाइल नहीं होती। जब विंडो बंद होती है, सब कुछ खत्म हो जाता है — कुकीज़, कैश, इतिहास, एक्सटेंशन, HSTS स्थिति, TLS सत्र कैश, DNS कैश, सहेजी गई टैब स्थिति। यह Firefox प्राइवेट ब्राउज़िंग से आगे जाता है, जो अभी भी एक्सटेंशन और काफी हद तक ऑन-डिस्क स्थिति को बनाए रखता है।

एक साथ कई @tmp केज चलते हैं, प्रत्येक दूसरों से पृथक होता है। मेनू बार में FoxCage - tmp (<short id>) दिखता है ताकि आप समवर्ती अस्थायी विंडोज़ में अंतर बता सकें।

अस्थायी केज स्टार्टअप पर एक खाली पृष्ठ और खाली नए टैब खोलते हैं — डिफ़ॉल्ट Firefox होम पेज और नए-टैब सामग्री (शीर्ष साइटें, Pocket अनुशंसाएँ, गतिविधि स्ट्रीम) एक नई प्रोफ़ाइल पर जो जल्द ही फेंक दी जाने वाली है, महज शोर होते हैं, इसलिए उन्हें दबा दिया जाता है। स्थायी केज Firefox के डिफ़ॉल्ट को बनाए रखते हैं।

नामित अस्थायी केज

यदि आप किसी अस्थायी सत्र पर एक सार्थक नाम चाहते हैं (मान लीजिए, एक शोध की गहरी खोज जिसे आप नए टैब में फिर से खोलना चाहेंगे), तो @tmp-<name> का उपयोग करें:```sh ./foxcage @tmp-research https://example.com # first call → new window ./foxcage @tmp-research https://another.example # second call → new tab in the existing window

`@tmp-<name>` अभी भी अस्थायी है — जब आप विंडो बंद करते हैं, सब कुछ चला जाता है। सादे `@tmp` से अंतर यह है कि एक ही नाम के साथ दूसरी लॉन्च **मौजूदा विंडो का पुन: उपयोग करती है** (स्थायी केज की तरह), इसलिए आप बिना समानांतर कॉपी शुरू किए बाद में और टैब जोड़ सकते हैं। सादा `@tmp` अपना "हर लॉन्च एक नया थ्रोअवे" व्यवहार बनाए रखता है।

मेनू-बार लेबल आपके द्वारा चुना गया नाम दिखाता है (`FoxCage - tmp-research`) ताकि विंडो सार्थक रूप से लेबल हो।

#### अस्थायी डिफ़ॉल्ट को कस्टमाइज़ करना

सभी अस्थायी केज (सादे `@tmp` और हर `@tmp-<name>`) के लिए डिफ़ॉल्ट सेट करने हेतु `~/.config/foxcage/tmp.toml` बनाएँ। उदाहरण के लिए:```toml
private_browsing = true
lifetime = "30m"

[network]
dns = "cloudflare"

अब हर अस्थायी लॉन्च को एक निजी विंडो, Cloudflare DoH मिलता है, और 30 मिनट के बाद अपने आप बंद हो जाता है — पूर्ण अस्थायित्व बरकरार रहता है। नामित अस्थायी (named ephemeral) डिफ़ॉल्ट रूप से tmp.toml इनहेरिट करते हैं; यदि आप प्रति नाम ओवरराइड करना चाहते हैं, तो ~/.config/foxcage/tmp-<name>.toml बनाएँ। फिर वह फ़ाइल tmp.toml के बजाय लागू होती है — कोई मर्ज नहीं होता, अधिक विशिष्ट फ़ाइल सीधे जीतती है। यदि आप चाहें तो साझा डिफ़ॉल्ट उसमें कॉपी कर लें।

नियमित केज के कॉन्फ़िग में जो कुछ भी सेट कर सकते हैं वह यहाँ काम करता है, सिवाय उस एक कुंजी के जो अस्थायित्व को ही विफल कर देगी:

  • profile — कठोर त्रुटि।

यह होस्ट पर स्थायी प्रोफ़ाइल निर्देशिका की ओर इशारा करता है, जो सीधे तौर पर @tmp के उद्देश्य का खंडन करता है। यदि आप स्थायी प्रोफ़ाइल के साथ सैंडबॉक्स्ड केज चाहते हैं, तो एक नियमित नामित केज (@work, @research, आदि) उपयोग करें जो tmp- से शुरू नहीं होता।

लॉन्च के अनुसार DNS ओवरराइड करना

--dns फ़्लैग (और इसके समतुल्य network.dns कॉन्फ़िग कुंजी) तीन रूपों को स्वीकार करता है:```sh ./foxcage @tmp --dns 1.1.1.1 https://example.com # IP ./foxcage @tmp --dns cloudflare https://example.com # alias ./foxcage @tmp --dns https://dns.nextdns.io/ # custom DoH URI

**जब मान किसी ज्ञात प्रदाता (alias या IP द्वारा) से मेल खाता है, तो foxcage स्वचालित रूप से उस प्रदाता के लिए फोर्स्ड DNS over HTTPS सक्षम करता है।** Firefox का TRR मोड 3 (सख्त, बिना क्लियरटेक्स्ट फॉलबैक) पर सेट हो जाता है, जिसमें बूटस्ट्रैप पता भरा होता है ताकि स्टार्टअप पर कोई अनएन्क्रिप्टेड रिज़ॉल्यूशन लीक न हो। आपको stderr पर एक-पंक्ति की सूचना दिखती है जैसे `Enabling DNS over HTTPS via Cloudflare`।

अंतर्निहित उपनाम:

| उपनाम | IP | फ़िल्टरिंग |
|-------|------|-----------|
| `cloudflare` | 1.1.1.1 | कोई नहीं |
| `cloudflare-security` | 1.1.1.2 | मैलवेयर ब्लॉक करता है |
| `cloudflare-family` | 1.1.1.3 | मैलवेयर + वयस्क ब्लॉक करता है |
| `google` | 8.8.8.8 | कोई नहीं |
| `quad9` | 9.9.9.9 | मैलवेयर ब्लॉक करता है (Quad9 डिफ़ॉल्ट) |
| `quad9-unfiltered` | 9.9.9.10 | कोई नहीं |
| `adguard` | 94.140.14.14 | विज्ञापन + ट्रैकर ब्लॉक करता है |
| `adguard-family` | 94.140.14.15 | विज्ञापन + ट्रैकर + वयस्क |
| `opendns` | 208.67.222.222 | कुछ |

जो IP तालिका में नहीं है (उदा. आपके LAN का Pi-hole) केवल क्लियरटेक्स्ट रहता है — कोई DoH सक्षम नहीं होता, क्योंकि foxcage संबंधित DoH एंडपॉइंट नहीं जानता। उसके लिए URI फ़ॉर्म का उपयोग करें: `--dns https://pi.hole/dns-query` (मान्य प्रमाणपत्र के साथ) DoH सक्षम करता है और कंटेनर DNS को अकेला छोड़ देता है।

URI फ़ॉर्म कंटेनर के क्लियरटेक्स्ट DNS को सेट करना छोड़ देता है, इसलिए कंटेनर के अंदर कोई भी चीज़ जो Firefox नहीं है, वह अभी भी होस्ट के DNS का उपयोग करती है। यह जानबूझकर है — `--dns URI` का अर्थ है "Firefox को इस DoH रिज़ॉल्वर का उपयोग कराएं", बस।

`--dns` का `network.mode = "host"` के साथ असंगत है, जिसके पास पहले से ही पूर्ण होस्ट नेटवर्क एक्सेस है।

### विज़ुअल कैज पहचान

हर नामित कैज को मेनू बार में एक एक्सेंट रंग मिलता है ताकि आप एक नज़र में विंडोज़ को अलग पहचान सकें। **आपको कुछ भी कॉन्फ़िगर करने की आवश्यकता नहीं है** — रंग कैज के नाम से नियतात्मक रूप से व्युत्पन्न होता है (SHA256-हैश करके ह्यू में बदला जाता है, निश्चित संतृप्ति और हल्केपन के साथ)। `@banking`, `@work`, `@personal`, `@tmp-research` सभी को बिना किसी प्रयास के अलग, स्थिर रंग मिलते हैं।

डिफ़ॉल्ट (अनाम) कैज में अंतर्निहित नारंगी रंग बना रहता है।

यदि आप स्वतः-व्युत्पन्न रंग को ओवरराइड करना चाहते हैं, तो इसे स्पष्ट रूप से सेट करें:```toml
# ~/.config/foxcage/banking.toml
color = "#dc2626"   # red — overrides the auto-derived colour

Please provide the Markdown content to be translated.```sh ./foxcage @experiment --color "#10b981" https://example.com # teal, one-off

मानक CSS हेक्स स्वीकार करता है: `#rgb`, `#rrggbb`, या `#rrggbbaa` (अल्फा के साथ)। स्वतः-व्युत्पन्न रंग हल्के और गहरे दोनों मेन्यूबार पर दिखने योग्य बनाने के लिए ट्यून किए गए हैं (लाइटनेस 55% पर स्थिर, सैचुरेशन 75% पर), इसलिए थीम कारणों से ओवरराइड करने की आवश्यकता नहीं होनी चाहिए।

### समय-सीमित पिंजरे

`--lifetime` फ़्लैग (और समकक्ष `lifetime` कॉन्फ़िग कुंजी) एक निर्धारित अवधि के बाद पिंजरे को स्वतः बंद कर देता है। प्रारूप है `<number><unit>` जिसमें इकाई `s`, `m`, या `h` होती है:```sh
./foxcage @tmp --lifetime 10m https://example.com
./foxcage @work --lifetime 2h

काउंटडाउन तब शुरू होता है जब Firefox वास्तव में केज के अंदर लॉन्च होता है — कंटेनर स्टार्टअप और इमेज-बिल्ड समय आपके बजट में से नहीं कटते। केज का मेनू-बार लेबल काउंटडाउन को केज पहचान के साथ दिखाता है — जैसे FoxCage - tmp (a3f2b1) | 9m — जब एक मिनट से अधिक शेष बचा होता है तो प्रति मिनट एक बार अपडेट होता है, और अंतिम मिनट में प्रति सेकंड एक बार। जब काउंटडाउन शून्य पर पहुँचता है, Firefox स्वयं बंद हो जाता है और कंटेनर बाहर निकल जाता है। यदि आप जीवनकाल समाप्त होने से पहले Firefox को स्वयं बंद करते हैं, तो कुछ भी असामान्य नहीं होता।

इसके कॉन्फ़िग में प्रति केज एक डिफ़ॉल्ट जीवनकाल सेट करें:```toml

~/.config/foxcage/tmp.toml — every @tmp launch auto-closes after 15 minutes

lifetime = "15m" private_browsing = true

`--lifetime` कमांड लाइन पर किसी भी कॉन्फ़िग मान से अधिक प्राथमिकता रखता है।

पूर्ण इमेज पुनर्निर्माण को बल दें (Firefox और सभी सिस्टम पैकेज पुनः डाउनलोड होते हैं):```sh
./foxcage --rebuild

एक चालू कंटेनर उसी इमेज को बनाए रखता है जिसके साथ उसे शुरू किया गया था, भले ही foxcage इमेज टैग को पुनर्निर्मित कर दे। यदि आप किसी केज में एक टैब खोलने का प्रयास करते हैं जिसकी इमेज को तब से अद्यतन किया गया है (--rebuild, एक Firefox अद्यतन, या निर्धारित पुनर्निर्माण द्वारा), foxcage एक त्रुटि के साथ मना कर देता है (जो डेस्कटॉप सूचना के रूप में भी दिखाई देती है) और आपसे Firefox को बंद करके पुनः लॉन्च करने के लिए कहता है — जो वर्तमान इमेज पर एक नया कंटेनर शुरू करता है। --rebuild के तहत एक सक्रिय केज के साथ, foxcage पहले ही चेतावनी देता है, निर्माण करता है, फिर वही जाँच लागू करता है।

अद्यतन

foxcage प्रत्येक लॉन्च पर नए ब्राउज़र रिलीज़ की जाँच करता है — Firefox के लिए Mozilla की रिलीज़ API, LibreWolf के लिए GitLab का रिलीज़ एंडपॉइंट। यदि कोई अद्यतन उपलब्ध है, तो कंटेनर इमेज स्वचालित रूप से पुनर्निर्मित की जाती है। इमेज को समय-समय पर (डिफ़ॉल्ट रूप से हर 7 दिन में) भी पुनर्निर्मित किया जाता है ताकि Debian सुरक्षा अद्यतन प्राप्त किए जा सकें। ब्राउज़र का अंतर्निहित स्वतः-अद्यतनकर्ता अक्षम कर दिया गया है क्योंकि अद्यतन इमेज स्तर पर संभाले जाते हैं।

यदि अद्यतन जाँच विफल हो जाती है (कोई नेटवर्क नहीं, API टाइमआउट), एक चेतावनी मुद्रित होती है और मौजूदा इमेज का उपयोग किया जाता है — आप हमेशा ब्राउज़ कर सकते हैं।

अद्यतन आवृत्ति (cadence) कॉन्फ़िग के शीर्ष स्तर पर रहती है; संस्करण और चैनल पिनिंग प्रति-फोर्क अनुभाग में रहती है:```toml rebuild_days = 14 # rebuild for base-image updates every 14 days (0 to disable)

[firefox] channel = "beta" # track the beta channel instead of stable (firefox only) version = "149" # pin to Firefox 149.x (latest patch release)

**एक ESR संस्करण को पिन करने के लिए चैनल की भी आवश्यकता होती है।** Mozilla का संस्करण सूचकांक ESR रिलीज़ को उनके डाउनलोड में मौजूद `esr` प्रत्यय के बिना सूचीबद्ध करता है, इसलिए डिफ़ॉल्ट चैनल पर एक साधारण `version = "140"` एक ऐसे रिलीज़ को संदर्भित करता है जो मौजूद नहीं है। दोनों सेट करें:```toml
[firefox]
channel = "esr"
version = "140"        # → 140.13.0esr

ऐसा पिन जो किसी रिलीज़ से मेल नहीं खाता, अब चुपचाप नवीनतम रिलीज़ पर वापस गिरने के बजाय पिन के नाम के साथ एक त्रुटि दिखाता है। Mozilla के API तक पहुँचने में अस्थायी विफलता अभी भी चेतावनी देती है और मौजूदा छवि के साथ आगे बढ़ती है, इसलिए अस्थिर नेटवर्क कभी भी स्टार्टअप को अवरुद्ध नहीं करता।

प्रत्यय वाले पिन पूर्णतः योग्य होने चाहिए — "140.13.0esr" और "150.0b9" काम करते हैं, "140esr" और "150b9" कॉन्फ़िग लोड के समय अस्वीकार कर दिए जाते हैं क्योंकि कोई भी रिलीज़ उनसे कभी मेल नहीं खा सकती। यही बात LibreWolf रिवीज़न पर भी लागू होती है: "146.0.1-1" काम करता है, "146-1" नहीं।

तुरंत पूर्ण पुनर्निर्माण को बाध्य करने के लिए: ./foxcage --rebuild

निरस्त हस्ताक्षर कुंजियाँ

foxcage उस ब्राउज़र बिल्ड को स्थापित करने से इनकार करता है जिसके हस्ताक्षर उस साइनिंग सबकी द्वारा बनाए गए हों जिसे अपस्ट्रीम प्रोजेक्ट ने समझौता (RFC 4880 निरस्तीकरण कारण 0x02) के रूप में निरस्त कर दिया है। gpg --verify यह अपने आप नहीं करता: यह चेतावनी मुद्रित करता है और 0 से बाहर निकलता है, इसलिए अतिरिक्त जाँच के बिना एक लीक हुई हस्ताक्षर कुंजी अभी भी छेड़छाड़ किए गए डाउनलोड को प्रमाणित कर सकती है।

एक इनकार कुछ इस तरह दिखता है, और स्थापित करने के बजाय बिल्ड को विफल कर देता है:``` foxcage: REFUSING /tmp/SHA512SUMS - signed by 09BEED63F3462A2DFFAB3B875ECB6497C1A20256, which its owner revoked as compromised. This build cannot be trusted; wait for upstream to re-sign this release with a current key.

कॉन्फ़िगर करने के लिए कुछ भी नहीं है और कोई ओवरराइड नहीं है। यदि आपको यह मिलता है, तो समाधान अपस्ट्रीम का है: या तो वर्तमान कुंजी से हस्ताक्षरित रिलीज़ को पिन करें, या प्रभावित रिलीज़ के पुनः हस्ताक्षरित होने की प्रतीक्षा करें।

सामान्य कुंजी रोटेशन को अलग तरीके से व्यवहार किया जाता है। सुपरसीडेड, रिटायर्ड, या बिना किसी कारण के रद्द की गई सबकुंजी, रद्दीकरण से *पहले* किए गए हस्ताक्षरों को अमान्य नहीं करती है, इसलिए वे रिलीज़ चेतावनी के साथ इंस्टॉल होती हैं। किसी भी रद्दीकरण के *बाद* की तारीख वाला हस्ताक्षर, कारण चाहे जो भी बताया गया हो, अस्वीकार कर दिया जाता है।

**मोज़िला का अगस्त 2026 कुंजी रोटेशन।** मोज़िला ने एक निजी GitHub रिपॉज़िटरी में एक अनएन्क्रिप्टेड प्रतिलिपि प्रतिबद्ध किए जाने के बाद 2026-08-06 को हस्ताक्षर सबकुंजी `09BEED63…C1A20256` को रद्द कर दिया, और उसे `827E6586…76767AA3` से बदल दिया। पुरानी सबकुंजी से हस्ताक्षरित Firefox रिलीज़ — 2025-03-13 और 2026-08-06 के बीच की सभी चीज़ें, जिसमें लिखने के समय वर्तमान ESR (`140.13.0esr`) और उस विंडो में कोई भी `version` पिन शामिल है — उपरोक्त जाँच द्वारा अस्वीकार कर दी जाती हैं। रिलीज़ और बीटा चैनल प्रभावित नहीं हैं। foxcage कुंजियाँ `keys.openpgp.org` से प्राप्त करता है, न कि `keyserver.ubuntu.com` से, क्योंकि बाद वाला रोटेशन के कई दिनों बाद तक न तो प्रतिस्थापन सबकुंजी और न ही रद्दीकरण प्रदान करता था; एक पुराना keyserver बिल्ड को सीधे तोड़ने के साथ-साथ रद्दीकरण जाँच को चुपचाप एक no-op में बदल देगा।

### Firefox फ़ोर्क्स (LibreWolf)

foxcage अपस्ट्रीम Firefox के स्थान पर एक गोपनीयता-केंद्रित Firefox फ़ोर्क चला सकता है:```toml
fork = "librewolf"         # default is "firefox"

[librewolf]
version = "146.0.1-1"      # optional pin; partial pins ("146", "146.0.1") also work

या CLI के माध्यम से प्रति-लॉन्च:```sh foxcage @tmp --fork librewolf https://example.com

**LibreWolf**: गोपनीयता-सुदृढ़ Firefox fork — डिफ़ॉल्ट रूप से सख्त ट्रैकिंग सुरक्षा, DoH, RFP, टेलीमेट्री बंद। GitLab से हस्ताक्षरित Linux tarball (`librewolf-community/browser/bsys6`), LibreWolf अनुरक्षकों की कुंजी `662E 3CDD 6FE3 2900 2D0C A5BB 4033 9DD8 2B12 EF16` के विरुद्ध GPG-सत्यापित, एक सहयोगी `.sha256sum` क्रॉस-चेक के साथ, Firefox के समान [निरस्तीकरण नियमों](#revoked-signing-keys) के अधीन। LibreWolf का बंडल किया गया `librewolf.cfg` संरक्षित रहता है; foxcage ओवरराइट करने के बजाय उसके ऊपर अपनी खुद की prefs जोड़ता है। अनुरक्षकों ने 2026-04-25 को बिना कोई कारण बताए अपनी हस्ताक्षरण उप-कुंजी घुमाई; वर्तमान tarball उस तिथि से पहले हस्ताक्षरित किए गए थे, इसलिए वे अस्वीकार किए जाने के बजाय चेतावनी के साथ इंस्टॉल होते हैं।

**Channel केवल Firefox के लिए है**: जब `fork` `"firefox"` के अलावा कुछ भी हो, तो `firefox.channel = "beta" | "esr"` अस्वीकार कर दिया जाता है। LibreWolf का एक ही रिलीज़ ट्रैक है।

`fork` स्विच करने से (config या `--fork` के माध्यम से) Containerfile हैश बदल जाता है, जो अगले लॉन्च पर rebuild ट्रिगर करता है — किसी मैनुअल `--rebuild` की आवश्यकता नहीं।

#### प्रोफ़ाइल संगतता

> **प्रत्येक fork के लिए एक समर्पित प्रोफ़ाइल उपयोग करें।** सबसे सुरक्षित डिफ़ॉल्ट यह है कि foxcage को अपनी स्वयं की प्रोफ़ाइल बनाने दें (config से `profile` हटाएँ), या `profile` को ऐसी निर्देशिका पर इंगित करें जिसे आप होस्ट से भी नहीं खोलते।

- **LibreWolf**: *आम तौर पर* अपने होस्ट Firefox प्रोफ़ाइल के साथ साझा करना ठीक है — LibreWolf Firefox संस्करणों को कुछ दिनों के भीतर ट्रैक करता है, इसलिए `compatibility.ini` स्कीमा संघर्ष दुर्लभ हैं। जोखिम: (1) केवल अनुक्रमिक उपयोग सुरक्षित है (Firefox की लॉक फ़ाइल समवर्ती खोलने से रोकती है); (2) Firefox स्थिर रिलीज़ के बाद के छोटे समय-खिड़की में, पहले Firefox और फिर LibreWolf चलाने से "एक नए संस्करण द्वारा उपयोग किया गया" माइग्रेशन डायलॉग ट्रिगर हो सकता है; (3) LibreWolf द्वारा हटाई गई सुविधाएँ (Sync, Pocket, Mozilla account) चुपचाप काम नहीं करतीं लेकिन डेटा को दूषित नहीं करतीं।

### नामित cages

अपने स्वयं के config और Firefox प्रोफ़ाइल के साथ अलग-अलग sandboxed इंस्टेंस चलाएँ:```sh
./foxcage @work

यह ~/.config/foxcage/work.toml को लोड करता है और एक अलग इमेज (foxcage-work), कंटेनर (foxcage-work), और वॉल्यूम (foxcage-work-profile) का उपयोग करता है। नामित केजों के लिए कॉन्फ़िग फ़ाइल का मौजूद होना आवश्यक है। केज के नामों में केवल अक्षर, अंक, हाइफ़न और अंडरस्कोर हो सकते हैं।

कॉन्फ़िगरेशन

कॉन्फ़िग फ़ाइलें $XDG_CONFIG_HOME/foxcage/ में रहती हैं (डिफ़ॉल्ट ~/.config/foxcage/ है)।

  • config.toml — डिफ़ॉल्ट केज (वैकल्पिक, इसके बिना उचित डिफ़ॉल्ट)
  • <name>.toml — नामित केज, @<name> के साथ लोड किया जाता है (आवश्यक)

अज्ञात कॉन्फ़िग कुंजियों को त्रुटि के साथ अस्वीकार कर दिया जाता है। डिफ़ॉल्ट के साथ सभी उपलब्ध विकल्पों के लिए config.toml.example देखें।

उदाहरण config.toml```toml

Bind-mount a host Firefox profile directory into the cage

profile = "~/.mozilla/firefox/xxxxxxxx.default-release"

Allow downloading files to ~/Downloads

downloads_dir = "~/Downloads"

Shared memory size for Firefox IPC (default: 256m)

shm_size = "256m"

Pass through webcam devices (/dev/video*)

webcam = true

Pass through host CUPS socket for locally-connected printers (e.g. USB)

local_printers = true

Pass through FIDO2/U2F security key devices (/dev/hidraw*)

security_keys = true

Always open Firefox in private browsing mode

private_browsing = true

Auto-close the cage after a duration ( with unit s, m, or h)

lifetime = "30m"

Accent colour for the menu-bar label. Named cages get a colour derived

from the name automatically; set this to override it.

color = "#4a90e2"

Browser fork: "firefox" (default) or "librewolf"

fork = "librewolf"

Full image rebuild interval in days for base-image updates (default: 7, 0 to disable)

rebuild_days = 7

[firefox]

Firefox release channel: "release" (default), "beta", "esr".

Only valid when fork = "firefox".

channel = "release"

Pin to a specific Firefox version (overrides channel).

Partial versions like "149" or "149.0" resolve to the latest patch release.

Suffixed versions must be fully qualified ("140.13.0esr", "150.0b9"); to

follow the ESR line by major version, pair a numeric pin with

channel = "esr" above.

version = "149.0.2"

[librewolf]

Pin to a specific LibreWolf version. Tags are "-",

e.g. "146.0.1-1". Partial pins like "146" or "146.0.1" also work.

version = "146.0.1-1"

[network]

"host" for full host networking (needed if the cage has to reach services

on the host's localhost), or omit for isolated pasta (default)

mode = "host"

DNS server (isolated mode only, default: host DNS)

dns = "1.1.1.1"

Disable IPv6 in the cage (isolated mode only)

ipv4_only = true

[mounts]

Additional bind mounts into the container. Supported forms:

"~/Documents" — same path in container

"/Documents:/Documents" — ~ expanded on both sides

"~/Documents:/home/user/Documents" — explicit container path

Append :ro for read-only, e.g. "~/Documents:ro"

nosuid,noexec are always enforced on bind mounts; an explicit "exec" or

"suid" is rejected rather than silently dropped.

Host paths must be absolute or start with "~/".

bind = [ "~/Documents:ro", ]

[init]

Commands to run at image build time (as root). Changes trigger a rebuild.

build = ["apt-get update && apt-get install -y --no-install-recommends vim"]

Commands to run at container startup as root, before Firefox.

root = ["chown user:user /some/path"]

Commands to run at container startup as your user, before Firefox.

user = ["mkdir -p ~/custom-dir"]

### होस्ट फ़ायरफ़ॉक्स प्रोफ़ाइल

केज के साथ होस्ट की फ़ायरफ़ॉक्स प्रोफ़ाइल साझा करने के लिए, `profile` को प्रोफ़ाइल निर्देशिका पर सेट करें। होस्ट पर फ़ायरफ़ॉक्स में `about:profiles` पर जाकर अपना प्रोफ़ाइल पथ खोजें — या यदि आप चाहते हैं कि केज एक साफ प्रोफ़ाइल के साथ शुरू हो जो होस्ट पर बनी रहे, तो बस एक नई खाली निर्देशिका की ओर इंगित करें।```toml
profile = "~/.mozilla/firefox/xxxxxxxx.default-release"

केवल यह एक निर्देशिका cage में bind-mount की गई है। ~/.mozilla/firefox/ के अंतर्गत सहोदर प्रोफ़ाइलें और profiles.ini रजिस्ट्री उजागर नहीं होती हैं — एक compromised cage उनके साथ छेड़छाड़ नहीं कर सकता।

यदि profile सेट नहीं है, तो एक named Podman volume Firefox प्रोफ़ाइल को इसके बजाय संग्रहीत करता है (नीचे "क्या स्थायी रहता है" देखें)। यदि वही प्रोफ़ाइल पहले से host पर Firefox में खुली है, तो Firefox का प्रति-प्रोफ़ाइल लॉक फ़ाइल टकराव का कारण बनेगा — प्रति cage एक समर्पित प्रोफ़ाइल का उपयोग करें।

Networking

डिफ़ॉल्ट रूप से, container pasta का उपयोग करता है, जिसमें host loopback अवरुद्ध रहता है और host DNS का उपयोग होता है। pasta के लिए podman 4.4 या नया संस्करण आवश्यक है (यह podman 5.0 से रूटलेस डिफ़ॉल्ट रहा है)।

Host networking नेटवर्क अलगाव को पूरी तरह से हटा देता है। इसका उपयोग तब करें जब cage को host के localhost पर सेवाओं तक पहुँचने की आवश्यकता हो (जैसे स्थानीय dev सर्वर, 127.0.0.1 पर एक डेटाबेस):```toml [network] mode = "host"

`dns` को `mode = "host"` के साथ जोड़ा नहीं जा सकता — होस्ट नेटवर्किंग पहले से ही होस्ट के रिज़ॉल्वर का उपयोग करती है।

> **होस्ट मोड सिर्फ localhost से अधिक छोड़ता है।** यह केज को होस्ट के नेटवर्क नेमस्पेस में रखता है, और abstract यूनिक्स सॉकेट्स उस नेमस्पेस में स्कोप होते हैं, फाइलसिस्टम में नहीं। इसलिए होस्ट मोड में एक केज सीधे होस्ट पर abstract-address सॉकेट्स तक पहुँच सकता है — जिसमें Xwayland का `@/tmp/.X11-unix/X0` शामिल है यदि आप X11 या Xwayland चलाते हैं (input logging, भले ही foxcage केवल Wayland-आधारित है), और `unix:abstract=…` के साथ कॉन्फ़िगर किया गया session bus, जो फ़िल्टर किए गए D-Bus प्रॉक्सी को बायपास कर देगा। यह नेटवर्क स्टैक को साझा करने में अंतर्निहित है, कोई ऐसी चीज़ नहीं जिसे foxcage फ़िल्टर कर सके। होस्ट मोड का उपयोग तब करें जब आपको इसकी आवश्यकता हो, और एक नामित केज को प्राथमिकता दें जिसे आप केवल उसी उद्देश्य के लिए लॉन्च करते हैं।

**केवल IPv4 वाले केज** IPv6 को पूरी तरह से अक्षम कर देते हैं:```toml
[network]
ipv4_only = true

या प्रति लॉन्च --ipv4-only फ्लैग के साथ (लघु रूप -4, जैसे ssh/curl/pasta में):```sh ./foxcage @tmp -4 https://example.com

यह पास्ता को केवल IPv4 मोड (`-4`) में चलाता है, इसलिए कंटेनर के पास कोई भी IPv6 स्टैक नहीं होता है, और इसके अतिरिक्त Firefox में `network.dns.disableIPv6` सेट करता है ताकि यह AAAA रिकॉर्ड्स को हल न करे — यह महत्वपूर्ण है जब DoH सक्षम हो, क्योंकि DoH उत्तर कंटेनर के रिज़ॉल्वर को बायपास करते हैं। `ipv4_only` को `mode = "host"` के साथ नहीं जोड़ा जा सकता है — होस्ट नेटवर्किंग सीधे होस्ट के नेटवर्क स्टैक का उपयोग करती है, इसलिए इसके बजाय होस्ट पर IPv6 को अक्षम करें।

### Init कमांड्स

`[init]` के माध्यम से बिल्ड समय या कंटेनर स्टार्टअप पर कस्टम कमांड चलाएँ:

- **`build`** — इमेज बिल्ड समय पर रूट के रूप में चलता है। पैकेज इंस्टॉल करने या अन्य धीमी सेटअप के लिए उपयोग करें। बिल्ड कमांड में बदलाव स्वचालित रूप से इमेज रीबिल्ड को ट्रिगर करते हैं।
- **`root`** — कंटेनर स्टार्टअप पर रूट के रूप में, Firefox से पहले चलता है। त्वरित रनटाइम रूट कार्यों (अनुमतियाँ समायोजित करना, कॉन्फ़िग फ़ाइलें लिखना) के लिए उपयोग करें।
- **`user`** — कंटेनर स्टार्टअप पर आपके उपयोगकर्ता के रूप में, Firefox से पहले चलता है। निर्देशिकाएँ बनाने, उपयोगकर्ता-स्तरीय स्थिति सेट करने के लिए उपयोग करें।```toml
[init]
build = [
    "apt-get update && apt-get install -y --no-install-recommends fonts-noto-cjk",
    "rm -rf /var/lib/apt/lists/*",
]
root = ["chmod 777 /tmp/shared"]
user = ["mkdir -p ~/workspace"]

ये तीनों कुंजियाँ शेल कमांड स्ट्रिंग्स की सूचियाँ हैं। यदि कोई भी कमांड विफल हो जाए, तो कंटेनर Firefox शुरू किए बिना ही बाहर निकल जाता है।

सुरक्षा नोट: जब init.root सेट होता है, तो कंटेनर root के रूप में शुरू होता है, जिसमें डिफ़ॉल्ट CAP_SYS_CHROOT के अतिरिक्त CAP_SETUID और CAP_SETGID जोड़े जाते हैं, ताकि यह नियमित उपयोगकर्ता पर वापस आ सके। ये क्षमताएँ केवल root init चरण के दौरान धारित की जाती हैं — विशेषाधिकार हटाने के बाद, नियमित-उपयोगकर्ता प्रक्रिया के पास कोई अतिरिक्त क्षमता नहीं होती। init.root के बिना, कंटेनर डिफ़ॉल्ट न्यूनतम क्षमता सेट के साथ चलता है।

क्या स्थायी रहता है

बिना किसी कॉन्फ़िगरेशन के, एक नामित Podman वॉल्यूम Firefox प्रोफ़ाइल (बुकमार्क, सेटिंग्स, एक्सटेंशन, Widevine DRM प्लगइन) संग्रहीत करता है। बाकी सब कुछ अस्थायी होता है।

  • डिफ़ॉल्ट केज: foxcage-profile
  • नामित केज: foxcage-<name>-profile

नई शुरुआत करने के लिए, वॉल्यूम हटाएँ:```sh podman volume rm foxcage-profile

यदि `profile` सेट है, तो होस्ट निर्देशिका सीधे bind-mounted होती है और कोई volume नहीं बनता।

### Disk usage

प्रत्येक cage image लगभग 1 GB का होता है। एक rebuild image को retag करता है और पिछले वाले को अनटैग्ड `<none>` प्रविष्टि के रूप में छोड़ देता है, इसलिए foxcage प्रत्येक सफल build के बाद उस image को हटा देता है जिसे उसने अभी-अभी विस्थापित किया है। यह केवल उस विशिष्ट image को हटाता है, और कभी भी उस image को नहीं जिसे कोई चालू cage अभी भी उपयोग कर रहा है।

इस व्यवहार के अस्तित्व में आने से पहले अनाथ (orphaned) हुई images को पूर्वव्यापी रूप से साफ नहीं किया जाता। उन्हें पुनः प्राप्त करने के लिए:```sh
podman images --filter dangling=true    # review first
podman image prune                      # then remove

फ़ायरफ़ॉक्स अपडेट प्रत्येक लॉन्च पर स्वचालित रूप से पहचाने जाते हैं। पूर्ण पुनर्निर्माण को बाध्य करने के लिए (उदा. सिस्टम सुरक्षा अपडेट को तुरंत प्राप्त करने हेतु):```sh ./foxcage --rebuild

## थीमिंग

foxcage स्वचालित रूप से होस्ट से निम्नलिखित चीज़ों को पारित करता है, ताकि कंटेनर में Firefox एक मूल एप्लिकेशन की तरह दिखे और महसूस हो:

- **फ़ॉन्ट्स।** सिस्टम फ़ॉन्ट्स (`/usr/share/fonts`) और उपयोगकर्ता फ़ॉन्ट्स (`~/.local/share/fonts`) रीड-ओनली बाइंड-माउंट किए जाते हैं। `~/.config/fontconfig` से फ़ॉन्ट कॉन्फ़िगरेशन भी पारित किया जाता है।
- **GTK थीम और डार्क मोड।** `GTK_THEME` या `gsettings` के माध्यम से पता लगाया जाता है और कंटेनर में पारित किया जाता है। `~/.config/gtk-3.0` और `~/.config/gtk-4.0` से GTK कॉन्फ़िगरेशन रीड-ओनली बाइंड-माउंट होता है।
- **समय क्षेत्र (Timezone)।** होस्ट का समय क्षेत्र नाम (`TZ`, `/etc/localtime` सिमलिंक, या `/etc/timezone` से पता लगाया गया) कंटेनर में `TZ` के रूप में पारित किया जाता है, और `/etc/localtime` रीड-ओनली बाइंड-माउंट होता है। दोनों आवश्यक हैं: Firefox जावास्क्रिप्ट समय क्षेत्र को ज़ोन *नाम* से प्राप्त करता है, फ़ाइल सामग्री से नहीं — `TZ` के बिना, वेबसाइटें समय UTC में दिखाएँगी।
- **लोकेल।** `LANG` पारित किया जाता है। होस्ट का लोकेल निर्माण समय पर कंटेनर इमेज में उत्पन्न किया जाता है।

**केज लेबल।** Firefox मेन्यू बार "FoxCage" (या नामित केजों के लिए "FoxCage - नाम") प्रदर्शित करता है, ताकि आप एक नज़र में बता सकें कि आप एक कंटेनरीकृत सत्र में हैं। मेन्यू बार एंटरप्राइज़ नीति के माध्यम से हमेशा दृश्यमान रहता है।

कंटेनर में केवल Adwaita GTK थीम शामिल है। GNOME डेस्कटॉप पर यह बिना किसी अतिरिक्त सेटअप के काम करता है। KDE या अन्य डेस्कटॉप पर, यदि आपकी GTK थीम (जैसे Breeze) कंटेनर में स्थापित नहीं है, तो Firefox Adwaita पर वापस आ जाएगा। जब तक प्राथमिकता `gsettings` या `GTK_THEME` के माध्यम से सेट की गई है, डार्क मोड का पता लगाना फिर भी काम करता है।

## DRM (Netflix, Disney+, आदि)

Widevine DRM बिना किसी अतिरिक्त सेटअप के काम करता है। DRM-संरक्षित साइट की पहली यात्रा पर, Firefox स्वचालित रूप से Widevine CDM डाउनलोड करेगा। इसमें कुछ समय लग सकता है।

## होस्ट एकीकरण (हमेशा चालू)

foxcage Firefox को होस्ट के XDG Desktop Portal और नोटिफिकेशन डेमन तक पहुँच देने के लिए एक फ़िल्टर्ड D-Bus प्रॉक्सी का उपयोग करता है। ये सुविधाएँ सुरक्षित हैं क्योंकि सभी पहुँच उपयोगकर्ता-मध्यस्थ है — होस्ट मूल डायलॉग दिखाता है जिनके साथ आपको इंटरैक्ट करना होता है। एक समझौता किया गया ब्राउज़र चुपचाप होस्ट संसाधनों तक नहीं पहुँच सकता।

- **फ़ाइल अपलोड** — होस्ट का मूल फ़ाइल पिकर (आप चुनते हैं कि कौन सी फ़ाइलें साझा करनी हैं)
- **बाहरी लिंक** — `mailto:`, मैग्नेट लिंक, आदि होस्ट ऐप चूज़र के माध्यम से खुलते हैं
- **डेस्कटॉप नोटिफिकेशन** — होस्ट नोटिफिकेशन डेमन को अग्रेषित किए जाते हैं
- **स्क्रीन शेयरिंग** — पोर्टल स्क्रीन पिकर + PipeWire वीडियो स्ट्रीम (होस्ट पर PipeWire की आवश्यकता है)

## डिवाइस पास-थ्रू (ऑप्ट-इन)

ये होस्ट डिवाइसों को सीधे कंटेनर में पारित करते हैं और **डिफ़ॉल्ट रूप से बंद** होते हैं — उपरोक्त पोर्टल सुविधाओं के विपरीत, होस्ट-पक्ष पर कोई पुष्टि नहीं होती। एक समझौता किया गया ब्राउज़र चुपचाप हार्डवेयर का उपयोग कर सकता है।```toml
webcam = true          # /dev/video* — webcam for video calls
local_printers = true  # CUPS socket — USB printers (network printers work by default)
security_keys = true   # /dev/hidraw* — FIDO2/U2F hardware keys

अभी तक समर्थित नहीं

कुछ वेब प्लेटफ़ॉर्म सुविधाएँ होस्ट एकीकरण की कमी के कारण कंटेनर में काम नहीं करती हैं। इन्हें पारदर्शिता के लिए यहाँ सूचीबद्ध किया गया है।

ब्लूटूथ, USB, सीरियल और NFC. Web Bluetooth, WebUSB, Web Serial और WebNFC APIs के लिए डिवाइस एक्सेस और सिस्टम सेवाओं (BlueZ, udev) की आवश्यकता होती है, जो कंटेनर में उपलब्ध नहीं हैं।

गेमपैड और MIDI. Gamepad API को /dev/input/ एक्सेस चाहिए। Web MIDI को ALSA सीक्वेंसर एक्सेस चाहिए। इनमें से कोई भी पास-थ्रू नहीं किया गया है।

PWA इंस्टॉलेशन. Progressive Web Apps को कंटेनर के अंदर से होस्ट डेस्कटॉप पर इंस्टॉल नहीं किया जा सकता।

एक्सेसिबिलिटी. AT-SPI के माध्यम से स्क्रीन रीडर समर्थन अक्षम है (NO_AT_BRIDGE=1) — कंटेनर का होस्ट की एक्सेसिबिलिटी बस से कोई संबंध नहीं है। Web Speech API सिंथेसिस काम करती है: speech-dispatcher और espeak-ng इंजन कंटेनर में इंस्टॉल है और पहले उपयोग पर ऑटोस्पॉन होता है, ऑडियो साझा PulseAudio सॉकेट के माध्यम से रूट किया जाता है।

होस्ट कॉन्फ़िगरेशन

अनुशंसित: fuse-overlayfs के साथ ओवरले स्टोरेज

रूटलेस पॉडमैन डिफ़ॉल्ट रूप से vfs स्टोरेज ड्राइवर का उपयोग कर सकता है, जो ओवरले माउंट का उपयोग करने के बजाय पूरी इमेज परतों की प्रतिलिपि बनाता है। यह बिल्ड के बाद कंटेनर स्टार्टअप को बहुत धीमा बना देता है। इसे ठीक करने के लिए, fuse-overlayfs इंस्टॉल करें और निम्नलिखित को ~/.config/containers/storage.conf में जोड़ें:```toml [storage] driver = "overlay"

[storage.options.overlay] mount_program = "/usr/bin/fuse-overlayfs"

### foxcage को अपना डिफ़ॉल्ट ब्राउज़र बनाना

सबसे पहले, सुनिश्चित करें कि `foxcage` स्क्रिप्ट अपनी स्थायी जगह पर है (जैसे `~/bin/foxcage` या `/usr/local/bin/foxcage`)। इंस्टॉल कमांड स्क्रिप्ट का वर्तमान पथ `.desktop` फ़ाइल में दर्ज करता है, इसलिए बाद में इसे स्थानांतरित करने से लॉन्चर टूट जाएगा।

फिर चलाएँ:```sh
foxcage --install

यह एक .desktop फ़ाइल बनाता है जो स्क्रिप्ट के वर्तमान स्थान को इंगित करती है, फॉक्सकेज आइकन स्थापित करता है, और डेस्कटॉप और आइकन डेटाबेस को ताज़ा करता है। फिर FoxCage को आपके एप्लिकेशन मेनू में दिखना चाहिए।

foxcage को डिफ़ॉल्ट वेब ब्राउज़र के रूप में सेट करने के लिए ताकि अन्य एप्लिकेशन में क्लिक किए गए लिंक foxcage में खुलें:```sh xdg-settings set default-web-browser foxcage.desktop

यदि कोई cage पहले से चल रहा है, तो URLs मौजूदा ब्राउज़र में नए टैब के रूप में खुलते हैं।

पूर्ववत करने के लिए:```sh
foxcage --uninstall

StartupNotify=true .desktop फ़ाइल में सेट है, जो कंपोज़िटर को बताता है कि foxcage शुरू होने पर स्पिनर कर्सर दिखाए। जब इमेज बिल्ड की आवश्यकता होती है (जिसमें कई मिनट लग सकते हैं), foxcage एक डेस्कटॉप सूचना भेजता है ताकि आपको पता चले कि Firefox आ रहा है। कोई भी प्रारंभिक-निकास त्रुटि (कॉन्फ़िग टाइपो, लापता निर्भरता, गलत cage नाम) भी डेस्कटॉप सूचना के रूप में सामने आती है, ताकि डेस्कटॉप से लॉन्च किए गए उपयोगकर्ता तब खाली घूरते न रहें जब foxcage बिना किसी जुड़े टर्मिनल के विफल हो जाता है। दोनों को notify-send (Debian/Ubuntu पर libnotify-bin से) की आवश्यकता होती है — यदि यह इंस्टॉल नहीं है, तो सूचनाएं चुपचाप छोड़ दी जाती हैं और त्रुटि अभी भी stderr पर जाती है।

मैन्युअल सेटअप

यदि आप .desktop फ़ाइल को मैन्युअल रूप से बनाना पसंद करते हैं, तो ~/.local/share/applications/foxcage.desktop बनाएँ:```ini [Desktop Entry] Type=Application Name=FoxCage Comment=Firefox in a rootless Podman container Exec=/path/to/foxcage %u Icon=foxcage MimeType=text/html;x-scheme-handler/http;x-scheme-handler/https; Terminal=false Categories=Network;WebBrowser; StartupNotify=true StartupWMClass=foxcage

`/path/to/foxcage` को स्क्रिप्ट के वास्तविक पथ से बदलें। इसे पंजीकृत करें:```sh
update-desktop-database ~/.local/share/applications

परीक्षण चलाना

परीक्षण सूट pytest + pytest-cov का उपयोग करता है, जिन्हें requirements-dev.txt में केवल-डेव निर्भरताओं के रूप में घोषित किया गया है।``` pip install -r requirements-dev.txt pytest

परीक्षण पूरी तरह से हर्मेटिक हैं — कोई podman नहीं, कोई नेटवर्क नहीं, pytest के `tmp_path` के अलावा कोई वास्तविक फ़ाइलसिस्टम नहीं। टेस्ट सूट **100% लाइन और ब्रांच कवरेज** पर गेट करता है (`pytest.ini` और `.coveragerc` में कॉन्फ़िगर किया गया); कोई भी अनकवर्ड लाइन, या कंडीशनल का न लिया गया पक्ष, रन को विफल कर देता है। CI हर पुश पर `.gitlab-ci.yml` के माध्यम से टेस्ट सूट चलाता है।

## आभार

यह प्रोजेक्ट Mike Cardwell द्वारा विकसित किया गया था, [Claude Code](https://claude.ai/claude-code), Anthropic के AI कोडिंग टूल की सहायता से।

## मेरे काम का समर्थन/सराहना करें

- [Bitcoin](bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1): 1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1
- [Paypal](https://www.paypal.me/grepular)
- [Patreon](https://patreon.com/grepular)

श्रेणियाँ