यूज़र गाइड
GitHub पर इस पेज को संपादित करेंसहायता — career-ops-ui
ऐप लॉन्च करने के क्षण से लेकर इंटरव्यू पाने तक, हर पेज का पूरा
वॉकथ्रू। नीचे दिया गया हर ## हेडिंग साइडबार की किसी एंट्री या
वर्कफ़्लो के किसी चरण से मेल खाता है। पहली बार चलाते समय ऊपर से नीचे
पढ़ें; बाद में सहायता साइडबार की सामग्री-सूची (table of contents) के
ज़रिए किसी खास सेक्शन पर सीधे जाएँ।
दर्शक: वह कोई भी व्यक्ति जिसने अभी-अभी इस UI को किसी
career-opsचेकआउट के अंदर डाला है औरbash bin/start.shचलाया है। career-ops की पहले से कोई जानकारी ज़रूरी नहीं है।
career-ops के बारे में
career-ops एक ओपन-सोर्स जॉब-सर्च सिस्टम है जो किसी भी AI कोडिंग CLI (Claude Code, Cursor, Codex, OpenCode, Antigravity CLI, Grok Build CLI, Qwen Code, Kimi, GitHub Copilot CLI, Gemini CLI (legacy) — अन्य Claude-संगत CLI भी उसी स्लैश-कमांड सतह के ज़रिए काम करते हैं) के अंदर स्लैश कमांड के रूप में चलता है। मॉडल-अज्ञेय (model-agnostic)। यह हर पोस्टिंग का मूल्यांकन आपके CV के मुकाबले छह-आयामी 0.0–5.0 रूब्रिक से करता है, टेलर्ड PDF रिज़्यूमे जनरेट करता है, और हर आवेदन को आपकी मशीन पर स्थानीय रूप से ट्रैक करता है।
कैननिकल संदर्भ (पहली इंस्टॉल पर इसी क्रम में पढ़ें):
- career-ops क्या है — सिस्टम, सिद्धांत, और कॉन्सेप्ट्स की सूची।
- जॉब पोर्टल स्कैन करें — वैकेंसी खोजें; Pipeline भरें।
- किसी जॉब के लिए आवेदन करें — Playwright फ़ॉर्म-रीड के साथ पूरा सबमिशन फ़्लो।
- ऑफ़र्स का बैच-मूल्यांकन करें
—
batch-runner.shके ज़रिए एक साथ 10+ JD स्कोर करें। - Playwright सेट अप करें — Chromium इंस्टॉल करें + PDF और फ़ॉर्म-फ़िल के लिए MCP रजिस्टर करें।
- career-ops जॉब लिस्टिंग को कैसे स्कोर करता है — स्कोरिंग मेथडोलॉजी: छह आयाम, 4.0 अप्लाई थ्रेशोल्ड, और सिस्टम स्पष्ट रूप से क्या करने से इनकार करता है। आपकी भाषा में cvstart.org/methodology पर भी संक्षेप में उपलब्ध।
मूल सिद्धांत ( career-ops.org/docs/introduction/what-is-career-ops से):
- ओपन सोर्स, गंभीरता से — MIT, कोई पेड टियर नहीं, कोई वेटलिस्ट नहीं, कोई टेलीमेट्री नहीं, कोई अकाउंट नहीं। सिस्टम बिना पेड टियर, अकाउंट, या टेलीमेट्री के काम करता है। कोड योगदान रिलीज़ से पहले सामुदायिक समीक्षा से गुज़रते हैं।
- डेटा सॉवरेनिटी —
cv.md,config/profile.yml,data/,reports/,interview-prep/आपके लैपटॉप से तब तक बाहर नहीं जाते जब तक आप उन्हें स्पष्ट रूप से पुश नहीं करते। आप इसे अपनी मशीन पर स्थानीय रूप से चलाते हैं, पूरी डेटा सॉवरेनिटी बनाए रखते हुए। - AI-अज्ञेय आर्किटेक्चर — career-ops कोई मॉडल बंडल नहीं करता। यह मौजूदा AI कोडिंग CLI के अंदर कमांड्स के रूप में काम करता है। प्रोवाइडर बदलें (Anthropic ↔ Gemini ↔ OpenAI) और आपका मूल्यांकन इतिहास सुसंगत रहता है।
- मानव-नियंत्रित सबमिशन — career-ops उत्तर तैयार करता है और फ़ॉर्म खोलता है, पर Submit आप ही क्लिक करते हैं। सिस्टम कभी ऑटो-अप्लाई नहीं करता। सिस्टम संरचना और मूल्यांकन प्रदान करता है; अंतिम सबमिशन का अधिकार मनुष्यों के पास रहता है।
- संरचित खोज — कई आवेदनों वाली सक्रिय, सोच-समझकर की गई जॉब हंट के लिए बना है; यह सिंगल-सबमिशन टूल नहीं है, न ही सिफ़ारिश इंजन है। सेटअप में ~15 मिनट लगते हैं और टर्मिनल से सहजता मानी जाती है।
career-ops क्या नहीं है (स्पष्ट गैर-लक्ष्य):
- ऑटो-अप्लायर नहीं। यह आपके लिए फ़ॉर्म सबमिट नहीं करेगा।
- रिज़्यूमे रीबिल्डर नहीं। यह प्रति-JD टेलर करता है; यह अनुभव गढ़ता नहीं है।
- LinkedIn ऑप्टिमाइज़र नहीं। आपकी प्रोफ़ाइल आपका अपना मामला है।
- स्प्रेडशीट का विकल्प नहीं जो किसी SaaS UI के पीछे छुपा हो। डेटा आपके फ़ाइल-सिस्टम पर सादा मार्कडाउन है।
मुख्य अवधारणाएँ (पूरी सूची — हर आर्टिफ़ैक्ट जिसे career-ops छूता है):
| अवधारणा | यह क्या है |
|---|---|
| Mode | modes/<slug>.md के अंतर्गत एक प्रॉम्प्ट टेम्प्लेट। बिल्ट-इन: oferta, deep, apply, pipeline, batch, contacto, followup, interview-prep, patterns, project, training, ofertas, auto-pipeline, pdf, latex, scan, tracker। |
| Archetype | config/profile.yml में एक टारगेट-रोल प्रोफ़ाइल। रूब्रिक स्किल मैचों को सक्रिय आर्किटाइप के मुकाबले भार देता है — सबसे महत्वपूर्ण एकल फ़ील्ड। |
| Pipeline | data/pipeline.md — मूल्यांकन की प्रतीक्षा कर रहे JD URL का इनबॉक्स। |
| Tracker | data/applications.md — हर मूल्यांकन + आवेदन स्थिति की ऐतिहासिक GFM तालिका। |
| Report | reports/<NNN>-<company>-<DATE>.md — प्रति JD पूरा A–F मूल्यांकन, हेडर में स्कोर + वैधता (legitimacy) के साथ। |
| Scan history | data/scan-history.tsv — केवल-जोड़ने योग्य लॉग; स्कैन के बीच डुप्लिकेट रोकता है। |
| Proof points | cv.md से निकाले गए STAR+R प्रमाण ब्लॉक, मूल्यांकन, अप्लाई उत्तर, इंटरव्यू प्रेप में दोबारा उपयोग होते हैं। |
| JD store | jds/jd-<date>-<ts>.txt — मूल्यांकन के दौरान ऑडिट ट्रेल के लिए सहेजी गई शब्दशः जॉब डिस्क्रिप्शन। |
| Interview-prep | interview-prep/<company>-<role>.md — गहन-शोध ब्रीफ़ और राउंड वन-पेजर। |
| Batch additions | batch/tracker-additions/*.tsv — batch-runner.sh द्वारा ट्रैकर में मर्ज होने के लिए क़तार में रखी गई लंबित पंक्तियाँ। |
career-ops बनाम career-ops-ui (यह ऐप)
| career-ops (CLI) | career-ops-ui (यह ऐप) | |
|---|---|---|
| कहाँ चलता है | Claude Code / Cursor / Codex / OpenCode / Antigravity CLI / Grok Build CLI / Qwen Code / Kimi / GitHub Copilot CLI / Gemini CLI (legacy) के अंदर | आपके ब्राउज़र में http://127.0.0.1:4317 |
| सतह | /career-ops <mode> स्लैश कमांड |
प्रति वर्कफ़्लो एक पेज वाला साइडबार |
| फ़ॉर्म-फ़िल | हाँ, Playwright MCP के ज़रिए | नहीं — चेकलिस्ट जनरेट करता है, आप CLI में पूरा करते हैं |
generate-pdf.mjs |
#/cv, #/reports/:slug, #/evaluate, #/deep, #/interview-prep पर 📄 Generate PDF |
|
| डेटा फ़ाइलें | career-ops-ui के साथ साझा | career-ops के साथ साझा |
career-ops-ui शुद्ध रूप से एक जोड़ है। career-ops/ के अंदर कुछ
भी नहीं बदलता। दोनों सतहें एक ही cv.md, config/profile.yml,
portals.yml, data/, reports/, interview-prep/, modes/ साझा
करती हैं।
स्कोर के अनुसार एक्शन थ्रेशोल्ड
एक बार किसी JD का मूल्यांकन हो जाने पर, स्कोर तय करता है कि आगे क्या करें ( career-ops.org/docs/introduction/what-is-career-ops से कैननिकल तालिका):
| स्कोर | अगला कदम |
|---|---|
| ≥ 4.5 | /career-ops apply चलाएँ — उच्च फ़िट, तुरंत आगे बढ़ें। |
| 4.0 – 4.4 | अप्लाई करें, या पहले वॉर्म इंट्रो के लिए /career-ops contacto। |
| 3.5 – 3.9 | निर्णय लेने से पहले कंपनी / रोल पर शोध के लिए /career-ops deep चलाएँ। |
| < 3.5 | जब तक कोई खास व्यक्तिगत वजह न हो, छोड़ दें। |
career-ops-ui का #/dashboard और #/tracker 4.0 या उससे ऊपर की हर
पंक्ति को हाइलाइट करता है ताकि आप बिना कुछ दोबारा चलाए एक्शन चुन
सकें।
बाहरी दस्तावेज़
अंतर्निहित career-ops इंजन (स्कैनिंग, मूल्यांकन रूब्रिक, बैच प्रोसेसिंग, अप्लाई फ़्लो, Playwright सेटअप) का पूरा संदर्भ career-ops.org/docs पर है:
- career-ops क्या है
- जॉब पोर्टल स्कैन करें
- किसी जॉब के लिए आवेदन करें
- ऑफ़र्स का बैच-मूल्यांकन करें
- Playwright सेट अप करें
1. क्विक स्टार्ट — “CV बनाएँ” से “अप्लाई किया & मैसेज भेजा” तक पूरा स्टेप-बाय-स्टेप
यह कैननिकल, बटन-दर-बटन प्लेबुक है। पहली बार इसे इसी क्रम में फ़ॉलो करें। हर स्टेप में सटीक रूट, सटीक बटन, और सफलता पर आप जो देखेंगे वह बताया गया है। नीचे सेक्शन 2–16 हर चरण में और गहराई से जाते हैं।
सीधे पूछना पसंद करते हैं? साइडबार में, Help के नीचे, Ask the docs 💬 खोलें और “How do I scan job portals?” या “How does the two-pager fit score work?” जैसा सवाल टाइप करें। यह केवल इसी गाइड से, आपकी भाषा में जवाब देता है, और दिखाता है कि उसने किन सेक्शन से जानकारी ली — यह कभी आपका CV या जॉब सर्च नहीं पढ़ता। LLM कुंजी के साथ यह लाइव जवाब देता है; बिना कुंजी के यह पेस्ट करने के लिए तैयार प्रॉम्प्ट (पहले से प्रासंगिक हेल्प सेक्शन भरे हुए) थमा देता है। यही सहायक हर पेज से भी एक टैप दूर है — नीचे-दाएँ कोने में एक रोबोट चैट बटन तैरता रहता है (राइट-टू-लेफ़्ट भाषाओं में नीचे-बाएँ); जो कर रहे हैं उसे छोड़े बिना पूछने के लिए उसे क्लिक करें।
वन-कमांड लॉन्च & init। टर्मिनल से आप UI छुए बिना पूरा बूटस्ट्रैप कर सकते हैं:
career-ops-ui setup # install deps → doctor → run the server career-ops-ui init # pick LLM provider + paste its key (echo suppressed) career-ops-ui doctor # re-verify any time (exit 0 ⇔ all required green) career-ops-ui run # just launch the server at http://127.0.0.1:4317 career-ops-ui open # open + RAISE the dashboard tab in your browser
setup/runके बाद ब्राउज़र टैब अपने-आप खुल जाता है और सामने ला दिया जाता है (v1.43.0);career-ops-ui openमाँग पर वही करता है ताकि आपको कभी डैशबोर्ड टैब ढूँढना न पड़े।NO_OPEN=1हेडलेस/CI स्टार्ट के लिए ऑटो-ओपन बंद कर देता है।
setupपूरी चेन खुद चलाता है।initउसी वैलिडेटेड पथ से कुंजी को पैरेंटcareer-ops/.envमें लिखता है जिसे#/configका API-keys टैब उपयोग करता है, औरLLM_PROVIDER(auto|claude|gemini) सेट करता है जिसे live evaluate / deep / mode / auto-pipeline रूट मानते हैं। CI फ़ॉर्म:career-ops-ui init --provider claude --anthropic-key sk-ant-… --yes। UI पसंद है? नीचे दिए गए स्टेप्स से जारी रखें।
A. सेटअप (एक बार करें, ~5 मिनट)
career-ops-ui को career-ops/web-ui/ पर ही रहना चाहिए (पैरेंट
career-ops प्रोजेक्ट के अंदर नेस्टेड)। यह ../ के ज़रिए पैरेंट फ़ोल्डर
से आपका cv.md, config/, और data/ पढ़ता है और अकेले काम नहीं
करता। यदि पुल के बाद career-ops-ui init नहीं मिलता, तो
cd career-ops/web-ui && npm install && npx career-ops-ui init चलाएँ।
स्टेप 1 — http://127.0.0.1:4317 पर ऐप खोलें। अगर यह नहीं
चल रहा है, तो टर्मिनल में रेपो रूट से bash bin/start.sh चलाएँ।
Dashboard (#/dashboard) लोड होता है।
स्टेप 2 — बाएँ साइडबार में ❤ Health क्लिक करें। हर आवश्यक चेक
हरा होना चाहिए:
cv.md,config/profile.yml,portals.ymlमौजूद हैं- API कुंजी सेट है (
ANTHROPIC_API_KEY/GEMINI_API_KEYमें से कम-से-कम एक) - Playwright इंस्टॉल है (केवल तभी ज़रूरी है जब आप Generate PDF उपयोग करेंगे)
अगर कुछ भी लाल है, तो पेज आपको ठीक-ठीक बताता है कि कौन-सी फ़ाइल या env var ठीक करनी है। Health हरा होने तक आगे न बढ़ें।
स्टेप 3 — साइडबार में ⚒ App settings क्लिक करें। आप
API keys & runtime टैब पर पहुँचते हैं।
ANTHROPIC_API_KEYपेस्ट करें (पसंदीदा — बेहतर लंबे-फ़ॉर्म स्कोरिंग) और/याGEMINI_API_KEY। कुंजियाँ https://console.anthropic.com/settings/keys या https://aistudio.google.com/apikey से लें।- 💾 Save क्लिक करें। फिर ▶ Test Anthropic (या Gemini) क्लिक करें — एक छोटा राउंड-ट्रिप पुष्टि करता है कि कुंजी काम कर रही है।
स्टेप 4 — उसी पेज पर Profile टैब पर स्विच करें। यह
config/profile.yml का सीधा YAML एडिटर है। कम-से-कम इन्हें एडिट
करें:
candidate.full_name— किसी भी प्लेसहोल्डर (“Jane Smith”) को अपने असली नाम से बदलेंcandidate.email,linkedin,github— कवर लेटर में उपयोग होते हैंtarget.roles— जिन जॉब टाइटल के लिए आप अप्लाई करेंगेtarget.comp_total_min_usd— न्यूनतम कुल compensation; इससे कम ऑफ़र हर मूल्यांकन के सेक्शन D में फ़्लैग हो जाते हैंtarget.archetypes— वे करियर पैटर्न जिन्हें आप स्वीकार करते हैं (सबसे प्रभावशाली एकल फ़ील्ड)
💾 Save क्लिक करें। सर्वर YAML वैलिडेट करता है और कैननिकल
# Career-Ops Profile Configuration हेडर स्टैम्प करता है।
B. CV (एक बार करें, ~10 मिनट)
स्टेप 5 — साइडबार में ✎ CV क्लिक करें। दो कॉलम: बाईं ओर
एडिटर, दाईं ओर लाइव प्रीव्यू।
स्टेप 6 — एडिटर भरने के लिए एक रास्ता चुनें:
- मौजूदा रिज़्यूमे अपलोड करें — 📁 Upload CV क्लिक करें,
.docx / .doc / .odt / .rtf / .pdf / .html / .txt / .mdमें से कोई भी चुनें। सर्वर pandoc या pdftotext के ज़रिए मार्कडाउन में बदलता है, XSS सैनिटाइज़ करता है, और नतीजा एडिटर में डाल देता है। कन्वर्ज़न की समीक्षा करें — खासकर PDF में लेआउट की सटीकता खो सकती है। - मार्कडाउन सीधे पेस्ट करें — टेक्स्टएरिया एक मार्कडाउन एडिटर है; दायाँ पेन वही दिखाता है जो LLM (और आपका भावी रिक्रूटर) देखेगा।
- लहजा (tone) टिप्स: एक बुलेट = एक मीट्रिक वाली उपलब्धि। 1500 शब्दों से कम रखें। सेक्शन इस क्रम में: Summary, Experience, Projects, Education, Skills।
स्टेप 7 — (CV पेज के ऊपर-दाईं ओर) 💾 Save क्लिक करें। सर्वर
सैनिटाइज़ करता है (<script> / javascript: / इनलाइन हैंडलर हटा
दिए जाते हैं) और cv.md लिखता है। टोस्ट: “Saved”।
स्टेप 8 (वैकल्पिक) — 📄 Generate PDF क्लिक करें। पैरेंट में
generate-pdf.mjs चलाता है (Playwright ज़रूरी है) और पूरा होते ही
नई PDF आपके ब्राउज़र में ऑटो-डाउनलोड हो जाती है। पेज के नीचे की
सूची पहले जनरेट की गई हर फ़ाइल रखती है।
C. वैकेंसी खोजें (~प्रति स्कैन 2 मिनट)
स्टेप 9 — साइडबार में 🌐 Scan क्लिक करें। पुष्टि करें कि
portals.yml उन बोर्ड्स को सूचीबद्ध करता है जिनकी आपको परवाह है
(इस सहायता का सेक्शन 5)। 🌐 Scan now बटन दबाएँ। स्कैनर के
Greenhouse / Ashby / Lever / Workable / SmartRecruiters / Workday
(अंग्रेज़ी बोर्ड) और hh.ru / Habr Career (सक्षम होने पर रूसी बोर्ड)
चलने के दौरान एक लाइव SSE लॉग स्ट्रीम होता है।
स्टेप 10 — स्कैन पूरा होने पर, नतीजे देखें। फ़िल्टर के लिए किसी भी कंपनी टैग पर क्लिक करें; ↗ आइकन पर क्लिक करके कंपनी का करियर पेज नए टैब में खोलें। टाइटल-फ़िल्टर से बची हर वैकेंसी Pipeline में क़तार में लग जाती है।
D. ऑफ़र्स को स्कोर करें (~प्रति JD 30 सेकंड)
स्टेप 11 — साइडबार में Pipeline क्लिक करें। आपको स्कैनर द्वारा
क़तारबद्ध हर URL दिखता है। JD को इनलाइन देखने के लिए किसी एंट्री पर
क्लिक करें।
स्टेप 12 — किसी भी JD के बगल में ▶ Evaluate क्लिक करें। यह
#/evaluate पर ले जाता है। API कुंजी सेट होने पर यह लाइव चलता है;
बिना कुंजी के, आपको अपने खुद के LLM में पेस्ट करने के लिए एक मैन्युअल
प्रॉम्प्ट मिलता है। लाइव मोड आपके CV के मुकाबले सेक्शन A–G (Role /
Company / Compensation / Risk / Stretch / Cultural fit / Verdict) पर
एक 0–5 स्कोर पैदा करता है। सेव reports/<date>-<slug>.md में
जाता है।
स्टेप 13 — साइडबार में Reports क्लिक करें और नवीनतम मूल्यांकन
देखें। आपके comp_total_min_usd से कम कुछ भी सेक्शन D में लाल फ़्लैग
होता है। Verdict: pursue वाला कुछ भी आपकी शॉर्टलिस्ट है।
E. शॉर्टलिस्ट की गई कंपनी पर निर्णय लें और गहराई से शोध करें (~3 मिनट)
स्टेप 14 — आगे बढ़ने लायक कोई वैकेंसी चुनें। साइडबार में
Deep research क्लिक करें। कंपनी का नाम और रोल डालें। मॉडल एक
7-सेक्शन कंपनी ब्रीफ़ (mission, recent news, tech stack, hiring
signals, comp benchmarks, risks, recommended angle) तैयार करता है।
सेव interview-prep/<company>-<role>.md में जाता है।
F. अप्लाई करें (~प्रति आवेदन 5 मिनट)
स्टेप 15 — साइडबार में Apply checklist क्लिक करें। वैकेंसी
URL + JD पेस्ट करें। हेल्पर एक स्टेप-बाय-स्टेप सबमिशन चेकलिस्ट
जनरेट करता है:
- टेलर्ड कवर-लेटर ड्राफ़्ट (आपके
cv.md+profile.ymlका उपयोग करता है) - JD से मिरर करने के लिए खास कीवर्ड
- अटैच करने वाली फ़ाइलें (CV PDF — स्टेप 8 देखें)
- कहाँ अप्लाई करें (कैननिकल करियर URL, एग्रीगेटर रीडायरेक्ट नहीं)
- याद दिलाना: कभी ऑटो-सबमिट न करें — अंतिम समीक्षा और सबमिशन हमेशा मैन्युअल है।
स्टेप 16 — करियर पेज को नए टैब में खोलें। अपने टूडू के रूप में अप्लाई चेकलिस्ट उपयोग करें। कंपनी के असली फ़ॉर्म के ज़रिए सबमिट करें। स्टेप 8 में जनरेट की गई PDF अटैच करें।
स्टेप 17 — किसी असली इंसान से संपर्क करें। Outreach मोड
(साइडबार में #/contacto) खोलें। मॉडल स्टेप 14 के कंपनी ब्रीफ़ के
अनुसार टेलर की गई एक छोटी LinkedIn / ईमेल मैसेज ड्राफ़्ट करता है।
ओपनर को पर्सनलाइज़ करें (आपके डीप-रिसर्च ब्रीफ़ से एक खास डिटेल)।
इसे भेजें।
G. ट्रैक करें और फ़ॉलो-अप करें (निरंतर)
स्टेप 18 — साइडबार में Tracker क्लिक करें और आवेदन के लिए एक
पंक्ति जोड़ें: कंपनी, रोल, स्कोर, स्थिति Applied, रिपोर्ट का लिंक,
डीप-रिसर्च ब्रीफ़ का लिंक। तारीख़ अपने-आप भर जाती है।
स्टेप 19 — एक हफ़्ते बाद: Follow-up मोड खोलें (#/followup)।
मूल आवेदन का हवाला देते हुए एक विनम्र चेक-इन ईमेल ड्राफ़्ट करता है।
भेजें। ट्रैकर स्थिति को Followed up में अपडेट करें।
स्टेप 20 — जब आपको इंटरव्यू का न्योता मिले, Interview prep मोड
चलाएँ (#/interview-prep)। विशिष्ट कंपनी + चरण (system design /
behavioral / coding) के लिए लक्षित तैयारी जनरेट करता है। डीप-रिसर्च
ब्रीफ़ से अपने-आप डेटा लेता है।
स्टेप 21 — ऑफ़र मिल गया? Tracker स्थिति को Offer में अपडेट
करें और अपनी मूल्यांकन रिपोर्ट के comp सेक्शन को दोबारा देखें —
आपका न्यूनतम स्वीकार्य आँकड़ा वहीं है।
TL;DR — साइडबार का क्रम वर्कफ़्लो से मेल खाता है
Health → App settings → Profile → CV → Scan → Pipeline → Evaluate → Reports → Deep research → Apply checklist → Outreach → Tracker → Follow-up → Interview prep → Activity log
बस इतना ही। शून्य से ऑफ़र तक, बटन-दर-बटन 21 स्टेप।
वन-क्लिक Auto-pipeline (#/auto) — 21-स्टेप शॉर्टकट
अगर आप बस एक ख़ास पोस्टिंग को जल्दी स्कोर करना चाहते हैं, तो मैन्युअल वॉकथ्रू छोड़ दें। साइडबार → ✨ Auto-pipeline (या Dashboard पर ✨ बटन) एक समर्पित स्क्रीन खोलता है: जॉब URL पेस्ट करें, Enter दबाएँ या ▶ Run full pipeline क्लिक करें, और सर्वर पूरी चेन को एक अवलोकन-योग्य पास में चलाता है:
- Validating URL — SSRF-सुरक्षित जाँच (
isValidJobUrl); loopback /file:/ private IP / स्क्रिप्ट कैरेक्टर को रिजेक्ट करता है। - Fetching job description —
safeGet(DNS-पिन्ड, रीडायरेक्ट- रीवैलिडेटेड) JD खींचता है + सैनिटाइज़ करता है। - Evaluating against your CV — Anthropic (पसंदीदा) → Gemini फ़ॉलबैक → कुंजी न होने पर मैन्युअल-प्रॉम्प्ट।
- Saving report — हेडर में स्कोर + वैधता के साथ
reports/<slug>.mdलिखता है। - Adding to tracker —
data/applications.mdमें एक पंक्ति जोड़ता है।
लाइव फ़ीडबैक एक वर्टिकल स्टेपर है (हर स्टेप running → done /
failed में जगमगाता है)। यह aria-current वाली एक ऑर्डर्ड लिस्ट है
जिसमें सक्रिय स्टेप पर एक विनम्र स्क्रीन-रीडर लाइव-रीजन हर ट्रांज़िशन
की घोषणा करता है। सफलता पर परिणाम कार्ड सेव की गई रिपोर्ट
(View report · N/5) और tracker से सीधे डीप-लिंक करता है। कोई
विफल स्टेप अपने मैसेज के साथ लाल चिह्नित होता है और बटन फिर से सक्षम
हो जाता है ताकि आप बिना रीलोड किए URL ठीक करके फिर कोशिश कर सकें।
API कुंजी नहीं है? पाइपलाइन मैनुअल मोड में चलती है: स्टेप 3–5 संक्षिप्त हो जाते हैं और आपको पेस्ट-करने-लायक तैयार प्रॉम्प्ट कार्ड मिलता है (Claude Code / Anthropic / Gemini में पेस्ट करें)। कोई लाइव LLM कॉल नहीं, कोई खर्च नहीं।
#/auto लिंक-योग्य है: #/auto?url=<encoded>&go=1 स्क्रीन खोलता है
और अपने-आप शुरू करता है। Dashboard ✨ बटन और यह साइडबार एंट्री दोनों
यहीं पहुँचते हैं (एक सुसंगत फ़्लो — pre-1.34 का क्षणिक मोडल इस पेज
में प्रोमोट कर दिया गया)।
CLI (v1.38.0)। एक कमांड पूरी चेन करता है:
career-ops-ui setup(बूटस्ट्रैप → इंस्टॉल → स्टार्ट)। स्टैंडअलोन वर्ब:career-ops-ui doctor(env/keys/tooling जाँच — Health पेज जैसा ही इंजन; किसी भी आवश्यक विफलता पर exit 1),career-ops-ui run,career-ops-ui init(provider+key विज़ार्ड, v1.39.0)। Providers (v1.39.0)। API-keys टैब में एकLLM_PROVIDERselect जुड़ता है (auto= Anthropic→Gemini डिफ़ॉल्ट ·claude·gemini) और एकOPENAI_API_KEYफ़ील्ड (Codex/OpenCode CLI साइड)।career-ops-ui initइसी के लिए एक इंटरैक्टिव विज़ार्ड है।Providers (v1.57.0)। हेडलेस लाइव-eval अब Anthropic → Gemini → OpenAI → Qwen → OpenRouter तक फैला है (
autoक्रम;LLM_PROVIDERएक को पिन करता है)। OpenRouter — एकOPENROUTER_API_KEY300+ मॉडल के सामने;OPENROUTER_MODELड्रॉपडाउन OpenRouter की लाइव सूची लोड करता है (सर्वर-साइड प्रॉक्सी, क्यूरेटेड ऑफ़लाइन फ़ॉलबैक)। साथ ही ठीक किया गया: अंत में newline / आस-पास स्पेस के साथ पेस्ट की गई कुंजियाँ अब वैलिडेशन से पहले ट्रिम हो जाती हैं, ताकि/#/configकिसी भी प्रोवाइडर के लिए “validation failed” न दिखाए।
2. ऐप सेटिंग्स & API कुंजियाँ (#/config)
v1.55 → v1.56 में नया। जब कोई LLM कुंजी सेट न हो, हर स्क्रीन पर एक लाल बैनर बताता है कि ⚡ Run-live मैनुअल-प्रॉम्प्ट मोड में है और यहाँ लिंक करता है; कुंजी सेट होते ही यह सक्रिय प्रोवाइडर का नाम लेने वाला एक शांत चिप बन जाता है। किसी भी ⚡ Run-live बटन (
#/auto,#/evaluate,#/deep, modes) से पहले एक ईमानदार लागत अनुमान दिखता है (जैसे “Estimated cost: OpenAI gpt-5-codex · ~$0.04/eval”, या मैनुअल मोड में कोई-API-लागत-नहीं वाला नोट)।#/scanद्वितीयक फ़िल्टर को एक Advanced filters डिस्क्लोज़र के पीछे छुपाता है;#/trackerमें क्लिक-योग्य फ़नल चिप्स + वैकल्पिक सर्वर-साइड पेजिनेशन जुड़ता है;#/pipeline1000 पंक्तियों से आगे वर्चुअलाइज़ करता है।
तीन टैब:
- API keys & runtime — पैरेंट प्रोजेक्ट की
.env(वही फ़ाइल जो career-ops Node स्क्रिप्ट स्टार्टअप पर पढ़ती हैं) पर एक संरचित फ़ील्ड फ़ॉर्म। समूहीकृत: API keys / Runtime / Regional sources। यह टैब प्रति-प्रोवाइडर मॉडल सिलेक्टर भी दिखाता है —ANTHROPIC_MODELऔरGEMINI_MODELके साथOPENAI_MODEL(OpenAI/Codex)। - Profile —
config/profile.ymlपर फ़ील्ड-दर-फ़ील्ड फ़ॉर्म (web-ui 1.32.0)। Save फ़ाइल में मर्ज होता है — आपके archetypes, proof points, और कोई भी कस्टम कुंजी अछूती बची रहती है। - Modes —
modes/_profile.mdके लिए संरचित फ़ील्ड-फ़ॉर्म (web-ui 1.54.3), दस्तावेज़ीकृत स्कीमा से व्युत्पन्न। लिस्ट-टाइप सेक्शन — Target Roles / Adaptive Framing / Comp Targets — दोहराए जा सकने वाले लाइन-आइटम इनपुट के रूप में रेंडर होते हैं (पंक्तियाँ जोड़ें/हटाएँ); गद्य (prose) सेक्शन — Exit Narrative / Location Policy — लेबल किए गए टेक्स्टएरिया के रूप में रेंडर होते हैं; कोई भी अज्ञात या गैर-लिस्ट सेक्शन एक लेबल किए गए शब्दशः टेक्स्टएरिया पर फ़ॉलबैक होता है। Save अब भी सेक्शन के अनुसार मर्ज होता है — प्रीएम्बल, अछूते सेक्शन, और कोई भी कस्टम सेक्शन बाइट-दर-बाइट सुरक्षित रहते हैं। पूरी-फ़ाइल एडिट के लिए — सेक्शन जोड़ना/हटाना या प्रीएम्बल एडिट करना — एक Advanced: raw markdown डिस्क्लोज़र बना रहता है।
किसी भी टैब में एक Save तुरंत लागू हो जाता है — सर्वर रीस्टार्ट की ज़रूरत नहीं।
अपना LLM प्रोवाइडर सेट अप करना (चरण-दर-चरण)। वेब UI का ⚡ लाइव
मूल्यांकन हेडलेस चलता है और एक API कुंजी उपयोग करता है। यह “OR”
के ज़रिए काम करता है — इनमें से कोई भी एक सेट करें और यह बस काम
करता है; कई सेट होने पर, auto इस क्रम में उन्हें प्राथमिकता देता
है: Anthropic → Gemini → OpenAI → Qwen। (career-ops खुद CLI-अज्ञेय
है — आप इसे Claude Code, Cursor, Codex, Gemini, OpenCode, Antigravity, Grok Build, Qwen, Copilot या
Kimi के अंदर भी चला सकते हैं; वह इस हेडलेस कुंजी से अलग है।)
#/config→ API keys & runtime टैब खोलें।LLM_PROVIDERमें अपना प्रोवाइडर चुनें:auto(जो भी कुंजी सेट है उसे उपयोग करें), याclaude/gemini/openai/qwenमें से किसी एक को ज़बरदस्ती चुनें।- आपके चुने प्रोवाइडर के लिए कुंजी + मॉडल भरें:
- Anthropic —
ANTHROPIC_API_KEYसेट करें (console.anthropic.com), वैकल्पिक रूप सेANTHROPIC_MODEL(डिफ़ॉल्टclaude-sonnet-4-6)। - Gemini —
GEMINI_API_KEYसेट करें (aistudio.google.com/apikey), वैकल्पिक रूप सेGEMINI_MODEL(डिफ़ॉल्टgemini-3.6-flash)। - OpenAI —
OPENAI_API_KEYसेट करें (platform.openai.com), वैकल्पिक रूप सेOPENAI_MODEL(डिफ़ॉल्टgpt-5-codex)। - Qwen —
QWEN_API_KEYसेट करें (Alibaba Model Studio / DashScope, dashscope.console.aliyun.com), वैकल्पिक रूप सेQWEN_MODEL(डिफ़ॉल्टqwen-max)। मेनलैंड-CN एंडपॉइंट के लिए कच्ची.envमेंQWEN_BASE_URLसेट करें।
- Anthropic —
- Save क्लिक करें। कुंजियाँ पैरेंट प्रोजेक्ट की
.envमें लिखी जाती हैं; परिवर्तन तुरंत लागू होता है — सर्वर रीस्टार्ट की ज़रूरत नहीं। #/evaluateपर सत्यापित करें: कोई जॉब URL/विवरण पेस्ट करें और ⚡ Run live दबाएँ। परिणाम हेडर दिखाता है कि कौन-सा प्रोवाइडर चला (anthropic/gemini/openai/qwen)। कहीं भी कोई कुंजी सेट न होने पर → आपको कॉपी-पेस्ट मैनुअल प्रॉम्प्ट मिलता है।
Save करने के बाद रहस्य (secrets) मास्क कर दिए जाते हैं और कभी लॉग
नहीं होते। Model-id फ़ील्ड (*_MODEL) गुप्त नहीं हैं।
Profile टैब (फ़ील्ड फ़ॉर्म — v1.32.0)
v1.32.0 से पहले यह टैब एक ही कच्चा-YAML टेक्स्टएरिया था जहाँ हर सेटिंग एक अविभेदित ब्लॉब में रहती थी। अब यह एक संरचित फ़ॉर्म है, फ़ील्ड तीन कोलैप्सिबल सेक्शन में समूहीकृत हैं:
- Candidate — Full name (आवश्यक), Email, Phone, Location, LinkedIn, GitHub, Portfolio URL, X / Twitter।
- Narrative — Headline, Exit story।
- Compensation — Target range, Currency, Walk-away minimum, Location flexibility।
- संरचित ऐरे एडिटर (web-ui 1.35.0) — लिस्ट-आकार वाले फ़ील्ड के लिए पंक्ति-जोड़ें/हटाएँ एडिटर, ताकि अब इन्हें भी कच्ची YAML की ज़रूरत न रहे: Target roles + Superpowers (स्ट्रिंग लिस्ट); Archetypes (name / level / fit पंक्तियाँ); Proof points (name / url / hero-metric पंक्तियाँ)। खाली पंक्तियाँ हटा दी जाती हैं; एक खाली की गई लिस्ट कुंजी को साफ़-सुथरे तरीके से हटा देती है। वही मर्ज-न-कि-रिप्लेस की गारंटी — हर ऐरे जिसे आप नहीं छूते वह अछूता बचा रहता है।
Save कैसे सुरक्षित है:
- फ़ॉर्म केवल 14 मॉडलेड स्केलर पथ भेजता है
{ fields: { "candidate.full_name": … } }के रूप में। सर्वर मौजूदाconfig/profile.ymlपढ़ता है, केवल उन्हीं लीफ़ को सेट/क्लियर करता है, और पूरे ऑब्जेक्ट को फिर से सीरियलाइज़ करता है — इसलिए जो नेस्टेड ऐरे फ़ॉर्म मॉडल नहीं करता (target_roles.archetypes,narrative.proof_points,narrative.superpowers) और आपने हाथ से जोड़ी कोई कस्टम कुंजी राउंड-ट्रिप में अछूती बच जाती है। किसी फ़ील्ड को क्लियर करने से वह कुंजी साफ़-सुथरे तरीके से हट जाती है (कोईphone: ""अवशेष नहीं)। - वैलिडेशन में अब भी पूरा नाम आवश्यक है;
# Career-Ops Profile Configurationहेडर अपने-आप स्टैम्प होता है। - एक ट्रेडऑफ़: फ़ील्ड-फ़ॉर्म Save YAML को फिर से सीरियलाइज़ करता है,
इसलिए इनलाइन
#कमेंट खो जाते हैं। कमेंट सुरक्षित रखने या नेस्टेड ऐरे एडिट करने के लिए, टैब के नीचे Advanced: edit raw YAML डिस्क्लोज़र उपयोग करें — यह pre-1.32 पूरी-फ़ाइल एडिटर है, अपरिवर्तित (Save पर पूरी फ़ाइल बदल देता है)। #/profileपर रीड-ओनली सारांश इसका दृश्य साथी है।
पहचाने गए कुंजी-नाम
| Key | यह क्या करता है | कहाँ से लें |
|---|---|---|
ANTHROPIC_API_KEY |
लाइव Anthropic SDK कॉल सक्षम करता है। जब Anthropic + Gemini दोनों सेट हों तो पसंदीदा — JD स्कोरिंग और डीप रिसर्च के लिए बेहतर लंबे-फ़ॉर्म संरचित आउटपुट। | https://console.anthropic.com/settings/keys |
ANTHROPIC_MODEL |
डिफ़ॉल्ट claude-sonnet-4-6 को ओवरराइड करें। कठिन रीज़निंग के लिए claude-opus-4-7, सस्ते-और-तेज़ के लिए claude-haiku-4-5-20251001 आज़माएँ। |
— |
GEMINI_API_KEY |
कोई Anthropic कुंजी न होने पर फ़ॉलबैक। oferta मोड के लिए gemini-eval.mjs द्वारा उपयोग किया जाता है। कम मात्रा के लिए फ़्री टियर काम करता है। |
https://aistudio.google.com/apikey |
GEMINI_MODEL |
डिफ़ॉल्ट Gemini मॉडल ओवरराइड करें। | — |
(सर्वर डिफ़ॉल्ट UA उपयोग करता है) |
रूस के बाहर से hh.ru स्कैन चलाते समय ज़रूरी (सादे User-Agent पर API 403 लौटाता है)। https://dev.hh.ru/admin पर एक ऐप रजिस्टर करें और उसकी UA स्ट्रिंग उपयोग करें। |
dev.hh.ru |
PORT |
Express बाइंड पोर्ट। डिफ़ॉल्ट 4317। | — |
HOST |
बाइंड पता। डिफ़ॉल्ट 127.0.0.1। 0.0.0.0 सेट करने से UI LAN पर एक्सपोज़ हो जाता है — अभी तक कोई ऑथ गेट नहीं, Production-readiness दस्तावेज़ देखें। |
— |
व्यवहार
- Read (
GET /api/config) हर पहचानी गई कुंजी लौटाता है। गुप्त कुंजियाँ (ANTHROPIC_API_KEY,GEMINI_API_KEY) मास्क्ड हैं — आपsk-ant•••••••a1b2देखते हैं, कभी पूरा मान नहीं। - Save (
POST /api/config) हर मान वैलिडेट करता है,<parent>/.envमें लिखता है, और तुरंत चल रही प्रक्रिया पर लागू करता है। रीस्टार्ट की ज़रूरत नहीं। - खाली मान कुंजी को हटा देता है। अगर आप किसी रूसी IP / VPN को अनयूज़ करना चाहते हैं तो उपयोगी है।
स्मोक-टेस्ट बटन
Save करने के बाद, ▶ Test Anthropic या ▶ Test Gemini क्लिक करें — दोनों एक छोटा प्रॉम्प्ट (≤256 टोकन आउटपुट) फ़ायर करते हैं ताकि कुंजी सही से वायर्ड है यह पुष्टि करते हुए आप लगभग कुछ भी खर्च न करें। सफलता पर ~200-कैरेक्टर का सैंपल लौटाता है।
AI CLI tools टैब। career-ops Claude-Code-driven है पर ओपन स्किल
स्टैंडर्ड पर किसी भी एजेंट CLI के साथ काम करता है। AI CLI tools
टैब उन्हें सूचीबद्ध करता है जिन्हें यह जानता है — Claude Code, Cursor, Codex,
Gemini CLI, OpenCode, GitHub Copilot CLI, Qwen, Antigravity, Kimi CLI, Grok Build CLI — और
दिखाता है कि कौन-से सर्वर चलाने वाली मशीन पर इंस्टॉल हैं और
कहाँ। यह सर्वर के PATH का एक रीड-ओनली स्कैन है: यह केवल जाँचता है
कि बाइनरी मौजूद है या नहीं, यह इसे कभी नहीं चलाता (कोई
--version नहीं, कोई एक्ज़ीक्यूशन नहीं), और कुछ भी नहीं लिखता। अगर
कुछ भी न दिखे, तो टर्मिनल से पाइपलाइन चलाने के लिए एक इंस्टॉल करें
(जैसे Claude Code)।
Appearance — कंपनी लोगो। Appearance कार्ड में एक टॉगल है:
Show company logos in the scan table। डिफ़ॉल्ट रूप से बंद। चालू
होने पर, हर स्कैन पंक्ति कंपनी का लोगो दिखाती है — उसका favicon
उसी के अपने डोमेन से लाया गया और सर्वर के ज़रिए प्रॉक्सी किया गया
(/api/logo), ताकि किसी भी तीसरे-पक्ष लोगो सेवा को कभी पता न चले
कि आप किन नियोक्ताओं को देख रहे हैं। किसी साझा जॉब बोर्ड (Greenhouse,
Lever, Ashby, …) पर होस्ट की गई पोस्टिंग बोर्ड के आइकन के बजाय एक
रंगीन लेटर बैज दिखाती है, और लोड होने में विफल कोई भी लोगो उसी
बैज पर फ़ॉलबैक होता है। यह पूरी तरह सजावटी है — कुछ भी नहीं लिखा
जाता और कोई CV/profile डेटा शामिल नहीं होता।
3. Profile (#/profile — #/settings से भी पहुँचा जा सकता है)
config/profile.yml का एक रीड-ओनली सारांश कार्ड व्यू। एडिट करने
के लिए, App settings → Profile टैब (#/config → Profile) पर
जाएँ — web-ui 1.32.0 से यह फ़ील्ड-दर-फ़ील्ड फ़ॉर्म है (Candidate /
Narrative / Compensation), कच्चा-YAML ब्लॉब नहीं। Save उसी फ़ाइल में
मर्ज होता है; यह पेज रीलोड पर दोबारा पार्स करता है।
सबसे ज़्यादा मायने रखने वाले फ़ील्ड:
candidate.full_name— हर प्रॉम्प्ट में उपयोग होता है। किसी भी चीज़ को असल में स्कैन करने से पहले टेम्प्लेटJane Smithबदल दें, वरना आपके जनरेट किए गए कवर लेटर प्लेसहोल्डर नाम के साथ जाएँगे।candidate.email,linkedin,github— कवर-लेटर जनरेशन और अप्लाई चेकलिस्ट में संदर्भित।target.roles— स्वीकृत जॉब टाइटल। स्कैनर का पॉज़िटिव फ़िल्टर इसे परोक्ष रूप से (portals.yml::title_filterके ज़रिए) उपयोग करता है।target.comp_total_min_usd— न्यूनतम कुल compensation। हर मूल्यांकन का सेक्शन D इससे कम ऑफ़र फ़्लैग करता है।target.archetypes— सबसे महत्वपूर्ण फ़ील्ड। ये वे करियर पैटर्न हैं जिन्हें आप स्वीकार करते हैं (जैसेTech-Lead-Backend,Founding-Engineer,Data-Platform)। हर JD का इनके मुकाबले मिलान किया जाता है और सबसे अच्छा-फ़िट आर्किटाइप रिपोर्ट हेडर में जाता है।
Health पेज एक Profile customized चेक दिखाता है जो तब तक विफल
रहता है जब तक full_name किसी ज्ञात प्लेसहोल्डर नाम से मेल खाता
है।
4. CV (#/cv)
हर मूल्यांकन, डीप रिसर्च, और कवर लेटर के लिए एकल सत्य स्रोत। पैरेंट
प्रोजेक्ट रूट में cv.md में रहता है।
एडिटिंग विकल्प
- इसे सीधे पेस्ट करें — बाईं ओर का टेक्स्टएरिया एक मार्कडाउन एडिटर है। दायाँ पेन वही दिखाता है जो LLM (और आपका भावी रिक्रूटर) देखता है।
- 📁 Upload CV — इनमें से किसी भी फ़ॉर्मैट में एक लोकल फ़ाइल
चुनें और सर्वर इसे आपके लिए मार्कडाउन में बदल देता है:
- टेक्स्ट फ़ॉर्मैट —
.md,.markdown,.txt,.html,.htmसीधे पास हो जाते हैं (HTML pandoc → GFM मार्कडाउन से होकर जाता है)। - ऑफ़िस फ़ॉर्मैट —
.docx,.doc,.odt,.rtfको pandoc के ज़रिए बदला जाता है (macOS परbrew install pandoc, Linux परapt install pandoc)। - PDF —
.pdfको Poppler के pdftotext के ज़रिए निकाला जाता है (brew install poppler/apt install poppler-utils)। - बदला गया मार्कडाउन एडिटर में आ जाता है; सहेजने के लिए 💾 Save क्लिक करें। नतीजा सैनिटाइज़्ड है (पेस्ट जैसा ही XSS स्ट्रिप)।
- सख़्त सीमा: प्रति अपलोड 10 MB। बड़ी फ़ाइलें → 413।
- टेक्स्ट फ़ॉर्मैट —
- LinkedIn से — सबसे आसान रास्ता: पैरेंट प्रोजेक्ट में Claude
Code खोलें,
/career-opsचलाएँ, अपना LinkedIn URL पेस्ट करें, और पूछेंextract my CV from this and write it to cv.md।
क्या सैनिटाइज़ होता है
सर्वर-साइड, /api/cv पर हर PUT stripDangerousMarkdown से होकर
गुज़रता है:
<script>,<iframe>,<object>,<embed>,<svg>,<style>,<form>टैग — पूरी तरह हटाए जाते हैं।- इनलाइन इवेंट हैंडलर (
onclick=,onerror=, आदि) — हटाए जाते हैं। javascript:,vbscript:,data:text/htmlURI स्कीम — निष्प्रभावी कर दी जाती हैं।
जब भी ऊपर में से कुछ हटाया जाता है, प्रतिक्रिया में sanitized: true
शामिल होता है, ताकि आपको पता चले कि स्रोत में कुछ गड़बड़ था या नहीं।
अधिकतम बॉडी साइज़: 1 MB। इससे बड़ा कुछ भी 413 लौटाता है।
अन्य बटन
- sync-check — पैरेंट प्रोजेक्ट में
cv-sync-check.mjsचलाता है। असंगतियाँ फ़्लैग करता है: आपके CV में सूचीबद्ध कोई प्रोजेक्ट जोdata/applications.mdआर्किटाइप में नहीं है, आदि। - 📄 Generate PDF —
generate-pdf.mjsस्ट्रीम करता है। आउटपुटoutput/*.pdfमें जाता है। Playwright ज़रूरी है (Health पेज दिखाता है कि यह पैरेंट केnode_modulesमें इंस्टॉल है या नहीं)। जनरेशन पूरा होने पर, सबसे नई PDF आपके डिफ़ॉल्ट Downloads फ़ोल्डर में ऑटो-डाउनलोड हो जाती है; पेज पर मौजूद सूची पहले जनरेट की गई हर फ़ाइल रखती है।
टोन / फ़ॉर्मैट टिप्स
- एक बुलेट = एक मीट्रिक वाली उपलब्धि। हर मूल्यांकन रूब्रिक के लिए “Reduced p99 latency by 38%”, “improved performance” से बेहतर है।
- सेक्शन इस क्रम में: Summary (3–5 पंक्तियाँ), Experience (रिवर्स-क्रोनोलॉजिकल), Projects (अधिकतम 5), Education, Skills (डुप्लिकेट-रहित, कोई बज़वर्ड सूप नहीं)।
- इसे 1500 शब्दों से कम रखें। स्कोरिंग रूब्रिक सघन जानकारी उपयोग करता है; फैला हुआ CV शोर के लिए दंडित होता है।
5. पोर्टल्स & सोर्स (portals.yml)
स्कैनर कॉन्फ़िग पैरेंट रूट में portals.yml में रहता है। तीन सेक्शन
मायने रखते हैं। SPA के तीन सेक्शन (नीचे) कैननिकल career-ops.org
स्कीमा से
scan-job-portals
1:1 मेल खाते हैं।
शॉर्टकट:
#/portalsURL अब सीधे App settings पर रिज़ॉल्व होता है और (जब कोई क्षेत्रीय स्रोत कॉन्फ़िगर हो) Regional sources समूह पर कूद जाता है — इसलिए बुकमार्क किया गया या टाइप किया गया#/portalsलिंक अब 404 नहीं होता (v1.42.0)।
title_filter
title_filter:
positive: [backend, engineer, senior, tech lead, golang, php]
negative: [junior, intern, frontend, ios, android, java]
seniority_boost: [Senior, Staff, Lead, Principal]
स्कैन की गई कोई वैकेंसी तभी पास होती है जब उसके टाइटल में कम-से-कम एक पॉज़िटिव कीवर्ड हो AND कोई भी नेगेटिव कीवर्ड न हो। दोनों को ट्यून करें। कीवर्ड केस-असंवेदनशील सबस्ट्रिंग हैं।
seniority_boost तीसरी title-filter कुंजी है। यहाँ सूचीबद्ध कीवर्ड
कुछ भी बाहर फ़िल्टर नहीं करते — वे मैच होने वाली जॉब्स को नतीजों में
ऊपर धकेल देते हैं ताकि “Senior Backend Engineer” किसी “Engineer” से
ऊपर आए। डिफ़ॉल्ट: ["Senior", "Staff", "Lead"]। अपने टारगेट रोल्स
के शीर्षकों के अनुसार ट्यून करें।
स्पष्टता के लिए 3–5 पॉज़िटिव कीवर्ड से शुरू करें; बाद में विस्तार करें।
location_filter (वैकल्पिक — web-ui 1.33.0, parent #570)
location_filter:
allow:
- "Remote"
- "United States"
- "Atlanta"
block:
- "India"
- "London"
- "Germany"
स्कैन की गई वैकेंसी को उनकी location स्ट्रिंग (केस-असंवेदनशील
सबस्ट्रिंग) से फ़िल्टर करता है, ATS स्वीप और क्षेत्रीय स्वीप दोनों
द्वारा लागू। सिमैंटिक्स, कैननिकल career-ops scan.mjs जैसे ही:
- कोई
location_filterकुंजी नहीं → हर location पास होता है (डिफ़ॉल्ट)। - खाली/गायब location वाली वैकेंसी → पास होती है (गायब डेटा को दंडित नहीं किया जाता)।
- कोई
blockकीवर्ड मैच → रिजेक्ट (block, allow पर वरीयता रखता है)। allowखाली → पास होता है (block पहले ही इसे साफ़ कर चुका है)।allowगैर-खाली → कम-से-कम एक कीवर्ड से मेल खाना ज़रूरी है।
portals.yml में शीर्ष-स्तरीय कुंजी (title_filter की सिबलिंग,
russian_portals के अंदर नेस्टेड नहीं)। इसका उपयोग उन जॉब्स को
हटाने के लिए करें जो title फ़िल्टर से बच गईं पर किसी ऐसे क्षेत्र में
हैं जिसे आप नहीं ले सकते।
स्पष्टता के लिए 3–5 पॉज़िटिव कीवर्ड से शुरू करें; बाद में विस्तार करें।
content_filter (वैकल्पिक — web-ui 1.75.0, parent #974)।
location_filter का एक शीर्ष-स्तरीय सिबलिंग, वही positive /
negative कीवर्ड लिस्ट के साथ, लेकिन location के बजाय किसी
पोस्टिंग के description / snippet टेक्स्ट के मुकाबले मैच किया
जाता है:
content_filter:
positive: ["python", "machine learning"]
negative: ["security clearance", "on-site only"]
location_filter जैसे ही सिमैंटिक्स: कोई कुंजी नहीं → सब कुछ पास
होता है; खाली/गायब description वाली पोस्टिंग पास होती है (गायब
डेटा दंडित नहीं होता); negative मैच → रिजेक्ट; positive खाली →
पास होता है; positive गैर-खाली → कम-से-कम एक कीवर्ड से मेल खाना
ज़रूरी है (केस-असंवेदनशील सबस्ट्रिंग)। ATS और क्षेत्रीय दोनों
स्वीप द्वारा लागू। केवल वे स्रोत प्रभावित होते हैं जो
description/snippet देते हैं (जैसे RSS) — बाक़ी हर पोस्टिंग पास हो
जाती है — इसलिए इसे सक्षम करने से बॉडी न रखने वाले स्रोतों से कभी
चुपचाप पंक्तियाँ नहीं गिरतीं। इसका उपयोग किसी title-पास पोस्टिंग को
हटाने के लिए करें जिसकी बॉडी में कोई डील-ब्रेकर उजागर हो।
trust_filter (वैकल्पिक — web-ui 1.76.0, parent career-ops v1.13.0)।
एक शीर्ष-स्तरीय ब्लॉक जो हर स्कैन की गई पोस्टिंग को (कभी हटाता नहीं,
केवल) एनोटेट करता है एक trust स्कोर (0–100), एक level (high /
medium / low) और फ़्लैग के साथ। मौजूद और डिसेबल न होने तक बंद:
trust_filter:
enabled: true
suspicious_domains: ["bit.ly", "tinyurl.com"] # optional — overrides the default shortener list
ats_allowlist: ["greenhouse.io", "ashbyhq.com"] # optional — overrides the default ATS host allowlist
ह्यूरिस्टिक्स: गायब apply URL (−40), अमान्य URL (−50), संदिग्ध
शॉर्टनर डोमेन (−25), कंपनी↔डोमेन मिसमैच (−15, ज्ञात ATS होस्ट के लिए
छोड़ दिया जाता है)। high से नीचे की पोस्टिंग को #/scan तालिका में
एक भाषा-निरपेक्ष ⚠ score बैज मिलता है (टूलटिप फ़्लैग कोड सूचीबद्ध
करता है), ताकि आप कुछ भी फ़िल्टर किए बिना निम्न-trust पंक्तियों को
नज़र से देख सकें। pre-1.76 व्यवहार (कोई एनोटेशन नहीं, कोई बैज नहीं)
बनाए रखने के लिए ब्लॉक को पूरी तरह छोड़ दें।
search_queries
search_queries:
- name: "Greenhouse — Rails Engineer"
query: 'site:job-boards.greenhouse.io "Rails Engineer" OR "Ruby on Rails" remote'
enabled: true
- name: "Ashby — Senior Backend"
query: 'site:jobs.ashbyhq.com "Senior Backend" remote'
enabled: false
search_queries AI-संचालित Option B स्कैन (Claude Code के अंदर
/career-ops scan / Codex) को चलाता है। ये in-process npm run scan
(जो केवल पब्लिक बोर्ड API हिट करता है) द्वारा एक्ज़ीक्यूट नहीं होते।
इनका उपयोग तब करें जब आप ऐसी कंपनियों में रोल खोजना चाहते हैं जो
अभी तक tracked_companies में नहीं हैं। किसी एंट्री को बिना चलाए
रखने के लिए enabled: false सेट करें।
tracked_companies
tracked_companies:
- { name: Stripe, enabled: true, careers_url: https://job-boards.greenhouse.io/stripe }
- { name: Linear, enabled: true, careers_url: https://jobs.ashbyhq.com/linear }
- { name: JetBrains, enabled: true, careers_url: https://jobs.lever.co/jetbrains }
प्रति एंट्री आवश्यक फ़ील्ड: name और careers_url। वैकल्पिक:
api (स्पष्ट Greenhouse / Ashby / Lever / Workable / SmartRecruiters
/ Workday एंडपॉइंट), बिना एंट्री हटाए शामिल/बहिष्कृत करने के लिए
enabled: true|false। ATS स्कैनर URL पैटर्न से ATS पहचानता है
(job-boards.greenhouse.io/<slug> → Greenhouse, आदि) और हर कंपनी का
पब्लिक boards-api सीधे फ़ेच करता है। पहचाने न जा सकने वाले ATS वाली
कंपनियाँ छोड़ दी जाती हैं (/#/scan पर Active Companies कार्ड
उन्हें ○ के साथ धूसर (gray) में दिखाता है)।
प्रति-टेनेंट ATS प्रोवाइडर (v1.76.0 — parent career-ops v1.13.0
समानता)। छह और ATS careers_url (या स्पष्ट api:) से सीधे
ऑटो-डिटेक्ट होते हैं, किसी provider: की ज़रूरत नहीं:
tracked_companies:
- { name: Acme, enabled: true, careers_url: https://acme.bamboohr.com } # BambooHR
- { name: Foo, enabled: true, careers_url: https://foo.breezy.hr } # Breezy HR
- { name: Bar, enabled: true, careers_url: https://bar.jobs.personio.de } # Personio (XML feed)
- { name: Baz, enabled: true, careers_url: https://baz.recruitee.com } # Recruitee
- { name: SolidCo, enabled: true, careers_url: https://solid.jobs/public-api/offers/it } # SolidJobs
# Comeet needs the full careers-api URL (uid + token aren't in the branded page):
- { name: ComeetCo, enabled: true, api: https://www.comeet.co/careers-api/2.0/company/<uid>/positions?token=<token> }
हर एक अपने होस्ट को एक एंकर्ड regex + redirect:'error' से पिन करता
है (SSRF-सुरक्षित)। पूर्ण कॉपी-पेस्ट एंट्री के लिए
docs/portals-examples.md देखें।
rss (RSS / Atom बोर्ड)
tracked_companies:
- { name: LaraJobs, enabled: true, provider: rss, rss: https://larajobs.com/feed }
- { name: WeWorkRemotely, enabled: true, provider: rss, rss: https://weworkremotely.com/remote-jobs.rss }
स्कैनर को किसी भी ऐसे जॉब बोर्ड पर इंगित करें जो RSS/Atom फ़ीड
प्रकाशित करता हो (LaraJobs, WeWorkRemotely, RemoteOK,
golangprojects, …), provider: rss वाली एक एंट्री जोड़कर, साथ में
एक rss: (या feed_url:) कुंजी — कोई कोड परिवर्तन नहीं। RSS
एडाप्टर हर <item> (CDATA + HTML entities, टाइटल/कंपनी टैग-स्ट्रिप्ड)
पार्स करता है, इसे एक जॉब में सामान्यीकृत करता है, और ATS स्रोतों
जैसा ही title_filter / location_filter + dedup + pipeline-append
फ़्लो चलाता है। इसके बाद RSS #/scan फ़िल्टर ड्रॉपडाउन में एक
चयन-योग्य स्रोत के रूप में दिखाई देता है। (web-ui v1.62.x)
russian_portals
russian_portals:
sources: ["hh", "habr", "trudvsem", "getmatch", "geekjob"] # or just one
area: 113 # 1=Moscow, 2=SPb, 113=Russia, 1001=remote
per_page: 50
only_remote: false
queries:
- "Senior PHP"
- "Senior Go"
- "Тимлид PHP"
queries hh.ru और Habr Career पर वैकेंसी टाइटल के मुकाबले
केस-असंवेदनशील सबस्ट्रिंग मैच हैं। negative लिस्ट के साथ ओवरलैप से
सावधान रहें — अगर "Senior PHP", queries में है पर "php"
title_filter.negative में आ जाता है, तो स्कैन शून्य नतीजे लौटाएगा
और कंसोल आपको इस टकराव के बारे में चेतावनी देगा।
रूसी पोर्टल कॉन्फ़िगर करना — विस्तृत सेटअप गाइड
v1.29.0 5 रूसी-भाषा एडाप्टर के साथ आता है। दो को डिफ़ॉल्ट UA के
अलावा कुछ नहीं चाहिए (habr-career, HTML स्क्रेप; trudvsem,
सरकारी open-data API — कोई कुंजी नहीं, कोई IP गेट नहीं)। दो टेक
बोर्ड के HTML स्क्रेप हैं (getmatch, geekjob — इन्हें भी कोई
कुंजी नहीं चाहिए)। एक कैननिकल hh.ru API है जो गैर-रूसी IP से 403 दे
सकता है जब तक आप App settings → API keys & runtime के ज़रिए
HH_USER_AGENT env var सेट न करें (या सर्वर को किसी रूसी IP /
VPN एग्ज़िट नोड से न चलाएँ)।
स्रोत सूची
| स्रोत कुंजी | प्रदर्शित लेबल | प्रकार | प्रमाणीकरण | भौगोलिक प्रतिबंध |
|---|---|---|---|---|
hh |
hh.ru | JSON API | वैकल्पिक HH_USER_AGENT |
गैर-RU IP 403 दे सकते हैं |
habr |
Habr Career | HTML | कोई नहीं | कोई नहीं |
trudvsem |
Trudvsem | JSON API (open-data) | कोई नहीं | कोई नहीं |
getmatch |
GetMatch | HTML | कोई नहीं | कोई नहीं |
geekjob |
GeekJob | HTML | कोई नहीं | कोई नहीं |
स्टेप 1 — portals.yml खोलें
यह फ़ाइल पैरेंट career-ops/ रूट में रहती है (web-ui/ के अंदर
नहीं)। अगर यह अभी तक मौजूद नहीं है, तो पैरेंट प्रोजेक्ट के साथ आया
उदाहरण कॉपी करें:
# from the parent career-ops/ root (NOT web-ui/)
cp templates/portals.example.yml portals.yml
$EDITOR portals.yml
स्टेप 2 — सभी 5 स्रोत सक्षम करें
आप जिन सभी स्रोतों को स्कैन करना चाहते हैं उन्हें सूचीबद्ध करने के
लिए russian_portals ब्लॉक जोड़ें या अपडेट करें। ऐरे में क्रम
अप्रासंगिक है; स्कैनर उन्हें रजिस्ट्री क्रम में चलाता है।
russian_portals:
sources: ["hh", "habr", "trudvsem", "getmatch", "geekjob"]
area: 113 # 1=Moscow, 2=SPb, 113=Russia, 1001=remote
per_page: 50 # how many vacancies per query per source
only_remote: false # set true to keep only remote postings
queries:
- "Senior PHP"
- "Senior Go"
- "Backend Senior"
- "Тимлид PHP"
स्टेप 3 — queries और फ़िल्टर ट्यून करें
queries वे स्ट्रिंग हैं जिनका उपयोग स्कैनर हर स्रोत को खोजने के
लिए करता है। हर query हर स्रोत पर एक बार चलती है — इसलिए 4 queries ×
5 स्रोत = प्रति स्कैन 20 कॉल। स्कैन समय को एक मिनट से कम रखने के
लिए लिस्ट को केंद्रित रखें (3–7 queries)। area hh.ru क्षेत्र कोड
है (बाक़ी स्रोत इसे नज़रअंदाज़ करते हैं)। per_page सीमित करता है कि
हर स्रोत प्रति query कितनी वैकेंसी लौटाता है। only_remote: true
एडाप्टर स्तर पर हर नतीजे को केवल-रिमोट तक फ़िल्टर करता है (नतीजा
तालिका में अब भी एक अलग Remote चिप है)।
आम गड़बड़ियाँ
Negative-list टकराव। अगर किसी query का कोई शब्द ("php",
"senior") title_filter.negative में भी दिखता है, तो हर नतीजा
आपको दिखने से पहले ही फ़िल्टर हो जाता है। स्कैनर स्कैन के समय एक
stderr टकराव चेतावनी देता है — ⚠ config: query "Senior PHP" contains "php" which is in the negative list पंक्ति देखें। टकराने
वाले शब्द को negative से हटाकर ठीक करें:
title_filter:
positive: [backend, senior, lead, php, go, golang, python]
negative: [junior, intern, frontend, ios, android]
russian_portals:
queries:
- "Senior PHP" # OK — "php" no longer in negative list
- "Senior Go"
किसी स्रोत को अस्थायी रूप से डिसेबल करना
किसी स्रोत का डेटा हटाए बिना उसे डिसेबल करने के लिए, बस उसकी कुंजी
sources से हटा दें:
russian_portals:
sources: ["hh", "habr", "trudvsem"] # only 3 of 5 sources will run
सेटअप सत्यापित करना
portals.yml सहेजने के बाद:
# 1. Save portals.yml.
# 2. In the SPA, switch to #/scan.
# 3. Click 🌐 Scan now.
# 4. Watch the SSE log for the per-source line per query:
# "Senior PHP"
# hh.ru 18
# habr 21
# trudvsem 3
# getmatch 0
# geekjob 2
# A value of 0 is normal for some queries — it just means that
# source had no matches. A "geo-blocked" or "timeout" line means
# the adapter reached the site but couldn't read results.
CLI बूटस्ट्रैप फ़्लो (scan-job-portals)
कैननिकल career-ops सेटअप (पैरेंट रूट से एक बार चलाएँ):
cp templates/portals.example.yml portals.yml
$EDITOR portals.yml
यही पूरा बूटस्ट्रैप है। तीन सेक्शन एडिट करें (title_filter,
tracked_companies, search_queries, वैकल्पिक russian_portals),
सहेजें, और आप स्कैन करने के लिए तैयार हैं।
SPA बूटस्ट्रैप व्यवहार
पहली बार चलाने पर सर्वर portals.yml में एक दस्तावेज़ीकृत
russian_portals: ब्लॉक जोड़ता है अगर यह गायब हो — यह इडेम्पोटेंट है
(दूसरा बूट कोई-ऑप है क्योंकि शाब्दिक russian_portals: पंक्ति अब
वहाँ है)। अंग्रेज़ी सेक्शन अपने-आप इंजेक्ट नहीं होते; वे ऊपर दिए
कैननिकल बूटस्ट्रैप के अनुसार आपके द्वारा कॉपी किए गए
templates/portals.example.yml से आते हैं।
री-अप्लाई कूलडाउन (v1.84.0)। स्कैन को उन रोल्स को दोबारा सामने
लाने से रोकने के लिए जिनके लिए आप पहले ही अप्लाई कर चुके हैं,
config/profile.yml में एक re_apply_windows: ब्लॉक जोड़ें। प्रति
कंपनी आप last_apply_date (YYYY-MM-DD), same_role_days (कूलडाउन
लंबाई), applied_to: (आपने जिन रोल टाइटल के लिए अप्लाई किया उनकी
लिस्ट), और एक वैकल्पिक cross_role_bucket (अंडरस्कोर कीवर्ड, जैसे
backend_em) सेट करते हैं। जब तक today,
last_apply_date + same_role_days से पहले है, उस कंपनी में स्कैन
की गई कोई भी रोल जिसका टाइटल applied_to (सबस्ट्रिंग) या बकेट
कीवर्ड से मेल खाता है, छोड़ दी जाती है — स्कैन लॉग
Cooldown skipped: N दिखाता है और वे पंक्तियाँ कभी नतीजा तालिका या
pipeline.md तक नहीं पहुँचतीं। कंपनी मिलान विराम-चिह्न-असंवेदनशील
और शब्द-सीमा-सजग है (Acme Inc, Acme, Inc. से मेल खाता है)। कोई
re_apply_windows: कुंजी न होने पर कोई कूलडाउन नहीं (डिफ़ॉल्ट)।
pipeline.md में Compensation (v1.84.0)। जब किसी स्कैन किए गए
ऑफ़र में सैलरी हो, तो इसे data/pipeline.md में एक वैकल्पिक ट्रेलिंग
कॉलम के रूप में जोड़ दिया जाता है — url | salary — URL के साथ।
URL ही dedup कुंजी रहता है (जब pipeline वापस पढ़ी जाती है तो salary
कॉलम हटा दिया जाता है), सेल इस तरह सैनिटाइज़्ड है कि यह कोई पंक्ति
या स्प्रेडशीट फ़ॉर्मूला इंजेक्ट न कर सके, और मौजूदा बेयर-URL
pipelines बिना बदलाव के काम करती रहती हैं।
6. Health (#/health)
हर सेटअप गेट, OK / OPTIONAL / FAIL बैज में दिखता है। कोई भी “काम नहीं कर रहा” वाला इशू फ़ाइल करने से पहले इसे ज़रूर पढ़ें।
AI उपयोग और लागत (#/usage). साइडबार में Health के बगल में, AI usage पेज दिखाता है कि आपने live AI जनरेशन — evaluations, reports, chats — पर पिछले 24 घंटों, 7 दिनों, 30 दिनों और पूरे समय में हर प्रोवाइडर के हिसाब से कितने टोकन खर्च किए हैं, साथ में एक अनुमानित USD लागत भी। हर live प्रोवाइडर कॉल data/llm-usage.jsonl में एक छोटा सा {provider, in, out} रिकॉर्ड जोड़ती है; कहीं भी कुछ नहीं भेजा जाता। डॉलर का आँकड़ा सिर्फ़ एक संपादन-योग्य प्राइस टेबल (server/lib/llm-pricing.mjs) से लगाया गया अनुमान है — टोकन काउंट सटीक हैं, लेकिन कीमतें अनुमानित लिस्ट-प्राइस हैं जिन्हें आप अपने प्लान के हिसाब से ठीक कर सकते हैं। बिना API key (मैनुअल मोड) के रन कोई खर्च नहीं करते और दर्ज नहीं होते। एक कॉम्पैक्ट USAGE मीटर हर पेज पर बाएँ साइडबार के सबसे नीचे भी पिन रहता है — वही 24h / 7d / 30d टोकन टोटल और एक अनुमानित 24-घंटे की लागत, लाइव रिफ़्रेश होती हुई; मेन्यू हमेशा इसके ऊपर साफ़ बना रहता है, और इसके हेडर पर क्लिक करने से यह collapse हो जाता है।
आवश्यक जाँचें (इनके बिना सिस्टम काम नहीं कर सकता)
Node version≥ 18 — सर्वर नेटिवfetchऔरnode:testका इस्तेमाल करता है।Project root— किCAREER_OPS_ROOT(env या ऑटो-डिटेक्टेड) मौजूद है।cv.md,config/profile.yml,portals.yml,data/applications.md,data/pipeline.md,modes/oferta.md।
वैकल्पिक जाँचें (सिर्फ़ चेतावनियाँ)
Profile customized—candidate.full_nameटेम्पलेट वाला प्लेसहोल्डर नहीं है।GEMINI_API_KEY/ANTHROPIC_API_KEY—.envमें सेट किया गया है।(server uses default UA)— यह तभी मायने रखता है जब आप hh.ru को रूस के बाहर से स्कैन करें।Playwright (parent node_modules)— PDF जनरेशन औरcheck-liveness.mjsके लिए ज़रूरी। इंस्टॉल करेंcd $CAREER_OPS_ROOT && npm install && npx playwright install chromium।Parent project dependencies— अगर मौजूद न हो तोcd $CAREER_OPS_ROOT && npm installचलाएँ।data/,reports/,output/,jds/डायरेक्टरीज़ — पहली बार लिखते समय ऑटो-क्रिएट होती हैं।
जब सर्वर loopback से बाहर एक्सपोज़ किया जाता है (HOST=0.0.0.0) तो
absolute paths और सटीक Node वर्शन को रिस्पॉन्स में "hidden" से बदल दिया
जाता है ताकि कोई जिज्ञासु पड़ोसी आपकी इंस्टॉल का फ़िंगरप्रिंट न ले सके।
रन बटन
- ▶ Doctor
node doctor.mjsचलाता है और आउटपुट को एक मॉडल में दिखाता है। - ▶ Verify pipeline
node verify-pipeline.mjsचलाता है।
7. Scan (#/scan)
स्कैनर हर enabled बोर्ड को क्रॉल करता है, आपकी हिस्ट्री के मुक़ाबले
डीड्यूप्लिकेट करता है, और हिट्स को data/last-scan.json तथा
data/pipeline.md में लिख देता है।
One-click scan (SPA)
🌐 Scan एक ही स्वीप में हर enabled सोर्स को चलाता है:
- Greenhouse / Ashby / Lever / Workable / SmartRecruiters / Workday (ATS स्वीप) —
tracked_companiesमें हर उस कंपनी के लिए जिसका ATS URL पहचाना जा सके। - v1.75.0 वाले एग्रीगेटर्स,
tracked_companiesकी हर उस एंट्री के लिए जो किसी एक को चुनती है: RemoteOK / Remotive / Working Nomads (बोर्ड-वाइड रिमोट फ़ीड्स,provider: <slug>) और IBM / Arbeitsagentur / Glints / Jobstreet · SEEK (कॉन्फ़िग-ड्रिवन, प्रति-एंट्री<provider>:ब्लॉक)। - hh.ru API + Habr Career + Trudvsem + GetMatch + GeekJob —
russian_portalsकी हर क्वेरी के लिए।
दो चरण, एक क्लिक (v1.29.2)। सिंगल 🌐 Scan बटन एक ही SSE स्ट्रीम में ATS स्वीप और रीजनल स्वीप दोनों को चलाता है। आपको लॉग में क्रम से दो फ़ेज़ हेडर दिखेंगे:
▶ ATS scan (Greenhouse + Ashby + Lever)— EN ATS बोर्ड्स।▶ Regional scan (hh.ru + Habr Career)— रजिस्ट्री से 5 RU सोर्स।
हर फ़ेज़ एक ✓ done · NEW=N सारांश के साथ ख़त्म होता है। अगर आपको सिर्फ़ ATS फ़ेज़ दिखे, तो आपका स्टैंड pre-v1.29.2 बिल्ड पर है — अपग्रेड करें। v1.29.2 से पहले SSE क्लाइंट पहले ही done इवेंट पर बंद हो जाता था और रीजनल फ़ेज़ चुपचाप ड्रॉप हो जाता था (tests/scan-stream-multi-phase.test.mjs इसकी रेग्रेशन नेट है)।
स्कैन चलते समय लाइव SSE लॉग दाएँ पैन में स्ट्रीम होता है। रोकने के लिए
Stop पर क्लिक करें (या बस दूर नैविगेट कर जाएँ) — सर्वर
in-flight HTTPS रिक्वेस्ट्स को AbortController के ज़रिए कैंसिल कर देता है।
नतीजे फ़िल्टर करना
लॉग के नीचे, रिज़ल्ट्स टेबल data/last-scan.json से रो रेंडर करती है।
Search + Exclude (v1.109.0)। Search बॉक्स आपका “roles to find” फ़िल्टर है — एक या ज़्यादा टर्म कॉमा से अलग करके टाइप करें, और अगर कोई रो उनमें से किसी भी से मैच करे (OR) तो वह दिखेगी। नया Exclude बॉक्स इसका उल्टा करता है: कॉमा-सेपरेटेड शब्द जो किसी भी ऐसी रो को छुपा देते हैं जिसकी company / role / location में वे मिलें (जैसे senior, staff, java को एक्सक्लूड करना)। दोनों को आपकी saved searches के साथ remote / source / country / posted-within / salary फ़िल्टर्स के साथ याद रखा जाता है।
v1.76.0 — कोई रिज़ल्ट कैप नहीं। पहले के बिल्ड प्रति रीजन ज़्यादा से ज़्यादा 2000 मैचिंग रो (
MAX_STORED_RESULTS) स्टोर करते थे, जिससे किसी बड़े स्वीप की बाक़ी एंट्रीज़ चुपचाप छिप जाती थीं। वह कैप अब हटा दी गई है: हर मैच हुई पोस्टिंग स्टोर होती है और टेबल बस उनके पेज बनाकर दिखाती है (प्रति पेज 200 — टेबल के नीचे pager कंट्रोल्स का इस्तेमाल करें)। कुछ भी ड्रॉप नहीं होता; आप बस पेज पलटते हैं।
v1.78.1 — लाइव ऑटो-रिफ़्रेश। रिज़ल्ट्स टेबल अब स्कैन चलते समय अपने आप अपडेट होती है और स्कैन ख़त्म होने के तुरंत बाद फिर से — किसी मैन्युअल रीलोड या पेज स्विच की ज़रूरत नहीं। हर स्कैन की शुरुआत में कैश रीसेट होकर फिर से भरा जाता है।
v1.80.0 — Max per source और source quarantine। Scan बटन के बगल में मौजूद Max per source फ़ील्ड यह सीमित करती है कि हर बोर्ड कितनी नौकरियाँ दे सकता है (empty/0 = असीमित, डिफ़ॉल्ट) — तब उपयोगी जब कोई एक बहुत बड़ा बोर्ड बाक़ी सब पर हावी हो जाता। अलग से, जो भी सोर्स लगातार 404 / 410 लौटाता है वह
data/scan-quarantine.jsonमें लिख दिया जाता है और बाद के स्कैन में स्किप हो जाता है (self-healing: 14 दिन बाद फिर आज़माया जाता है), ताकि मृत slug लॉग को स्पैम न करें।portals.ymlमेंscan_quarantine: falseसे इसे बंद करें।
फ़िल्टर:
- Free text — title / company के मुक़ाबले सबस्ट्रिंग मैच।
- Source ड्रॉपडाउन — Arbeitsagentur / Ashby / BambooHR / Breezy HR / Comeet / GeekJob / Glints / Greenhouse / GetMatch / Habr Career / hh.ru / IBM / Jobstreet · SEEK / Lever / Personio / Recruitee / RemoteOK / Remotive / RSS / SmartRecruiters / SolidJobs / Teamtailor / Trudvsem / We Work Remotely / Workable / Workday / Working Nomads (
GET /api/scan/sourcesसे ऑटो-पॉपुलेटेड)। - Remote / Hybrid / Onsite ड्रॉपडाउन।
- Country ड्रॉपडाउन (v1.78.0) — एक जियोग्राफ़ी फ़िल्टर जो मौजूदा रिज़ल्ट्स में मिले देशों से पॉपुलेट होता है, हर एक अपने फ़्लैग इमोजी और गिनती के साथ (जैसे
🇩🇪 Germany (12))। किसी एक को चुनें ताकि सिर्फ़ उस देश से जुड़ी भूमिकाएँ बचें। डिटेक्शन किसी पोस्टिंग के फ़्री-टेक्स्ट location (देश के नाम/उपनाम + लगभग 100 प्रमुख जॉब-मार्केट शहर) को किसी देश से मैप करता है; यह सतर्क रहता है और कभी अंदाज़ा नहीं लगाता, इसलिए जिस पोस्टिंग का location हल न हो पाए — या शुद्ध “Remote” लिस्टिंग — वह All countries में ही रहती है। इसे work-type ड्रॉपडाउन के साथ मिलाकर country-bound और remote दोनों तरह की भूमिकाएँ ढूँढें। - Posted within ड्रॉपडाउन (v1.80.0) — एक क्लाइंट-साइड एज फ़िल्टर (Last 24 hours / 7 days / 30 days)। जिन रो का
pubDateइससे पुराना है वे छिप जाती हैं; जिन रो में कोई तारीख़ ही नहीं है वे पास हो जाती हैं (मिसिंग डेटा को दंडित नहीं किया जाता)। - ★ Favorites (v1.80.0) — किसी भी रो में ☆ पर क्लिक करके नौकरी को स्टार करें (URL के हिसाब से
localStorageमें स्टोर होता है); फ़िल्टर पैनल में ★ Favorites टिक करने पर सिर्फ़ स्टार्ड रो दिखती हैं। स्टार, स्कैन और रीलोड के बाद भी बने रहते हैं। - Saved searches (v1.80.0) — फ़िल्टर्स के ऊपर वाली बार: मौजूदा फ़िल्टर सेट को नाम दें और 💾 Save दबाएँ, फिर उसे ड्रॉपडाउन से फिर से लागू करें या 🗑 Delete से हटाएँ।
localStorageमें स्टोर होता है; कोई corrupt/edited वैल्यू साफ़-साफ़ खाली स्थिति में रीसेट हो जाती है। - Stack chips (PHP / Go / Backend / Senior / …) —
Skills.detectTechऔरSkills.detectLevelद्वारा हर रो के लिए ऑटो-डिटेक्ट होते हैं। मल्टी-सिलेक्ट इंटरसेक्शन —PHP + Seniorचुनने पर वे रो दिखती हैं जिनमें दोनों हों। - Dynamic chips स्टैटिक स्टैक चिप्स के नीचे — titles से आने वाले सबसे लगातार आने वाले टॉप-25 कैपिटलाइज़्ड टोकन, ताकि UI आपके असली स्कैन किए गए रोल्स (marketing, design, finance…) के हिसाब से ढल जाए, न कि सिर्फ़ backend-engineer वाली शब्दावली तक सीमित रहे।
Active Companies कार्ड
एक collapsible कार्ड जो portals.yml की हर कंपनी को उसके स्कैन
स्टेटस के साथ लिस्ट करता है:
- ✓ हरा टैग — डायरेक्ट API सपोर्ट (Greenhouse / Ashby / Lever / Workable / SmartRecruiters / Workday)।
- ○ स्लेटी टैग — web-search प्रॉम्प्ट पर फ़ॉलबैक (कोई API मैच नहीं)।
कंपनी के नाम पर क्लिक करें → ऊपर वाले रिज़ल्ट्स फ़िल्टर को उस
नाम से भर देता है। ↗ आइकन पर क्लिक करें → कंपनी का careers_url
एक नए टैब में खोलता है।
CLI स्कैन फ़्लो (scan-job-portals)
CLI की तरफ़ से स्कैन करने के दो तरीक़े हैं (दोनों उसी
data/pipeline.md में URL डालते हैं जिसे SPA पढ़ता है):
विकल्प A — डायरेक्ट स्क्रिप्ट (~30 सेकंड, ज़ीरो AI टोकन):
npm run scan # all Greenhouse/Ashby/Lever boards
npm run scan -- --dry-run # preview without persisting
npm run scan -- --company Anthropic # narrow to one tracked company
यह सिर्फ़ Greenhouse / Ashby / Lever / Workable / SmartRecruiters / Workday (पहचाने जाने योग्य ATS URL) के लिए काम करता है। कोई AI टोकन ख़र्च नहीं होता — यह सीधे पब्लिक बोर्ड्स API को हिट करता है।
विकल्प B — AI-पावर्ड ब्राउज़र स्कैन:
/career-ops scan
Claude Code / Cursor / Codex / OpenCode / Antigravity CLI / Grok Build CLI / Qwen Code / Kimi / GitHub Copilot CLI (Gemini CLI legacy) के अंदर। मॉडल टोकन इस्तेमाल
करता है। हर tracked_companies पेज पर सीधे जाता है और non-API बोर्ड्स
(career pages, कस्टम ATS, रीजनल पोर्टल्स) भी खोज सकता है। धीमा पर
ज़्यादा व्यापक। तब उपयोगी जब ATS स्वीप किसी ऐसे टारगेट के लिए कुछ न
लौटाए जिसके बारे में आप जानते हों कि वहाँ हायरिंग चल रही है।
आउटपुट (दोनों पाथ) — नए JD URL data/pipeline.md में जोड़े जाते
हैं, हर विज़िट किया गया URL data/scan-history.tsv में लॉग होता है
(भविष्य के सभी स्कैन में डीड्यूप के लिए), और एक सारांश प्रिंट होता है:
कितनी कंपनियाँ स्कैन हुईं · कितनी नौकरियाँ मिलीं · title से फ़िल्टर
हुईं · कितने डुप्लिकेट स्किप हुए · कितने नए ऑफ़र जुड़े।
स्कोर के हिसाब से एक्शन थ्रेशहोल्ड (/career-ops pipeline द्वारा
नए URL को बैच-स्कोर करने के बाद लागू होते हैं):
| स्कोर | अनुशंसित अगला क़दम |
|---|---|
| ≥ 4.5 | /career-ops apply — उच्च फ़िट, तुरंत आगे बढ़ें |
| 4.0 – 4.4 | अप्लाई करें, या वॉर्म इंट्रो के लिए /career-ops contacto |
| 3.5 – 3.9 | /career-ops deep — पहले रिसर्च करें |
| < 3.5 | जब तक कोई ख़ास निजी वजह न हो, छोड़ दें |
SPA के #/dashboard और #/tracker, 4.0 या उससे ऊपर वाली हर रो को
हाइलाइट करते हैं ताकि आप बिना कुछ दोबारा चलाए एक्शन चुन सकें।
फ़ॉलो-अप कमांड
स्कोरिंग के बाद, कैननिकल फ़ॉलो-अप ये हैं:
/career-ops apply— तैयार किए गए जवाबों के साथ आवेदन भरें/career-ops contacto— LinkedIn / ईमेल आउटरीच का ड्राफ़्ट बनाएँ/career-ops deep— कंपनी / भूमिका पर गहराई से रिसर्च करें/career-ops tracker— पाइपलाइन का स्टेटस देखें
hh.ru — वेबसाइट से स्कैन किया जाता है (जुलाई 2026 से रूसी IP ज़रूरी)
hh.ru को इसकी पब्लिक सर्च वेबसाइट (hh.ru/search/vacancy) पढ़कर स्कैन किया जाता है, बिल्कुल उसी तरह जैसे Habr Career को स्कैन किया जाता है — कोई key नहीं, कोई कॉन्फ़िगरेशन नहीं। लेकिन जुलाई 2026 से, hh.ru रूस के बाहर की IP को HTTP 451 (एक क्षेत्रीय क़ानूनी ब्लॉक) देता है, इसलिए स्कैन सिर्फ़ रूसी IP से काम करता है — सर्वर को रूस से चलाएँ या किसी रूसी exit node वाले VPN के ज़रिए। पहले 451 (या एक anti-bot 403) पर स्कैनर बाक़ी रन के लिए hh.ru को बंद कर देता है और लॉग में यह बता देता है, ताकि बाक़ी रूसी सोर्स फिर भी पूरे हो जाएँ। JSON API (api.hh.ru) जान-बूझकर इस्तेमाल नहीं किया जाता: यह किसी भी IP या User-Agent की परवाह किए बिना हर programmatic क्लाइंट को 403 forbidden लौटाता है।
यहाँ तक कि जो नेटवर्क सही लगे, hh.ru फिर भी egress IP को VPN/प्रॉक्सी के तौर पर फ़्लैग कर सकता है (कोई भी datacenter/hosting IP गिना जाता है) और स्कैन को एक /vpncheeck इंटरस्टिशियल (“VPN мешает работе сайта”) पर 302-रीडायरेक्ट कर देता है, जो HTTP 200 के साथ शून्य वैकेंसी लौटाता है। स्कैनर इस रीडायरेक्ट को पहचान लेता है, बाक़ी रन के लिए hh.ru को बंद कर देता है और लॉग में यह बता देता है। इसका समाधान नेटवर्क साइड पर है: सुनिश्चित करें कि ट्रैफ़िक वाक़ई किसी residential IP से निकल रहा है — एक सिस्टम-वाइड VPN या प्रॉक्सी अक्सर तब भी चालू रहता है जब ब्राउज़र का टॉगल बंद हो (अपनी असली egress IP जाँचें, जैसे api.ipify.org पर)।
8. Pipeline (#/pipeline)
मूल्यांकन का इंतज़ार कर रहे URL का इनबॉक्स। यह data/pipeline.md में
रहता है।
Overview strip (v1.109.0)। पेज के सबसे ऊपर एक कॉम्पैक्ट स्ट्रिप आपकी पाइपलाइन को एक नज़र में दिखाती है — कितने URL इनबॉक्स में हैं, कितनी रो ट्रैक्ड हैं, और आपके ट्रैकर से लिए गए Applied / Responded / Interview / Offer के काउंट। हर चिप सीधे #/tracker से लिंक होती है (स्टेटस चिप्स उसे फ़िल्टर करके खोलती हैं)। अगर ट्रैकर पढ़ा न जा सके तो यह सिर्फ़ इनबॉक्स काउंट तक सीमित हो जाती है।
URL जोड़ना
तीन तरीक़े हैं:
- इनपुट में URL टाइप / पेस्ट करें और + Add पर क्लिक करें।
- टॉप-बार ग्लोबल सर्च का इस्तेमाल करें (इसका बैज Enter पढ़ता है):
कोई भी
http(s)://…लिंक पेस्ट करें और auto-pipeline खोलने के लिए Enter दबाएँ; कोई भी और टेक्स्ट टाइप करने पर Enter उस टर्म को पहले से भरे हुए#/scanपर ले जाता है (v1.78.1)। Ctrl/Cmd+K अब भी उस बॉक्स को फ़ोकस करता है जहाँ ब्राउज़र इसकी इजाज़त देता है। ब्रांड logo डैशबोर्ड पर वापस ले जाता है। - एक Scan चलाएँ (ऊपर देखें) — नए हिट अपने-आप पाइपलाइन में चले जाते हैं।
हर URL सर्वर-साइड पर isValidJobUrl() से होकर गुज़रता है। Loopback
(localhost, 127.0.0.1), file://, javascript:, IP लिटरल, और
टेम्पलेट कैरेक्टर (<, >, ") वाली स्ट्रिंग — सब पर 400 आता है।
सर्वर-साइड प्रीव्यू पैन
किसी भी पाइपलाइन रो पर क्लिक करने से दाईं ओर एक प्रीव्यू लोड होता है।
ज़्यादातर ATS बोर्ड CORS हेडर नहीं भेजते इसलिए ब्राउज़र उन्हें सीधे
फ़ेच नहीं कर सकता; सर्वर रिक्वेस्ट को प्रॉक्सी करता है, <script> /
<style> / HTML टैग हटाता है, और 8 KB तक प्लेन टेक्स्ट लौटाता है।
प्रीव्यू प्रॉक्सी रीडायरेक्ट्स को मैन्युअली, प्रति-हॉप SSRF वैलिडेशन
के साथ फ़ॉलो करती है — हर Location हेडर दोबारा isValidJobUrl()
से गुज़रता है, ताकि कोई हानिकारक बोर्ड आपको loopback / प्राइवेट IP /
file:// पर न उछाल सके। ज़्यादा से ज़्यादा 3 हॉप, 15-सेकंड का टाइमआउट।
रो एक्शन
- ▶ —
#/evaluate?url=…पर ले जाता है, URL पहले से भरा हुआ। - ✕ — URL को
data/pipeline.mdसे हटा देता है।
ऊपर-दाईं ओर के बटन
- ⚡ Evaluate first — क़तार में पहले URL को Evaluate पेज पर खोलता है, स्कोर करने के लिए तैयार।
- Scan — और URL चाहिए तो वापस स्कैनर पर।
9. Evaluate (#/evaluate)
किसी एक Job Description को cv.md और config/profile.yml के मुक़ाबले
स्कोर करता है। modes/oferta.md के अनुसार एक स्ट्रक्चर्ड A–G
मूल्यांकन, साथ में 0–5 स्कोर लौटाता है।
इनपुट
JD को टेक्स्टएरिया में पेस्ट करें, या #/pipeline से
?url=<href> के साथ यहाँ पहुँचें — पेज उस URL को उसी SSRF-सेफ़
प्रॉक्सी से फ़ेच करता है जो pipeline प्रीव्यू के लिए इस्तेमाल होती है
और टेक्स्टएरिया को पहले से भर देता है।
JD को ऑडिट ट्रेल के लिए jds/jd-<date>-<ts>.txt में सेव करने के लिए
💾 Save JD पर क्लिक करें (या API कॉल में save: true पास करें —
असर वही रहता है)।
फ़ॉलबैक चेन
- Anthropic — जब
ANTHROPIC_API_KEYसेट हो तो प्राथमिकता मिलती है। सर्वर प्रॉम्प्ट से पहलेcv.md,config/profile.yml,modes/_shared.md, औरmodes/oferta.mdको एक<project_context>ब्लॉक में बंडल करता है (हर फ़ाइल 16 KB तक सीमित, पूरा प्रॉम्प्ट 200 KB तक soft-capped)। सीधे पेज पर ग्राउंडेड मार्कडाउन लौटाता है। - Gemini — जब सिर्फ़
GEMINI_API_KEYसेट हो। सर्वर JD को एक टेम्प फ़ाइल के तौर परgemini-eval.mjsको स्पॉन करता है। रूटीन स्कोरिंग के लिए फ़्री-टियर मॉडल (gemini-3.6-flash) ठीक है। - Manual — कोई key सेट नहीं है। पेज एक पूरी तरह तैयार प्रॉम्प्ट लौटाता है जिसे आप Claude Code, ChatGPT, या किसी भी और LLM में पेस्ट कर सकते हैं।
आउटपुट सेक्शन (कैननिकल career-ops.org A-F)
v1.15.0 रीअलाइनमेंट। ब्लॉक लेटर अब कैननिकल career-ops.org स्कीमा से मेल खाते हैं। Pre-v1.15 रिपोर्ट A–G इस्तेमाल करती थीं (
C=Risks,F=Verdict,G=Legitimacyके साथ); हम उन्हें बैकवर्ड कम्पैटिबिलिटी के लिए अब भी वैसे ही रेंडर करते हैं, लेकिन नई रिपोर्ट नीचे दिए कैननिकल अर्थों के साथ A–F जारी करती हैं। Score और Legitimacy अब रिपोर्ट हेडर में रहते हैं (score: 4.2/5,legitimacy: High|Medium|Low)।
A. Role Summary — 3-बुलेट रीकैप (जोखिमों का इशारा इनलाइन में)।
B. CV Match — टॉप 3 मैच होने वाले स्किल्स + टॉप 3 गुम स्किल्स।
C. Strategy — सिफ़ारिश: अभी अप्लाई करें / पहले contacto / पहले
deep / छोड़ दें। v1.15 से पहले यह Risks था।
D. Compensation — आपके target.comp_total_min_usd (legacy) या
compensation.target_range (canonical) के सापेक्ष।
E. Personalization — किस एंगल से शुरुआत करें, आर्केटाइप के हिसाब
से फ़्रेमिंग, कवर लेटर / आउटरीच में ज़िक्र करने लायक़ हुक्स। v1.15 से
पहले यह Application Strategy था।
F. STAR stories — भूमिका के हिसाब से तैयार 1–3 पेस्ट-रेडी
S-T-A-R ब्लॉक। v1.15 से पहले यह Verdict (कच्चा स्कोर) था; स्कोर अब
रिपोर्ट हेडर में legitimacy के साथ दिखता है।
रिपोर्ट सेव करना
मार्कडाउन को reports/<date>-<company>-<role>.md में सेव करने के
लिए 💾 Save report (या API कॉल में save टॉगल) पर क्लिक करें।
रिपोर्ट का पार्स किया गया हेडर (Score / Legitimacy / URL) Reports
पेज और Dashboard पर दिखता है।
10+ JD होने पर बैच-मूल्यांकन
एक अकेले JD के लिए यह #/evaluate पेज सही टूल है। पाइपलाइन में क़तार
में लगे 10+ URL के लिए, प्रति-JD क्लिक-थ्रू व्यावहारिक नहीं रहता —
§14 के Batch evaluate सब-सेक्शन पर जाएँ (parent से
./batch/batch-runner.sh चलाना), इसे रातभर चलने दें, फिर नतीजों के
लिए #/reports / #/tracker पर वापस आएँ। पूरा फ़्लो:
batch-evaluate-offers।
10. Reports (#/reports)
हर सेव किए गए मूल्यांकन को ब्राउज़ करें। कार्ड title, date, legitimacy फ़्लैग, और स्कोर दिखाते हैं (रंग-कोडेड: हरा ≥ 4.0, पीला ≥ 3.0, इससे नीचे लाल)।
पूरा मार्कडाउन पढ़ने के लिए किसी कार्ड पर क्लिक करें। पेजिनेशन: प्रति पेज 12; कंट्रोल्स सबसे नीचे।
सिंगल-रिपोर्ट व्यू में ये भी हैं:
- ← All reports — ग्रिड पर वापस।
- 🔗 Open JD — मूल जॉब पोस्टिंग को एक नए टैब में खोलता है।
11. ट्रैकर (#/tracker)
यह CRM है। प्रत्येक आवेदन के लिए एक पंक्ति; यह data/applications.md में
GitHub-Flavored Markdown टेबल के रूप में रहती है।
स्थिति प्रवाह
Evaluated → Applied → Responded → Interview → Offer /
Hired / Rejected / Discarded / SKIP.
Hired (v1.118.0) अंतिम सुखद स्थिति है — जब ऑफर स्वीकार कर लिया गया हो। ट्रैकर इसे एक उत्सवी बैज से चिह्नित करता है और इसे job-landed बैनर के साथ स्वागत करता है।
स्टेज-टैब बोर्ड (v1.131.0)। तालिका के ऊपर एक स्टेज-टैब स्ट्रिप आपको फ़नल पर चलने देती है: एक All टैब प्लस हर कैननिकल स्टेटस के लिए एक टैब, हर एक लाइव संपूर्ण-इतिहास गिनती दिखाता है — शून्य-गिनती वाले स्टेज सहित, ताकि पूरा पाइपलाइन एक नज़र में हमेशा दिखे। किसी स्टेज पर क्लिक करने से तालिका उसी पर फ़िल्टर हो जाती है; फिर से क्लिक करने पर All पर वापस लौट आती है। टैब्स (और गिनतियों में स्थानीयकृत/लेगेसी स्टेटस उपनामों का फ़ोल्डिंग) GET /api/tracker/stages से आते हैं, जो वही templates/states.yml पढ़ता है जिसे सर्वर उपयोग करता है — ताकि टैब सेट पैरेंट की स्टेटस शब्दावली के साथ स्वतः समक्रमित रहे, पेज पर कोई हार्डकोडेड सूची नहीं। Search, स्कोर फ़िल्टर, सॉर्ट करने योग्य कॉलम और प्रति-पंक्ति report/PDF/legitimacy अपरिवर्तित हैं; लोगो सक्षम होने पर, हर पंक्ति की कंपनी एक ब्रांड मार्क दिखाती है।
स्थिति की व्हाइटलिस्ट सर्वर-साइड पर लागू होती है; POST /api/tracker
में कुछ और भेजने पर डिफ़ॉल्ट रूप से Evaluated सेट हो जाता है। मानक
Evaluated → Applied संक्रमण तब स्वचालित होता है जब आप /career-ops apply
(देखें §14) के अंत में Submitted. की पुष्टि करते हैं।
कॉलम संरचना
| कॉलम | यह क्या है |
|---|---|
# |
ऑटो-नंबरिंग, ज़ीरो-पैडेड (001, 002, …). |
Date |
ISO तिथि (YYYY-MM-DD). डिफ़ॉल्ट रूप से आज की तिथि। |
Company |
मुक्त पाठ। पाइप (|) और नई-पंक्तियाँ स्वतः एस्केप हो जाती हैं। |
Role |
वही व्यवहार। |
Score |
N/5 प्रारूप (जैसे, 4.2/5). |
Status |
व्हाइटलिस्टेड enum। |
PDF |
✅ जब इस पंक्ति के लिए generate-pdf.mjs सफल हो गया हो। |
Report |
संबंधित reports/*.md का Markdown लिंक। |
Notes |
मुक्त पाठ, 200 वर्णों तक सीमित। |
फ़िल्टर
- Status ड्रॉपडाउन।
- Score ड्रॉपडाउन —
≥ 4.0(उच्च),≥ 3.0(मध्यम),< 3.0(निम्न). - Search — कंपनी + भूमिका में सबस्ट्रिंग मिलान।
हर फ़िल्टर पेजिनेटर को पृष्ठ 1 पर रीसेट कर देता है। प्रति पृष्ठ 25 पंक्तियाँ।
रखरखाव बटन
- ▶ Normalize
normalize-statuses.mjsचलाता है — स्थिति की वर्तनी को पुनः-कैनोनिकल बनाता है (applied→Applied,interview→Interview). - ▶ Dedup
dedup-tracker.mjsचलाता है —(company, role)के आधार पर केस-असंवेदनशील डुप्लिकेट हटाता है। - ▶ Merge
merge-tracker.mjsचलाता है — यहbatch/tracker-additions/*.tsvसे लंबित प्रविष्टियाँ खींचता है (जहाँ पैरेंट का बैच फ्लो Apply हेल्पर के माध्यम से सबमिट किए गए आवेदनों को छोड़ता है)। यह डुप्लिकेट हटाता है और प्रोसेस की गई फ़ाइलों कोbatch/tracker-additions/merged/में संग्रहीत करता है। अपस्ट्रीम बैच फ्लो के लिए batch-evaluate-offers देखें।
पंक्तियाँ जोड़ना
POST /api/tracker — बॉडी { company, role, score?, status?, url?, reportSlug?, notes?, date? }. (company, role) के आधार पर केस-असंवेदनशील
डिडुप। UI से, Evaluate पृष्ठ सफल स्कोर के बाद एक “Add to tracker” बटन
प्रस्तुत करता है।
12. डीप रिसर्च (#/deep)
एक संरचित कंपनी ब्रीफ़ बनाएँ: स्नैपशॉट, इंजीनियरिंग संस्कृति, हालिया समाचार, Glassdoor भावना, साक्षात्कार प्रक्रिया, बातचीत के लीवरेज बिंदु, और रिक्रूटर से पूछने के लिए तीन समझदार प्रश्न।
इनपुट
दो फ़ील्ड — कंपनी का नाम और (वैकल्पिक) भूमिका। मोड टेम्पलेट
(modes/deep.md) ही इसकी संरचना तय करता है।
आउटपुट पथ
Evaluate जैसी ही फ़ॉलबैक श्रृंखला:
- Anthropic लाइव (पसंदीदा) —
bundleProjectContextcv + profile +_shared.md+deep.mdको इनलाइन करता है। आउटपुट: 10–30 KB का आधारभूत markdown, जोinterview-prep/<company>-<role>.mdमें सहेजा जाता है। - Gemini लाइव —
gemini-eval.mjsइनवोकेशन। वही सेव लक्ष्य। - मैनुअल प्रॉम्प्ट — पृष्ठ आपको Claude Code के लिए एक तैयार प्रॉम्प्ट देता है (जिसमें WebFetch + WebSearch है और जो वास्तविक शोध कर सकता है)।
सुझाव
claude-sonnet-4-6पर Anthropic आमतौर पर प्रति कॉल 1–3 मिनट में लगभग 13 KB का उपयोगी पाठ लौटाता है।- Anthropic SDK में कोई अंतर्निहित वेब खोज नहीं है। जिन भूमिकाओं के लिए आपको ताज़ा समाचार + Glassdoor भावना चाहिए, उनके लिए मैनुअल प्रॉम्प्ट को Claude Code में पेस्ट करें और इसे इसके WebFetch टूल का उपयोग करने दें।
- लाइव रन शुल्क योग्य होते हैं; एक Sonnet 4.6 डीप-रिसर्च कॉल की लागत लगभग $0.30–0.50 होती है।
13. मोड प्रॉम्प्ट (सात /#/<mode> पृष्ठ)
कैडेंस बोर्ड (v1.117.0)। Follow-up पृष्ठ अब पैरेंट के followup-cadence.mjs
द्वारा संचालित एक निर्धारित कैडेंस बोर्ड के साथ खुलता है: प्रति-आवेदन
अत्यावश्यकता (🔴 अर्जेंट / 🟠 ओवरड्यू / 🟡 प्रतीक्षारत / 🔵 ठंडा) अगले चरण
तक के दिनों के साथ, साथ ही एक Seed follow-up dates बटन जो हर Applied
पंक्ति के लिए पहली फ़ॉलो-अप तिथि पिन करता है (followup-seed.mjs --backfill).
पैरेंट स्क्रिप्ट के बिना बोर्ड एक ईमानदार “उपलब्ध नहीं है” संदेश दिखाता है।
सात प्रॉम्प्ट बिल्डर: Project आइडिया, Training योजनाएँ,
Follow-up ईमेल, Batch मूल्यांकन, रिक्रूटरों को Outreach,
Interview prep वन-पेजर, और Patterns रेट्रोस्पेक्टिव। प्रत्येक एक
विशिष्ट modes/<slug>.md टेम्पलेट को रैप करता है:
| पृष्ठ | Slug | उद्देश्य |
|---|---|---|
#/project |
project |
लक्षित भूमिका के लिए एक पोर्टफोलियो प्रोजेक्ट तैयार करें। |
#/training |
training |
कौशल-अंतराल विश्लेषण → पाठ्यक्रम। |
#/followup |
followup |
साक्षात्कार के बाद ईमेल का ड्राफ़्ट। |
#/batch |
batch |
बहु-JD बैच मूल्यांकन प्रॉम्प्ट। |
#/contacto |
contacto |
रिक्रूटर / रेफ़रल को आउटरीच संदेश। |
#/interview-prep |
interview-prep |
किसी विशिष्ट साक्षात्कार दौर के लिए वन-पेजर तैयारी। |
#/patterns |
patterns |
“किन पैटर्न ने मुझे सफल बनाया?” का चिंतनशील विश्लेषण। |
साझा संरचना
प्रत्येक पृष्ठ में एक छोटा फ़ॉर्म होता है (फ़ील्ड मोड-विशिष्ट होती हैं), एक ▶ Generate prompt बटन (मैनुअल), और — जब Anthropic या Gemini कुंजी मौजूद हो — एक ⚡ Run live बटन जो प्राथमिक बन जाता है।
▶ Generate prompt पर क्लिक करने से आपके फ़ॉर्म मूल्यों को
User-supplied context: ब्लॉक में JSON-स्ट्रिंगीफ़ाई करके असेंबल किया गया
प्रॉम्प्ट मिलता है, उसके बाद यथावत modes/<slug>.md टेम्पलेट आता है। इसे
कॉपी करके अपने पसंदीदा LLM में पेस्ट करें।
⚡ Run live पर क्लिक करने से वही प्रॉम्प्ट Anthropic (या Gemini) को
भेजा जाता है, जिसमें bundleProjectContext के माध्यम से cv.md +
profile.yml + _shared.md इनलाइन होते हैं। परिणाम पृष्ठ पर प्रदर्शित होता
है, कॉपी योग्य होता है, और .md के रूप में डाउनलोड योग्य होता है।
ये सात पृष्ठ एक स्पष्ट allowlist हैं — जिन मोड का समर्पित रूट है
(oferta → Evaluate, deep → Deep research) और जिन मोड को पैरेंट
प्रोजेक्ट केवल Claude Code के भीतर समर्थन करता है (apply, scan,
pipeline, tracker, pdf, latex, ofertas, auto-pipeline) जानबूझकर
इस UI से बाहर रखे गए हैं।
14. आवेदन चेकलिस्ट (#/apply)
एक बार जब आप आवेदन करने का निर्णय ले लें, तो यह Apply हेल्पर पृष्ठ वास्तविक
आवेदन चरण के लिए एक सबमिशन चेकलिस्ट तैयार करता है। यह फ़ॉर्म को स्वतः नहीं
भरता — वह प्रवाह Claude Code के भीतर /career-ops apply में रहता है, जो
पैरेंट प्रोजेक्ट में Playwright का उपयोग करता है।
SPA चेकलिस्ट मोड (#/apply)
SPA की चेकलिस्ट उन उपयोगकर्ताओं के लिए है जो Playwright चलाए बिना फ़ॉर्म को हाथ से भरना पसंद करते हैं। इसमें शामिल है:
- Playwright के माध्यम से फ़ॉर्म पढ़ने के लिए Claude Code में
/career-ops apply <url>चलाएँ (यदि आप हाथ से भर रहे हैं तो यह चरण छोड़ दें)। - सत्यापित करें कि पोस्टिंग अभी भी लाइव है (
check-liveness.mjs). - पुष्टि करें कि CV नवीनतम है (
cv-sync-check.mjs, फिर स्कोर ≥ 4.0 होने पर PDF). cv.mdके STAR+R प्रूफ़ पॉइंट्स का उपयोग करके कवर लेटर / “Why us?” उत्तर को अनुकूलित करें।- EEO / प्रायोजन / प्रारंभ-तिथि प्रश्नों का ईमानदारी से उत्तर दें।
- सबमिट करने से पहले भरे हुए उत्तरों को
interview-prep/{company}-{role}.mdमें सहेजें। - कभी भी स्वतः सबमिट न करें — अंतिम बटन आप (मानव) ही क्लिक करते हैं।
- सबमिट के बाद:
data/applications.mdमें पंक्ति जोड़ें (याbatch/tracker-additions/में TSV लिखें)।
मैनुअल भरना बनाम Playwright-सहायता प्राप्त
वास्तविक सबमिशन के लिए दो रास्ते:
- मैनुअल — सामान्य ब्राउज़र टैब में करियर पृष्ठ खोलें, ऊपर दी गई SPA चेकलिस्ट का पालन करें, उत्तर कॉपी/पेस्ट करें। Playwright की आवश्यकता नहीं। इसका उपयोग तब करें जब फ़ॉर्म छोटा हो या आपके पास Chromium इंस्टॉल न हो।
- Playwright-सहायता प्राप्त — Claude Code (पैरेंट प्रोजेक्ट) में
/career-ops apply <company>चलाएँ। Playwright अपना स्वयं का ब्राउज़र खोलता है, हर फ़ॉर्म फ़ील्ड पढ़ता है, नंबरयुक्त ड्राफ़्ट उत्तर लौटाता है। आप अभी भी Submit पर क्लिक करते हैं। इसका उपयोग तब करें जब फ़ॉर्म लंबा, डायनामिक हो, या आप यह ऑडिट ट्रेल चाहते हों कि किस प्रश्न का कौन-सा उत्तर था।
पूर्ण CLI आवेदन प्रवाह (apply-for-a-job)
पूर्वापेक्षाएँ:
- पहले
/career-ops pipelineचलाएँ ताकि JD के पासreports/के तहत एक मूल्यांकन रिपोर्ट हो। apply कमांड एक मौजूदा मूल्यांकन पर निर्भर करता है; यदि कोई न हो, तो पहले पाइपलाइन चलाएँ। - रिपोर्ट और प्रोफ़ाइल लोड होनी चाहिए।
- अनुशंसित: Playwright इंस्टॉल हो
(
npx playwright install chromium— नीचे Playwright सेटअप देखें)। अनुपस्थित होने पर WebFetch पर फ़ॉलबैक होता है (केवल-पाठ फ़ॉर्म पूर्वावलोकन, क्लिक-फ़िल नहीं)।
नंबरयुक्त प्रवाह (मानक 8 चरण):
-
कंपनी के नाम के साथ कमांड चलाएँ:
/career-ops apply <company>उदाहरण:
/career-ops apply Anthropic. बिना किसी आर्गुमेंट के, अगले टर्न में फ़ॉर्म का स्क्रीनशॉट, पेस्ट किया गया फ़ॉर्म पाठ, या आवेदन URL प्रदान करें। -
रिपोर्ट खोजें। सिस्टम
reports/में मिलान करने वाला मूल्यांकन ढूँढता है (जो पहले/career-ops pipelineया#/evaluateद्वारा बनाया गया था)। -
फ़ॉर्म खोलें। Playwright स्वचालित रूप से एक ब्राउज़र विंडो लॉन्च करता है — आप इसे स्वयं नहीं खोलते।
-
फ़ील्ड पढ़ें। सिस्टम हर फ़ॉर्म फ़ील्ड (लेबल, प्रकार, आवश्यक, सेलेक्ट के लिए विकल्प) को पढ़ता और पार्स करता है।
-
उत्तर जनरेट करें। career-ops आपकी प्रोफ़ाइल, प्रूफ़ पॉइंट्स, और भूमिका के आधार पर हर फ़ील्ड के लिए अनुकूलित उत्तर बनाता है।
-
नंबरयुक्त सूची लौटाएँ। आपको फ़ॉर्म लेआउट से मेल खाते क्रम में उत्तर मिलते हैं — सरल फ़ील्ड (नाम, ईमेल) पहले, मुक्त-पाठ फ़ील्ड (कवर लेटर, “Why us?”) अंत में। फ़्लैग किए गए आइटम मानवीय ध्यान चाहने वाली चीज़ों की ओर इशारा करते हैं — वेतन एंकर, अनुपस्थित रिज़्यूमे विवरण, वैकल्पिक प्रश्न।
-
मैनुअल भरना। आप हर उत्तर को कॉपी करके संबंधित फ़ील्ड में पेस्ट करते हैं। यह चरण मैनुअल है, स्वचालित नहीं। आप पहले हर उत्तर की समीक्षा करते हैं।
-
उपयोगकर्ता सबमिट करता है। आप स्वयं Submit पर क्लिक करते हैं। career-ops कभी नहीं Submit पर क्लिक करता है। चैट में टाइप करके पूर्णता की पुष्टि करें:
Submitted.
Submitted. पर स्वचालित अपडेट:
data/applications.mdमें स्थितिEvaluated → Appliedमें बदल जाती है।- भविष्य के संदर्भ के लिए भरे हुए उत्तर रिपोर्ट के सेक्शन G में बने रहते हैं।
ट्रैकर को हैंडऑफ़:
/career-ops tracker
भूमिका के स्कोर की परवाह किए बिना, अपनी पूरी पाइपलाइन की स्थिति की निगरानी करें।
बैच मूल्यांकन (batch-evaluate-offers)
जब आपके पास एक साथ स्कोर करने के लिए 10+ JD हों (उस मात्रा के लिए SPA का
एक-एक करके चलने वाला #/evaluate अव्यावहारिक है), तो CLI से बैच रनर का
उपयोग करें।
इनपुट फ़ाइल — batch/batch-input.tsv (टैब-सेपरेटेड):
| कॉलम | उद्देश्य |
|---|---|
id |
विशिष्ट क्रमिक संख्या |
url |
पूर्ण जॉब पोस्टिंग लिंक |
source |
मूल प्लेटफ़ॉर्म (LinkedIn, Greenhouse, आदि) |
notes |
वैकल्पिक संदर्भात्मक विवरण |
उदाहरण पंक्ति:
1<TAB>https://jobs.example.com/senior<TAB>LinkedIn<TAB>
./batch/batch-runner.sh फ़्लैग:
--dry-run— बिना मूल्यांकन के लंबित ऑफ़र का पूर्वावलोकन करें। TSV को सत्यापित करने के लिए हमेशा पहले इसे चलाएँ।--parallel N— N वर्कर एक साथ चलाएँ (1, 2, या 3 अनुशंसित)।--min-score X.X— सीमा से कम स्कोर करने वाले ऑफ़र को सहेजना छोड़ें। केवल उच्च-फ़िट भूमिकाओं की रिपोर्ट रखने के लिए उपयोगी।--retry-failed— केवल उन ऑफ़र को फिर से प्रोसेस करें जो पिछले रन में त्रुटिग्रस्त हुए थे (नेटवर्क विफलता, रेट लिमिट)।--max-retries N— विफल ऑफ़र को N बार तक प्रयास करें (डिफ़ॉल्ट: 2)।--model NAME—claude -p --modelको पास किया गया Claude मॉडल (पैरेंट career-ops 1.8.0, #504). सेट न होने पर = आपके Claude Max सदस्यता का डिफ़ॉल्ट। बड़े बैचों के लिए सस्ते मॉडल का उपयोग करें, जैसेclaude-sonnet-4-6.#/batchमें Model इनपुट के रूप में उपलब्ध (web-ui 1.31.0)।--start-from N— N से नीचे की ऑफ़र ID छोड़ें (आंशिक रूप से प्रोसेस हो चुके बैच को फिर से शुरू करें)।#/batchमें Start from # इनपुट के रूप में उपलब्ध (web-ui 1.31.0)।
मानक अनुक्रम:
-
संपादित करें
batch/batch-input.tsv— प्रति JD एक पंक्ति। -
ड्राई-रन (पहले अनुशंसित):
./batch/batch-runner.sh --dry-run -
चलाएँ — क्रमिक या समानांतर:
./batch/batch-runner.sh # एक-एक करके ./batch/batch-runner.sh --parallel 2 # दो समवर्ती ./batch/batch-runner.sh --parallel 3 # तीन समवर्ती ./batch/batch-runner.sh --parallel 2 --min-score 4.0 # केवल उच्च-फ़िट सहेजें -
विफलताओं को फिर से प्रयास करें (नेटवर्क / रेट-लिमिट):
./batch/batch-runner.sh --retry-failed --max-retries 3 -
रिपोर्ट
reports/में{id}-{company}-{YYYY-MM-DD}.mdके रूप में सहेजी जाती हैं। सारांश पंक्तियाँbatch/tracker-additions/में जुड़ जाती हैं। -
ट्रैकर में मर्ज करें:
node merge-tracker.mjs # बैच के जोड़ लागू करें node merge-tracker.mjs --dry-run # मर्ज का पूर्वावलोकन करेंमर्ज कमांड प्रविष्टियों को डिडुप करता है और प्रोसेस की गई फ़ाइलों को
batch/tracker-additions/merged/में संग्रहीत करता है।
SPA परिणामी रिपोर्ट को #/reports (पेजिनेटेड, स्कोर-पिल रंगीन) के तहत और
ट्रैकर पंक्तियों को #/tracker के तहत प्रस्तुत करता है — बिल्कुल वैसे ही
जैसे आपने प्रत्येक को #/evaluate के माध्यम से जोड़ा हो। यदि आप CLI पर जाना
पसंद नहीं करते, तो इसे #/tracker पर ▶ Merge रखरखाव बटन के साथ जोड़ें।
Playwright सेटअप (set-up-playwright)
career-ops की दो सुविधाओं के लिए आवश्यक:
- फ़ॉर्म-फ़िल
/career-ops applyमें (ऊपर चरण 3 — Playwright ब्राउज़र खोलता है, फ़ील्ड लेबल पढ़ता है, उत्तर सुझाता है)। - PDF जनरेशन
/career-ops pdfऔर SPA के 📄 Generate PDF बटन के माध्यम से#/cv/#/reports/:slug/#/evaluate/#/deep/#/interview-prepपर।
Playwright अनुपस्थित होने पर फ़ॉलबैक: apply प्रवाह WebFetch पर फ़ॉलबैक हो जाता है (केवल-पाठ फ़ॉर्म पूर्वावलोकन, क्लिक-फ़िल नहीं)। PDF जनरेशन बस त्रुटि देता है।
मुख्य सेटअप (career-ops पैरेंट रूट से चलाएँ):
# Playwright के लिए Chromium इंस्टॉल करें
npm install
npx playwright install chromium
# Playwright MCP रजिस्टर करें ताकि Claude Code फ़ॉर्म चला सके
claude mcp add playwright npx @playwright/mcp@latest
# तीनों घटकों को सत्यापित करें (Chromium, Playwright लाइब्रेरी, MCP)
npm run doctor
वैकल्पिक MCP पंजीकरण — इसे
.claude/settings.local.json में जोड़ें:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["-y", "@playwright/mcp@latest"]
}
}
}
व्यवहार संबंधी टिप्पणियाँ:
- डिफ़ॉल्ट रूप से हेडलेस। Playwright चुपचाप काम करता है। कार्रवाई में
ब्राउज़र देखने के लिए, Claude को बताएँ
open up with playwright the browser and fill out the entire form. - एक पैकेज में तीन भूमिकाएँ — Playwright npm इंस्टॉल आपको
ब्राउज़र-ऑटोमेशन लाइब्रेरी,
/career-ops pdfके लिए PDF रेंडरिंग इंजन, और (MCP के माध्यम से) Claude Code के भीतर फ़ॉर्म-फ़िल वर्कफ़्लो देता है। - इस पर भरोसा करने से पहले सत्यापित करें —
npm run doctorपुष्टि करता है कि तीनों संचालनरत हैं। SPA का Health पृष्ठ एकPlaywright (parent node_modules)जाँच प्रस्तुत करता है जो अनुपस्थित होने पर तुरंत विफल हो जाती है।
15. साक्षात्कार की तैयारी
यह शोध-पश्चात, साक्षात्कार-पूर्व चरण है। इस ऐप के तीन आर्टिफ़ैक्ट यहाँ मिलते हैं:
- सहेजी गई डीप-रिसर्च फ़ाइलें
interview-prep/के तहत, आपके द्वारा चलाए गए प्रत्येक कंपनी-भूमिका जोड़े के लिए एक। Deep research पृष्ठ से या सीधे/api/interview-prepके माध्यम से ब्राउज़ करें। - Patterns मोड (
#/patterns) — एक आत्म-चिंतनशील प्रॉम्प्ट जनरेट करता है: “मेरे पिछले N साक्षात्कारों / ऑफ़रों / अस्वीकृतियों में, कौन-से पैटर्न बने रहते हैं?” तब उपयोगी जब आपके पास 5+ ट्रैकर पंक्तियाँ जमा हो गई हों। - Interview-prep मोड (
#/interview-prep) — किसी विशिष्ट आगामी दौर (व्यवहारिक, तकनीकी, सिस्टम डिज़ाइन) के लिए एक वन-पेजर पहले से भर देता है। आउटपुट उसीinterview-prep/फ़ोल्डर में जाता है।
अनुशंसित वर्कफ़्लो
आपके पास मौजूद हर साक्षात्कार के लिए:
- एक दिन पहले Deep को फिर से चलाएँ (या सहेजी गई फ़ाइल खोलें)।
#/interview-prep— उस विशिष्ट दौर के लिए एक वन-पेजर जनरेट करें। इसे अपने नोट्स में पेस्ट करें।- सिस्टम डिज़ाइन / कोडिंग दौर —
#/trainingखोलें और JD जिस विशिष्ट सबसिस्टम पर ज़ोर देती है, उस पर 30-मिनट के लक्षित रिफ़्रेशर के लिए अनुरोध करें। - मुआवज़ा दौर — डीप-रिसर्च फ़ाइल खोलें, “Negotiation leverage points” पर जाएँ। 2–3 विशिष्ट डेटा बिंदु लाएँ (Glassdoor बैंड, हालिया फ़ंडिंग, किसी अन्य कंपनी में तुलनीय ऑफ़र)।
- व्यवहारिक दौर — अपनी
cv.mdसे STAR+R कहानियाँ निकालें जो मूल Evaluate रिपोर्ट के सेक्शन B में आती हैं।
साक्षात्कार के बाद, तुरंत:
- ट्रैकर पंक्ति अपडेट करें: स्थिति →
Responded(फिरInterview,Offer, आदि)। - धन्यवाद-ईमेल का ड्राफ़्ट बनाने के लिए
#/followupचलाएँ। - यदि आपको नई जानकारी मिली (मुआवज़ा रेंज, टीम संरचना, टेक स्टैक की कोई
अप्रत्याशित बात), तो भविष्य के स्वयं के लिए सहेजी गई
interview-prep/<company>-<role>.mdको## Post-round notesके साथ संपादित करें।
16. गतिविधि लॉग + समस्या निवारण
गतिविधि लॉग (#/activity)
सर्वर पर आने वाले हर स्टेट-बदलने वाले रिक्वेस्ट का ऑडिट ट्रेल। इसमें दर्ज होता है: पाइपलाइन जोड़ना, ट्रैकर लेखन, CV सेव, JD सेव, evaluate रन, deep-research रन, scan रन, config बदलाव, mode रन।
गुप्त कुंजियाँ (ANTHROPIC_API_KEY, GEMINI_API_KEY) अंदर आते समय
रीडैक्ट कर दी जाती हैं; आपको data/activity.jsonl में कभी भी असली
key वैल्यू दिखाई नहीं देगी।
एक्शन प्रीफ़िक्स (pipeline., cv., evaluate, scan.,
आदि) से फ़िल्टर करें। प्रति पेज 25 पंक्तियाँ; सर्वर अधिकतम 500
सबसे हाल की घटनाएँ लौटाता है।
समस्या निवारण
| लक्षण | संभावित कारण | समाधान |
|---|---|---|
cv.md पर Health पेज लाल |
पहला रन, फ़ाइल अभी मौजूद नहीं है | touch $CAREER_OPS_ROOT/cv.md चलाएँ फिर रीफ़्रेश करें। |
Profile customized पर Health लाल |
candidate.full_name में अभी भी Jane Smith लिखा है |
config/profile.yml संपादित करें। |
scan लॉग में hh.ru: HTTP 403 |
ग़ैर-रूसी IP, (server uses default UA) नहीं |
dev.hh.ru/admin पर रजिस्टर करें, रूसी IP / VPN सेट करें। |
gemini-eval.mjs: ERR_MODULE_NOT_FOUND |
पैरेंट प्रोजेक्ट की dependencies इंस्टॉल नहीं हैं | cd $CAREER_OPS_ROOT && npm install। |
| PDF जनरेट करने में errors | पैरेंट में Playwright इंस्टॉल नहीं है | cd $CAREER_OPS_ROOT && npx playwright install chromium। |
/career-ops apply कहता है “no report found” |
पाइपलाइन ने इस JD को कभी स्कोर नहीं किया | पहले /career-ops pipeline (या #/evaluate) चलाएँ; §14 की पूर्वापेक्षाएँ देखें। |
batch-runner.sh: no such file |
ग़लत डायरेक्टरी से चलाया जा रहा है | ./batch/batch-runner.sh इनवोक करने से पहले cd $CAREER_OPS_ROOT। |
सर्वर EADDRINUSE: 4317 रिपोर्ट करता है |
पुराना इंस्टेंस अभी भी चल रहा है | pkill -f 'node server/index.mjs' फिर पुनः शुरू करें। |
| Live LLM कॉल 2 मिनट से ज़्यादा अटक जाता है | प्रॉम्प्ट बहुत बड़ा है या Anthropic धीमा है | /api/health में Anthropic फ़्लैग जाँचें; सर्वर प्रॉम्प्ट को 200 KB पर सॉफ़्ट-कैप करता है और 413 लौटाता है। |
Pipeline preview में (unsafe redirect) दिखता है |
Posting एक प्राइवेट IP / loopback पर रीडायरेक्ट हुई | यह एक सुरक्षा फ़ीचर है (REVIEW-B1)। रीडायरेक्ट टारगेट अस्वीकृत कर दिया जाता है और मूल URL अपरिवर्तित रहता है। |
| Tracker पंक्ति का टेक्स्ट टेबल तोड़ देता है | v1.9.1 से पहले कंपनी नाम में Pipe | v1.9.1+ पर अपडेट करें — pipes एंड-टू-एंड escape किए जाते हैं (BF-1)। |
ताज़ा clone पर npm test फ़ेल होता है |
टेस्ट पैरेंट प्रोजेक्ट के लेआउट को मान लेते हैं | CAREER_OPS_ROOT=$(mktemp -d) इस्तेमाल करें और fixtures बूटस्ट्रैप करें। |
गहरे निदान के लिए: Health पेज पर ▶ Doctor चलाएँ, आउटपुट कॉपी करें, और इश्यू ट्रैकर पर खोजें https://github.com/Fighter90/career-ops-ui/issues।
17. एक नया job-portal स्रोत कैसे जोड़ें
career-ops-ui हर job board को एक adapter के रूप में मानता है — एक अकेली फ़ाइल
server/lib/sources/<slug>.mjs के अंतर्गत जो
एक बोर्ड के परिणामों को fetch + normalize करना जानती है। v1.119.0 तक
server/lib/sources/ रजिस्ट्री 73 adapters शिप करती है — 68 अंग्रेज़ी + 5 रूसी
बोर्ड। अंग्रेज़ी सेट प्रमुख ATS-ों (Greenhouse / Ashby / Lever /
Workable / SmartRecruiters / Workday) को कवर करता है, बोर्ड-वाइड aggregators
जिन्हें स्पष्ट provider: से चुना जाता है (RemoteOK, Remotive, We Work Remotely, NoDesk, Get on Board,
Amazon, …), और per-tenant ATS-ें जो careers_url होस्ट से या स्पष्ट
api: URL से ऑटो-डिटेक्ट होती हैं (BambooHR, Personio, Recruitee, Teamtailor, Avature,
SAP SuccessFactors, …)। पूरी सूची को यहाँ कभी हाथ से गिनने की ज़रूरत नहीं है —
यह server/lib/sources/ से ऑटो-डिस्कवर होती है और #/scan के
Source dropdown में लाइव दिखाई जाती है। YAML के लिए §5 देखें और
कॉपी-पेस्ट एंट्रीज़ के लिए docs/portals-examples.md देखें।
v1.69.0 (P-14) — drop-in ऑटो-डिस्कवरी। 12वाँ स्रोत जोड़ना अब एक शुद्ध फ़ाइल-ड्रॉप है। रजिस्ट्री (
server/lib/sources/registry.mjs) अब हाथ से मेंटेन की गई लिस्ट नहीं रखती — बूट के समय यह इस फ़ोल्डर को स्कैन करती है (readdirSync+ dynamicimport()) और हर*.mjsसेexport const metaब्लॉक इकट्ठा करती है। adapter लिखें, इसकाmetaडिक्लेयर करें, और यह तुरंत scanner,#/scanफ़िल्टर dropdown, और RU dispatcher को दिखने लगता है —registry.mjsमें कोई एडिट ज़रूरी नहीं है। (RU स्रोतों को अभी भी पैरेंट केportals.ymlमें एक लाइन चाहिए; Step 5 देखें।)
Step 1 — Adapter लिखें
server/lib/sources/<slug>.mjs बनाएँ। इस पर निर्भर करते हुए कि स्रोत
के पास JSON API है या यह सिर्फ़ HTML रेंडर करता है, दो पैटर्न काम करते हैं:
API-आधारित स्रोत (सबसे साफ़ — जब भी साइट के पास एक ओपन डेटा एंडपॉइंट हो, इसे इस्तेमाल करें):
// server/lib/sources/example.mjs
const ENDPOINT = 'https://example.com/api/v1/vacancies';
const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...';
// v1.69.0 (P-14) — self-describing metadata। रजिस्ट्री बूट के समय
// इस ब्लॉक को ऑटो-डिस्कवर करती है; स्रोत को रजिस्टर करने वाली चीज़ यही है (Step 2 देखें)।
export const meta = {
value: 'example', // ← नीचे लिखे job.source के बराबर होना चाहिए
label: 'Example.com', // ← #/scan फ़िल्टर dropdown में दिखाया जाता है
region: 'ru', // ← 'en' (ATS sweep) | 'ru' (regional dispatcher)
configKey: 'example', // ← सिर्फ़ RU के लिए; portals.yml में इस्तेमाल होने वाली key
};
export async function searchExample(query, opts = {}) {
const { onlyRemote = false, fetchImpl = fetch, signal } = opts;
const res = await fetchImpl(`${ENDPOINT}?text=${encodeURIComponent(query)}`, {
signal,
headers: { 'User-Agent': UA, Accept: 'application/json' },
});
if (!res.ok) {
const err = new Error(`Example: HTTP ${res.status}`);
err.status = res.status;
throw err;
}
const data = await res.json();
return (data.items || []).map(normalizeExample);
}
function normalizeExample(item) {
return {
id: `example-${item.id}`,
title: item.title || '',
company: item.company?.name || '',
url: item.url || '',
salary: item.salary || '',
location: item.location || '',
isRemote: !!item.remote,
workplaceType: item.remote ? 'Remote' : 'Onsite',
relocates: false,
date: item.posted_at || '',
snippet: (item.description || '').slice(0, 240),
source: 'example', // ← रजिस्ट्री के `value` से बिल्कुल मेल खाना चाहिए
};
}
HTML-scrape स्रोत (जब कोई API न हो — पूरे उदाहरणों के लिए
getmatch.mjs और
geekjob.mjs देखें):
const BASE = 'https://example.com';
export async function searchExample(query, opts = {}) {
const { fetchImpl = fetch, signal } = opts;
const res = await fetchImpl(`${BASE}/vacancies?q=${encodeURIComponent(query)}`, {
signal,
headers: { 'User-Agent': UA, Accept: 'text/html' },
});
if (!res.ok) {
throw Object.assign(new Error(`Example: HTTP ${res.status}`), { status: res.status });
}
return parseExampleCards(await res.text());
}
export function parseExampleCards(html) {
// …regex-आधारित card निष्कर्षण। पार्स विफल होने पर [] लौटाएँ (throw न करें):
// बिना पार्स होने योग्य कार्ड्स वाला स्वस्थ 200 "no results" है, "error" नहीं,
// ताकि multi-source scanner आगे बढ़ता रहे।
}
हर adapter को इन तीन शर्तों का पालन करना ज़रूरी है:
- एक वैध
metaब्लॉक एक्सपोर्ट करें (Step 2 देखें)। इसके बिना रजिस्ट्री चुपचाप फ़ाइल को स्किप कर देती है (बूट पर एकconsole.warn) और स्रोत कभी सामने नहीं आता। optsमें{ onlyRemote, fetchImpl, signal }स्वीकार करें।fetchImplवही है जो adapters को नेटवर्क के बिना टेस्ट करने योग्य बनाता है;signalclient-disconnect प्रोपेगेशन (REVIEW-B3) के लिए ज़रूरी है।- कॉमन शेप वाले रिकॉर्ड लौटाएँ —
{ id, title, company, url, salary, location, isRemote, workplaceType, relocates, date, snippet, source }, जहाँsource,meta.valueसे मेल खाता है।
Step 2 — Adapter का meta डिक्लेयर करें (auto-registration)
यही पूरा रजिस्ट्रेशन स्टेप है। आप registry.mjs को एडिट नहीं करते।
बस सुनिश्चित करें कि adapter एक meta ब्लॉक एक्सपोर्ट करे — रजिस्ट्री
बूट के समय इसे ऑटो-डिस्कवर करती है:
// server/lib/sources/example.mjs की शुरुआत में
export const meta = {
value: 'example', // job.source वैल्यू और #/scan option.value दोनों
label: 'Example.com', // dropdown में दिखने वाला लेबल
region: 'ru', // 'en' | 'ru'
configKey: 'example', // सिर्फ़ RU — portals.yml::russian_portals.sources में key
};
डिस्कवरी इसे कैसे वैलिडेट करती है (कोई भी नियम फ़ेल करने वाली फ़ाइल स्किप कर दी
जाती है, एक [sources/registry] चेतावनी के साथ, ताकि आधा-माइग्रेट किया गया
ब्रांच डायग्नोसेबल बना रहे):
value— non-empty string। आपके adapter केjob.sourceसे मेल खाना ज़रूरी है।label— non-empty string।region— बिल्कुल'en'या'ru'; कुछ और अस्वीकृत कर दिया जाता है।configKey—region: 'ru'के लिए ज़रूरी,'en'के लिए अनदेखा किया जाता है।
region: 'en' ATS sweep में शामिल होता है (tracked_companies
URL पैटर्न से ऑटो-डिस्कवर करता है); region: 'ru' regional dispatcher में शामिल
होता है। पब्लिक API (SOURCES, SOURCES_BY_REGION, RU_CONFIG_KEYS, getRegionalSources)
हर डिस्कवर किए गए meta से दोबारा बनाया जाता है, पहले en फिर ru के क्रम में,
हर region के अंदर label के अनुसार alphabetical — ताकि dropdown का क्रम
उपयोगकर्ताओं के लिए स्थिर बना रहे।
Step 3 — Dispatcher में वायर करें (सिर्फ़ RU)
EN ATS स्रोत tracked_companies URL पैटर्न से ऑटो-डिस्कवर होते हैं —
आगे कोई वायरिंग ज़रूरी नहीं। RU स्रोतों के लिए,
server/lib/ru-scanner.mjs खोलें,
RU_DISPATCH टेबल ढूँढें, और एक पंक्ति जोड़ें:
import { searchExample } from './sources/example.mjs';
// …
const RU_DISPATCH = {
// …मौजूदा…
example: { label: 'example.com', search: searchExample },
};
Dispatcher लूप cfg.sources में मौजूद हर key के लिए entry.search(query, opts)
कॉल करता है। आगे कोई कोड बदलाव ज़रूरी नहीं।
Step 4 — टेस्ट करें (मॉक्ड, कभी लाइव नहीं)
tests/sources-<slug>.test.mjs के अंतर्गत एक फ़ाइल डालें। टेस्ट में असली
नेटवर्क वर्जित है (CI-isolation कॉन्ट्रैक्ट):
import test from 'node:test';
import assert from 'node:assert/strict';
import { searchExample } from '../server/lib/sources/example.mjs';
test('searchExample normalizes one record', async () => {
const fetchImpl = async () =>
new Response(
JSON.stringify({ items: [{ id: 1, title: 'Backend Engineer' }] }),
{ status: 200, headers: { 'content-type': 'application/json' } }
);
const out = await searchExample('q', { fetchImpl });
assert.equal(out.length, 1);
assert.equal(out[0].source, 'example');
});
Step 5 — अपने portals.yml में सक्षम करें
पैरेंट प्रोजेक्ट का portals.yml उपयोगकर्ता-स्वामित्व वाला config है। नए
स्रोत का configKey array में जोड़ें:
russian_portals:
sources: ["hh", "habr", "trudvsem", "getmatch", "geekjob", "example"]
area: 113
per_page: 50
only_remote: false
queries:
- "Senior PHP"
- "Senior Go"
ब्राउज़र में #/scan को रीलोड करें। source-filter dropdown नई एंट्री
को अपने आप उठा लेता है (सत्य का एकल स्रोत
GET /api/scan/sources →
registry.mjs के ज़रिए)। 🌐 Scan
बटन अब हर regional sweep में नया स्रोत शामिल करता है।
संदर्भ adapters (नए स्रोतों के लिए इन्हें आदर्श मानें)
| Adapter फ़ाइल | प्रकार | नोट्स |
|---|---|---|
hh.mjs |
JSON API | कैननिकल RU API adapter; geo-aware UA fallback। |
trudvsem.mjs |
JSON API | रूसी सरकारी ओपन-डेटा; कोई IP गेट नहीं। |
habr.mjs |
HTML scrape | रूसी टेक बोर्ड; regex-आधारित card parser। |
getmatch.mjs |
HTML scrape | Defensive parser, पार्स मिस होने पर []। |
geekjob.mjs |
HTML scrape | GetMatch जैसी ही defensive शैली। |
greenhouse.mjs |
JSON API | कैननिकल EN ATS adapter; tracked_companies URL पैटर्न इस्तेमाल करता है। |
आम ग़लतियाँ
metaएक्सपोर्ट भूल जाना। v1.69.0 सेmetaब्लॉक ही एकमात्र ऐसी चीज़ है जो किसी स्रोत को रजिस्टर करती है। कोईmetaन होना (या ग़लत बना होना) = फ़ाइल बूट पर चुपचाप स्किप हो जाती है, सिर्फ़ एक[sources/registry] <file> has no valid \export const meta` — skipped` चेतावनी के साथ, और स्रोत कभी dropdown तक नहीं पहुँचता। अगर बिल्कुल नया adapter नहीं दिखता तो सर्वर लॉग जाँचें।sourceफ़ील्ड का बेमेल होना। आपके adapter द्वारा लिखी गई string कोmeta.valueसे बिल्कुल मेल खाना चाहिए। अगर वे अलग हो जाएँ, तो#/scanफ़िल्टर dropdown में स्रोत दिखेगा लेकिन उसे चुनने पर हर पंक्ति फ़िल्टर हो जाएगी (क्योंकि equality checkr.source === fsहै)।- पार्स विफलता पर throw करना। HTML scrapers को बिना पार्स होने योग्य
कार्ड्स वाले स्वस्थ 200 पर
[]ज़रूर लौटाना चाहिए। Throw करना multi-source dispatcher लूप को तोड़ देता है — एक ख़राब HTML structure उसी query के लिए बाक़ी सभी स्रोतों को मार देता है। fetchImpl/signalभूल जाना। इनके बिना, आपका adapter बिना लाइव नेटवर्क को हिट किए unit-test नहीं किया जा सकता, और client disconnects प्रोपेगेट नहीं होते (उपयोगकर्ता के टैब बंद करने के बाद भी background fetch चलता रहता है)।- RU के लिए
tracked_companiesपर भरोसा करना। वह लिस्ट सिर्फ़ EN ATS स्रोतों के लिए है। RU adapters ख़ुद कोrussian_portals.queriesसे चलाते हैं — कोई per-company एंट्रीज़ नहीं।
18. सूचनाएँ (टॉप बार में 🔔)
v1.58.34 — नीचे-दाएँ कोने में दिखने वाला हर toast एक इन-मेमोरी journal (कैप 50, सबसे पुराना हटा दिया जाता है) में भी कैद कर लिया जाता है। दाईं ओर स्लाइड होने वाला Notifications drawer खोलने और जो कुछ आपने छोड़ा उसे फिर पढ़ने के लिए टॉप बार में 🔔 बेल पर क्लिक करें। यह journal प्रति-टैब, प्रति-सेशन है — टैब बंद करने से यह साफ़ हो जाता है।
Drawer सिर्फ़ तभी खुलता है जब आप बेल पर क्लिक करते हैं (या keyboard-focus होने पर Enter / Space से एक्टिवेट करते हैं)। यह अपने आप कभी नहीं दिखता। बेल पर लाल बैज उन एंट्रीज़ की गिनती बताता है जो आपने पिछली बार खोलने के बाद से नहीं देखी हैं; drawer खोलने से बैज साफ़ हो जाता है।
सूचना श्रेणियाँ
| श्रेणी | कब फ़ायर होती है | विज़ुअल संकेत |
|---|---|---|
| Success | Saved, Copied, Refreshed, scan पूरा, CV इम्पोर्ट हुआ, apply-checklist क्रियाएँ (“Copied unchecked”, “Reset”), profile सेव हुआ, pipeline URL जोड़ा गया |
drawer में हरा बायाँ बॉर्डर; हरा toast बैकग्राउंड |
| Error | URL validation विफलता (http:// / https:// से शुरू होना चाहिए, कोई script/template वर्ण नहीं), (METHOD /path · HTTP NNN) postfix वाली API errors, नेटवर्क विफलताएँ (सर्वर डाउन), pipeline-400 duplicates, doctor / verify-pipeline का non-zero exit |
लाल बायाँ बॉर्डर; लाल toast बैकग्राउंड; तकनीकी postfix Details <details> ब्लॉक में समेट दिया जाता है (U-4 / v1.58.24) |
| Info / progress | Running doctor.mjs…, Running verify-pipeline.mjs…, Refreshing…, Loading…, Generating prompt…, scan प्रोग्रेस लाइनें |
धूसर बायाँ बॉर्डर; डिफ़ॉल्ट toast बैकग्राउंड |
हर drawer एंट्री दिखाती है:
- Timestamp (सक्रिय SPA भाषा में लोकलाइज़्ड
HH:MM:SS)। - Message (मानवीय वाक्य, U-4 के अनुसार headline से तकनीकी postfix हटा कर)।
- Details (जब मौजूद हो — API कॉल का
(METHOD /path · HTTP NNN)postfix या कोई अन्य तकनीकी विवरण, monospace में)।
जो सूचना नहीं है
- Doctor / verify-pipeline का result modal (पूरा stdout / stderr) — यह एक modal है, toast नहीं, और journal में दर्ज नहीं होता।
#/scanऔर#/autoपर SSE लॉग लाइनें — वे toast pipeline में नहीं, बल्कि पेज के बॉडी में स्ट्रीम होती हैं।- सिर्फ़ spinner वाली लोडिंग स्टेट्स (वे बिना toast के
UI.withSpinnerइस्तेमाल करती हैं)।
कीबोर्ड
- बेल पर क्लिक या focus + Enter / Space → drawer खोलता है।
- Esc, × क्लोज़ बटन पर क्लिक, या बेल पर फिर क्लिक → drawer बंद करता है; focus बेल पर वापस लौटता है।
- Drawer खुला होने पर Tab → क्लोज़ बटन और अंदर के किसी भी focusable details से होकर गुज़रता है; drawer
aria-modal="false"है, इसलिए Tab उसे trap नहीं करता (आप पेज के बाक़ी हिस्से तक अभी भी पहुँच सकते हैं)।
19. ऐप को अपनी भाषा में localize करना
इंटरफ़ेस 9 भाषाओं में शिप होता है (English, Español, Français, Português, 한국어, 日本語, Русский, 简体中文, 繁體中文)। हर ऑन-स्क्रीन लेबल एक translation dictionary से आता है, और आप ऐप के लॉजिक को छुए बिना कोई भाषा जोड़ या ठीक कर सकते हैं।
Translations कहाँ रहते हैं। v1.60.0 से हर भाषा public/js/lib/locales/ के अंतर्गत अपनी ख़ुद की फ़ाइल है — i18n-dict.en.js, i18n-dict.es.js, i18n-dict.ru.js, और इसी तरह — 'key': 'text' जोड़ों की एक सरल सूची। एक साझा i18n-dict.aliases.js उन keys को, जिन्हें हमेशा एक जैसा पढ़ा जाना चाहिए (एक sidebar लेबल और उसका पेज title), एक ही translation पर इंगित करने देता है। i18n-dict.js पेज लोड पर इन सबको मर्ज करता है; आप इसे कभी एडिट नहीं करते।
कोई वाक्यांश ठीक करें या जोड़ें। अपनी भाषा की फ़ाइल खोलें, key ढूँढें (जैसे 'nav.scan') और टेक्स्ट एडिट करें। बिल्कुल नया लेबल जोड़ने के लिए, वही key सभी 8 भाषा फ़ाइलों में translated वैल्यू के साथ जोड़ें, फिर पेज में t('your.key') के ज़रिए उसका संदर्भ दें। npm test चलाएँ — अगर किसी भाषा में वह key ग़ायब है तो यह फ़ेल हो जाता है, ताकि कुछ भी आधा-translated शिप न हो।
बिल्कुल नई भाषा जोड़ें। i18n-dict.en.js को i18n-dict.<code>.js में कॉपी करें, हर वैल्यू का अनुवाद करें, फिर i18n.js में (भाषा सूची + browser auto-detect), i18n-dict.js assembler में, और index.html में एक <script> लाइन जोड़ कर code रजिस्टर करें। पूरी चेकलिस्ट — जिसमें test snapshot और help / README साथी फ़ाइलें शामिल हैं — docs/LOCALIZATION.md में है।
जानने लायक बात। भाषा switcher sidebar के footer में है; आपकी पसंद प्रति-ब्राउज़र याद रखी जाती है। सर्वर डायग्नोस्टिक संदेश जान-बूझकर अंग्रेज़ी में रहते हैं (ताकि लॉग एक जैसे पढ़े जा सकें) — सिर्फ़ ऑन-स्क्रीन इंटरफ़ेस translated होता है।
पूरी, चरण-दर-चरण localization गाइड के लिए repository में docs/LOCALIZATION.md देखें।
20. लक्षित भूमिकाओं के अनुसार आँकड़े (#/stats)
Analytics → Target-role stats पेज उन विरल डेटा को, जो आपके scans पहले से इकट्ठा करते हैं, उन भूमिकाओं के लिए एक बाज़ार-चित्र में बदल देता है जिन्हें आप वास्तव में लक्षित कर रहे हैं — देश के अनुसार vacancy गिनती और वेतन स्तर, साथ ही एक trend जिसे आप समय के साथ ट्रैक कर सकते हैं। कुछ भी गढ़ा नहीं गया है: यह सिर्फ़ उतना ही एकत्र करता है जितना scanners ने पाया, और यह इस बारे में ईमानदार है कि sample कितना पतला है।
आँकड़े कहाँ से आते हैं
- Target roles आपकी Profile (
config/profile.yml→ target roles) से पढ़ी जाती हैं — कभी hard-code नहीं होतीं। पहले उन्हें#/profileपर सेट करें; बिना roles के पेज खाली charts के बजाय “अपनी target roles सेट करें” वाला प्रॉम्प्ट दिखाता है। - Postings आपके सबसे हाल के scan से आती हैं (पहले
#/scanपर एक चलाएँ)। हर job की location को एक देश में मैप किया जाता है (वही detector जो Scan country filter इस्तेमाल करता है) और इसकी salary string को पार्स करके एक अनुमानित FX टेबल के ज़रिए USD में normalize किया जाता है। - सब कुछ आपके ब्राउज़र में aggregate किया जाता है — कोई डेटा आपकी मशीन से बाहर नहीं जाता, और पेज जो एकमात्र चीज़ लिखता है वह एक snapshot है जिसे आप स्पष्ट रूप से सेव करते हैं।
Charts कैसे पढ़ें
- देश के अनुसार Vacancies — हर देश में कितनी मैच होने वाली postings हैं। एक target role या एक देश तक सीमित करने के लिए ऊपर दिए गए Role और Country फ़िल्टर इस्तेमाल करें।
- देश के अनुसार माध्यिका वेतन (USD) — प्रति देश बीच वाली पार्स की गई salary। सिर्फ़ पार्स होने योग्य salary वाली postings गिनी जाती हैं; sample size chart के बग़ल में दिखाया जाता है, और राशियाँ मोटे दरों पर convert की जाती हैं, इसलिए इसे संकेतात्मक समझें, बिल्कुल सटीक नहीं। एक अकेला
¥(जापानी येन और चीनी युआन के बीच अस्पष्ट) अनुमान लगाने के बजाय हटा दिया जाता है, ताकि बड़ी FX विकृति से बचा जा सके। - जब मौजूदा scan में कोई पार्स होने योग्य salary न हो, तो salary chart संख्याएँ गढ़ने के बजाय यही बात कहता है।
Snapshots सेव करना और trend ट्रैक करना
- मौजूदा aggregate को
data/role-stats.jsonlमें जोड़ने के लिए Save snapshot क्लिक करें। हर snapshot सर्वर पर timestamp किया जाता है; snapshots ही एकमात्र चीज़ हैं जो यह पेज लिखता है और वे कभी आपकी CV या profile को नहीं छूते। - Trend chart आपके सेव किए गए snapshots में vacancy गिनती को प्लॉट करता है — समय-समय पर एक सेव करें (उदाहरण के लिए हर साप्ताहिक scan के बाद) यह देखने के लिए कि आपकी target roles के लिए बाज़ार समय के साथ कैसे बदलता है।
21. आपका टू-पेजर — कैंडिडेट मार्केट फिट (#/two-pager)
career-ops-ui का ज़्यादातर हिस्सा यह पूछता है “क्या यह जॉब मेरे CV से मेल खाती है?”। टू-पेजर दूसरे आधे हिस्से का जवाब देता है: “क्या यह जॉब उससे मेल खाती है जो मैं वाकई चाहता/चाहती हूँ?”। यह Never Search Alone के “Mnookin two-pager” से प्रेरित है — एक छोटा, प्रथम-पुरुष कथन जो बताता है कि आपको क्या ऊर्जा देता है, आपको क्या चाहिए, और आप क्या स्वीकार नहीं करेंगे। इसे Setup → Two-pager 🎯 से खोलें।
आप क्या भरते हैं
- मैं कौन हूँ — आपके ट्रैक रिकॉर्ड और आप किस तरह की भूमिका में आगे बढ़ते हैं, इस पर प्रथम-पुरुष में कुछ वाक्य।
- लक्ष्य वातावरण — कंपनी का आकार, स्टेज, और संस्कृति जो आप चाहते हैं।
- पाँच चिप-लिस्ट — हर आइटम जोड़ने के लिए टाइप करें और Enter (या कॉमा) दबाएँ, हटाने के लिए × पर क्लिक करें:
- मुझे क्या पसंद है — ऊर्जा देने वाली चीज़ें (रिमोट, ओनरशिप, ग्रीनफ़ील्ड, मेंटरिंग…)।
- अनिवार्य ज़रूरतें — कठोर आवश्यकताएँ (एक कॉम्प फ्लोर, एक देश, एक स्टैक…)।
- मुझे क्या नापसंद है — ऊर्जा खींचने वाली चीज़ें (ऑन-कॉल, अंतहीन मीटिंग, केवल लीगेसी…)।
- डील-ब्रेकर्स — पूर्ण रूप से नहीं (केवल ऑनसाइट, कोई स्पॉन्सरशिप नहीं, एक तय संख्या से कम…)।
- गैर-परक्राम्य शर्तें — सीमाएँ (लोकेशन, रिमोट, कॉम्प फ्लोर…)।
इसे सुरक्षित करने के लिए Save two-pager पर क्लिक करें। यह आपके पेरेंट career-ops प्रोजेक्ट की यूज़र लेयर में config/two-pager.yml पर लिखा जाता है, इसलिए — आपके CV और प्रोफ़ाइल की तरह — जब आप सिस्टम अपडेट करते हैं तो यह कभी ओवरराइट नहीं होता।
AI फिल असिस्टेंट
पता नहीं कैसे लिखें? ✨ AI fill assistant पर क्लिक करें और यह आपके लिए पूरा टू-पेजर ड्राफ़्ट कर देगा। जब आपने LLM प्रोवाइडर कॉन्फ़िगर किया हो (देखें §3), तो यह लाइव चलता है: यह केवल आपकी अपनी CV और प्रोफ़ाइल पढ़ता है, हर फ़ील्ड ड्राफ़्ट करता है — आप कौन हैं, आपकी पसंद, अनिवार्य ज़रूरतें, नापसंद, डील-ब्रेकर्स, गैर-परक्राम्य शर्तें, और लक्ष्य वातावरण — और फ़ॉर्म को उसी जगह भर देता है। कुछ भी अपने आप फ़ाइल नहीं होता: आप किसी भी हाथ से टाइप किए टू-पेजर की तरह समीक्षा करें, संपादित करें, और Save पर क्लिक करें। यह आपके बारे में कभी तथ्य नहीं गढ़ता; यह केवल वही पुनर्गठित करता है जो आपकी CV और प्रोफ़ाइल पहले से कहती है। कोई API कुंजी सेट न होने पर, यह पुराने व्यवहार पर वापस आ जाता है — यह एक डायलॉग में तैयार-चलाने-योग्य Mnookin प्रॉम्प्ट दिखाता है ताकि आप इसे किसी भी LLM में चला सकें और YAML वापस पेस्ट कर सकें।
पूर्वावलोकन और निर्यात (PDF / DOCX / Markdown)। अपने टू-पेजर को साफ़, फ़ॉर्मेट किए दस्तावेज़ के रूप में देखने के लिए 👁 Preview & export पर क्लिक करें। पूर्वावलोकन से आप .md डाउनलोड कर सकते हैं, PDF के रूप में सेव कर सकते हैं, DOCX के रूप में सेव कर सकते हैं (एक असली Word फ़ाइल — कोच या रिक्रूटर के साथ शेयर करने के लिए सुविधाजनक), या इसे क्लिपबोर्ड पर कॉपी कर सकते हैं। वही एक्सपोर्ट बार अब मार्केट रिपोर्ट, करियर प्लान, और करियर ओरिएंटेशन पेजों पर भी दिखाई देता है। .docx पूरी तरह ऐप के अंदर बनाया जाता है — कोई बाहरी सेवा आपका टू-पेजर कभी नहीं देखती।
फ़िट-टू-व्हाट-यू-वांट स्कोर
एक बार जब आप टू-पेजर सेव कर लेते हैं, तो #/scan पर हर पोस्टिंग को एक छोटा ◎ N बैज (0–100) मिल जाता है। यह हर जॉब के वर्क-टाइप (रिमोट/हाइब्रिड/ऑनसाइट), देश, सैलरी फ्लोर, और रिलोकेशन की आपके टू-पेजर से तुलना करता है — हरा बैज मज़बूत फ़िट दर्शाता है, लाल का मतलब है कि कोई डील-ब्रेकर ट्रिगर हुआ। विवरण के लिए होवर करें (✓ क्या मेल खाया, ✗ किस डील-ब्रेकर का उल्लंघन हुआ)।
यह जानबूझकर ईमानदार है: जब किसी पोस्टिंग में कोई मिलान-योग्य संकेत नहीं होता (उदाहरण के लिए आपकी प्राथमिकताएँ सब फ़्री-टेक्स्ट हैं जिनकी एक स्कैन रो पुष्टि नहीं कर सकती), कोई बैज बिल्कुल नहीं दिखाया जाता — सिस्टम कभी कोई संख्या नहीं गढ़ता। एक कठोर डील-ब्रेकर उल्लंघन उसी चीज़ की एक हल्की नापसंद से ज़्यादा भारी होता है। बैज के अलावा, आपका सेव किया टू-पेजर हर LLM मूल्यांकन में इनलाइन किया जाता है, इसलिए आपकी बताई प्राथमिकताएँ लिखित निर्णय को भी आकार देती हैं, न कि सिर्फ़ CV-बनाम-JD मिलान को।
22. मॉक इंटरव्यू (#/mock-interview)
इंटरव्यू की तैयारी पढ़ना एक बात है; जवाब ज़ोर से बोलना बिल्कुल अलग बात है। Mock interview पेज (साइडबार में Interview prep → Mock interview 🎤 से खोलें) एक विशिष्ट भूमिका के विरुद्ध टर्न-बाय-टर्न रिहर्सल चलाता है, जो आपकी अपनी CV, प्रोफ़ाइल, टू-पेजर, और स्टोरी बैंक पर आधारित है। यह कोई तयशुदा सवालों की सूची नहीं है — इंटरव्यूअर उस पर प्रतिक्रिया देता है जो आप वाकई कहते हैं।
सेशन शुरू करना
- एक लक्ष्य भूमिका (और वैकल्पिक रूप से एक कंपनी) दर्ज करें। अगर आपके पास है तो जॉब विवरण भी पेस्ट करें — इससे सवाल काफ़ी तीखे हो जाते हैं।
- Start interview पर क्लिक करें। इंटरव्यूअर भूमिका और आपकी पृष्ठभूमि के अनुरूप एक केंद्रित सवाल से शुरुआत करता है।
- अपना जवाब टाइप करें और Send answer पर क्लिक करें। जितनी देर चाहें दोहराते रहें — यह एक निश्चित प्रश्नोत्तरी नहीं, बातचीत है।
हर टर्न आपको क्या देता है
हर जवाब के बाद, इंटरव्यूअर तीन हिस्सों में जवाब देता है:
- फ़ीडबैक — क्या असरदार रहा (मज़बूती) और क्या छूट गया, STAR+R शब्दों में (Situation, Task, Action, Result, Reflection) फ़्रेम किया गया। यह उस विशिष्ट पहलू को नाम देता है जो आपने छोड़ दिया।
- स्कोर — एक-लाइन औचित्य के साथ त्वरित
N/5, ताकि आप एक सेशन में प्रगति महसूस कर सकें। - अगला सवाल — एक फ़ॉलो-अप जो जानबूझकर आपके पिछले जवाब के सबसे कमज़ोर हिस्से की जांच करता है।
सब कुछ आपकी असली सामग्री पर आधारित है: cv.md, config/profile.yml, config/two-pager.yml, और आपका STAR+R स्टोरी बैंक (interview-prep/story-bank.md) — ये सब प्रॉम्प्ट में इनलाइन किए जाते हैं। इंटरव्यूअर असली कमियों पर ज़ोर देगा लेकिन कभी ऐसा अनुभव नहीं गढ़ेगा जो आपके पास नहीं है। अगर कोई LLM कुंजी सेट नहीं है, तो पेज आपको किसी भी असिस्टेंट में पेस्ट करने के लिए एक तैयार-चलाने-योग्य प्रॉम्प्ट देता है — वही ईमानदार फ़ॉलबैक जो ऐप में और कहीं भी इस्तेमाल होता है।
सेशन सेव और दोबारा देखना
एक समाप्त रिहर्सल रखने के लिए Save transcript पर क्लिक करें। यह आपके पेरेंट प्रोजेक्ट की यूज़र लेयर में interview-prep/mock-{company}-{role}-{date}.md पर लिखा जाता है, इसलिए यह आपके अन्य इंटरव्यू-प्रेप नोट्स के साथ रहता है और सिस्टम अपडेट से कभी ओवरराइट नहीं होता। पेज के नीचे Saved sessions सूची आपको किसी भी ट्रांसक्रिप्ट को फिर से खोलने या हटाने देती है। किसी अलग भूमिका के साथ फिर से शुरू करने के लिए New interview का उपयोग करें।
23. नेटवर्किंग और गहन कंपनी रिसर्च (#/networking)
सामने के दरवाज़े से आवेदन करना खेल का सिर्फ़ आधा हिस्सा है — बाकी आधा है किसी को जानना, या कम से कम यह जानना कि किससे संपर्क करें और क्या कहें। Networking पेज (साइडबार में Deep research → Networking 🤝 से खोलें) एक कंपनी को इंटरव्यू पाने की ठोस योजना में बदल देता है, जो आपकी अपनी CV, प्रोफ़ाइल, और टू-पेजर पर आधारित है।
एक योजना बनाना
- एक कंपनी (आवश्यक) और वैकल्पिक रूप से एक भूमिका और जॉब विवरण दर्ज करें। JD “मैं क्यों फ़िट हूँ” वाले संकेतों को तीखा बना देता है।
- Build plan पर क्लिक करें। LLM कुंजी के साथ यह लाइव चलता है और योजना को इनलाइन रेंडर करता है; बिना कुंजी के यह आपको किसी भी असिस्टेंट में पेस्ट करने के लिए एक तैयार-चलाने-योग्य प्रॉम्प्ट देता है (ऐप भर में इस्तेमाल होने वाला वही ईमानदार फ़ॉलबैक — कुछ भी गढ़ा नहीं जाता)।
योजना में क्या होता है
योजना चार हिस्सों में वापस आती है:
- कंपनी डोज़ियर — कंपनी क्या करती है, हवाला देने लायक हाल के संकेत, और आपकी असली पृष्ठभूमि से निकाले गए दो या तीन “मैं क्यों फ़िट हूँ” वाले संकेत, इस पर एक सटीक ब्रीफ़।
- किससे संपर्क करें — तीन से पाँच लक्षित व्यक्तित्व (टीम का हायरिंग मैनेजर, एक इन-हाउस रिक्रूटर, टीम पर एक वरिष्ठ इंजीनियर, एक वार्म या एलुमनाई कनेक्शन) जिनमें से हर एक को खोजने के लिए एक ठोस LinkedIn खोज स्ट्रिंग दी गई है। यह कभी असली नाम नहीं गढ़ता — यह आपको बताता है कि सही लोगों को कैसे खोजें।
- सबसे वार्म इंट्रो रास्ता — आपकी पृष्ठभूमि के लिए सबसे यथार्थवादी वार्म रास्ता: एक साझा नियोक्ता, स्कूल, या समुदाय; एक दूसरे-दर्जे का कनेक्शन; या जब यह वाकई सबसे अच्छा विकल्प हो तो एक उच्च-सिग्नल कोल्ड मैसेज।
- आउटरीच ड्राफ़्ट — आपके शीर्ष व्यक्तित्वों के लिए छोटे, विशिष्ट संदेश (तीन से पाँच वाक्य, कोई फ़्लफ़ नहीं), जो आपके असली सबूत बिंदुओं पर आधारित हैं ताकि वे सामान्य न लगें।
योजनाएँ सेव और दोबारा देखना
एक योजना रखने के लिए Save plan पर क्लिक करें। यह आपके पेरेंट प्रोजेक्ट की यूज़र लेयर में networking/net-{company}-{role}-{date}.md पर लिखी जाती है — आपकी अपनी फ़ाइल, सिस्टम अपडेट से कभी ओवरराइट नहीं होती। पेज के नीचे Saved plans सूची आपको किसी भी योजना को फिर से खोलने या हटाने देती है। क्योंकि ड्राफ़्ट और व्यक्तित्व केवल आपकी असली सामग्री पर आधारित हैं, इन्हें व्यक्तिगत बनाने के लिए एक मज़बूत पहला ड्राफ़्ट मानें — बिना देखे भेजने की स्क्रिप्ट नहीं।
24. CV Studio (#/cv-studio)
Add to CV (v1.117.0)। एक नया कार्ड किसी प्रोजेक्ट, प्रकाशन, या पोर्टफ़ोलियो पेज (URL या पेस्ट किया टेक्स्ट) को ATS-तैयार बुलेट पॉइंट में बदल देता है जो केवल उसी स्रोत पर आधारित हैं — जो मेट्रिक्स, नियोक्ता, या तारीखें स्रोत में मौजूद नहीं हैं वे छोड़ दी जाती हैं, कभी गढ़ी नहीं जातीं। आप सुझावों की समीक्षा करते हैं और जो स्वीकार करते हैं उसे खुद CV एडिटर में पेस्ट करते हैं; कुछ भी अपने आप नहीं लिखा जाता, और URL स्रोतों को पाइपलाइन जैसे ही SSRF-सुरक्षित वैलिडेटर से फ़ेच किया जाता है।
#/cv पेज वह है जहाँ आप अपनी CV लिखते हैं; CV Studio (साइडबार में Setup → CV Studio 🎨 से खोलें) वह है जहाँ आप इसे निखारते हैं। यह आपकी cv.md को तीन ईमानदार टूल देता है, जिनमें से दो कभी आपके ब्राउज़र से बाहर नहीं जाते।
रिज़्यूमे डायग्नोस्टिक्स
पेज खोलते ही यह आपकी CV को 100 में से स्कोर करता है और हर जांच के निष्कर्ष एक छोटे स्पष्टीकरण के साथ सूचीबद्ध करता है ताकि आप तय करें कि क्या बदलना है (यह कभी चुपचाप फिर से नहीं लिखता):
- लंबाई — क्या CV एक स्वस्थ एक-से-दो पेज की सीमा में है?
- मात्रात्मक प्रभाव — आपके कितने बुलेट पॉइंट्स में एक असली संख्या या मेट्रिक शामिल है? रिक्रूटर इन्हें ही तेज़ी से देखते हैं।
- मज़बूत क्रिया शब्द — “responsible for” या “helped” जैसी कमज़ोर भाषा को फ़्लैग करता है।
- बज़वर्ड्स — खोखले घिसे-पिटे शब्दों (“results-driven”, “team player”) को फ़्लैग करता है।
- मुख्य सेक्शन — Summary, Experience, Education, और Skills की जांच करता है।
- संपर्क जानकारी — सुनिश्चित करता है कि एक ईमेल मौजूद है।
यह पूरी तरह आपके ब्राउज़र में बिना किसी LLM के चलता है — संख्याएँ निर्धारक होती हैं और कुछ भी गढ़ा नहीं जाता।
प्राइवेसी मास्क
अपनी CV को लेखन नमूने या स्क्रीनशॉट के रूप में शेयर करने से पहले, Privacy mask व्यक्तिगत रूप से पहचान योग्य डेटा को छिपा देता है: ईमेल, फ़ोन, लिंक/हैंडल, और सड़क का पता, साथ ही अगर आप विकल्प चुनें और दर्ज करें तो आपका नाम → आद्याक्षर। हर श्रेणी को टॉगल करें, मास्क किया गया संस्करण कॉपी करें, और इसे सुरक्षित रूप से शेयर करें। यह पूरी तरह ब्राउज़र में होता है, ठीक-ठीक बताता है कि इसने कितनी चीज़ें छिपाईं, और मूल को कभी सेव या ट्रांसमिट नहीं करता।
इसे इंसानी बनाएँ (आवाज़ का मिलान)
एक कठोर पंक्ति या पैराग्राफ़ पेस्ट करें — उस तरह की सामान्य AI भाषा जो साँचे जैसी लगती है — और Make it human इसे आपकी आवाज़ में फिर से लिखता है। यह पुनर्लेखन सर्वर-साइड पर आपकी voice-dna.md (आपका लेखन कैसा पढ़ा जाता है) और आपके writing-samples/ (आपका असली गद्य) पर आधारित है। कठोर नियम: यह पुनर्व्यवस्थित कर सकता है, कस सकता है, और आवाज़ बदल सकता है, लेकिन यह कभी ऐसा तथ्य, मेट्रिक, या उपलब्धि नहीं जोड़ेगा जो आपके पेस्ट किए टेक्स्ट में पहले से नहीं है। LLM कुंजी के साथ यह लाइव फिर से लिखता है; बिना कुंजी के यह आपको किसी भी असिस्टेंट में पेस्ट करने के लिए एक तैयार-चलाने-योग्य प्रॉम्प्ट देता है। फिर हमेशा की तरह #/cv पेज पर अपनी CV संपादित करें — CV Studio सुझाव देता है, आप तय करते हैं।
किसी जॉब के लिए तैयार करें। Tailor to a job कार्ड में एक जॉब विवरण पेस्ट करें और CV Studio उस पोस्टिंग के लिए तैयार किया रिज़्यूमे और एक मेल खाता कवर लेटर बनाता है, फिर इन्हें सौंपने से पहले एक रिक्रूटर-ग्रेड चेकलिस्ट गेट से गुज़ारता है। यह तंत्र करियर-कोचिंग की प्रैक्टिस से निकाले गए सामान्य नियमों पर आधारित है — एक रिक्रूटर सेकंडों में पढ़ता है, इसलिए प्रासंगिक अनुभव सबसे ऊपर जाता है, हेडलाइन वेकैंसी की भूमिका से मेल खाती है, परिणामों में विशिष्ट संख्याएँ होती हैं, और कवर लेटर एक “आवश्यकता ↔ आपका मेल खाता तथ्य” के एक ही पुल के साथ एक छोटा टीज़र बना रहता है। चेकलिस्ट हर आइटम को PASS/FAIL के रूप में रिपोर्ट करती है: errors ब्लॉक करती हैं (परिणाम दिखने से पहले उन्हें ठीक कर दिया जाता है), warnings सलाह देती हैं। सब कुछ केवल आपकी अपनी CV, प्रोफ़ाइल, और टू-पेजर पर आधारित है — यह जो आपके पास पहले से है उसे पुनर्व्यवस्थित और पुनर्गठित करता है लेकिन कभी कोई नियोक्ता, मेट्रिक, या दावा नहीं गढ़ता। LLM कुंजी के साथ यह लाइव चलता है; बिना कुंजी के आपको तैयार-चलाने-योग्य प्रॉम्प्ट मिलता है। इसे निर्देशित करने के लिए वैकल्पिक रूप से एक लक्ष्य भूमिका/हेडलाइन टाइप करें। परिणाम कार्ड पर बटनों से नतीजे को Markdown, PDF, या DOCX के रूप में निर्यात करें।
25. मेमोरी (#/memory)
हर दूसरा पेज हर बार नए सिरे से शुरू होता है। Memory (साइडबार में Setup → Memory 🧠 से खोलें) वह एक जगह है जहाँ आप असिस्टेंट को कोई बात एक बार बताते हैं और वह टिकी रहती है। यह एक छोटा, संपादन-योग्य “मेरे बारे में यह याद रखें” नोट रखता है जो हर AI अनुरोध में फ़ीड किया जाता है।
यह किसलिए है
इसे स्थायी प्राथमिकताओं और कार्यशैली के लिए उपयोग करें, उदाहरण के लिए:
- वे प्रकार की भूमिकाएँ और कंपनियाँ जिन्हें आप लक्षित कर रहे हैं (और वे जो आप कभी नहीं देखना चाहते)।
- आपको जवाब कैसे लिखे जाने पसंद हैं — संक्षिप्त या विस्तृत, वरिष्ठ लहजा, बिना भराव के।
- दोहराने लायक कठोर शर्तें — केवल रिमोट, एक कॉम्प फ्लोर, कोई ऑन-कॉल नहीं।
इसे केवल प्राथमिकताओं और मार्गदर्शन तक सीमित रखें। यह आपके अनुभव के तथ्यों के लिए जगह नहीं है — आपके कौशल, नियोक्ता, और उपलब्धियाँ आपकी CV, प्रोफ़ाइल, और टू-पेजर में रहती हैं, जो आपकी CV और कवर लेटर्स में दिखने वाली किसी भी चीज़ के लिए एकमात्र स्रोत बनी रहती हैं। मेमोरी नोट यह तय करता है कि असिस्टेंट आपके साथ कैसे काम करता है, कभी क्या दावा करता है इसे नहीं।
यह हर जगह कैसे पहुँचता है
जब आप Save memory पर क्लिक करते हैं, तो नोट आपके पेरेंट प्रोजेक्ट की यूज़र लेयर में config/memory.md पर लिखा जाता है और साझा प्रोजेक्ट संदर्भ में इनलाइन किया जाता है। इसका मतलब है कि यह अपने आप हर AI अनुरोध के साथ जाता है — मूल्यांकन, मॉक इंटरव्यू, नेटवर्किंग योजनाएँ, CV Studio पुनर्लेखन — और आपके कॉन्फ़िगर किए हर प्रोवाइडर में। इसे एक बार लिखें; आपको हर पेज पर दोहराने की ज़रूरत नहीं है। आपकी अन्य यूज़र-लेयर फ़ाइलों की तरह, जब आप सिस्टम अपडेट करते हैं तो यह कभी ओवरराइट नहीं होता, और यह केवल उन्हीं LLM प्रॉम्प्ट्स के अंदर आपकी मशीन छोड़ता है जिन्हें आप चलाना चुनते हैं।
अपने डेटा से सुझाव लें
पता नहीं क्या लिखें? ✨ Suggest from my data आपके एप्लिकेशन ट्रैकर को पढ़ता है और व्यवहार संबंधी बुलेट पॉइंट्स का एक सेट ड्राफ़्ट करता है — वे पैटर्न जो आप ढूँढ़ते, स्वीकार करते, और अस्वीकार करते हैं। यह जो प्रॉम्प्ट देता है उसे किसी भी LLM में चलाएँ, सुझावों की समीक्षा करें, और एक संपादित संस्करण नोट में पेस्ट करें। यह केवल आपके अपने ट्रैकर की खोज करता है और कभी तथ्य नहीं गढ़ता; कुछ भी सेव होने से पहले आप हमेशा समीक्षा करते हैं।
26. आँकड़े (#/stats)
रिजेक्शन पैटर्न टैब (v1.117.0). चौथा टैब पेरेंट प्रोजेक्ट की analyze-patterns.mjs (केवल-पठन) चलाता है और आपके परिणामों का मिश्रण, कार्रवाई-योग्य सुझाव, और प्रति-ATS-वेंडर आगे बढ़ने की दर (“एल्गोरिदमिक मोनोकल्चर” संकेत — Bommasani et al., FAccT 2026) दिखाता है। न्यूनतम सैंपल से कम वाले वेंडरों को तारांकन (asterisk) से चिह्नित किया जाता है; पेरेंट प्रोजेक्ट के बिना टैब एक ईमानदार नोट दिखाता है।
आँकड़े पेज एक ही सेक्शन के तहत तीन दृश्यों को साथ लाता है: एक AI-जनित मार्केट रिपोर्ट, आपकी अपनी पाइपलाइन का विश्लेषण, और आपके स्कैन से लक्षित-भूमिका रिक्तियों का रुझान। ऊपर दिए गए टैब से इनके बीच स्विच करें।
मार्केट रिपोर्ट
मार्केट रिपोर्ट टैब मॉडल से आपकी लक्षित भूमिकाओं के वेतन और श्रम-बाज़ार विश्लेषण के लिए पूछता है — यह जानने के लिए कि किन भूमिकाओं और वरिष्ठता स्तरों को कवर करना है, यह आपका CV और प्रोफ़ाइल पढ़ता है। एक क्षेत्र / बाज़ार टाइप करें (उदाहरण के लिए Russia, EU-remote, US, या Germany), एक मुद्रा (Currency) चुनें, और मार्केट रिपोर्ट जनरेट करें पर क्लिक करें। आपको एक कार्यकारी सारांश, ग्रेड अनुसार वेतन (माध्य (median) के साथ P10/P25/P75/P90), शीर्ष नियोक्ता, मांग वाले कौशलों की तालिका, लाभों की आवृत्ति, ऑफिस/हाइब्रिड/रिमोट विभाजन, AI प्रभाव सहित 12–24 महीनों के रुझान, और बातचीत (negotiation) संबंधी मार्गदर्शन के साथ एक संरचित रिपोर्ट मिलती है। हर आँकड़ा मॉडल के प्रशिक्षण ज्ञान से एक दिशात्मक अनुमान है — स्क्रैप किया गया या लाइव डेटा नहीं — और रिपोर्ट यह स्पष्ट रूप से कहती है; संख्याओं को उद्धरण नहीं, बल्कि सीमाएँ मानें। बिना API कुंजी सेट किए आपको एक मनगढ़ंत रिपोर्ट के बजाय कॉपी-पेस्ट प्रॉम्प्ट मिलता है। रिपोर्ट को ऐप से बाहर ले जाने के लिए Download .md, Save as PDF, या Copy का उपयोग करें।
मेरी पाइपलाइन
मेरी पाइपलाइन टैब आपके अपने आवेदन ट्रैकर का चार्ट बनाता है — कुछ भी बाहरी नहीं। यह दिखाता है कि आपने कितनी भूमिकाएँ ट्रैक की हैं, आपका स्कोर वितरण, स्टेटस फ़नल, आपकी शीर्ष कंपनियाँ और भूमिकाएँ, समय के साथ आवेदन, और रूपांतरण दरें (आवेदनों का कितना हिस्सा Applied, Responded, Interview, और Offer तक पहुँचता है)। यह आपकी खोज का ईमानदार आईना है: यह केवल वही दर्शाता है जो पहले से data/applications.md में मौजूद है।
लक्षित-भूमिका रुझान
लक्षित-भूमिका रुझान टैब मूल दृश्य है: आपके नवीनतम स्कैन से एकत्रित, आपकी लक्षित भूमिकाओं के लिए देश के अनुसार रिक्तियों की संख्या और माध्य वेतन, एक मुद्रा चयनकर्ता और लक्षित भूमिका अनुसार पोस्टिंग अवलोकन के साथ। Save snapshot वर्तमान समुच्चय को रिकॉर्ड करता है ताकि आप समय के साथ रिक्तियों की संख्या में बदलाव देख सकें, और रुझान रेखा उन्हीं स्नैपशॉट को वापस पढ़ती है। विरल डेटा अपेक्षित है और इसे संकेतात्मक (indicative) लेबल किया जाता है — इसे कभी भी मनगढ़ंत संख्याओं से नहीं भरा जाता।
जीवनकाल और मुआवज़ा
Lifetime टैब (v1.118.0) दो शून्य-टोकन पेरेंट स्क्रिप्ट्स को केवल-पठन मोड में रिले करता है: stats.mjs — आपके जीवनकाल ट्रैकर का समुच्चय, संचयी फ़नल दरें (response / interview / offer), स्कैनर के कुल आँकड़े, और पोर्टल कवरेज — और salary-gap.mjs — प्रति आवेदन वांछित बनाम विज्ञापित बनाम वास्तविक मुआवज़ा, जो रिपोर्ट Machine Summaries और data/salary-observations.tsv से संयोजित है। छोटे सैंपलों को संकेतात्मक लेबल किया जाता है; पेरेंट प्रोजेक्ट के बिना टैब एक ईमानदार नोट दिखाता है।
27. करियर योजना (#/career-plan)
करियर योजना पेज आपके CV और प्रोफ़ाइल को एक ठोस, व्यक्तिगत विकास योजना में बदल देता है — ठीक वैसी जैसी आप एक करियर कोच के साथ बनाते, लेकिन आपकी अपनी सामग्री से जनरेट की गई और संपादित करने के लिए पूरी तरह आपकी।
योजना जनरेट करना
एक Horizon (6, 12, या 24 महीने) चुनें, वैकल्पिक रूप से एक Focus टाइप करें (उदाहरण के लिए “प्रबंधन में जाना”, “रिमोट पर जाना”, या “Go में स्विच करना”), और Generate plan पर क्लिक करें। मॉडल आपका CV, प्रोफ़ाइल, two-pager, और मेमोरी नोट (साझा प्रोजेक्ट संदर्भ के माध्यम से) पढ़ता है और एक संरचित योजना लिखता है: एक ईमानदार शुरुआती-बिंदु स्नैपशॉट, ताकत-और-विकास SWOT, SMART / OKR / WOOP के रूप में व्यक्त किए गए लक्ष्य, ट्रेड-ऑफ़ के साथ वैकल्पिक करियर पथ, एक हार्ड/सॉफ्ट स्किल योजना, आपके चुने हुए Horizon के लिए महीने-दर-महीने रोडमैप, प्रगति को ट्रैक करने का तरीका, संभावित नुकसान (pitfalls), और सहायक कदम। हर सिफ़ारिश आपकी सामग्री में वास्तव में जो दिखता है उस पर आधारित है — यह आगे की योजना बनाता है, यह कभी भी आपके इतिहास के बारे में तथ्य नहीं गढ़ता। बिना API कुंजी सेट किए आपको इसके बजाय एक कॉपी-पेस्ट प्रॉम्प्ट मिलता है।
संपादन और सहेजना
योजना एक संपादन योग्य टेक्स्ट क्षेत्र में उतरती है — कुछ भी बदलें, फिर Save plan पर क्लिक करें। यह आपके पेरेंट प्रोजेक्ट की यूज़र लेयर में config/career-plan.md पर लिखी जाती है, इसलिए यह सिस्टम अपडेट से बची रहती है और केवल तभी भेजी जाती है जब आप स्वयं चलाने के लिए चुने गए LLM प्रॉम्प्ट्स के भीतर हो। Preview आपके Markdown को रेंडर करता है ताकि आप सहेजने से पहले इसे फ़ॉर्मेट किया हुआ पढ़ सकें।
निर्यात (Exporting)
योजना को ऐप से बाहर ले जाने के लिए Download .md, Save as PDF, या Copy का उपयोग करें — वही निर्यात नियंत्रण जो ऐप की AI रिपोर्टों में हर जगह उपयोग किए जाते हैं। PDF मौजूदा इनलाइन-PDF जनरेटर से गुज़रता है; Markdown एक सीधा डाउनलोड है।
28. करियर ओरिएंटेशन (#/orientation)
करियर ओरिएंटेशन पेज इस सवाल का जवाब देता है “कौन-सी दिशाएँ वास्तव में मुझ पर सूट करती हैं?” — वैसा ही आकलन जो आपको एक व्यावसायिक परीक्षण (vocational test) से मिलता, लेकिन एक प्रश्नावली के बजाय आपके अपने CV और प्रोफ़ाइल से निकाला गया।
यह क्या तैयार करता है
Generate profile पर क्लिक करें और मॉडल आपका CV, प्रोफ़ाइल, two-pager, और मेमोरी नोट पढ़कर एक करियर-ओरिएंटेशन प्रोफ़ाइल लिखता है: आपके सर्वश्रेष्ठ-फ़िट करियर वेक्टर (आठ आर्किटाइप्स में से — Functionalist, Administrator, Communicator, Specialist, Analyst, Innovator, Manager, Entrepreneur — कौन-से सबसे अच्छे फ़िट होते हैं, आपके CV से साक्ष्य के साथ), एक करियर-प्रकार झुकाव, अनुशंसित भूमिकाओं का एक सेट, CV में जो दिखता है उससे जुड़ी आपकी व्यावसायिक ताकतें, कार्य-शैली प्रवृत्तियाँ (कुछ अक्षों पर “आपका CV कैसा पढ़ा जाता है”), और आपकी फ़िट को व्यापक बनाने के लिए विकास सिफ़ारिशें।
यह कैसे जनरेट होता है
यह आपका CV कैसा पढ़ा जाता है इसका एक AI प्रतिबिंब है — कोई मनोमितीय (psychometric) परीक्षण नहीं। प्रॉम्प्ट पूरी तरह से आपकी अपनी सामग्री पर आधारित है: यह उपलब्धियाँ नहीं गढ़ता और यह कभी भी संख्यात्मक परीक्षण स्कोर को ऐसे रिपोर्ट नहीं करता जैसे वे मापे गए हों। बिना API कुंजी सेट किए आपको एक लाइव प्रोफ़ाइल के बजाय किसी भी LLM में चलाने के लिए एक कॉपी-पेस्ट प्रॉम्प्ट मिलता है। डिस्क पर कुछ भी नहीं लिखा जाता — प्रोफ़ाइल हर बार नए सिरे से जनरेट होती है।
निर्यात (Exporting)
प्रोफ़ाइल रखने के लिए Download .md, Save as PDF, या Copy का उपयोग करें — वही निर्यात नियंत्रण जो ऐप की AI रिपोर्टों में हर जगह उपयोग किए जाते हैं। PDF मौजूदा इनलाइन-PDF जनरेटर से गुज़रता है; Markdown एक सीधा डाउनलोड है।
29. CareerOps मेनिफेस्टो
career-ops — यह पेरेंट प्रोजेक्ट जिसका यह ऐप मुखौटा (front) है — CareerOps मेनिफेस्टो (पेरेंट v1.20.0) का पहला संदर्भ कार्यान्वयन है। यह मेनिफेस्टो उस प्रैक्टिस का नाम बताता है जिसके लिए यह पूरा टूलचेन मौजूद है: नौकरी की खोज को उसी तरह चलाना जैसे इंजीनियर प्रोडक्शन चलाते हैं — साक्ष्य के साथ, अनुशासन के साथ, और उम्मीदवार के पक्ष में मेज़ पर मौजूद औज़ारों के साथ।
इसमें क्या कहा गया है
छह सिद्धांत — “कम को बेहतर तरीके से लागू करो”, “मात्रा से ज़्यादा संकेत”, “कीवर्ड से ज़्यादा साक्ष्य”, “फ़ैसला एक इंसान लेता है”, “स्थानीय-पहले (local-first)”, “मेज़ के दोनों तरफ़ गरिमा” — साथ ही AI-मध्यस्थ भर्ती के इस युग के लिए उम्मीदवार अधिकारों का एक विधेयक: आप डिफ़ॉल्ट रूप से अदृश्य हैं, आपकी सहमति के बिना कोई आपको प्रस्तावित नहीं करता, आपकी सहमति मानवीय है और किसी एजेंट को सौंपी नहीं जा सकती, आप कभी भुगतान नहीं करते, आपका डेटा आपका है। ऐप इन नियमों का डिज़ाइन के अनुसार पालन करता है: कुछ भी कभी स्वतः-सबमिट नहीं होता, सब कुछ स्थानीय रूप से चलता है, और जनरेट किए गए CV में हर दावा आपकी अपनी सामग्री तक वापस जाता है।
इसे पढ़ना और हस्ताक्षर करना
साइडबार फ़ुटर में दिया गया लिंक मेनिफेस्टो पेज खोलता है। आप पेरेंट प्रोजेक्ट में MANIFESTO.md भी पढ़ सकते हैं, या हस्ताक्षर पेज खोलने के लिए वहाँ npm run manifesto चला सकते हैं। हस्ताक्षर करना वैकल्पिक है और इसमें दस सेकंड लगते हैं — आपका हस्ताक्षर पेरेंट रिपॉज़िटरी के SIGNATURES.md लेजर में एक सार्वजनिक कमिट बन जाता है। ऐप में कुछ भी इस पर निर्भर नहीं करता कि आप हस्ताक्षर करते हैं या नहीं।