* feat(shortcuts): add tinykeys + core infrastructure (useHotkeys, shortcut-map, KbdHint) Install tinykeys (~400B) for declarative keyboard shortcut handling. Add useHotkeys React hook with input-guarding logic, centralized shortcut definitions, and a reusable KbdHint badge component. Ref #113 * feat(shortcuts): wire j/k navigation and 1-4 tab switching Add useHotkeys call to OrchestratorPage with: - j/ArrowDown to navigate to next job in list - k/ArrowUp to navigate to previous job - 1/2/3/4 to switch between Ready/Discovered/Applied/All tabs Auto-scrolls the list to keep the selected job visible. Ref #113 * feat(shortcuts): add context action shortcuts (s/a/t/p/d/o/x/Esc) Wire keyboard shortcuts for all primary actions: - s: skip job (discovered/ready tabs) - a: mark applied (ready tab) - t: toggle tailor mode (discovered/ready tabs) - p: view PDF in new tab (ready tab) - d: download PDF (ready tab) - o: open job listing (all tabs) - x: toggle select current job - /: open search (command bar) - Escape: clear selection Actions are tab-scoped and guard against in-flight state. Thread tailorTrigger counter prop through JobDetailPanel to DiscoveredPanel and ReadyPanel for keyboard-driven tailor toggle. Ref #113 * feat(shortcuts): add bottom hint bar and help dialog (? key) Add KeyboardShortcutBar -- a Superhuman-style bottom bar showing available shortcuts for the current tab. Dismissible with X button, preference stored in localStorage. Add KeyboardShortcutDialog -- a grouped help overlay triggered by '?' showing all shortcuts with their key bindings in a two-column layout. Both components are context-aware, only displaying shortcuts valid for the active tab. Ref #113 * feat(shortcuts): add visual KbdHint badges on action buttons Show keyboard shortcut key caps on primary action buttons: - DecideMode: 's' on Skip, 't' on Start Tailoring - ReadyPanel: 'p' on View PDF, 'd' on Download, 'o' on Open Listing, 'a' on Mark Applied - OrchestratorFilters: '1'-'4' on tab triggers All hints are desktop-only (hidden below lg breakpoint). Ref #113 * refactor(shortcuts): migrate Cmd+K to useHotkeys in JobCommandBar Replace manual window.addEventListener keydown handler with the shared useHotkeys hook for consistency across all keyboard shortcuts. Ref #113 * fix(test): mock getProfile in OrchestratorPage tests * style: move tab shortcut indicator before label * feat: add ArrowLeft/Right shortcuts for tab navigation * feat: show keyboard helpers only when Control is held down * feat: expand shortcut bar with multiline layout * feat: show keyboard shortcut help on first launch * 1 * 2 * 3 * better modifier pattern * 5 * tailoring is a toggle * tests * tests is passing * r to move to ready * tests
JobOps
AI-powered job discovery and application pipeline. Automatically finds jobs, scores them against your profile, and generates tailored resumes.
Workflow
- Search: Scrapes Gradcracker, Indeed, LinkedIn, Glassdoor, and UK Visa Sponsorship jobs.
- Score: AI ranks jobs by suitability using the configured LLM provider (OpenRouter by default).
- Tailor: Generates a custom resume summary for top-tier matches.
- Export: Uses RxResume v4 to create tailored PDFs.
- Manage: Review and mark jobs as "Applied" via the dashboard (calls webhooks for lifecycle events).
Example of generating a tailored resume for a job
https://github.com/user-attachments/assets/5b9157a9-13b0-4ec6-9bd2-a39dbc2b11c5
Example of applying to a Ready job
https://github.com/user-attachments/assets/06e5e782-47f5-42d0-8b28-b89102d7ea1b
How to Start
Prerequisites
- Docker Desktop (or Docker Engine + Docker Compose)
Overview
-
Run the app with Docker (this pulls the pre-built image).
-
Create accounts:
- OpenRouter (LLM scoring/tailoring)
- RxResume v4 (PDF export + editable resume data)
-
Open the dashboard and complete the onboarding wizard:
- Add API keys/credentials
- Choose a resume template from RxResume
- Run the pipeline to fetch jobs → score → tailor → export PDFs
-
Review jobs in the dashboard and mark stages
Quick Start (commands)
# 1. Clone and move to directory
git clone https://github.com/DaKheera47/job-ops.git
cd job-ops
# 2. Start with Docker (pulls pre-built image from GHCR)
docker compose up -d
# 3. Open the dashboard in your browser, the app will onboard your credentials
# http://localhost:3005
Required accounts
-
OpenRouter (LLM provider)
- Create an account and generate an API key.
-
RxResume v4
- Create an account on v4.rxresu.me
- The summary, title, chosen projects, and keywords in the Resume will be tailored for the job description
- Recreate/import your resume there so JobOps can:
- pick a template
- generate tailored PDFs from your stored resume data
App Onboarding
The app will guide you through setup on first launch. The onboarding wizard helps you:
- Configure the LLM provider (OpenRouter by default) and add an API key if required (for AI scoring/tailoring)
- Add your RxResume credentials (for PDF export via v4.rxresu.me)
- Select a template resume from your v4.rxresu.me account
Technical Details
- Technical breakdowns here:
documentation/extractors/README.md - Orchestrator docs here:
documentation/orchestrator.md - Persistent data lives in
./data(bind-mounted into the container).
Notes / sharp edges
- Crawl targets: edit
extractors/gradcracker/src/main.tsto change the Gradcracker location/role matrix. - Pipeline config knobs:
POST /api/pipeline/runaccepts{ topN, minSuitabilityScore };PIPELINE_TOP_N/PIPELINE_MIN_SCOREare used bynpm run pipeline:run(CLI runner). - Anti-bot reality: crawling is headless + "humanized", but sites can still block; expect occasional flakiness.
Note on Analytics: The current alpha version includes anonymous analytics (Umami) to help me debug performance. This will be made opt-in only in the upcoming updates. If you want to disable it now, block umami.dakheera47.com in your firewall.
Contact
If you need any help with any step of the process, feel free to open an issue. I am actively monitoring this section and I would be extremely happy to help you get up and running!
Star History
License
AGPLv3