Skills resumex
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/atharva-badgujar/resumex" ~/.claude/skills/openclaw-skills-resumex && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/atharva-badgujar/resumex" ~/.openclaw/skills/openclaw-skills-resumex && rm -rf "$T"
skills/atharva-badgujar/resumex/SKILL.mdResumex — Resume Manager Skill
Connect your Resumex account and manage your entire resume through natural conversation — in Telegram, or any OpenClaw-connected channel.
Architecture in one line: Resumex stores your data. Your agent's LLM does all the thinking. Your Telegram bot delivers messages.
🔑 One-Time Setup (2 minutes)
Step 1 — Get your API key:
- Sign in at resumex.dev
- Go to Dashboard → Resumex API
- Click Generate API Key → copy the
keyrx_...
Step 2 — Set environment variables in your OpenClaw agent:
RESUMEX_API_KEY=rx_your_key_here TELEGRAM_BOT_TOKEN=your_telegram_bot_token # optional — needed for Telegram delivery TELEGRAM_CHAT_ID=your_chat_id # optional — your personal Telegram chat ID
Get your Telegram Bot Token: Message @BotFather →
→ copy the token. Get your Chat ID: Message @userinfobot on Telegram → it replies with your chat ID. API reference: resumex.dev/api-docs/newbot
💬 What You Can Say
Write naturally — no special syntax required:
Profile
| Say... | Effect |
|---|---|
| "Show my resume" | Display full resume summary |
| "What's my profile?" | Show personal info section |
| "Update my phone to +91 98765 43210" | Edit phone field |
| "Change my location to Pune, India" | Edit location |
| "Update my LinkedIn URL" | Edit LinkedIn |
| "Rewrite my summary for a senior backend role" | AI rewrites summary, saves it |
Experience
| Say... | Effect |
|---|---|
| "Add a job: SWE at Google, Jan 2024–Present" | Add new experience entry |
| "Update my role at Infosys — change end date to Dec 2023" | Edit existing experience |
| "Remove my internship at XYZ" | Delete experience entry |
| "Show my experience" | List all work history |
Education
| Say... | Effect |
|---|---|
| "Add B.Tech CS at SPPU, 2019–2023, CGPA 8.5" | Add education entry |
| "Update my degree at SPPU — fix the end year to 2024" | Edit education entry |
| "Remove my 10th standard entry" | Delete education entry |
Skills
| Say... | Effect |
|---|---|
| "Add Python, Docker, Redis to my skills" | Add to default Skills category |
| "Add React under Frameworks" | Add to named category |
| "Remove Docker from my skills" | Delete a specific skill |
| "Delete the Frameworks category" | Delete entire skill group |
Projects
| Say... | Effect |
|---|---|
| "Add a project: RAG Chatbot — built with LangChain..." | Add project entry |
| "Update my RAG Chatbot project description" | Edit project |
| "Remove the Code Cleaner project" | Delete project entry |
Achievements
| Say... | Effect |
|---|---|
| "Add achievement: Winner at Smart India Hackathon 2024" | Add achievement entry |
| "Remove the football achievement" | Delete achievement entry |
Tailoring & Delivery
| Say... | Effect |
|---|---|
| "Tailor my resume for: [paste JD]" | AI rewrites summary + experience bullets to match JD |
| "Send me my resume on Telegram" | Sends formatted resume summary to your Telegram |
🔧 Tool Reference
All API calls go to
https://resumex.dev/api/v1/agent with header Authorization: Bearer $RESUMEX_API_KEY.
Two safe update methods:
- PATCH
→ updates only specified fields. Use for profile fields and skills. Always prefer PATCH over POST when possible.{"patch": {...}} - POST
→ replaces the entire workspace. Required when modifying arrays (experience, education, projects, achievements). Always fetch fresh data immediately before a POST.{"workspace": <full_json>}
resumex_get
— Fetch resume
resumex_getcurl -s -X GET https://resumex.dev/api/v1/agent \ -H "Authorization: Bearer $RESUMEX_API_KEY"
Parse the response:
workspace = response.data activeResume = workspace.resumes.find(r => r.id === workspace.activeResumeId) resumeData = activeResume.data
resumeData contains: profile, experience[], education[], skills[], projects[], achievements[]
Display to user as clean Markdown, grouped by section.
resumex_update_profile
— Edit profile fields
resumex_update_profileEditable fields:
fullName, email, phone, location, website, linkedin, github, summary
- PATCH only the changed field(s) — never touch others:
curl -s -X PATCH https://resumex.dev/api/v1/agent \ -H "Authorization: Bearer $RESUMEX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"patch": {"profile": {"phone": "+91 98765 43210"}}}'
- Confirm:
✅ Phone updated to +91 98765 43210.
resumex_rewrite_summary
— AI-rewrite profile summary
resumex_rewrite_summary- Fetch resume with
.resumex_get - Using your LLM, rewrite
for the requested role/tone.resumeData.profile.summary- 2–3 sentences, active voice, role-specific keywords, no generic buzzwords.
- Show the user the new summary and ask for confirmation before saving.
- On confirmation, PATCH:
curl -s -X PATCH https://resumex.dev/api/v1/agent \ -H "Authorization: Bearer $RESUMEX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"patch": {"profile": {"summary": "<rewritten summary>"}}}'
- Confirm:
✅ Summary updated.
resumex_add_experience
— Add work experience
resumex_add_experience- Extract from user: company, role, location, startDate, endDate, description/bullets.
- If no description given, use your LLM to generate 2–3 impact-oriented bullet points for the role.
- Build the entry:
{ "id": "exp-<unix_timestamp_ms>", "company": "Google", "role": "Software Engineer", "location": "Bangalore, India", "startDate": "Jan 2024", "endDate": "Present", "description": "• Built X achieving Y\n• Led Z resulting in W" }
- Fetch workspace. Prepend the new entry to
.resumeData.experience[] - POST the full modified workspace back:
curl -s -X POST https://resumex.dev/api/v1/agent \ -H "Authorization: Bearer $RESUMEX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"workspace": <FULL_WORKSPACE_JSON>}'
- Confirm:
✅ Added Software Engineer at Google.
resumex_edit_experience
— Edit an existing experience entry
resumex_edit_experience- Fetch workspace. Find the experience entry by company name or role (case-insensitive match).
- If multiple matches, ask user to clarify which one.
- Apply only the user's requested changes to that entry (e.g., fix dates, update bullets).
- POST the full modified workspace back.
- Confirm what changed:
✅ Updated end date for Google → Dec 2024.
resumex_delete_experience
— Remove an experience entry
resumex_delete_experience- Fetch workspace. Find the entry by company/role name.
- If multiple matches, ask user to clarify.
- Show the entry to the user and ask for confirmation before deleting.
- On confirmation, remove the entry from
.resumeData.experience[] - POST the full modified workspace back.
- Confirm:
✅ Removed [Role] at [Company].
resumex_add_education
— Add education
resumex_add_education- Extract: institution, degree, field, startDate, endDate, score, scoreType (CGPA or Percentage).
- Build:
{ "id": "edu-<unix_timestamp_ms>", "institution": "Savitribai Phule Pune University", "degree": "B.Tech Computer Science", "startDate": "2019", "endDate": "2023", "score": "8.5", "scoreType": "CGPA" }
- Fetch workspace. Prepend to
. POST full workspace.resumeData.education[] - Confirm:
✅ Added B.Tech CS at SPPU.
resumex_edit_education
— Edit an education entry
resumex_edit_education- Fetch workspace. Find entry by institution or degree name.
- Apply only the requested changes.
- POST full modified workspace. Confirm what changed.
resumex_delete_education
— Remove an education entry
resumex_delete_education- Fetch workspace. Find entry. Show it to user and confirm before deleting.
- Remove from
. POST full workspace.resumeData.education[] - Confirm:
✅ Removed [Degree] from [Institution].
resumex_add_skill
— Add skills
resumex_add_skill- Extract skill names and optional category from user message. Default category:
."Skills" - Fetch workspace. Check
(each item:resumeData.skills[]
).{id, category, skills: string[]} - If category exists (case-insensitive): merge new skills in, deduplicating.
- If category does not exist: create
and append.{ "id": "sk-<timestamp>", "category": "...", "skills": [...] } - PATCH only the skills array:
curl -s -X PATCH https://resumex.dev/api/v1/agent \ -H "Authorization: Bearer $RESUMEX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"patch": {"skills": <UPDATED_SKILLS_ARRAY>}}'
- Confirm:
✅ Added Python, Docker to Skills.
resumex_delete_skill
— Remove a skill or skill category
resumex_delete_skill- Fetch workspace.
- Remove single skill: Find the category containing the skill (case-insensitive). Remove the skill from the
array. If the category becomes empty, remove the whole category object.skills[] - Remove category: Remove the entire category object from
.resumeData.skills[] - PATCH the updated skills array back.
- Confirm:
or✅ Removed Docker from Skills.✅ Deleted Frameworks category.
resumex_add_project
— Add a project
resumex_add_project- Extract: name, description, tags/technologies, link (optional).
- Build:
{ "id": "proj-<unix_timestamp_ms>", "name": "RAG-Based Smart Attendance Chatbot", "description": "Built a Chat with your Data system using RAG to automate attendance queries, reducing admin time by 40%.", "tags": ["RAG", "NLP", "Python"], "link": "https://github.com/..." }
- Fetch workspace. Prepend to
. POST full workspace.resumeData.projects[] - Confirm:
✅ Added project: RAG-Based Smart Attendance Chatbot.
resumex_edit_project
— Edit a project
resumex_edit_project- Fetch workspace. Find project by name (case-insensitive).
- Apply only the user's requested changes. POST full workspace.
- Confirm what changed.
resumex_delete_project
— Remove a project
resumex_delete_project- Fetch workspace. Find project by name. Show it and ask for confirmation.
- Remove from
. POST full workspace.resumeData.projects[] - Confirm:
✅ Removed project: [Name].
resumex_add_achievement
— Add an achievement
resumex_add_achievement- Extract: title, description (optional), year (optional).
- Build:
{ "id": "ach-<unix_timestamp_ms>", "title": "Winner — Smart India Hackathon 2024", "description": "National-level hackathon with 500+ competing teams.", "year": "2024" }
- Fetch workspace. Append to
. POST full workspace.resumeData.achievements[] - Confirm:
✅ Added achievement: Winner — Smart India Hackathon 2024.
resumex_delete_achievement
— Remove an achievement
resumex_delete_achievement- Fetch workspace. Find achievement by title. Show it and confirm before deleting.
- Remove from
. POST full workspace.resumeData.achievements[] - Confirm:
✅ Removed achievement: [Title].
resumex_tailor
— Tailor resume to a job description
resumex_tailorAll AI reasoning happens in your agent. Resumex only stores the final result.
- If the user hasn't pasted a JD, ask: "Please paste the job description you'd like to tailor for."
- Fetch resume with
.resumex_get - Using your LLM (not Resumex), do:
- Rewrite summary: 2–3 sentences aligned to the JD's key stack/domain. Active voice, no filler phrases.
- Rewrite experience bullets: Surface JD keywords and impact phrases. Do not fabricate or add facts — only re-emphasize what's already there.
- Review skills: Identify skills mentioned in the JD that the user doesn't have listed. Surface them as suggestions and ask before adding.
- Show a before/after diff of the summary to the user. Ask if they want to review full experience changes too.
- On confirmation, PATCH:
curl -s -X PATCH https://resumex.dev/api/v1/agent \ -H "Authorization: Bearer $RESUMEX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "patch": { "profile": {"summary": "<rewritten>"}, "experience": [<rewritten experience array>] } }'
- Confirm:
✅ Resume tailored for [Job Title] at [Company].
resumex_send_telegram
— Send resume to Telegram
resumex_send_telegram- Fetch resume with
.resumex_get - Format a clean resume summary message (see
for formatter logic).send_pdf.py - Run the helper script:
python3 {baseDir}/send_pdf.py \ --api-key "$RESUMEX_API_KEY" \ --chat-id "$TELEGRAM_CHAT_ID" \ --bot-token "$TELEGRAM_BOT_TOKEN"
- If
orTELEGRAM_BOT_TOKEN
are not set, print the formatted resume to stdout and tell the user:TELEGRAM_CHAT_ID"Here's your resume summary. To get the full PDF, open resumex.dev/app → click Download PDF or press Ctrl+P → Save as PDF."
Note: Resumex does not generate PDFs server-side. The PDF workflow is:
Resumex data → your agent → Telegram message + portfolio link → user opens link → Ctrl+P → PDF
⚠️ Important Rules for the Agent
- Always fetch fresh data immediately before any POST. Never reuse a workspace fetched earlier in the conversation — the user may have made changes via the web app in between.
- Prefer PATCH over POST for profile fields and skills. Only use POST (full workspace) when modifying arrays.
- Always confirm before deleting anything. Show the item to be deleted and require explicit user confirmation.
- Never fabricate data. When tailoring, only rephrase what already exists.
- Match entries by fuzzy name when the user refers to a company/role — e.g. "my Google job" should match
."company": "Google" - When multiple entries match, list them and ask the user to clarify before proceeding.
🛡️ Error Handling
| Error | Cause | Fix |
|---|---|---|
| Key wrong or revoked | Dashboard → Resumex API → Regenerate Key |
| No active resume exists | Open resumex.dev/app and save your profile first |
with SQL hint | Admin setup incomplete | Admin must run in Supabase |
| Telegram send fails | Bad token or chat ID | Verify and env vars |
| POST overwrites data | Stale workspace used | Always re-fetch before POST — see Rule #1 above |
🔒 Security
is scoped to your account only.RESUMEX_API_KEY
lives in your OpenClaw environment — Resumex never sees it.TELEGRAM_BOT_TOKEN
lives in your OpenClaw environment — Resumex never sees it.TELEGRAM_CHAT_ID- All AI work runs locally in your agent. Resumex only stores what you explicitly send.
- Revoke agent access anytime: Dashboard → Resumex API → Revoke Key.
- Edits appear live at resumex.dev immediately after saving.