Skip to content
Closed
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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ modes/_profile.md
# Secrets (never commit — use .env.example as template)
.env

# Google OAuth credentials and tokens
calendar/credentials.json
calendar/token.json

# Generated
.resolved-prompt-*
node_modules/
Expand Down
30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,36 @@ The scanner comes with **45+ companies** ready to scan and **19 search queries**

**Job boards searched:** Ashby, Greenhouse, Lever, Wellfound, Workable, RemoteFront

## Gmail Interview Scanner

Automatically detects interview invitation emails, updates your tracker to `Interview` status, creates prep files, and adds Google Calendar events. Zero LLM calls.

```bash
node scan-gmail.mjs # scan last 7 days
node scan-gmail.mjs --days 14 # scan last 14 days
node scan-gmail.mjs --dry-run # preview without writing files
node scan-gmail.mjs --no-calendar # skip calendar event creation
```

### Setup

1. Go to [Google Cloud Console](https://console.cloud.google.com/apis/credentials) and create a project.
2. Enable **Gmail API** and **Google Calendar API**.
3. Create an **OAuth 2.0 Client ID** (Desktop app type).
4. Download the JSON and save it as `calendar/credentials.json`.
5. Run `node scan-gmail.mjs` — a browser window opens for authorization.
6. After approving, the token is saved to `calendar/token.json` automatically.

Both `credentials.json` and `token.json` are in `.gitignore` and will never be committed.

Configure scan behavior in `config/profile.yml`:

```yaml
google:
gmail_scan_days: 7 # days back to scan
calendar_id: primary # or a specific calendar ID
```

## Dashboard TUI

The built-in terminal dashboard lets you browse your pipeline visually:
Expand Down
Empty file added calendar/.gitkeep
Empty file.
11 changes: 10 additions & 1 deletion config/profile.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,13 @@ cv:
# (Optional) Canva resume design ID for visual CV generation via /career-ops pdf.
# Find it in your Canva design URL: https://www.canva.com/design/DAxxxxxxx/...
# The ID starts with "D" and is 11 characters long.
# canva_resume_design_id: "DAxxxxxxxxx"
# canva_resume_design_id: "DAxxxxxxxxx"

# Google Workspace integration (Gmail + Calendar)
# Required for: node scan-gmail.mjs
# Setup: see README.md — "Gmail Interview Scanner" section
google:
credentials_path: calendar/credentials.json # OAuth2 client credentials from Google Cloud Console
token_path: calendar/token.json # Auto-generated after first auth — do not commit
gmail_scan_days: 7 # How many days back to scan (override with --days N)
calendar_id: primary # Google Calendar to add events to ("primary" or calendar ID)
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"rollback": "node update-system.mjs rollback",
"liveness": "node check-liveness.mjs",
"scan": "node scan.mjs",
"scan:gmail": "node scan-gmail.mjs",
"gemini:eval": "node gemini-eval.mjs"
},
"keywords": [
Expand All @@ -34,6 +35,7 @@
"dependencies": {
"@google/generative-ai": "^0.24.1",
"dotenv": "^17.0.0",
"googleapis": "^171.4.0",
"js-yaml": "^4.1.1",
"playwright": "^1.58.1"
}
Expand Down
Loading