
خزينة CLI مشفرة للملاحظات والإعدادات والمفاتيح والملفات. ابحث، لا تنظم.
هذا ليس مدير كلمات مرور. ليس تطبيق ملاحظات. وبالتأكيد ليس سجلًا تصنيفيًا لأصول العينات الشاذة القاعية في أعماق البحار. لكنه يقوم بالأولين أفضل منهما. أمزح فقط (ليس حقًا).
ابحث، لا تنظم. ملاحظات، إعدادات، مفاتيح، أسرار — خمس ثوانٍ من الطرفية الخاصة بك.
"لا تزعجني بالفوضى المعتادة." — بائع السمك
go install github.com/DeprecatedLuar/dredge-cargo/cmd/dredge@latest
لن أحكم عليك. مفاتيح API المزعجة التي تظهر مرة واحدة فقط، إعدادات SSH، مطالبات الذكاء الاصطناعي، كلمات المرور، نصوص برمجية حرفية يمكنك تنفيذها، قوالب البريد الإلكتروني؟، ملفات نقطية (غريبة لكنها ستعمل بشكل جيد)، أرشيفات مضغوطة، قائمة أفلام، قوائم عناوين URL للوصول السريع...
حتى نسخة قانونية من الفصل الثاني من Chainsaw Man باليابانية. (قد يكون لدي أو لا يكون لدي هذا بالتحديد)
go install github.com/DeprecatedLuar/dredge-cargo/cmd/dredge@latest
تأكد من أن $GOPATH/bin (عادةً ~/go/bin) موجود في PATH الخاص بك.
curl -sSL https://raw.githubusercontent.com/DeprecatedLuar/the-satellite/main/satellite.sh | bash -s -- install DeprecatedLuar/dredge-cargo:dredge
التثبيت اليدوي
chmod +x dredge-*mv dredge-* ~/.local/bin/dredgeمن المصدر
git clone https://github.com/DeprecatedLuar/dredge-cargo
cd dredge-cargo
go build -o dredge ./cmd/dredge
mv dredge ~/.local/bin/
# Initialize with an existing git remote
dredge init yourusername/vault # GitHub shorthand
# or: dredge init [email protected]:you/vault.git
# Add your first item
dredge add "OpenAI Key" -c "sk-..." -t keys api #opens the editor without -c flag
# Search for it
dredge search openai
# Push to git
dredge push
# Add anything
dredge add My SSH Config -t ssh dotfiles --import ~/.ssh/config
dredge add "Master Architect Prompt" --import prompt.md -t ai prompts
dredge add "Watchlist" -c "Dune 2, Oppenheimer..." -t lists
dredge add "project-backup" --import project.tar.gz # binary files too :D
# Search — just type whatever you remember
dredge search prompt
dredge search aws key
dredge search ssh
# View, edit, remove
dredge view <id>
dredge edit <id>
dredge rm <id>
dredge undo # brought it back
# Search results are numbered — just type the number to view
dredge search ssh # shows: 1. [xKP] SSH Config 2. [mNq] SSH Key
dredge 1 # views it directly
# Git sync
dredge push
dredge pull
dredge sync # pull + push
"لا أستطيع تخيل ما هو هناك في الأعماق." — حارس المنارة
حسنًا، للتلخيص:
استقررت على استخدام تقنيتين رئيسيتين للتشفير Argon2id وبالطبع AES-256 وتحديدًا متغير GCM.
Argon2id لأنها التوصية من RFC 9106 والفائز بمسابقة PHC 2015. هذا كل شيء. متغير GCM من AES لأنه يجعل جميع البيانات المشفرة غير قابلة للتلاعب بسبب البصمة. هذا كل شيء أيضًا.
حاليًا أقوم بتخزين كل شيء كملفات مشفرة في ~/.local/share/dredge/. هذا الدليل هو أيضًا مستودع git (على الأقل حاليًا). لذا فإن dredge push يقوم بالالتزام والدفع لكل شيء للنسخ الاحتياطي. كل عنصر عبارة عن كتلة مشفرة مستقلة بمعرف عشوائي من 3 أحرف. قررت أنه لا ينبغي كشف أي أسماء ملفات، لذا حتى إذا كان بإمكان أي شخص رؤية محتوياتك، فليس لديه فكرة عما ينظر إليه.
Your password
+ 16-byte random salt ← the salt is stored in .dredge-key
→ Argon2id (64 MB memory · 4 threads · 1 iteration)
→ 32-byte master key (salt + password = the real key)
Master key + item content (TOML: title, tags, content)
→ AES-256-GCM with a fresh random 12-byte nonce per operation
→ [12B nonce][ciphertext + 16B auth tag]
→ written to disk as items/xKP (random ID, no extension)
لذا فإن خزنتك بأكملها تشترك في نفس المفتاح المشتق (هذا يعني إذا فقدت مفتاحك، فقدت بياناتك، من فضلك لا تفقد مفتاحك). كل عنصر يستخدم نفس المفتاح، كل مع nonce عشوائي خاص به. إذا قمت بتشفير نفس المحتوى مرتين، ينتج نص مشفر مختلف تمامًا.
~/.local/share/dredge/ ← the vault (git repo)
├── .git/
├── .gitignore ← excludes .spawned/ and links.json
├── .dredge-key ← salt + encrypted verification string
├── items/
│ ├── xKP ← encrypted item
│ ├── mNq ← encrypted item
│ └── ...
├── .spawned/ ← plaintext copies of linked items
└── links.json ← symlink manifest
لذا فإن جميع ملفاتك المشفرة و .dredge-key مخزنة في مستودع git، بينما لن يتم تتبع جميع ملفات النص العادي (التي قررت جعلها قابلة للقراءة من قبل النظام) أبدًا. لذا افعل ما تشاء بها.
بعد أول أمر لك في طرفية، يتم تخزين المفتاح المشتق 32-بايت في $XDG_RUNTIME_DIR/dredge/$PPID/.key (الوصول للجذر فقط).
جميع أوامر dredge التالية في نفس الطرفية تستخدم المفتاح المخبأ. مما يعني أنك لن تُطلب كلمة مرور بعد الآن. كل طرفية تحصل على دليلها المعزول بناءً على PID الأصلي. لذا يتبخر المفتاح من القرص بمجرد موت الطرفية.
اشتقاق المفتاح — Argon2id: معلمات RFC 9106 الموصى بها (ذاكرة 64 ميجابايت، 4 خيوط، 1 تكرار). الملح في .dredge-key ليس من المفترض أن يكون سريًا، فهو يضمن فقط أن القوة الغاشمة لكلمة مرورك مكلفة جدًا حتى مع الملف. كلمة مرورك هي ما يبقيك آمنًا، لذا أنت تعرف ماذا تفعل.
الشيفرة — AES-256-GCM: في الأساس يبصم كل تشفير. تحصل على السرية والتكامل معًا. التلاعب بالنص المشفر لن يفك تشفيره إلى هراء، بل سيفشل فك التشفير ويصرخ طلبًا للمساعدة.
التحقق من كلمة المرور: يحتوي .dredge-key على السلسلة dredge-vault-v1 المشفرة بمفتاحك الرئيسي. في كل جلسة جديدة، يقوم dredge بفك تشفير هذا للتحقق من صحة كلمة المرور. لذا إذا لم تحصل على dredge-vault-v1 منه، فكلمة المرور خاطئة، لذا تفشل في حوالي 100 مللي ثانية بدلاً من اكتشاف كلمة مرور خاطئة في منتصف العملية.
ما يتم تخزينه مؤقتًا: ملف الجلسة يخزن المفتاح المشتق 32-بايت (كلمة المرور + الملح)، وليس كلمة المرور نفسها (أنا لست بهذا الغباء). لذا حتى إذا قرأ شخص ما .key أثناء جلسة نشطة، لا يمكنه استعادة كلمة المرور منه.
الأمان"من الأفضل أن تعود بصيد صغير من ألا تعود على الإطلاق." — بائع السمك
شخص ما يستنسخ مستودع git الخاص بك:
يحصل على كتل مشفرة و .dredge-key. الملح ليس سريًا — الغرض منه جعل هجمات ما قبل الحساب غير عملية. بدون كلمة مرورك، العناصر هي بيانات ثنائية معتمة. Argon2id يجعل القوة الغاشمة غير المتصلة بالإنترنت مكلفة. استخدم كلمة مرور قوية.
شخص ما لديه إمكانية الوصول إلى جلستك النشطة:
المفتاح المشتق موجود في $XDG_RUNTIME_DIR/dredge/$PPID/.key طوال مدة جلسة الطرفية. كل طرفية تحصل على دليلها المعزول الخاص — أغلق الطرفية، يختفي المفتاح. هذا المسار محدد للمستخدم (الوضع 700) ومدعوم بـ RAM. مهاجم لديه حق الوصول للقراءة إلى دليل جلستك يمكنه فك تشفير خزنتك. تعامله مثل أي بيانات اعتماد حساسة في دليل منزلك. إذا كان لدى شخص ما صلاحية الجذر على جهازك، فإن مفتاح dredge الخاص بك هو أقل ما يقلقك.
شخص ما لديه وصول مادي إلى جهازك غير المتصل بالإنترنت:
العناصر على القرص مشفرة. مفتاح الجلسة موجود في تخزين مدعوم بـ RAM ولا ينجو من إعادة التشغيل. العناصر المرتبطة (.spawned/) هي نص عادي على القرص — انظر أدناه.
ملف .spawned هو النص العادي الوحيد الدائم على القرص، وهو موجود فقط لأنك قمت بربط عنصر بمسار النظام بشكل صريح. كل شيء آخر موجود في الذاكرة فقط.
--password / DREDGE_PASSWORD: تمرير كلمة المرور الخاصة بك في السطر يكشفها في تاريخ القشرة ومخرجات ps. يمكن أن تتسرب متغيرات البيئة إلى العمليات الفرعية. تجنب كليهما في البيئات المشتركة.--vault / DREDGE_VAULT: تجاوز الخزنة النشطة لأمر واحد دون حفظ التغيير. مفيد للبرمجة النصية عبر خزائن متعددة.~/.ssh/config). لا يتم تتبعه بواسطة git، لكنه موجود على القرص كنص عادي.
اربط أي عنصر مخزن بمسار على نظام الملفات الخاص بك:
dredge link <id> ~/.ssh/config
سيقوم هذا الأمر بإنشاء رابط رمزي في ~/.ssh/config يشير إلى نسخة نص عادي يديرها dredge (يتم كشف الملف على القرص حتى تتمكن من استخدامه). يمكنك تحرير الملف مباشرة أو من خلال dredge edit أو أياً كان ما تشعر به، جميع التغييرات تتم مزامنتها تلقائيًا مع المخزن المشفر.
الإصلاح التلقائي: إذا قمت بإعادة تسمية رابط رمزي (مثل mv ~/.ssh/config ~/.ssh/config-backup)، يكتشف dredge ويتتبع المسار الجديد تلقائيًا. يتم تنظيف الروابط المحذوفة عند بدء الجلسة.
على جهاز جديد:
git clone [email protected]:you/vault.git ~/.local/share/dredge
dredge link <id> ~/.ssh/config
# same SSH config, same keys, every machine git tracked for any update
هذا في الواقع هو السبب الذي جعلني أبني dredge. إعداد SSH الخاص بي متطابق على كل جهاز، لكن لم أستطع ببساطة وضعها داخل ملفاتي النقطية.
تستخدم مزامنة Git git العادي وتعمل مع أي مستودع بعيد (GitHub/GitLab/Gitea/etc).
dredge init يقبل مستودعًا بعيدًا اختياريًا. إذا حذفته، يقوم dredge بتهيئة مستودع git محلي فقط (بدون مستودع بعيد).
سلوك الالتزام التلقائي: push و pull و sync يحافظون على التغييرات غير الملتزمة والمزامنة في التزام قبل التوفيق مع المستودع البعيد. إذا كنت بحاجة إلى التخلص من التغييرات المحلية لتحديد أولوية النسخة البعيدة، استخدم dredge drop.
الاحتفاظ التلقائي بالتاريخ: push و sync يطبقان السياسة في dredge.toml. بيانات العنصر الوصفية والتخزين الثنائي لهما حدود مستقلة لكل عنصر من حيث الإصدار والبايتات المشفرة، بينما يتحكم history.deleted.retain_for في المدة التي تظل فيها المعرفات المحذوفة قابلة للاسترداد. إذا لم تقم السياسة بإزالة أي شيء، يدفع Dredge بشكل طبيعي. إذا كان الانكماش ضروريًا، يتحقق Dredge من تاريخ الاستبدال ويستخدم force-with-lease دقيق؛ التحديث البعيد المتزامن يتوقف بأمان بدلاً من أن يتم استبداله. pull لا يقوم أبدًا بالانكماش أو force-push.
افحص التاريخ المحفوظ باستخدام dredge history أو dredge history deleted أو dredge history <id>. استعد عنصرًا مشفرًا محذوفًا باستخدام dredge history restore <id>. تغييرات كلمة المرور لا تعيد تشفير الكتل التاريخية، لذا فإن الإصدارات المستعادة التي تم إنشاؤها تحت كلمة مرور أقدم قد لا تفك تشفيرها بكلمة المرور الحالية.
تنسيقات المستودع البعيد المقبولة:
# GitHub shorthand (expanded to https://github.com/<owner>/<repo>.git)
dredge init owner/repo
# HTTPS
dredge init https://github.com/owner/repo.git
dredge init https://gitlab.com/group/repo.git
# SSH (scp-like)
dredge init [email protected]:owner/repo.git
dredge init [email protected]:group/repo.git
# SSH URL
dredge init ssh://[email protected]/owner/repo.git
# Local path remote (advanced)
dredge init /srv/git/dredge-vault.git
origin، فسيؤدي dredge push/pull/sync إلى ظهور خطأ مع إرشادات.dredge init لن يقوم بالكتابة فوقه.
"أنا جامع — للعديد من الأشياء؛ الفن والتحف، الكنوز والحقائق... والفضول التي تحتل هامش الرغبة." — الجامع
العبء الذهني لحفظ شيء وعدم معرفة أين تجده عندما تحتاجه.
لقد سئمت من وجود أشياء مهمة (وغير مهمة أيضًا، مجرد أشياء بشكل عام) متناثرة في كل مكان، سأضطر للوصول إلى حساب بريد إلكتروني أنشأته منذ 6 سنوات لأنه كان مرتبطًا بخدمة عشوائية كنت بحاجة ماسة للوصول إليها دون سبب... على أي حال، أدركت أن العديد من الأدوات على الرغم من وجود حيلها الخاصة، إلا أنها تتداخل جميعًا في جانب مهم جدًا وهو تخزين المعلومات، لذا صنعت أداة تتخصص في ذلك التداخل المحدد وتترك الأدوات تقوم بما تجيده.
أنا كسول لذا أردت شيئًا يعمل فقط ويقرأ عقلي، لا يتطلب جهدًا لإضافة إدخال ولا لاسترجاعه من قاعدة المعرفة.
قمت بتنزيل jrnl مرة وأعجبتني الفكرة حقًا لكني كرهت التنفيذ بسبب بعض المعلمات الغريبة، لم يكن لديه فصل للعناصر وبحث يطابق كل شيء. Dredge هو ما أردته بالفعل. (لذا نعم، إلى حد كبير أداة شخصية)
شكر كبير لكم يا رفاق الذين ساهموا في dredge:
بواسطة Luar
| الموقع | متى | مدة البقاء |
|---|
| RAM فقط | كل عرض، بحث، أو تحرير | يتم تحريرها عند خروج الأمر |
$XDG_RUNTIME_DIR/dredge/$PPID/edit-*.txt | أثناء dredge edit فقط | يتم حذفها بعد إغلاق المحرر |
~/.local/share/dredge/.spawned/<id> | بعد dredge link | حتى تقوم بتشغيل dredge unlink |
| الأمر | الوصف | مثال |
|---|
add / a / new / + | إضافة عنصر (يفتح المحرر في حالة عدم وجود -c) | dredge add "OpenAI Key" -c "sk-..." -t keys |
search / s | بحث عن العناصر | dredge search aws key |
list / ls | عرض جميع العناصر | dredge ls |
view / v | عرض عنصر | dredge view xKP or dredge 1 |
cat / c | إخراج المحتوى الخام (للأنابيب) | dredge cat xKP | bash |
edit / e | تحرير عنصر | dredge edit xKP |
rm | إزالة (يذهب إلى سلة المهملات) | dredge rm 1 2 3 |
undo | استعادة آخر عنصر تمت إزالته | dredge undo |
link / ln | ربط عنصر بمسار نظام | dredge link xKP ~/.ssh/config |
unlink | إزالة رابط | dredge unlink xKP |
mv / rename | إعادة تسمية معرف العنصر | dredge mv xKP abc |
export | تصدير عنصر ملف إلى القرص | dredge export xKP ./output/ |
copy / cp | نسخ محتوى العنصر إلى الحافظة | dredge copy xKP |
lock | قفل الخزنة (مسح مفتاح الجلسة) | dredge lock |
init / use | تهيئة أو تفعيل خزنة | dredge init ~/vaults/work |
push / pull / sync | مزامنة Git (يلتزم بالتغييرات تلقائيًا) | dredge sync |
drop | التخلص من التغييرات غير الملتزمة | dredge drop xKP or dredge drop --all |
status | عرض التغييرات المعلقة | dredge status |
passwd | تغيير كلمة مرور الخزنة | dredge passwd |
update | التحديث إلى أحدث إصدار | dredge update |