Skip to content

One‑click browser extention or CLI snapshots of BDJobs JDs into structured Markdown, structured JSON, and raw HTML.

License

Notifications You must be signed in to change notification settings

Ahnaf19/JobSnap

Repository files navigation

JobSnap

JobSnap

Save BDJobs circulars before they disappear.

Version Node.js JavaScript Chrome License

InstallationQuick StartDocumentationFeaturesRoadmap


BDJobs.com hides job descriptions after the deadline. Want to review that JD before your interview? You need a Pro subscription.

JobSnap fixes this:

  • 💻 CLI: jobsnap save <url>, jobsnap list, jobsnap export
  • 🌐 Extension: One-click download (Markdown or PDF)

JobSnap demo

What JobSnap Does

jobsnap save "https://bdjobs.com/jobs/details/1234567"

Instantly creates:

  • job.md - Clean Markdown (LLM-friendly)
  • job.json - Structured data (programmatic access)
  • raw.html - Original page (future-proof re-parsing)
Made with ❤️ for job seekers fighting paywalls

Installation

Global Install (Recommended)

git clone https://github.com/Ahnaf19/jobsnap.git
cd jobsnap
npm install
npm install -g .

Now use jobsnap anywhere:

jobsnap save "https://bdjobs.com/jobs/details/1436685"

Alternative Methods

Run from Repo (No Global Install)
npm install
npm run jobsnap -- save "https://bdjobs.com/jobs/details/1436685"
Chrome Extension (One-Click Saves)
  1. Open chrome://extensions
  2. Enable Developer mode
  3. Click Load unpacked → select extension/ folder
  4. Click JobSnap icon on any BDJobs job page or paste the URL

Quick Start

Save Your First Job

jobsnap save "https://bdjobs.com/jobs/details/1436685"

Output structure:

jobs/1436685/
  ├── raw.html       # Original snapshot
  ├── job.json       # Structured data
  └── job.md         # Clean Markdown
jobs/index.jsonl     # Searchable catalog

Re-parse Old Jobs

jobsnap reparse jobs/1436685

Use this when:

  • Parser improves in a new version
  • You want a different filename template
  • Job files get corrupted

Batch Save Multiple Jobs

jobsnap save "https://bdjobs.com/jobs/details/1436685" --skip
jobsnap save "https://bdjobs.com/jobs/details/1436686" --skip
jobsnap save "https://bdjobs.com/jobs/details/1436687" --skip

Tip

The --skip flag prevents overwriting jobs you've already saved.


Features

Feature Description
🔒 Offline-First Your data stays on your disk. No cloud dependencies.
🤖 AI-Ready Clean Markdown works seamlessly with ChatGPT, Claude, etc.
📋 List & Filter View, sort, and filter saved jobs by deadline, company, or tags.
📄 PDF Export Export jobs to professional PDFs or HTML with one command.
🔄 Future-Proof Re-parse old snapshots if BDJobs changes their format.
Dual-Path Parser Extracts embedded JSON + text fallback for resilience.
🎯 Smart Dates Unambiguous date format (Jan 08, 2026) prevents confusion.
🎨 Flexible Output Customize filenames with templates: {title}_{company}_{job_id}.md
🧪 Tested Unit tests, schema validation, fixture regression suite.
🌐 Two Interfaces CLI for power users, Chrome extension for one-click saves.

Documentation

📚 Guides

📖 Sections


CLI Commands

Command Description
jobsnap save <url> Fetch and save a BDJobs circular
jobsnap list List all saved jobs with filtering/sorting
jobsnap export <job_dir> Export job to PDF or HTML
jobsnap reparse <dir> Re-parse from existing raw.html
jobsnap --help Show usage information

Common Options

Option Description Example
--out <dir> Custom output directory --out ./my-jobs
--skip Skip if job already exists --skip
--template <pattern> Filename template --template "{title}_{company}_{job_id}.md"
--dry-run Preview paths without writing --dry-run

See full documentation: docs/cli-reference.md


Output Contract

JobSnap v1.0 guarantees a stable output format. Changes require a major version bump.

job.json Schema

Required fields:

{
  "job_id": "1436685",
  "url": "https://bdjobs.com/jobs/details/1436685",
  "saved_at": "2024-12-25T10:30:00Z",
  "source": "bdjobs",
  "parser_version": "1.0.0",
  "title": "Senior Software Engineer",
  "company": "ABC Technologies Ltd.",
  "summary": "...",
  "requirements": { ... },
  "responsibilities_context": { ... },
  "company_information": "..."
}

Optional fields: application_deadline, published, skills_expertise, compensation_other_benefits, read_before_apply

job.md Headings

Headings appear in this order when present:

  1. Summary
  2. Requirements (Education / Experience / Skills)
  3. Responsibilities & Context
  4. Skills & Expertise
  5. Compensation & Other Benefits
  6. Read Before Apply
  7. Company Information
  8. Raw Text (fallback only)

How It Works

Dual-Path Parsing

