384 Commits

Author SHA1 Message Date
b72612fd06 Add Basic Auth gate, job owner context, and multi-tenant job isolation.
- Server: auth routes, owner profile on requests/jobs/pipeline, migrations
- Client: BasicAuthAppGate, SSE/API session handling, profile quick switch
- Tests: tracer-links, ghostwriter request-context mock, pipeline coverage
- Env examples for cron and optional basic auth credentials

Made-with: Cursor
2026-04-20 21:34:42 -04:00
e39341258a feat(orchestrator): blocked company filters and keyword parsing
- Add shared helper to parse blocked company keywords from JSON or legacy text
- Wire discover-jobs to resolved keywords for employer blocking; extend filters UI
- Include vite/client in TS types for import.meta.env; fix JobListItem test fixture

Made-with: Cursor
2026-04-11 12:04:38 -04:00
60b61ffe03 feat: job notes, deal-breaker score cap, richer cover letters, bulk action limit bump
- Add per-listing notes (JobNotes component, notes column, auto-save)
- Enforce hard score cap (≤15) when deal-breaker hits are present;
  add clearance/citizenship deal-breaker rules to scoring prompt
- Cover letter prompt now uses full search profile (experience level,
  skills, work arrangement, location, salary, industries, deal-breakers)
  and produces longer, name-signed output
- Include candidate name + location in sanitized scorer profile
- Raise MAX_JOB_ACTION_BATCH_SIZE from 100 → 2500 (shared constant)
- Update README with new features

Made-with: Cursor
2026-04-06 15:55:26 -04:00
4d7c8ac0bc feat(orchestrator): job list filters — multi source/country, URL sync, exclude
- Parse location strings into country keys (shared search-cities helper).
- URL params: source, sourceExclude, countries, countriesExclude.
- Chip cycle: off → include → exclude (destructive); remote bypasses country rules.
- README: document filter behaviour and query keys.

Unrelated local changes (scorer, notes, schema, etc.) remain unstaged.

Made-with: Cursor
2026-04-06 15:50:47 -04:00
77179b2b94 feat(orchestrator): local JSON base resume for PDF generation
Use JOBOPS_LOCAL_RESUME_PATH or Settings local path as the tailored PDF
source when Reactive Resume template is not selected. Align GET
/api/profile/status with local resume configuration. Update route test
mocks for resolveLocalResumeFilePath.

Includes discovered-panel UI tweaks in DecideMode and DiscoveredPanel.

Made-with: Cursor
2026-04-05 23:47:25 -04:00
87dbda3df1 Fix Fit assessment header and job list toolbar spacing on reload
- Put match badges in their own flex-wrap row under the title (no run-on text)
- Toolbar: flex-wrap, min-w-0 label, shrink-0 count, middot separator on narrow layouts

Made-with: Cursor
2026-04-05 22:22:41 -04:00
6b26f70ef7 Make cover letter discoverable: Overview, Ready panel, ⋯ menu
- Always show Cover letter card with Generate when empty; Regenerate + Copy when present
- Shared useCoverLetterGeneration hook calling runJobAction(generate_cover_letter)
- Ready tab previously had no cover letter UI; add same block under Fit Assessment
- Floating bar Cover letter button tooltip points to Overview/Ready
- Job detail ⋯ menu: Generate / Regenerate cover letter

Made-with: Cursor
2026-04-05 21:53:27 -04:00
54adc66e73 Score hybrid/onsite jobs low when job search profile is remote-only
- Require workArrangementMatch in LLM schema; show badge in Fit Assessment
- Prompt: remote-only vs hybrid/N days in office is a hard cap (~35 score)
- Deterministic cap from JD keywords + isRemote/workFromHomeType when only Remote is selected
- hasNonEmptyProfile includes preferredWorkArrangement and preferredLocations so prefs reach the scorer

Made-with: Cursor
2026-04-05 21:40:35 -04:00
14a6da4bdf Improve job scoring for QA vs generic SWE roles; document Ollama on 16GB GPU
- Cap suitability score when roleTypeMatch is low and target roles are set
- Harden scoring prompt (role-type gating, examples, headline in resume payload)
- QA-oriented mock scoring when LLM is unavailable
- .env.example: optional Ollama MODEL/LLM_BASE_URL block for self-hosted LLM

