
टीमों के लिए एक आधुनिक git-आधारित age-एन्क्रिप्टेड सीक्रेट्स मैनेजर।
cottage एक GitOps टूल है जो टीमों के लिए git रिपॉजिटरी में age-encrypted रहस्यों (secrets) को प्रबंधित करने हेतु बनाया गया है।
यह रहस्यों को एन्क्रिप्ट/डिक्रिप्ट करने, प्राप्तकर्ताओं (recipients) को प्रबंधित करने और रहस्यों को रिपॉजिटरी से बाहर रखने के लिए एक सरल वर्कफ़्लो प्रदान करता है, साथ ही VCS के माध्यम से आसान साझाकरण की अनुमति देता है। cottage एन्क्रिप्टेड रहस्यों के संपादित (redacted) पूर्वावलोकन भी उत्पन्न करता है ताकि बेहतर दृश्यता मिल सके, और यह स्थायी (persistent) तथा अस्थायी (temporary) दोनों प्रकार के डिक्रिप्शन वर्कफ़्लो का समर्थन करता है, साथ ही यह सुनिश्चित करता है कि रहस्य कभी भी सादे पाठ (plaintext) में कमिट न हों।

.gitignore को स्वचालित रूप से अपडेट करता है।ctg diff स्थानीय रूप से संशोधित रहस्यों और ट्रैक किए गए एन्क्रिप्टेड समकक्षों के बीच का अंतर दिखाता है।ctg decrypt/sync डिक्रिप्टेड रहस्यों को डिस्क पर रखता है।ctg run (शॉर्टकट ctgx) और ctg edit ऑपरेशन से पहले रहस्यों को डिक्रिप्ट करते हैं, यदि वे पहले से डिस्क पर मौजूद हों तो उन्हें वहीं रखते हैं या यदि वे पहले मौजूद नहीं थे तो बाद में स्वचालित रूप से साफ़ कर देते हैं।ctg encrypt --clean, , और यह सुनिश्चित करते हैं कि डिक्रिप्टेड फ़ाइलें डिस्क से साफ़ कर दी जाएँ, भले ही वे पहले मौजूद रही हों।# rust: cargo-binstall/cargo
cargo binstall --locked cottage
cargo install --locked cottage
# python: pip/uv/uvx
pip install cottage
uv pip install cottage
uvx --from cottage ctg --version
# node: yarn/pnpm/npx
yarn global add @sayanarijit/cottage
pnpm add -g @sayanarijit/cottage
npx -p @sayanarijit/cottage ctg --version
Docker छवियों के रूप में भी उपलब्ध:
# Docker
docker run --rm -v $PWD:/app sayanarijit/cottage --version
# Podman
podman run --rm -v $PWD:/app quay.io/sayanarijit/cottage --version
या GitHub से नवीनतम रिलीज़ डाउनलोड करें।
ctg स्थापित करने, Copilot सुरक्षा हुक जोड़ने, Explorer से फ़ाइलें एन्क्रिप्ट करने और .cott.age फ़ाइलों को संपादक वर्कफ़्लो के माध्यम से खोलने के लिए Cottage VS Code एक्सटेंशन का उपयोग करें।
इसे Visual Studio Marketplace से स्थापित करें, या vscode-plugin-cottage से स्थानीय रूप से बनाकर स्थापित करें।
VSX फ़ाइल डाउनलोड करें और इसे अपने Cursor या Eclipse IDE में स्थापित करें। यह VS Code एक्सटेंशन के समान कार्य करता है।
Vim या Neovim से रहस्यों को एन्क्रिप्ट/डिक्रिप्ट करने के लिए cottage.vim प्लगइन का उपयोग करें।
नीचे दिए गए सभी एकीकरण AI एजेंटों को सीधे ctg/ctgx चलाने और रहस्य फ़ाइलों को देखने या संपादित करने से रोकते हैं: .cottage/ के अंदर की कोई भी चीज़, कोई भी *.cott.* फ़ाइल (एन्क्रिप्टेड *.cott.age ब्लॉब और संपादित *.cott.toml पूर्वावलोकन), और कोई भी डिक्रिप्टेड फ़ाइल जिसका *.cott.age समकक्ष अभी भी डिस्क पर मौजूद है।
यदि आप Claude Code का उपयोग कर रहे हैं, तो रहस्यों वाली अपनी रिपॉजिटरी में .claude/settings.json और .claude/hooks/deny-secrets.py जोड़ें ताकि Claude Code सत्र रहस्यों को सुरक्षित रूप से संभाल सकें, या claude-plugin-cottage प्लगइन स्थापित करें।
यदि आप VS Code में GitHub Copilot का उपयोग कर रहे हैं, तो रहस्यों वाली अपनी रिपॉजिटरी में .github/hooks/ctg-policy.json और .github/hooks/scripts/deny_ctg_command.py जोड़ें ताकि Copilot सत्र डिक्रिप्टेड फ़ाइलों को साफ़ करें, सीधे ctg शेल कमांड को ब्लॉक करें, और रहस्य फ़ाइलों तक पहुँच को ब्लॉक करें, या इसे VS Code से सेट करने के लिए vscode-plugin-cottage एक्सटेंशन स्थापित करें।
VS Code .claude/settings.json हुक परिभाषाओं को भी लोड करता है। यदि आप एक ही रिपॉजिटरी में Claude और Copilot दोनों हुक फ़ाइलें रखते हैं, तो सुनिश्चित करें कि आप गलती से एक ही सफ़ाई हुक को दो बार न चलाएँ।
यदि आप Codex का उपयोग कर रहे हैं, तो रहस्यों वाली अपनी रिपॉजिटरी में .codex/hooks.json और .codex/hooks/deny-ctg.py जोड़ें ताकि Codex सत्र रहस्यों को सुरक्षित रूप से संभाल सकें, या codex-plugin-cottage प्लगइन स्थापित करें।
Codex को स्थानीय हुक चलाने से पहले उनकी समीक्षा करने की आवश्यकता होती है। फ़ाइलें जोड़ने के बाद, रिपॉजिटरी में Codex प्रारंभ करें और प्रोजेक्ट हुक की समीक्षा और विश्वास करने के लिए /hooks का उपयोग करें।
यदि आप Antigravity (agy) का उपयोग कर रहे हैं, तो रहस्यों वाली अपनी रिपॉजिटरी में .agents/hooks.json और .agents/scripts/deny-ctg.py जोड़ें ताकि Antigravity सत्र रहस्यों को सुरक्षित रूप से संभाल सकें, या agy-plugin-cottage प्लगइन स्थापित करें।
यदि आप Cursor का उपयोग कर रहे हैं, तो रहस्यों वाली अपनी रिपॉजिटरी में .cursor/hooks.json, .cursor/hooks/deny-ctg.py, .cursor/hooks/deny-read-secrets.py, .cursor/rules/deny-ctg.mdc, और .cursorignore जोड़ें ताकि Cursor सत्र रहस्यों को सुरक्षित रूप से संभाल सकें।
Cursor को पहले हुक सक्षम करने की आवश्यकता होती है। Cursor Settings > Hooks खोलें और हुक सक्षम करें, फिर एजेंट सत्र को पुनः आरंभ करें ताकि प्रोजेक्ट हुक प्रभावी हों। .cursorignore अतिरिक्त रूप से रहस्य फ़ाइलों को Cursor की अनुक्रमणिका और एजेंट के संदर्भ से बाहर रखता है।
प्रोजेक्ट आरंभ करें:
mkdir project && cd project
git init # वैकल्पिक, cottage git के साथ बेहतर काम करता है लेकिन यह आवश्यक नहीं है
ctg init # .cottage निर्देशिका और आवश्यक फ़ाइलें सेट करता है
tree -a
# .
# ├ .cottage/ <- `ctg init` द्वारा स्वचालित रूप से उत्पन्न
# │ ├ identity <- आपकी निजी कुंजी, इसे सुरक्षित रखें। इसे वैश्विक रूप से उपयोग करने के लिए `~/.config/cottage/identity` पर ले जाएँ, या इसे अपनी मौजूदा निजी कुंजियों में से किसी एक के सॉफ्ट लिंक से बदलें।
# │ └ recipients/ <- यह वह जगह है जहाँ आपकी टीम सभी प्राप्तकर्ताओं की सार्वजनिक कुंजियाँ रखती है।
# │ └ sayanarijit <- आपकी सार्वजनिक कुंजी। इसे कमिट करें। मौजूदा सार्वजनिक कुंजी का उपयोग करने के लिए, उस कुंजी को यहाँ कॉपी करें (सॉफ्टलिंक नहीं)।
# ├ .git/...
# ├ .gitattributes <- git diff को प्रदूषित करने से बचने के लिए `*.cott.age binary linguist-generated filter=cottage-encrypted -diff` जोड़ा गया
# └ .gitignore <- स्पष्ट कारणों से `/.cottage/identity` जोड़ा गया
# आप cottage द्वारा किए गए सब कुछ साफ़ करने के लिए किसी भी समय `ctg clean --all` चला सकते हैं।
एक रहस्य बनाएँ या संपादित करें:
# `ctg edit` $EDITOR में खोलने से पहले फ़ाइल को डिक्रिप्ट करता है और सहेजने पर पुनः एन्क्रिप्ट करता है।
# यदि डिक्रिप्टेड फ़ाइल `ctg edit` चलाने से पहले डिस्क पर मौजूद नहीं थी, तो इसे बाद में साफ़ कर दिया जाता है।
# यदि यह पहले से मौजूद थी, तो इसे डिस्क पर रखा जाता है।
ctg edit secret.yml
# `ctg edit` या `ctg encrypt` के साथ `--clean` का उपयोग करें ताकि यह सुनिश्चित हो सके कि डिक्रिप्टेड फ़ाइलें हटा दी जाएँ, भले ही वे पहले मौजूद हों
ctg edit secret.yml --clean # $EDITOR में खोलता है, सहेजने पर एन्क्रिप्ट करता है, और साफ़ करता है
ctg encrypt secret.yml --clean # secret.yml को एन्क्रिप्ट करता है और साफ़ करता है
# encrypt secret.yml
# into secret.yml.cott.age
# edit secret.yml.cott.toml
# edit .gitignore
# delete secret.yml
डिक्रिप्टेड रहस्यों के साथ एक कमांड चलाएँ:
cat secret.yml
# cat: secret.yml: No such file or directory
# `ctg run` (या शॉर्टकट `ctgx`) कमांड चलाने से पहले रहस्यों को डिक्रिप्ट करता है।
# यदि डिक्रिप्टेड फ़ाइलें पहले से डिस्क पर मौजूद नहीं थीं, तो कमांड समाप्त होने के बाद उन्हें स्वचालित रूप से साफ़ कर दिया जाता है।
# यदि वे पहले से मौजूद थीं, तो उन्हें डिस्क पर रखा जाता है।
ctg run -- kubectl apply -f secret.yml # secret.yml.cott.age को secret.yml में डिक्रिप्ट करता है और कमांड चलाता है
ctg run -- kubectl apply -f secret.yml.cott.age # पथ तर्क को डिक्रिप्टेड फ़ाइल पथ से भी बदल देता है
ctg run -- kubectl apply -f . # . में सभी .cott.age फ़ाइलों को डिक्रिप्ट करता है और कमांड चलाता है
ctg run -- ./deploy.sh # रिपॉजिटरी में सभी .cott.age फ़ाइलों को डिक्रिप्ट करता है और कमांड चलाता है
cat secret.yml
# cat: secret.yml: No such file or directory
# यह सुनिश्चित करने के लिए `--clean` का उपयोग करें कि डिक्रिप्टेड फ़ाइलें साफ़ कर दी जाएँ, भले ही वे पहले मौजूद हों
ctg run --clean ./deploy.sh
या शॉर्टकट का उपयोग करें:
ctgx -- ./deploy.sh
ctgx --clean -- ./deploy.sh
रहस्यों को पर्यावरण चर के रूप में इंजेक्ट करके एक कमांड चलाएँ, बिना डिस्क पर लिखे:
ctg env -- ./deploy.sh # .env.cott.age (डिफ़ॉल्ट) से रहस्यों को डिस्क पर लिखे बिना निर्यात करता है, फिर deploy.sh चलाता है
ctg env -F .env.prod.cott.age -- ./deploy.sh # .env.cott.age के बजाय .env.prod.cott.age से निर्यात करता है
ctg env -F secrets.json.cott.age -- printenv COTTAGE_SECRET # गैर-dotenv फ़ाइलों का भी समर्थन करता है।
अपने रहस्यों को टीम के सदस्यों के साथ साझा करने के लिए, बस git रिपॉजिटरी में पुश करें।
git add .
git commit -m "Add secret.yml"
git push origin main
अपने सहकर्मियों से कहें कि वे अपनी सार्वजनिक कुंजियाँ .cottage/recipients में जोड़ें और परिवर्तन पुश करें। फिर आप उनके लिए रहस्यों को खींच और पुनः एन्क्रिप्ट कर सकते हैं।
git pull origin main
ctg decrypt --skip-verify-recipients # पुनः एन्क्रिप्शन के लिए लापता रहस्यों को डिक्रिप्ट करें
ctg encrypt # सभी रहस्यों को पुनः एन्क्रिप्ट करें
# encrypt secret.yml
# into secret.yml.cott.age
# edit secret.yml.cott.toml
ctg clean # वैकल्पिक
# delete secret.yml
# परिवर्तनों की समीक्षा करें, कमिट करें और पुश करें
git add .
git commit -m "Add new recipient to secrets"
git push origin main
अब आपके सहकर्मी नवीनतम परिवर्तन खींच सकते हैं और अपने लिए रहस्यों को डिक्रिप्ट कर सकते हैं।
आप कमिट से पहले रहस्यों की स्वचालित जाँच/एन्क्रिप्शन और चेकआउट के बाद डिक्रिप्शन के लिए git हुक सेट करने हेतु prek या pre-commit का उपयोग कर सकते हैं।
उदाहरण prek कॉन्फ़िगरेशन यहाँ देखें।
prek.toml फ़ाइल जोड़ने के बाद, चलाएँ:
prek install
prek install --hook-type post-checkout
prek install --hook-type post-merge
prek install --hook-type post-rewrite
मेटाडेटा फ़ाइल में, आप एनोटेट कर सकते हैं कि रहस्य किन प्राप्तकर्ताओं के लिए एन्क्रिप्ट किया जाना चाहिए। यह आपको विभिन्न वातावरणों (जैसे स्टेजिंग बनाम प्रोडक्शन) के लिए अलग-अलग रहस्य रखने और उन्हें केवल प्रासंगिक प्राप्तकर्ताओं के लिए एन्क्रिप्ट करने की अनुमति देता है।
# secret.yml.cott.toml
[secret]
allow = ["sayanarijit"] # केवल sayanarijit के लिए एन्क्रिप्ट करें
# secret.yml.cott.toml
[secret]
deny = ["sayanarijit"] # sayanarijit को छोड़कर सभी के लिए एन्क्रिप्ट करें
# secret.yml.cott.toml
[secret]
allow = ["env/staging/*"] # ग्लोब पैटर्न का समर्थन करता है, केवल env/staging में प्राप्तकर्ताओं के लिए एन्क्रिप्ट करें
deny = ["env/staging/badservice"] # badservice को छोड़कर env/staging में सभी के लिए एन्क्रिप्ट करें
अस्वीकृति नियम अनुमति नियमों पर पूर्वता लेते हैं।
अधिक विवरण के लिए मेटाडेटा विनिर्देश देखें।
आप छेड़छाड़ को रोकने के लिए CI में ctg verify चला सकते हैं ताकि यह सत्यापित हो सके कि एन्क्रिप्टेड रहस्य और प्राप्तकर्ता सूचियाँ मेटाडेटा नियमों से मेल खाती हैं।
# .github/workflows/cottage-verify.yml
name: Cottage Verify
on: [push, pull_request]
permissions:
contents: read
jobs:
verify-secrets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Verify secrets
run: docker run --rm -v "${{ github.workspace }}:/app" ghcr.io/sayanarijit/cottage verify
cottage के साथ, आप किसी भी प्रदाता के साथ रहस्यों को सिंक कर सकते हैं जिसके पास API है, न केवल git।
इसके लिए, प्रोजेक्ट रूट में cottage.toml नामक एक फ़ाइल बनाएँ और अपस्ट्रीम सेटिंग्स कॉन्फ़िगर करें।
उदाहरण cottage.toml यहाँ देखें और रहस्य-विशिष्ट अपस्ट्रीम कॉन्फ़िगरेशन यहाँ।
उदाहरण प्लगइन कार्यान्वयन यहाँ देखें।
वर्कफ़्लो git के समान है, लेकिन git pull और git push के बजाय, आप कॉन्फ़िगर किए गए अपस्ट्रीम के साथ रहस्यों को सिंक करने के लिए ctg pull और ctg push चलाते हैं।
उदाहरण:
# नवीनतम परिवर्तनों को स्थानीय एन्क्रिप्टेड रहस्यों में खींचें
# `git pull origin` के समान
ctg pull myvault
# स्थानीय डिक्रिप्टेड रहस्यों के साथ अंतर की तुलना करें
ctg diff
# स्थानीय डिक्रिप्टेड रहस्यों को स्थानीय एन्क्रिप्टेड रहस्यों के साथ सिंक करें
ctg sync
# स्थानीय एन्क्रिप्टेड रहस्यों से परिवर्तनों को अपस्ट्रीम में पुश करें
# `git push origin main` के समान
ctg push myvault
अधिक विवरण के लिए अपस्ट्रीम कॉन्फ़िगरेशन विनिर्देश देखें।
Cottage आपके रहस्यों को सिंक करने के लिए विभिन्न प्लगइन प्रदाताओं का समर्थन करता है। उपयोग के लिए तैयार प्लगइन स्क्रिप्ट examples/plugins निर्देशिका में उपलब्ध हैं:
ctg run --cleanctg edit --cleanctg env डिक्रिप्टेड रहस्यों को पर्यावरण चर के रूप में इंजेक्ट करके एक कमांड चलाता है, बिना उन्हें डिस्क पर लिखे।ctg clean स्थानीय रिपॉजिटरी से सभी डिक्रिप्टेड रहस्यों को हटा देता है ताकि आप अपने AI एजेंटों को थोड़ी कम चिंता के साथ चला सकें।ctg init किसी भी निर्देशिका को एक रहस्य भंडार (secret store) में बदल देता है।git pull/diff/push की तरह ctg pull/diff/push का उपयोग शुरू करने देता है।