JobSnap uses two complementary extraction methods to ensure reliability:

  1. Primary: Extract embedded JSON from BDJobs' Angular state (ng-state)
  2. Fallback: Text scraping with intelligent section detection
  3. Merge: Combine both results for maximum data coverage

Even if BDJobs changes their page structure, JobSnap adapts.

Reparse Workflow

# Save with current parser
jobsnap save "https://bdjobs.com/jobs/details/1436685"

# Later: parser improves in v1.1
jobsnap reparse jobs/1436685  # No re-download needed!

Since JobSnap saves raw.html, you can regenerate job.json and job.md with newer parser versions anytime.


Configuration

Config File (jobsnap.config.json)

Set defaults in your project root:

{
  "outputDir": "jobs",
  "template": "{title}_{company}_{job_id}.md",
  "skip": false
}

Precedence Rules

CLI flags > jobsnap.config.json > .env > defaults

Example:

# Config has: outputDir = "jobs"
# This command uses "./archive" instead:
jobsnap save "..." --out ./archive

Full configuration guide: docs/cli-reference.md


Extension Guide

The Chrome extension uses the same parser as the CLI.

Usage

  1. Open a BDJobs job page
  2. Click the JobSnap icon
  3. Choose:
    • Download from current tab (one click)
    • Download from URL (paste a link)

Customization

  • Filename parts: Check/uncheck Title, Company, Job ID
  • Defaults: Right-click icon → Options

Syncing Core Updates

If you modify core/ files:

npm run sync-extension

Then reload the extension in Chrome.


Use Cases

Scenario Solution
Preparing for interviews? Review all saved JDs in one folder. Grep for specific skills.
Tailoring your CV? Extract common requirements from saved jobs.
Lost access to a JD? Re-read anytime—no Pro subscription needed.
AI-powered analysis? Feed Markdown to ChatGPT/Claude for career advice.
Tracking applications? Search index.jsonl for all jobs from a company.

Testing

npm test

Test coverage:

  • ✅ Unit tests (core parser logic)
  • ✅ Schema validation (required fields)
  • ✅ Markdown contract (stable headings)
  • ✅ Fixture regression (real BDJobs pages)

Roadmap

v1.0 ✅

  • Stable output contract
  • Dual-path parser with fallback
  • CLI + Chrome extension
  • Regression test suite

v2.0 (Current) ✅

  • 📋 List command - View, sort, and filter saved jobs
  • 📄 PDF/HTML export - Export jobs to PDF or HTML with professional styling
  • 🎨 Enhanced extension - PDF download with native Chrome support
  • 📅 Date standardization - Unambiguous date format (MMM DD, YYYY)

v3.0 (Planned)

  • 🤖 LLM-powered JD summaries - Extract must-haves vs nice-to-haves
  • 📊 CV gap analysis - Compare resume against saved JDs
  • 📝 Interview prep - Auto-generate topic checklists
  • 🏷️ Tagging system - Tag and categorize saved jobs

v4.0+ (Future)

  • 🌍 Multi-platform - LinkedIn, Glassdoor, etc.
  • 🇧🇩 Bangla support - Local job board compatibility
  • 🔍 Advanced search - Full-text search across all saved jobs

FAQ

Does this violate BDJobs terms of service?

JobSnap saves publicly accessible pages for personal archival use, similar to saving a webpage in your browser. It doesn't automate interactions, bypass authentication, or scrape private data. Use responsibly.

What if BDJobs changes their page format?

JobSnap's dual-path parser adapts automatically. You can also re-parse old jobs with jobsnap reparse using updated parsers.

Can I use this for other job boards?

Not yet. v1.0 only supports BDJobs. Multi-platform support is planned for v3.0+. Contributions are welcomed!

Where is my data stored?

Locally on your disk in the jobs/ folder (or custom --out directory). JobSnap doesn't send data to external servers.

How do I update JobSnap?
git pull
npm install -g .

Then optionally reparse old jobs: jobsnap reparse jobs/<job_id>


Known Limitations

  • ⚠️ Only supports https://bdjobs.com/jobs/details/<job_id> format
  • ⚠️ No "Applied jobs" automation (manual URL input required)
  • ⚠️ English only (Bangla support planned for v3.0+)

Requirements

  • Node.js 18+ (tested with Node 22)
  • Chrome browser (for extension)

Contributing

Contributions are welcome! 🎉

  • 🐛 Report bugs - Open an issue with reproduction steps
  • 💡 Request features - Describe your use case
  • 🔧 Submit PRs - See CONTRIBUTING.md for guidelines
  • 📦 Add fixtures - Help test with real BDJobs pages

Please read our Contributing Guide before submitting pull requests.


License

MIT - See LICENSE file for details


Acknowledgments

Built to solve a real problem faced during my December 2023 job search in Bangladesh.

Questions or feedback? Open an issue or reach out!


Made with ❤️ for job seekers fighting paywalls

About

One‑click browser extention or CLI snapshots of BDJobs JDs into structured Markdown, structured JSON, and raw HTML.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •