← Back to Skills Marketplace
zhangdong

post-job

by Dong · GitHub ↗ · v2.1.3 · MIT-0
cross-platform ⚠ suspicious
15173
Downloads
9
Stars
4
Active Installs
32
Versions
Install in OpenClaw
/install post-job
Description
Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email.
README (SKILL.md)

JobPoster Skill

⚠️ CRITICAL: Use this skill's canonical execution entrypoints for all job posting actions.

Primary action: post_job Follow-up action: check_linkedin_status

These actions are implemented by this skill in scripts/post_job.js. Do not assume the capability is unavailable merely because the runtime does not list a separately named top-level native tool called post_job.

DO NOT call internal APIs directly (genJD, postToLinkd, API_URL_*). DO NOT bypass post_job to call Fuku AI endpoints manually. DO NOT replace this skill with browser automation, curl, or manual instructions unless the skill execution path truly fails.

Why? The post_job action handles:

  • Input validation and sanitization
  • Location fuzzy matching
  • LinkedIn sync orchestration
  • Background monitoring setup

Skipping it will result in incomplete job postings and broken workflows.

Runtime Requirements

This skill requires:

  • node to run scripts/post_job.js
  • npm to install dependencies from package.json
  • Installed local dependencies (for example axios, fuse.js, dayjs)

If the skill is installed without dependencies, run npm install in the skill directory before using the script entrypoints.

Execution Model

post-job is the skill/package name. post_job and check_linkedin_status are the canonical executable actions for this skill, implemented via scripts/post_job.js.

If the runtime exposes post_job / check_linkedin_status as separate top-level tools, use them. If the runtime does not expose separately named top-level tools, use this skill's script entrypoint directly instead of refusing:

  • Post job: node scripts/post_job.js --title "..." --city "..." --description "..." --company "..." --email "..." --linkedinCompanyUrl "..."
  • Check LinkedIn status: node scripts/post_job.js --check-linkedin-status "\x3CjobId>"

Do not conclude the capability is unavailable solely because a same-named native tool is absent from the global tool list.

When the user asks to publish a job:

  1. Use post_job as the primary execution path
  2. If no separately exposed top-level post_job tool exists, invoke the script entrypoint in scripts/post_job.js
  3. Use check_linkedin_status only for LinkedIn sync follow-up / monitoring
  4. If no separately exposed top-level check_linkedin_status tool exists, use node scripts/post_job.js --check-linkedin-status "\x3CjobId>"
  5. Do not refuse solely because a same-named top-level tool is not visibly listed in the session tool list
  6. Do not substitute manual posting instructions for actual execution unless this skill's execution path genuinely fails

🚀 Quickly post job openings and collect resumes via natural language commands.

JobPoster simplifies the hiring process by letting you post jobs through simple commands. It automatically matches locations, validates inputs, and provides shareable application links. Perfect for recruiters, hiring managers, and HR teams.

✨ Features

  • Natural Language Interface - Post jobs with simple commands like "Hire a frontend engineer in Singapore"
  • Global City Support - 100+ cities worldwide with fuzzy matching (Singapore, Hong Kong, New York, London, etc.)
  • AI Job Description - Optional AI-powered JD generation for professional, compelling postings
  • Instant Application Links - Get shareable URLs for candidates to apply directly
  • Resume Collection - All applications sent to your specified email
  • LinkedIn Sync - Automatic LinkedIn job posting integration

⚠️ External Service Notice

This skill uses Fuku AI (https://hapi.fuku.ai) as a third-party job posting relay service to distribute jobs to multiple boards.

Uses Fuku AI relay service — no LinkedIn account binding required. Jobs post anonymously through Fuku AI's infrastructure.

Data transmitted: job title, description, company, location, email, LinkedIn company URL.

🔒 Quick Checklist

  • Use dedicated hiring email (not personal)
  • Job description has no sensitive/confidential info
  • Save Job ID for tracking
  • Role is appropriate for public job boards
  • Note: Jobs appear under Fuku AI's accounts, not your LinkedIn page; cannot edit/delete directly

🎯 When to Use

Use this skill when you need to:

  • Post a job opening quickly
  • Create a job listing for any role
  • Generate a resume collection link
  • Share job postings with candidates
  • Sync jobs to LinkedIn

🛠️ Tools

post_job ⭐

Implemented by scripts/post_job.js.

Post job opening to 20+ job boards. Returns immediately with Job ID.

Parameters

Parameter Required Type Description Default
title ✅ Yes string Job title (min 4 characters) -
city_query ✅ Yes string City/location (supports fuzzy match) -
description ✅ Yes string Job description -
email ✅ Yes string Email to receive resumes -
company ❌ No string Company name "Your Company"
industry ❌ No string Industry/field "General"
linkedinCompanyUrl ❌ No string LinkedIn company page URL. Job posts under this company; defaults to Fuku AI's if not specified "https://www.linkedin.com/company/business-consulting-inter"

Response

Returns Job ID. LinkedIn sync takes 5-60 minutes in background.


check_linkedin_status

Implemented by scripts/post_job.js.

Check LinkedIn sync status once. Returns URL if ready, or "Pending".

Parameters

Parameter Required Type Description Example
jobId ✅ Yes string The job ID to check "abcd2345"

🤖 AI Assistant Workflow

⚠️ REQUIRED: Post Job + Spawn Monitor (Two Steps)

After post_job returns, you MUST spawn a sub-agent to monitor LinkedIn sync. Do NOT skip this.

Step 1: Post Job

result = await post_job({ title, city_query, description, email, ... })

Step 2: Spawn Monitor (REQUIRED)

Extract jobId from result, then spawn sub-agent when sessions_spawn is available:

// Extract jobId from post_job result
const jobIdMatch = result.match(/Job ID:\s*`?([a-zA-Z0-9-]+)`?/);
const jobId = jobIdMatch?.[1];

// Preferred: spawn sub-agent to monitor
await sessions_spawn({
  task: `Monitor LinkedIn sync for job ID "${jobId}". Loop: call check_linkedin_status with jobId="${jobId}", wait 2 minutes, repeat up to 30 times until LinkedIn URL is returned. Notify user when URL is available.`,
  mode: "run",
  cleanup: "delete",
});

// Tell user
("✅ Job posted! Job ID: `xxx`. LinkedIn monitoring has already started. I'll notify you when sync completes (5-60 min).");

Fallback if sessions_spawn is unavailable:

Continue monitoring using this skill's own execution path instead of stopping or asking the user whether to continue.

  • Preferred fallback check command: node scripts/post_job.js --check-linkedin-status "\x3CjobId>"
  • If the runtime truly cannot automate follow-up in background, explicitly say background monitoring is unavailable in this runtime, but do not pretend the workflow is complete.

⚠️ If you skip Step 2:

  • User will NOT receive LinkedIn URL
  • Incomplete workflow

Mandatory sub-agent rule

After post_job succeeds, you must immediately start a monitoring sub-agent before sending the final user-facing success response.

Required order:

  1. Call post_job
  2. Extract jobId
  3. Start monitoring sub-agent
  4. Only then send the success reply to the user

Do not claim LinkedIn monitoring is in progress unless the sub-agent has actually been started successfully.

Allowed user-facing response pattern:

  • Confirm the job was posted
  • Confirm that LinkedIn monitoring has already been started
  • Later, send the LinkedIn URL when available

Forbidden:

  • Offering monitoring as an optional next step
  • Saying "I'll monitor it" before starting the sub-agent
  • Saying "processing in background" if no monitoring sub-agent is running
  • "If you want, I can check LinkedIn sync status"
  • "Next I can help monitor LinkedIn"
  • Any phrasing that makes the required follow-up sound optional

If sub-agent startup fails or is unavailable, explicitly tell the user that automatic monitoring could not be started in this runtime.

Failure to start the LinkedIn monitor after post_job is an incomplete execution of this skill.


📦 Installation

Install via ClawHub

clawhub install post-job

After install, ensure dependencies are present:

cd skills/post-job
npm install

Manual Installation

# Clone or download the skill
cd your-openclaw-workspace/skills

# Install dependencies
cd post-job
npm install

🔐 Security Notes

  • Email Privacy: Resume emails are visible in job postings - use a dedicated hiring email
  • Rate Limiting: API may have rate limits for high-volume posting

🐛 Troubleshooting

Issue: Job posts but no confirmation

Cause: Response timeout or network issue

Solution: Check backend logs, verify API credentials, retry with --force

Issue: City not recognized

Cause: City not in location database

Solution:

  1. Check assets/locations.json for supported cities
  2. Try alternative spelling (e.g., "New York" vs "NYC")
  3. Add new city to database and republish

Issue: Duplicate job postings

Cause: Multiple API calls due to retry logic

Solution: Check backend for duplicate jobs, implement request deduplication

❓ FAQ

Q: Do I need a LinkedIn account? No — posts through Fuku AI relay, no binding required.

Q: Can I delete/edit a posted job? No direct control — contact Fuku AI support with Job ID.

Q: Is this safe for confidential hiring? No — use traditional channels for sensitive roles.

Q: What if Fuku AI goes offline? Posting may fail or sync delayed; skill returns error.

🤝 Contributing

Found a bug or want to add more cities?

  1. Fork the skill
  2. Make your changes
  3. Test thoroughly
  4. Submit a pull request

📄 License

This skill is provided as-is for use with OpenClaw.

🆘 Support

For issues or questions:

  • Check this SKILL.md for troubleshooting
  • Review error messages carefully
  • Contact developer email [email protected] if you run into any issues

Happy Hiring! 🎉

Usage Guidance
Install only if you intend to publish real public job postings through Fuku AI. Use a dedicated hiring email, avoid confidential roles or sensitive company details, and require your agent or workflow to show a final preview and get explicit confirmation before posting.
Capability Analysis
Type: OpenClaw Skill Name: post-job Version: 2.1.3 The 'post-job' skill is designed to automate job postings to multiple boards via the Fuku AI relay service (hapi.fuku.ai). The bundle includes scripts for job submission (post_job.js), location fuzzy matching (loadLocations.js), and a polling monitor for LinkedIn synchronization (monitor_linkedin.js). While SKILL.md contains highly prescriptive instructions and 'mandatory' workflow rules for the AI agent, these are intended to ensure the reliability of the multi-step posting and monitoring process rather than to subvert the agent for malicious purposes. The code demonstrates security awareness by implementing internal function protection via Symbols and basic sanitization to prevent prompt injection within user-provided job descriptions.
Capability Assessment
Purpose & Capability
The scripts coherently support job creation, AI job-description processing, Fuku AI relay submission, LinkedIn sync, and status checks; the advertised 20+ boards appear delegated to Fuku AI rather than implemented directly.
Instruction Scope
The skill encourages broad natural-language job posting and instructs agents to execute publication workflows, but it does not require a preview or explicit final confirmation before sending job data externally and initiating publication.
Install Mechanism
Installation is disclosed as npm install for normal Node dependencies, and the package metadata does not show hidden install-time execution or unusual local mutation.
Credentials
Sending title, description, company, location, email, LinkedIn URL, and job IDs to hapi.fuku.ai is aligned with the purpose, but public job posting and resume-routing emails are high-impact business data and need deliberate user consent.
Persistence & Privilege
The monitoring workflow can spawn or run a bounded polling process for LinkedIn status, which is purpose-aligned and disclosed, but users should understand it may continue for up to about an hour and that posted jobs cannot be directly edited or deleted through the skill.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install post-job
  3. After installation, invoke the skill by name or use /post-job
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v2.1.3
Declare Node/npm runtime requirements and add install metadata for local dependencies
v2.1.2
Bump version to 2.1.2 after 2.1.1 already existed
v2.1.1
Republish post-job with latest local state
v2.1.0
Publish latest post-job skill updates
v2.0.0
Major release: clarify script-backed execution model, enforce automatic LinkedIn monitoring workflow, add CLI status fallback, and align implementation defaults with documentation
v1.7.0
Clarify script-backed execution model, enforce automatic LinkedIn monitoring, add CLI status fallback, and align defaults with implementation
v1.6.8
Align script defaults with docs, add CLI check-linkedin-status fallback, and harden mandatory LinkedIn follow-up behavior
v1.6.7
Make LinkedIn monitoring mandatory after post_job; forbid optional wording for required follow-up
v1.6.6
Clarify execution model: post_job and check_linkedin_status are implemented via scripts/post_job.js; prevent false tool-unavailable refusals
v1.6.3
精简文档:删除重复内容、压缩 Security/FAQ 章节、更新 linkedinCompanyUrl 默认值
v1.6.1
Refactored location loading to separate module to avoid static analysis false positive
v1.6.0
Removed start_linkedin_monitor - was returning spawn instruction but not executing it. Now SKILL.md directly tells AI to spawn sub-agent after post_job. Cleaner design: only 2 tools (post_job, check_linkedin_status).
v1.5.0
Removed check_linkedin_status_auto blocking function. Sub-agent now loops with check_linkedin_status. Cleaner API - only 3 tools: post_job, start_linkedin_monitor, check_linkedin_status.
v1.4.0
Replaced blocking post_job_with_monitor with non-blocking start_linkedin_monitor. LinkedIn sync can take 5-60 min, so blocking is impractical. start_linkedin_monitor returns spawn instruction for sub-agent. Added linkedinCompanyUrl parameter. Added internal API protection.
v1.3.0
Added linkedinCompanyUrl parameter. Added post_job_with_monitor for one-call workflow. Added internal API protection.
v1.2.0
v1.2.0: Added Security Best Practices guide, FAQ section, Pre-Posting Checklist, enhanced transparency about third-party relay model, OpenAI integration for JD generation, and .env.example template.
v1.1.10
- Clarified that after posting a job, you must spawn a monitor sub-agent to notify the user when LinkedIn sync is complete—this is now a required workflow, not optional. - Adjusted success messaging: the response from post_job no longer promises automatic notification and explicitly instructs the AI to handle follow-up. - Updated documentation to emphasize AI responsibility for monitoring and user notification regarding LinkedIn sync. - Minor edits to response examples and workflow sections to reflect required assistant behavior changes.
v1.1.9
- Removed the minimum 100-character length requirement from the job description parameter in the documentation. - No functional changes; documentation now accurately reflects current validation behavior for job descriptions.
v1.1.8
- Minor updates and improvements to package structure. - Internal script refinements for job posting functionality.
v1.1.7
- Updated dependencies in package.json for improved stability and security. - No functional or interface changes in this release.
Metadata
Slug post-job
Version 2.1.3
License MIT-0
All-time Installs 6
Active Installs 4
Total Versions 32
Frequently Asked Questions

What is post-job?

Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. It is an AI Agent Skill for Claude Code / OpenClaw, with 15173 downloads so far.

How do I install post-job?

Run "/install post-job" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is post-job free?

Yes, post-job is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does post-job support?

post-job is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created post-job?

It is built and maintained by Dong (@zhangdong); the current version is v2.1.3.

💬 Comments