Made-with: Cursor
2026-04-05 21:35:40 -04:00
09ab32e1e8 chore: default pipeline includes Glassdoor; document DB copy and cron sources
- Add glassdoor to DEFAULT_CONFIG so POST /api/pipeline/run with {} runs JobSpy trio.
- jobber-pipeline-telegram.sh: optional JOBBER_PIPELINE_SOURCES for explicit source list.
- Deploy doc: WAL checkpoint + rsync jobs.db to VM for profiles/settings/jobs.

Made-with: Cursor
2026-04-05 19:49:01 -04:00
fea00ae656 feat: search profiles, cover letters, discovery fixes
- Add search profiles (DB, API, settings UI) and wire into scorer/pipeline search terms.
- Add cover letter generation (service, job action, JobDetail UI).
- Align JobSpy Indeed country with country-level search geography when settings conflict; warn in logs.
- Infer country from search cities via inferCountryKeyFromSearchGeography (shared).
- Ignore extractor venv/storage and local data in Biome; ignore orchestrator/storage and JobSpy .venv in git.
- Vite: do not watch orchestrator/storage (prevents reloads during startup.jobs pipeline).
- JobSpy: document Python 3.10+ and venv setup in README/requirements.
- Onboarding and settings: local resume path handling, orchestrator .env.example for Vite.

Made-with: Cursor
2026-04-05 19:35:14 -04:00
ilia
9576c3d7a1 feat: workplace filter, job dedup, company skip docs, deploy notes
- Add remote/orchestrator filter by workplace (remote, not remote, unknown) with URL param
- Expose isRemote on job list API; canonicalize URLs and source_job_id dedup on import
- Onboarding: optional VITE_SKIP_RXRESUME_ONBOARDING for RxResume-free onboarding
- Scoring UI + docs for company skip list; pipeline-run dedup note
- Vitest: TZ=UTC for stable time-based tests
- DEPLOY_GITEA_VM_CRON_TELEGRAM.md for VM/cron/Telegram ops

