Install
openclaw skills install @clawjames1/job-applicationCreate tailored application documents from structured profile data
openclaw skills install @clawjames1/job-applicationCreate truthful, role-specific application documents from the bundled structured profile or a profile supplied by the user.
$JOB_APPLICATION_PROFILE_DIR/*.json when configured, otherwise the fictional demonstration data in assets/profile/*.json$JOB_APPLICATION_OUTPUT_DIR when configured, otherwise $JOB_APPLICATION_DATA_DIR/applications (or the platform data directory's equivalent)job.json shaped like examples/job.jsonassets/templates/Keep real profiles, photographs, signatures, generated documents, and application history outside the installed skill directory. ClawHub updates may replace that directory. Resolve bundled resources relative to this skill directory, but honor the persistent-data environment variables. Do not assume a username, home directory, workspace layout, messaging channel, or recipient ID. For ClawHub, export the whitelist-only staging directory described in PUBLISHING.md, then run the publish dry-run against that staging directory.
Create the application folder with python3 scripts/prepare_application.py --slug <yyyy-mm-company-role>. For a derived application, add --base-application <absolute/base-directory>; its readable, valid cv_selection.json is checked before a new directory is created. Use the printed absolute path for all following files. Never overwrite an existing application directory unless the user explicitly requests reuse.
Save normalized job details as job.json.
Run scripts/generate_cv_selection.py --job <job.json> --output <cv_selection.json>. Use --limits <limits.json> for reviewed CV limits, and optionally --base <base/cv_selection.json> --mode adaptive|strict for a derived application. Review its deterministic suggestion and adjust only with facts supported by the profile.
Create one application_content.json with schema_version: 2, job, cover_letter, and plain_text as in examples/application_content.json. Keep claims grounded in selected profile records. The legacy cover_letter.json and indeed_text.json adapters are transitional; use scripts/convert_application_content.py to migrate them.
The cover-letter template renders job.company as its own first recipient line. Therefore cover_letter.recipient must name only the contact or team, and cover_letter.company_address must contain only address/location lines, never the company name again.
Generate source documents:
python3 scripts/generate_cv.py --selection <cv_selection.json> --output <CV.tex>
python3 scripts/generate_cover_letter.py --content <application_content.json> --output <cover_letter.tex> --profile-dir <profile-directory>
python3 scripts/generate_plain_text.py --content <application_content.json> --output <indeed_text.txt>
If pdflatex is available and PDFs are requested, run the cross-platform renderer:
python3 scripts/render_application.py <application-dir>
Rendering runs validate_application.py by default; Poppler's pdfinfo and pdftotext are required. The visible --skip-validation switch is for debugging only. Use validate_application.py <application-dir> --strict-fill to make an underfilled CV fail. For an external profile, pass the same --profile-dir to the cover-letter generator and renderer (or configure JOB_APPLICATION_PROFILE_DIR). The generator refuses an external letter that would silently use the bundled fictional profile, and the validator checks the letterhead against the selected profile.
On Windows, py -3 can be used instead of python3. Linux and macOS users may alternatively use the scripts/render_application.sh wrapper.
Return the generated paths and validation result. Deliver files externally only after destination-specific approval.
CV.pdf, cover_letter.pdf, and (when useful) indeed_text.txt as native downloadable document attachments in that conversation.file:// links as downloadable chat links. They are references for the local host only and are not usable by most chat clients.Installation requirements and platform-specific commands are documented in README.md. Generated sample PDFs using only fictional data are in examples/generated/.
achievement_sentences_per_experience limit (two by default) and make every sentence concise.organization, context, and context_label) so generated CVs can distinguish employer projects from work performed through the candidate's own company.cover_letter.signature_image. Include a profile photograph only when the user requests one or the supplied profile explicitly declares profile_picture; the bundled photo is fictional demonstration material.JSON contains content, Python performs deterministic transformation, and LaTeX handles layout. Do not hand-edit generated LaTeX when the source JSON can be corrected instead.