Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 26 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<h1>JobSnap</h1>
<p><strong>Save BDJobs circulars before they disappear.</strong></p>
<p>
<a href="https://github.com/Ahnaf19/jobsnap/releases"><img src="https://img.shields.io/badge/version-v1.0.0-ff6a3d" alt="Version" /></a>
<a href="https://github.com/Ahnaf19/jobsnap/releases"><img src="https://img.shields.io/badge/version-v2.0.0-ff6a3d" alt="Version" /></a>
<a href="#requirements"><img src="https://img.shields.io/badge/node-18%2B-3c873a?logo=node.js&logoColor=white" alt="Node.js" /></a>
<img src="https://img.shields.io/badge/javascript-ES2022-f7df1e?logo=javascript&logoColor=000" alt="JavaScript" />
<img src="https://img.shields.io/badge/Chrome-MV3-4285f4?logo=googlechrome&logoColor=white" alt="Chrome" />
Expand All @@ -24,9 +24,10 @@

`JobSnap` fixes this:

- 💻 **CLI:** `jobsnap save <url>`
- 🌐 **Extension:** One-click from your browser
- 💻 **CLI:** `jobsnap save <url>`, `jobsnap list`, `jobsnap export`
- 🌐 **Extension:** One-click download (Markdown or PDF)

<!-- TODO: Update demo GIF to show v2.0 features (list, export commands) -->
![JobSnap demo](assets/jobsnap-demo.gif)

## What JobSnap Does
Expand Down Expand Up @@ -136,9 +137,11 @@ jobsnap save "https://bdjobs.com/jobs/details/1436687" --skip
| ----------------------- | ------------------------------------------------------------------- |
| 🔒 **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. |
| 📋 **Stable Contract** | v1.0 guarantees consistent output format across updates. |
| 🎯 **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. |
Expand Down Expand Up @@ -166,11 +169,13 @@ jobsnap save "https://bdjobs.com/jobs/details/1436687" --skip

## CLI Commands

| Command | Description |
| ----------------------- | --------------------------------- |
| `jobsnap save <url>` | Fetch and save a BDJobs circular |
| `jobsnap reparse <dir>` | Re-parse from existing `raw.html` |
| `jobsnap --help` | Show usage information |
| 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

Expand Down Expand Up @@ -342,25 +347,32 @@ npm test

## Roadmap

### v1.0 (Current)
### v1.0 ✅

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

### v2.0 (Finger crossed!)
### 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
- 🔍 **Local search** - Grep-like search with tagging
- 🏷️ **Tagging system** - Tag and categorize saved jobs

### v3.0+ (Future)
### v4.0+ (Future)

- 🌍 **Multi-platform** - LinkedIn, Glassdoor, etc.
- 📄 **PDF export** - Customizable templates
- 🇧🇩 **Bangla support** - Local job board compatibility
- 🔍 **Advanced search** - Full-text search across all saved jobs

---

Expand Down
108 changes: 108 additions & 0 deletions assets/jobsnap-demo-v2.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/jobsnap-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/jobsnap-demo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion core/version.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const PARSER_VERSION = '1.0.0';
export const PARSER_VERSION = '2.0.0';
152 changes: 152 additions & 0 deletions docs/cli-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,158 @@ jobs/index.jsonl

---

### `list`

List all saved jobs with sorting, filtering, and grouping options.

**Usage:**

```bash
jobsnap list [options]
```

**Options:**

- `--sort <field>` - Sort by: `deadline` (default), `company`, `title`, `saved`
- `--active` - Show only active jobs (deadline not passed)
- `--expired` - Show only expired jobs (deadline passed)
- `--tag <tag>` - Filter by tag (e.g., `--tag backend`)
- `--group-by <field>` - Group by: `company` or `deadline`

**Examples:**

List all jobs sorted by deadline (default):

```bash
jobsnap list
```

Show only active jobs:

```bash
jobsnap list --active
```

Sort by company alphabetically:

```bash
jobsnap list --sort company
```

Filter by tag:

```bash
jobsnap list --tag remote
```

Group by company:

```bash
jobsnap list --group-by company
```

Show expired jobs sorted by company:

```bash
jobsnap list --expired --sort company
```

**What it does:**

1. Reads `jobs/index.jsonl`
2. Parses and validates all job entries
3. Applies filters (active/expired/tag)
4. Sorts by specified field
5. Groups if requested
6. Displays formatted output with color-coded deadlines

**Output format:**

```
┌─────────┬──────────────────────┬────────────────┬─────────────┐
│ Job ID │ Title │ Company │ Deadline │
├─────────┼──────────────────────┼────────────────┼─────────────┤
│ 1445561 │ Graphic Designer │ Eden Study │ 23d left │
│ 1436685 │ Senior Engineer │ ABC Tech │ 15d left │
└─────────┴──────────────────────┴────────────────┴─────────────┘
```

**Deadline color coding:**

- 🔴 Red: Expired
- 🟡 Yellow: 3 days or less
- 🟢 Green: 4-7 days
- ⚪ Gray: More than 7 days

---

### `export`

Export a saved job to PDF or HTML format.

**Usage:**

```bash
jobsnap export <job_dir> [options]
```

**Arguments:**

- `<job_dir>` - Path to job directory (e.g., `jobs/1436685`)

**Options:**

- `--format <type>` - Export format: `pdf` (default) or `html`

**Examples:**

Export to PDF (default):

```bash
jobsnap export jobs/1436685
```

Export to HTML:

```bash
jobsnap export jobs/1436685 --format html
```

**What it does:**

1. Reads `job.json` and `job.md` from the specified directory
2. Generates styled HTML with professional layout
3. For PDF: Uses Puppeteer (headless Chrome) to render vector PDF
4. For HTML: Saves standalone HTML file
5. Updates `index.jsonl` with `has_pdf: true` metadata

**Output:**

```
jobs/1436685/
raw.html
job.json
job.md
job.pdf ← New PDF file (~200KB)
# or
job.html ← New HTML file
```

**PDF Features:**

- Vector-based (crisp quality, small file size ~200KB)
- Professional styling with metadata header
- Consistent branding and layout
- Print-optimized margins and page breaks
- Unambiguous date format (Jan 08, 2026)

**Requirements:**

- Puppeteer is automatically installed with JobSnap
- No additional setup needed

---

### `reparse`

Re-parse an existing `raw.html` snapshot without re-downloading.
Expand Down
2 changes: 1 addition & 1 deletion extension/core/version.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const PARSER_VERSION = '1.0.0';
export const PARSER_VERSION = '2.0.0';
4 changes: 2 additions & 2 deletions extension/manifest.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"manifest_version": 3,
"name": "JobSnap",
"version": "1.0.0",
"description": "Download BDJobs job circulars as Markdown",
"version": "2.0.0",
"description": "Download BDJobs job circulars as Markdown or PDF",
"permissions": ["activeTab", "downloads", "scripting", "storage", "tabs"],
"host_permissions": ["https://bdjobs.com/*", "https://*.bdjobs.com/*"],
"background": {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jobsnap",
"version": "1.0.0",
"version": "2.0.0",
"description": "Save BDJobs job circulars as clean, LLM-friendly Markdown",
"type": "module",
"private": false,
Expand Down