WorkingNomads: JSON API endpoint /api/exposed_jobs/, word-level keyword
matching against title/tags/category, returns up to 25 relevant remote jobs.
SkipTheDrive: HTML scraper with /?s={query} search URL, uses precise CSS
selectors (custom_fields_company_name_display_search_results, article.post
cards). Returns up to 25 results per query.
Both fill a gap in social media, customer service, and entry-level roles
that existing boards don't cover well. No freshness filter applied (empty
posted_date) since aggregator boards post jobs that stay live for weeks;
DB-level 7-day cleanup handles staleness.
fix: soup.find(name=...) keyword clash in extract-url
soup.find('meta', name='twitter:title') passes 'meta' as first
positional arg (name) AND name= as keyword — BeautifulSoup rejects this.
Use attrs={'name': '...'} instead.
fix: move import hashlib to top, wrap extract-url in try/except
- Move misplaced import hashlib from middle of file to top
- Add traceback logging + outer try/except to extract-url endpoint
- Converts unhandled 500 into proper 400 with error detail
- Cover letter: full-page (350-500 words, 4-5 paragraphs), zero AI slop
- Anti-jargon: expanded banned-words list, anti-examples, concrete rules
- Section ordering randomized per generation via seeded Fisher-Yates
- CV profile (font/color/size) varies per job+generation (not just per user)
- CV diversity engine: grouped skills shuffled, more synonym substitution
- File slugs include random hash suffix for naming variety
- HR email: optional checkbox during CV generation (both job-detail and manual pages)
- Also generate email button removed from standalone; now integrated into tailor flow
feat: add creative HR email generation on job-detail page
- Add generate_hr_email() in llm.py with non-generic, creative prompt
- Add POST /api/jobs/{job_id}/email-hr endpoint in main.py
- Add email card on job-detail.html with generate + copy-to-clipboard
fix: api key persistence — delete old keys before insert, add logging, verify saved keys in response