Made-with: Cursor
2026-04-04 14:44:52 -04:00
Ammad Ali
69a10acd4f
fix: render markdown in expanded job descriptions (#297)
* fix: render markdown in expanded job descriptions

* fix: respect markdown job description setting and harden rendering
2026-03-22 17:01:34 +00:00
Ryan Foote
0b22c08d7d
feat: add support for indicating workplaceTypes (#296) 2026-03-21 20:43:43 +00:00
Ammad Ali
8274ec4e14
Enhance model handling and settings integration for providers (#295) 2026-03-21 17:34:47 +00:00
Ammad Ali
ac0a1281f4
Enhance RxResume validation, settings handling, and caching (#287)
* feat: enhance validation handling in ReactiveResumeConfigPanel and rxresume-config

* feat: enhance RxResume validation handling in SettingsPage and ReactiveResumeSection

* feat: enhance RxResume settings handling and cache management

* feat: add save-time validation and caching for Reactive Resume settings

* refactor: improve code formatting and readability across multiple files

* fix: improve condition check in hasOverrideKey function

* feat: enhance RxResume validation and settings handling with precheck options

* refactor: streamline RxResume client initialization and improve backup sorting logic
2026-03-19 11:38:04 +00:00
0x1355
4787f4d151
feat(ghostwriter): branching conversations with edit and per-message regenerate (#290)
Turn Ghostwriter's flat message list into a tree structure, enabling
Claude.ai/ChatGPT-style branching conversations.

**Data model**: Add `parentMessageId` and `activeChildId` to messages,
`activeRootMessageId` to threads. Migration backfills existing messages
into a linear chain and links regenerated messages as siblings.

**Backend**: Tree-walking queries (getActivePathFromRoot, getAncestorPath,
getSiblingsOf), rewritten history builder that follows the ancestor path,
new editMessage and switchBranch services, regenerate now works on any
assistant message (not just the latest).

**Frontend**: BranchNavigator component (← 2/3 → arrows), inline edit on
user messages, per-message regenerate on assistant messages, regenerate
button removed from composer (now per-message).

**Infra**: Pin Node 22 via Volta to prevent ABI mismatches with
better-sqlite3 across environments.
2026-03-19 11:25:00 +00:00
0x1355
f19471ab58
Fix stale job detail showing wrong tab actions on tab switch (#286)
When switching between job tabs (e.g. Discovered → Applied), the detail
panel would briefly show the previously selected job with the new tab's
action buttons — confusing and error-prone.

Three coordinated fixes:
- setActiveTab now checks if the selected job's status fits the target
  tab, keeping it when valid (e.g. Discovered → All Jobs) and clearing
  it otherwise.
- New visibleSelectedJob useMemo guard synchronously nulls out the
  selected job when it doesn't belong to the active tab, eliminating
  the one-frame flash caused by the data hook's useEffect lag.
- Auto-select effect now handles the case where a job passes the status
  check but gets filtered out by source/sponsor/salary filters.
2026-03-19 09:39:13 +00:00
0x1355
4894711396
feat: add Ghostwriter "Start over" reset with confirmation dialog (#289) 2026-03-19 08:44:40 +00:00
Shihab Hasan
0b55cb260a
“Search for a company” input can expand to full available width on desktop (#285) 2026-03-18 21:33:46 +00:00
github-actions[bot]
e8f53405c1 chore: release 0.2.0 2026-03-17 12:22:29 +00:00
Shaheer Sarfaraz
71e640b563
Add startup.jobs extractor support (#279)
* Add startup.jobs extractor support

* Harden startup.jobs extractor inputs

* Wire startupjobs into Docker and CI

* Tighten startupjobs review follow-ups

* fix: publish ghcr during release workflow

* feat: add startupjobs max jobs configuration and update related tests
2026-03-17 12:20:45 +00:00
Shaheer Sarfaraz
26275e4ee8
Fix ready-job selection jumping after PDF regeneration (#276)
* Preserve selected ready job during refresh

* show processsing in ready
2026-03-16 19:48:43 +00:00
Shaheer Sarfaraz
ec89a02e4f
Fix in-progress jobs in command bar (#275) 2026-03-15 22:08:34 +00:00
Shaheer Sarfaraz
a0220df17f
Add open job listing action to discovered jobs (#274)
* feat: add open job listing action to discovered jobs

* chore: add skills lockfile

* impeccable
2026-03-15 21:13:57 +00:00
Shaheer Sarfaraz
74717166c9
Add first-party Umami proxy for docs (#259)
* Add first-party Umami proxy for docs

* Address Umami proxy review feedback

* Harden Umami stats proxy
2026-03-14 21:33:55 +00:00
Shaheer Sarfaraz
f5aef7af24
Add RxResume URL setting to dashboard (#258)
* Add RxResume URL setting to dashboard

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-14 20:39:15 +00:00
Saad
f92b80dfe2
Add language settings for AI-generated resume output (#252)
* Add language settings for AI-generated resume output

* Resolve merge conflicts for language settings PR

* Fix language settings review feedback and CI lint

* Tighten language setting precedence and onboarding validation

---------

Co-authored-by: saad <Saad>
2026-03-11 18:24:01 +00:00
Shaheer Sarfaraz
faea61a249
Add support for generic OpenAI-compatible endpoint LLM provider (#253)
* initial

* fix regressions

* Fix OpenAI-compatible provider aliases

* Normalize OpenAI-compatible settings aliases

* Update shared/src/settings-registry.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-11 02:33:20 +00:00
DaKheera47
6454efd9a2 try.jobops.app 2026-03-10 16:37:27 +00:00
DaKheera47
daca4d2bd4 try.jobops.app 2026-03-10 16:35:46 +00:00
DaKheera47
caf2b917c0 version bump test 2026-03-10 15:21:20 +00:00
DaKheera47
14085a977e initial commit 2026-03-10 15:16:00 +00:00
Shaheer Sarfaraz
ee6f889094
Improve ghostwriter output language guidance (#248) 2026-03-10 14:52:19 +00:00
Shaheer Sarfaraz
8c952a4011
Registry Architecture for Visa Sponsor sources (#246)
* initial

* lint fix

* docs!

* fix CI

* ci and runner fix

* fix + docs!

* make CI pass

* country specific search

* remove country specific language

* fix UI

* address comments

* Address visa sponsor PR feedback

* Address remaining visa sponsor review feedback

* Harden visa sponsor provider validation
2026-03-10 02:02:30 +00:00
Shaheer Sarfaraz
3fee6e0bef
Add shared writing style preferences (#240)
* Add shared writing style preferences

* Address PR review feedback

* Add scoring instructions settings

* Polish writing style inputs

* Clarify do-not-use terms guidance

* Normalize blank writing style overrides

* Refactor writing style resolution to use effective values and enhance blank value handling
2026-03-06 17:31:11 +00:00
Shaheer Sarfaraz
6a19fff436
google dork links (#239)
* Add ready tab Google dork links

* ui changes

* docs

* ci fix
2026-02-28 22:23:50 +00:00
Shaheer Sarfaraz
f234f8005c
chore(analytics): format analytics metadata changes for ci (#235) 2026-02-25 21:37:12 +00:00
DaKheera47
1c348298ba app version 2026-02-25 21:30:53 +00:00
DaKheera47
02aefb3dc1 ids 2026-02-25 21:27:28 +00:00
DaKheera47
cbc52cbac0 more analytics 2026-02-25 21:25:33 +00:00
Shaheer Sarfaraz
26dbed15b9
Custom welcome message (#234)
* json

* connect

* useWelcomMessage

* Update shared/src/messages/jobs-welcome.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-25 02:59:38 +00:00
Shaheer Sarfaraz
7514aa1b28
Add RxResume v4/v5 dual support (#230)
* feat(settings): add rxresume mode and v5 api key settings

* feat(server): add mode-aware rxresume adapter with auto v5-first selection

* refactor(server): route settings profile and pdf generation through rxresume adapter

* feat(api): support rxresume v4/v5 in onboarding and settings routes with ok/meta responses

* feat(client): add rxresume mode selector and v5 api key setup flow

* docs: document rxresume auto mode with v5-first self-hosted setup

* test: verify dual-mode rxresume support and ci parity checks

* comments

* services folder

* correct types for v5

* tests and docs fix

* Fix RxResume auto fallback and route API consistency

* warning for both being set

* simpler response

* onboarding component improvements, v5 check still not working

* fix list resume endpoint...

* fix api endpoints to latest v5 docs

* don't show the entire project field on v5

* remove auto entirely

* formatting

* ci green

* v5 has a different resume schema

* remove redundant check

* remove requirement that only one must be specified

* consolidate sections

* base resume can be v4 or v5

* saving now works

* status indicator

* actually render some pills

* reason for failure

* fix apikey verification

* dedupe isValidatingMode

* reefactoor

* simplification?

* refactor?

* ci passing

* remove auto from docs

* tailoring is schema dependent

* skills object tighter

* remove redundant text

* fix lint

* mode
2026-02-25 02:26:15 +00:00
Shaheer Sarfaraz
3da5ea35b4
Deduplicate shared helpers and enforce aliased imports (#228)
* Deduplicate string cleanup helpers and not-found responses

* Enforce aliased imports for infra and shared modules

* Enforce @client/@server aliases for deep relative imports

* Deduplicate visa sponsor and location filter definitions

* Use shared city filter export in extractor location checks
2026-02-22 16:13:52 +00:00
Shaheer Sarfaraz
16acdf2b5e
Set automatic extractor defaults from user location (#227)
* Set automatic extractor defaults from user location

* Rename detected country helper
2026-02-22 14:41:06 +00:00
Shaheer Sarfaraz
82e142a8a8
Auto-Registering Extractor System (#223)
* initial commit?

* Address PR feedback on extractor discovery and startup resilience

* Address latest PR review comments

* fix city resolution fallback when input parses empty

* address PR feedback on extractor registry and pipeline validation

* address copilot comments on manifests and registry startup

* fix extractor discovery export handling and env isolation in tests

* enforce duplicate manifest id failures in strict mode

* Fix remaining extractor registry and runtime review comments

* docs

* docs

* test all, logic remains in extractors

* Address PR review feedback on extractor registry and validation

* Revert extractor moduleResolution to bundler

* Enforce shared city filtering across all discovery sources

* Deduplicate extractor strict city post-filtering
2026-02-21 17:44:07 +00:00
Shaheer Sarfaraz
cc7cacd7f5
Feat/company blacklist tokenized input (#219)
* initial commit

* docs mention!

* Update orchestrator/src/server/pipeline/steps/discover-jobs.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* normalizeStringArray

* poppier orange

* comments

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-21 04:07:06 +00:00
Shaheer Sarfaraz
b18c2eccbb
Code cleanup (#218)
* chore: move @types/canvas-confetti to devDependencies, remove unused get-tsconfig direct dep

* chore: configure knip with workspace entry points for all packages

* refactor(shared): split 1119-line types.ts into domain modules under types/

* refactor: remove llm-service.ts shim, migrate all import sites to llm/service directly

* refactor(settings): migrate 4 manually-resolved settings into conversion registry

* refactor: split gmail-sync.ts into gmail-api, email-router, and thin orchestrator

* refactor(orchestrator): extract useKeyboardShortcuts and usePipelineControls from OrchestratorPage

Splits the 840-line OrchestratorPage into a thin orchestration shell (~480 lines) by
extracting keyboard shortcut handling into useKeyboardShortcuts.ts and pipeline
control logic into usePipelineControls.ts. Net negative line count across all files.

* feat: create settings registry (Step 1)

Introduces a single source of truth for all settings, combining schema definitions, default logic, parsing, and serialization into a single configuration object.

* feat: derive schema, keys, and types from settings registry (Step 2)

Derives AppSettings nested shape, SettingKey DB union, and updateSettingsSchema Zod shape automatically from the settings registry.

* refactor: gut envSettings and remove settings-conversion (Step 3)

Replaces manual env arrays with registry-driven maps in envSettings.ts.
Deletes settings-conversion.ts since all parsing/defaults now live in the registry.

* refactor: simplify getEffectiveSettings with generic loop (Step 4)

Replaces ~334 lines of manual key-by-key unpacking with a generic registry-driven iteration loop (~40 lines). Models, typed, string, and virtual kinds are automatically derived.

* refactor: simplify settingsUpdateRegistry (Step 5)

Replaces ~350 lines of explicit per-key update handlers with a dynamic generic loop over the settings registry, properly routing persistence and side effects.

* refactor(settings): implement nested settings registry and clean up tests

- Migrate settings system to use a centralized nested registry (`settings-schema.ts`, `registry.ts`)
- Remove obsolete flat-to-nested conversion logic (`settings-conversion.ts`)
- Address Biome warnings by explicitly ignoring intentional `any` usage in generic runtime schema builder and registry logic
- Clean up unused variables in test files (`SettingsPage.test.tsx`) to achieve a 100% green CI pipeline

* refactor(settings): address PR comments on env data and registry parsing

- Narrow `getEnvSettingsData` return type to `Partial<AppSettings>` to satisfy strict typing and omit 'typed' registry entries
- Introduce `parseNonEmptyStringOrNull` for typed string settings so empty-string overrides cleanly fall back to defaults (matching original `||` logic)
- Add missing unit tests for registry parse/serialize helpers (JSON, bools, numeric clamping)
2026-02-21 03:07:51 +00:00
Shaheer Sarfaraz
19266fe5eb
City search (#217)
* wave 1, jobspy only

* combine usa/ca to united states

* strict city location filter

* hide and show based on focus

* UI changes

* allow clicking cross!

* pill animate in

* animate out, uggo fix

* animate out

* framer motion

* animate component height

* adzuna

* hiring cafe implementation

* refactor: centralize shared search-city parsing and matching

* feat: migrate city setting to searchCities with legacy fallback

* docs: update pipeline and extractor city-search wording

* fix(orchestrator): normalize tokenized paste behavior

* fix(shared): tighten city matching semantics

* docs(extractors): document city-location knobs and geocoding note
2026-02-21 00:42:09 +00:00
DaKheera47
5ed9069813 Use optimistic skip mutation across Jobs page actions 2026-02-20 21:58:42 +00:00