279 Commits

Author SHA1 Message Date
Shaheer Sarfaraz
b456ab1951
Job api performance (#117)
* feat(api): add lightweight jobs list view without pagination

* refactor(client): use lightweight jobs list and on-demand job detail

* refactor(ui): separate job list rows from full job detail

* perf(home): reduce jobs payload to applied lightweight rows

* perf(db): add safe composite index for jobs list queries

* feat(api): default jobs endpoint to lightweight list view

* style: apply biome formatting for jobs list-view changes

* feat(api): add jobs revision endpoint for lightweight change detection

* refactor(client): switch jobs auto-refresh to revision checks

* perf(client): drive pipeline freshness via sse with polling fallback

* refactor(orchestrator): remove pipeline status polling loop from page

* chore(client): add periodic safety refresh and refresh lifecycle hardening

* refactor(types): define JobListItem via Pick<Job> to prevent drift
2026-02-09 20:49:54 +00:00
Copilot
3d7a014891
Remove /ukvisajobs page and related API surface (#115)
* Initial plan

* Remove ukvisajobs page and API

Co-authored-by: DaKheera47 <53654735+DaKheera47@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: DaKheera47 <53654735+DaKheera47@users.noreply.github.com>
2026-02-09 18:39:33 +00:00
Shaheer Sarfaraz
4cca521cd1
Cmdk based command bar (#110)
* initial commit

* use colours!

* match by scoring

* scroll job card into view

* introduce @ based 'locks' to restrict search to specific statuses

* clear lock states on close

* split up component

* inline pill

* resuse job row content

* fix intro anim

* larger size, instruction

* refactor existing search feature

* lock colour border

* if active, clear active on escape

* remove query param

* documenration update

* scoring logic

* check exists before scroll

* status dot and checkbox occupy the same space!
2026-02-09 16:38:36 +00:00
Shaheer Sarfaraz
a24522437c
manual import should move to ready directly (#109) 2026-02-08 15:12:54 +00:00
Shaheer Sarfaraz
bd6834f99e
Hotfix location in pipeline search (#108)
* feat(shared): centralize supported country list and source-country rules

* feat(orchestrator): add country selector and UK-only source gating in automatic run modal

* feat(orchestrator): persist country selection and run only compatible extractors

* fix(pipeline): enforce country-source compatibility during discovery

* test(orchestrator): cover country-based source gating and pipeline enforcement

* formatting

* test fix

* lint

* comments

* prevent auto focus grab

* verification

* command and popover

* make sure scroll is working
2026-02-08 13:02:52 +00:00
Shaheer Sarfaraz
9b80c2e05d
Tailor all ai fields (#106)
* initial commit

* accordionising

* merge extra cards

* visual highlight

* everybody becomes an accordion

* bugbashing

* text area

* split up tailoring editor

* feat: enhance `parseTailoredSkills` to support legacy string arrays and add comprehensive tests for parsing logic.
2026-02-08 01:30:36 +00:00
Shaheer Sarfaraz
cf7032ce5e
Additional Filter support (#103)
* Initial commit

* drawer initial implementation

* fix resetting

* formattign

* sort by salary

* sentence reading

* salary bounds

* responsiveness

* fix copy

* floating bar on mobile

* allow selecting on mobile

* formatting

* refactor

* don't count test files

* validate url after parsing
2026-02-08 00:19:26 +00:00
Shaheer Sarfaraz
2fe0dc2c2f
Recalculate match in batch actions (#102)
* rescore in batch

* more tests!

* formatting!
2026-02-07 22:51:42 +00:00
Shaheer Sarfaraz
a409aa5ee0
Live scraping updates in pipeline UI (#100)
* initial commit

* fix clear script

* cancelling pipelines

* formatting
2026-02-07 22:44:00 +00:00
Shaheer Sarfaraz
60788b0f6a
modal to configure pipeline settings on pipeline runs (#99)
* feat(orchestrator): add unified run modal shell with Automatic/Manual tabs

* feat(orchestrator): implement Automatic tab presets, estimate, and save+run flow

* refactor(manual-import): reuse manual import flow inside unified run modal

* refactor(settings): move pipeline tuning out of settings page into run modal

* stage 5

* jobs per term simplified

* copy improvement

* pill input

* better UI

* style(orchestrator): align run settings inputs on one row

* style(orchestrator): remove hover and pointer affordance from term pills

* style(orchestrator): restore hover and pointer affordance for term pills

* style(orchestrator): make search term pill hover more prominent

* better hover

* refactor(orchestrator): use react-hook-form in automatic run panel

* formatting

* fix(orchestrator): resolve biome issues in automatic run modal

* better copy

* feat(orchestrator): auto-select custom preset on manual config changes

* remove badge

* feat(orchestrator): redesign automatic run panel with collapsible advanced settings

* refactor(orchestrator): move estimate summary to footer and dedupe sources

* style(orchestrator): separate search term input from term pills

* style(orchestrator): remove save preset action from automatic footer

* ux(orchestrator): make entire search term pill tap-to-remove

* remove badge

* remove badge

* fix(orchestrator): return zero estimate when search terms are empty
2026-02-07 21:48:44 +00:00
DaKheera47
f50756281e demo top bar location fix 2026-02-07 16:06:59 +00:00
Shaheer Sarfaraz
a45cb0a724
change demo mode pdfs (#96) 2026-02-07 15:51:20 +00:00
Shaheer Sarfaraz
cfabee5f45
Select multiple jobs for bulk actions (#94)
* Initial implementation

* UI

* UI

* floating bar animations

* UI and split up orchestrator page

* remove bulk action hint

* UI

* UI

* formatting

* fix lint

* enforce max actions
2026-02-07 14:39:49 +00:00
Shaheer Sarfaraz
0e6f0bcf88
Inputs getting unset fix (#91)
* codex 5.3 one shot

* prevent cursor changing position
2026-02-05 19:43:10 +00:00
Shaheer Sarfaraz
6353a23f6f
Small wins style tickets (#88)
* wrap text

* version check!

* initial commit for "remove below score" in pipeline, or manually

* comments
2026-02-05 19:17:14 +00:00
Shaheer Sarfaraz
c4749b4211
feat: opinionated public DEMO_MODE with simulated/blocked actions, resets, and demo toasts (#87)
* feat(demo): add DEMO_MODE runtime helpers and /api/demo/info endpoint

* feat(demo): enforce simulated and blocked API actions under DEMO_MODE

* feat(demo): add deterministic seed dataset and 6-hour auto-reset

* feat(demo-ui): add demo banner and custom sonner toasts for simulated/blocked actions

* test+docs(demo): add demo mode coverage, behavior matrix, and operator docs

* formatting

* tests

* feat(demo): seed resets from typed baseline defaults

* formatting

* feat(demo): enrich baseline seed data and demo project catalog

* feat(demo): expand seeded applications and chart time ranges

* refactor(demo): split demo seed data from generation logic

* feat(demo): cap generated application history to 30 days

* feat(demo): rebalance generated job status distribution

* feat(demo-ui): make demo banner fixed and topmost

* minor fixes

* formatting

* duration revert

* durations

* feat(demo): share demo info hook, brighten demo toasts, and enforce webhook auth

* comment explaning

* formatting

* comments

* deadline builder comment
2026-02-05 16:04:04 +00:00
Devin Collins
d18464548e
feat: add salary display and missing salary penalty scoring (#86) 2026-02-05 07:35:17 +00:00
Shaheer Sarfaraz
16a8f1d15a
Use logger! add shim to convert backend responses to same format (#84)
* chore(orchestrator): add @infra import alias

* feat(server): add error/http/context/logger/sanitize infrastructure

* refactor(core): propagate request context, structured logs, and sanitization

* test/docs: update API contract assertions and contributor standards

* all pages working

* normalizing
2026-02-04 23:07:24 +00:00
Shaheer Sarfaraz
82b261c7bc
Refactor LLM service into modular adapters and policies (#83)
* llm migration

* orchestrator runer

* Decompose runPipeline steps

* dedupe

* refactor(settings): unify settings conversion metadata and round-trip tests

* refactor(llm): extract shared provider strategy factory

* refactor(settings-ui): add reusable numeric setting section

* test(orchestrator): stabilize usePipelineSources localStorage setup

* comments
2026-02-04 21:48:28 +00:00
Shaheer Sarfaraz
b94f85b149
Reduce low risk duplication (#79)
* clean up helpers

* shared in it's own top level folder

* workspaces setup

* build fix

* disable workspaces?

* run ci

* rename job-flow to gradcracker

* optional dependencies

* formatting?

* more optional modules

* allow post install runs

* node bump

* remove post install

* add optionals

* add more

* formatting

* comments, but im unsure

* run typescript DIRECTLY

* better build

* camoufox simplification

* lint

* build process doesn't exist

* build fix

* lockfile

* type check everything, build only for client

* rename steps correctly

* import from package!

* fix formatting

* don't fetch twice

* fix concern
2026-02-02 21:30:14 +00:00
Shaheer Sarfaraz
179deffe13
Database backups (#75)
* initial commit

* test fix

* manual test

* copilot comments

* code quality skill

* comments

* fix types problem

* formatting

* tests now correct for new backup method

* UTC dates
2026-02-02 00:07:39 +00:00
Shaheer Sarfaraz
b02dac5fe8
Fix for level 1 being added to skills (#73)
* single commit fix!

* fix tests!
2026-01-31 23:20:05 +00:00
Devin Collins
65952259ce
feat: add remote jobs filter for JobSpy (#70)
* feat(types): add jobspyIsRemote to TypeScript type definitions

- Add jobspyIsRemote boolean fields to AppSettings interface
- Follow three-field pattern: value, default, override
- Update test fixture with default values (false)

* feat(validation): add jobspyIsRemote validation schema

Add Zod validation schema for jobspyIsRemote boolean setting to ensure type safety in the settings API endpoint.

* feat(db): add jobspyIsRemote to database repository setting keys

* feat(api): add jobspyIsRemote storage to settings API route

* feat(service): add jobspyIsRemote to settings service with environment variable support

* feat(jobspy): add isRemote parameter to JobSpy service interface

* feat(pipeline): pass isRemote setting to JobSpy service

* feat(python): add is_remote parameter to JobSpy scraper script

* feat(ui): add Remote Jobs checkbox to JobSpy settings

* feat(ui): add Remote badge to job display

- Display Remote badge when job.isRemote === true
- Position badge next to Source badge in JobHeader
- Use Badge component with outline variant
- Badge does not display when isRemote is false or null

* docs(env): add JOBSPY_IS_REMOTE environment variable documentation

- Added JobSpy section to .env.example with JOBSPY_IS_REMOTE variable
- Documents remote-only job filtering option with default value of 0 (disabled)
- Follows existing .env.example format with clear section headers and descriptions

* test(remote-jobs): verify end-to-end functionality with comprehensive feedback loops
2026-01-31 16:48:17 +00:00
Shaheer Sarfaraz
3be0d25c87
Starting work on Dashboard! (#65)
* initial commit

* fix build issues and configurable time duration

* show in nav

* Positive response rate by posting freshness

* load today's jobs for charts

* fix infinite refetching with onboarding gate

* application to response rate

* refactor charts to their own directory

* bar hover color

* Duration selector embedded in navbar

* always load env

* remove warning about low conversion rate

* trend graph for applications per day

* better copy

* remove freshness response chart

* bottom line chart color and tooltip improved

* introduce check all command

* fix lint

* tests added and CI passing
2026-01-30 11:40:17 +00:00
DaKheera47
0e27dbe52b fix tests 2026-01-30 09:37:58 +00:00
DaKheera47
8e56378794 documentation update 2026-01-29 16:46:01 +00:00
DaKheera47
5a53c0063d deprecate openrouterApiKey 2026-01-29 16:42:46 +00:00
Shaheer Sarfaraz
b4641ad9cb
Customise llm base url (#68)
* backend initial commit

* frontend initial commit

* better copy

* make lmstudio work

* enum of providers

* better error messages

* llm model settings stay in one place

* llm settings should be under the model accordion

* skip llm key step in onboarding if provider is set to local

* onboarding now factors in new llm provider flow

* fix tests

* fix typecheck
2026-01-29 16:20:12 +00:00
Shaheer Sarfaraz
6e771ce728
Timeline introduced (#38)
* initial implementation

* onboarding doesn't pop until invalid values are present

* link to job page

* proactive inputs working slightly

* onboarding gate reinstated

* better proactive buttons

* fully manual tracking for now.

* edit and delete timeline events

* status showing correctly

* tests update

* tests

* Update orchestrator/src/server/services/applicationTracking.ts

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

* Update orchestrator/src/server/services/applicationTracking.test.ts

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

* Update orchestrator/src/server/services/applicationTracking.test.ts

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

* Update orchestrator/src/client/pages/job/Timeline.tsx

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

* Update orchestrator/src/client/pages/JobPage.tsx

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

* add tests for application tracking routes and remove unused actionId from client API

* remove unnecessary await from synchronous transitionStage calls and improve test isolation

* relax externalUrl validation to allow non-URL metadata

* add toast notifications for data loading and event logging in JobPage

* comments

* fix: resolve type error in sponsor-matching.test.ts

* fix ci

* tests fix for github

* lint

* github comments

* build fix

* dedupe

* format

* types fix

* Apply suggestion from @Copilot

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

* formatting

* title and group id are discrete fields

* backfill

* hide view button on page

* show relevant dropdown options

* confetti!

* remove redundant

* confirm delete is a custom element now

* formatting

* fix styling

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-27 23:49:11 +00:00
DaKheera47
480e601cd8 lint fix 2026-01-27 15:14:06 +00:00
DaKheera47
9d53dd6477 fix test fiels 2026-01-27 15:12:58 +00:00
DaKheera47
b3c8a04b71 fix working files 2026-01-27 15:12:53 +00:00
DaKheera47
ff822aaf81 setup typechecking in CI 2026-01-27 15:10:34 +00:00
DaKheera47
b432691414 mock settings fetch in test 2026-01-26 11:05:02 +00:00
DaKheera47
86c8e76bb1 tests passing 2026-01-26 11:01:42 +00:00
DaKheera47
8acb5dbc27 fix tests 2026-01-25 13:49:23 +00:00
DaKheera47
d4e83c0674 gem3 flash lint fix 2026-01-25 13:14:59 +00:00
DaKheera47
8b9b7f8bba formatting 2026-01-25 12:43:50 +00:00
DaKheera47
5c2eef2fc8 ran check:fix in orchestrator 2026-01-25 12:41:44 +00:00
DaKheera47
ac02a5fd1d add commands 2026-01-25 12:29:13 +00:00
DaKheera47
ca5486fcb4 country dropdown 2026-01-25 12:24:28 +00:00
Shaheer Sarfaraz
63b67baacf
Merge pull request #36 from DaKheera47/copilot/update-ukvisajobs-search-copy
Clarify UK Visa Jobs search limitation to job titles only
2026-01-25 12:07:31 +00:00
DaKheera47
85976caf9c useRescoreJob to reduce duplication 2026-01-25 12:06:14 +00:00
DaKheera47
f491f4634e better copy 2026-01-25 11:56:25 +00:00
DaKheera47
35365b5fca initial commit 2026-01-25 11:50:04 +00:00
Shaheer Sarfaraz
a2114cc454
Merge pull request #30 from anasyd/main
feat: add option to fetch from a link
2026-01-24 13:47:32 +00:00
copilot-swe-agent[bot]
9f5380fa69 Add clarifying note about job title-only search limitation
Co-authored-by: DaKheera47 <53654735+DaKheera47@users.noreply.github.com>
2026-01-24 05:18:22 +00:00
Anas Syed
867a13cf22 feat: add option to fetch from a link
Clean raw HTML to JSON  to pass to an LLM
2026-01-23 18:22:37 +00:00
DaKheera47
b2c42fadef fix: fix filter race condition and dedup filter source logic 2026-01-23 13:47:04 +00:00
DaKheera47
d7cbf81808 button shows how many selected 2026-01-23 13:43:37 +00:00