Manage recurring personalized job searches, analyze CVs, generate tailored application packs, and deliver ranked opportunity pipelines with DOCX attachments.
--- name: liber8 description: Role discovery and application-pack workflow for an individual job seeker. Use when setting up or operating Liber8: onboard a user, collect a resume and preferences, bootstrap the Liber8 workspace, run the bundled pipeline, review ranked opportunities, generate application-pack drafts, and optionally create a recurring run. Do not assume a fixed seniority, board bias, provider, or delivery endpoint unless the user explicitly chooses one. --- # Liber8 Liber8 is a recurring opportunity-discovery workflow for one person. The skill now includes its own runnable path: - `scripts/bootstrap_liber8.py` to create the user-local workspace - `scripts/liber8_pipeline.py` to run deterministic discovery, filtering, dedupe, and pack generation - `scripts/render_recurring_prompt.py` to generate the exact prompt used by a Liber8 recurring run - templates in `assets/templates/` for profile, resume, and recurring-run notes ## Credentials and environment model Liber8 has no skill-specific API keys. It should use capabilities already available in the user's OpenClaw environment. Expected environment: - OpenClaw web/search/fetch access for discovery and validation - an AI model if the host wants richer drafting later - an optional delivery channel if the host wants outbound summaries or attachments If delivery or drafting capability is not configured, Liber8 should still work locally. Do not ask the user to paste secrets into prompts or store credentials inside the skill. ## Scope and safety boundaries Keep Liber8 scoped to the user-approved Liber8 workspace and its own recurring run. In scope: - the Liber8 skill folder - the bundled Liber8 scripts - the user-local Liber8 config/state/output paths created during bootstrap - the specific recurring run created for Liber8 - user-provided role URLs, employer sites, and source lists relevant to discovery Out of scope unless the user explicitly asks: - unrelated repos or scheduler entries - shell startup files or OS service config - cookies, browser stores, login/session secrets - broad crawling beyond role-relevant pages - writes outside the Liber8 workspace/config paths ## Install and first-run checklist 1. Bootstrap a local Liber8 workspace by running `scripts/bootstrap_liber8.py`. 2. Fill in the generated profile JSON and resume text file. 3. Run `scripts/liber8_pipeline.py` manually once. 4. Inspect `summary.txt`, `manifest.json`, and generated pack files. 5. Only then enable recurring automation if the user wants it. ## Real execution path Use this path instead of relying on an external proof-of-concept script: 1. Run `scripts/bootstrap_liber8.py --workspace <workspace> --skill-root <skill-root>` once. 2. Edit the generated profile at `liber8/config/profiles/<name>.json`. 3. Edit the generated resume at `liber8/config/resumes/<name>.txt`. 4. Run: `python <skill-root>/scripts/liber8_pipeline.py --profile <profile-json> --resume <resume-txt> --state-dir <workspace>/liber8/state --output-dir <workspace>/liber8/output` 5. Read: - `liber8/output/summary.txt` - `liber8/output/manifest.json` - generated markdown pack files in `liber8/output/` 6. If the user wants automation, generate the recurring-run prompt with: `python <skill-root>/scripts/render_recurring_prompt.py --skill-root <skill-root> --workspace <workspace> --profile <profile-json> --resume <resume-txt> --state-dir <workspace>/liber8/state --output-dir <workspace>/liber8/output` 7. Create or update one Liber8-specific recurring run using that generated prompt. ## Onboarding flow When first setting up Liber8 for a user, make onboarding conversational and stepwise. Do not dump a large questionnaire all at once. Ask one question at a time, pause for the answer, then ask the next most relevant question. ### Resume intake Start by helping the user provide a resume/CV in whichever form is easiest for them: - file upload - a file placed in a known local directory - a URL to the resume/CV - pasted text For the local-directory path, do not ask the user to invent a file path. Instead, tell them to use the fixed Liber8 intake folder: - `liber8/inbox/` This inbox can be used for: - CVs / resumes - job descriptions - saved role adverts or exported role documents the user wants Liber8 to assess or apply against Then ask them for the filename, or let them simply say "done" if there is only one obvious relevant file there. If the user has not provided a resume yet, do not continue into deep search configuration. First resolve resume intake. If needed, help them populate the resume template incrementally. ### Conversational sequence After resume intake, gather the rest in small steps rather than one big form. A good order is: 1. target role families and exclusions 2. target seniority / level range 3. geography, commute, and remote/hybrid/onsite preferences 4. sectors to prioritise or avoid 5. target employers and employers to avoid 6. delivery preference: local-only or configured channel delivery 7. if using delivery, collect channel, target, whether to attach packs, and preferred formats 8. whether they want recurring automation after first-run validation Write the answers into the generated profile file as you go. Then: 9. extract employer names from the user's resume 10. infer likely competitors of those employers 11. run `scripts/search_source_candidates.py` to discover candidate source sites from target employers, resume employers, and likely competitors 12. show those candidate sources to the user and let them exclude any they do not want, keep the ones they do want, and add any extra sources manually 13. add the selected sources to the profile/source registry 14. run a manual first pass 15. review the shortlist with the user before enabling automation 16. ask for feedback on the shortlist: which roles felt promising, which felt off-target, which employers/titles/locations/themes should be favoured or avoided 17. write that feedback into the profile so future runs sharpen ranking and source selection ## Search design Liber8 should search in layers. - start from the candidate's configured role families, sectors, location, work mode, target employers, preferred sources, and accumulated feedback - during onboarding, search for candidate source sites the user can choose from - use selected source URLs and employer careers pages as the primary discovery path - use broader search results only as fallback discovery inputs, not as final validation on their own - dedupe previously surfaced roles through the local state ledger - continuously sharpen ranking using explicit user reactions to previous shortlists If a user shares a role URL: 1. inspect it 2. decide if it is live and relevant 3. generate a pack if relevant 4. add the domain/source only if it looks reusable If a user drops a JD / role file into `liber8/inbox/`: 1. read it 2. assess whether it is relevant to the user's current ambitions 3. generate or refine an application pack against it if useful 4. ask whether this role or employer should influence future search preferences If a user shares a target employer: 1. add it to the profile 2. use it in future discovery runs 3. consider competitor employers and their careers sites during source discovery After each meaningful shortlist review, ask brief feedback questions such as: - Which 1-3 roles were closest to what you want? - Which ones were clearly wrong, and why? - Are we under-targeting or over-targeting seniority? - Which employers, functions, sectors, or geographies should be favoured or avoided next time? Use the answers to update the feedback section of the profile rather than keeping them as loose chat context. ## Output contract A successful Liber8 run should produce local files even with no outbound delivery configured: - `summary.txt` -> concise shortlist - `manifest.json` -> structured run output - one application-pack draft per shortlisted role in Markdown - plain-text and DOCX variants where generated If the user configures delivery and the chosen channel supports attachments, Liber8 should prefer attaching generated pack files such as DOCX and Markdown. If the chosen channel does not support attachments, send the shortlist and include local file paths instead. ## Drafting rule If the host environment has a suitable AI model, Liber8 may use it for stronger cover-letter or CV refinement. If not, the bundled pipeline should still produce deterministic local draft packs. Do not require a model-specific credential owned by the skill. Do not invent facts. ## Automation rule Only create recurring automation when the user explicitly asks for it. That automation should call the bundled pipeline script with the user's profile/resume/state/output paths. Use `scripts/render_recurring_prompt.py` to generate the exact agent-turn text for the recurring run so the automation path stays consistent with the manual path. Default recurring behavior to local-only reporting unless the user has explicitly configured a delivery destination. Do not inspect or modify unrelated scheduler entries. Prefer sandbox or test-workspace validation before enabling recurring runs. ## Files bundled with this skill - `scripts/bootstrap_liber8.py` - `scripts/liber8_pipeline.py` - `scripts/render_recurring_prompt.py` - `scripts/search_source_candidates.py` - `assets/templates/profile.template.json` - `assets/templates/resume.template.txt` - `assets/templates/source-registry.template.json` - `assets/templates/recurring-run-notes.txt` - `assets/examples/sample-profile.json` - `assets/examples/sample-resume.txt` - `references/liber8-setup-and-ops.md` ## Example prompts - Set up Liber8 for me. - Bootstrap Liber8 in this workspace and show me which files to edit. - Use Liber8 to analyse my resume and build a first search profile. - Run Liber8 with my current profile. - Add these employers to Liber8: <list> - Update Liber8 to prioritise product roles in London with hybrid work. - Create a recurring Liber8 run every weekday at 07:30 after we validate the manual run.
don't have the plugin yet? install it then click "run inline in claude" again.
added explicit inputs section documenting environment, optional configs, and bundled scripts; restructured procedure into five numbered phases with clear input/output contracts for each step; extracted seven decision points covering missing resume, unavailable delivery, empty results, profile updates, attachment failures, state corruption, and network timeouts; formalized output contract with file paths and format guarantees; defined outcome signal as verifiable user-facing milestones.
Liber8 is a recurring opportunity-discovery workflow for a single job seeker. use it to onboard a user, collect their resume and role preferences, bootstrap a local workspace, run a deterministic search and filtering pipeline, review ranked opportunities, generate application-pack drafts, and optionally schedule recurring automation. do not assume fixed seniority, board bias, provider, or delivery endpoint unless the user explicitly chooses one. the skill works entirely within a local workspace with no skill-specific API keys, leveraging only capabilities already available in the user's OpenClaw environment.
required:
liber8/inbox/), URL, or pasted textoptional:
environment:
no credentials required:
bundled scripts and templates:
scripts/bootstrap_liber8.py: create the user-local workspacescripts/liber8_pipeline.py: run discovery, filtering, deduplication, and pack generationscripts/render_recurring_prompt.py: generate exact prompt for recurring automationscripts/search_source_candidates.py: discover candidate source sites from target employers and resume historyassets/templates/profile.template.json: profile schemaassets/templates/resume.template.txt: resume templateassets/templates/source-registry.template.json: source registry schemaassets/templates/recurring-run-notes.txt: notes for recurring runsassets/examples/sample-profile.json, sample-resume.txt: reference examplesphase 1: bootstrap workspace
input: user requests Liber8 setup or first run
scripts/bootstrap_liber8.py --workspace <workspace> --skill-root <skill-root> once<workspace>/liber8/ with config/, state/, output/, and inbox/ subdirectories, plus generated profile and resume templatesinput: empty profile and resume files created in step 1
liber8/inbox/ or upload directlyliber8/config/resumes/<name>.txtphase 2: gather preferences conversationally
input: confirmed resume location and basic user availability
liber8/config/profiles/<name>.json under targetRoles fieldinput: target role families confirmed
seniorityRange fieldinput: seniority confirmed
geography, workMode, commute fieldsinput: location and work mode confirmed
sectors and excludedSectors fieldsinput: sector preferences confirmed
targetEmployers and avoidEmployers fieldsinput: target employers listed
scripts/search_source_candidates.py --target-employers <list> --resume-employers <extracted> --skill-root <skill-root> to discover candidate source sites (e.g., LinkedIn, Indeed, company careers pages, niche boards)input: candidate sources presented to user
liber8/config/profiles/<name>.json under sources fieldinput: sources confirmed
delivery field (or "local" if local-only)input: delivery preference confirmed
delivery.attachments and delivery.formats fieldsphase 3: first manual run and validation
input: profile and resume fully populated, sources selected, delivery configured
python <skill-root>/scripts/liber8_pipeline.py --profile <profile-json> --resume <resume-txt> --state-dir <workspace>/liber8/state --output-dir <workspace>/liber8/outputsummary.txt, manifest.json, and one Markdown/DOCX pack per shortlisted roleinput: first run complete
liber8/output/summary.txt (concise shortlist) and liber8/output/manifest.json (structured run data)input: user has reviewed shortlist
feedback field for future ranking refinementphase 4: recurring automation (optional)
input: user explicitly requests recurring automation after validating first run
python <skill-root>/scripts/render_recurring_prompt.py --skill-root <skill-root> --workspace <workspace> --profile <profile-json> --resume <resume-txt> --state-dir <workspace>/liber8/state --output-dir <workspace>/liber8/outputinput: recurring prompt generated
ad-hoc flows
input: user shares a role URL mid-cycle
input: user drops a job description or role file into liber8/inbox/
input: user requests profile or source list changes mid-cycle
liber8/config/profiles/<name>.json or liber8/config/source-registry.json with user inputresume not yet provided:
delivery capability not available:
no AI model available for drafting:
source discovery fails or returns empty:
search_source_candidates.py returns no candidate sources, fall back to asking the user to provide sources manually (e.g., "where do you usually find job boards?")first-run shortlist is empty or off-target:
user requests profile updates after recurring runs have started:
attachment generation fails due to format or permissions:
deduplication ledger stale or corrupted:
liber8/state/ becomes corrupted or unreadable, delete it and allow the next run to rebuild from scratchrecurring run timeout or network failure:
a successful liber8 run produces the following local files, whether or not delivery is configured:
liber8/output/summary.txt: concise shortlist in plain text, one role per line with title, employer, location, and URLliber8/output/manifest.json: structured run metadata including timestamp, profile version, sources searched, deduplication stats, and role rank scoresliber8/output/<role-slug>.md: one application-pack draft per shortlisted role in Markdown format, including role description, match score, suggested cover-letter opening, and CV callout recommendationsliber8/output/<role-slug>.docx: DOCX variant of application pack where generation succeeds (optional if DOCX library unavailable)if the user configures delivery and the chosen channel supports attachments, liber8 prefers attaching generated pack files (DOCX and/or Markdown). if the chosen channel does not support attachments, liber8 delivers the shortlist summary and includes local file paths to packs instead.
if drafting with an AI model is available, packs include refined cover-letter and CV-refinement suggestions; without an AI model, packs include deterministic template text and direct callouts from the role description.
all files use UTF-8 encoding and are written only to paths under <workspace>/liber8/.
the user knows liber8 worked when:
config/, state/, output/, and inbox/ directoriessummary.txt and manifest.jsonliber8/output/ if local-only) at the requested frequency