Shaheer Sarfaraz
b88d00b15d
Make projects optional when moving jobs to Ready ( #189 )
...
* Make resume projects optional and reuse selection rules
* Apply Biome import/format fixes
* Handle explicit empty project selection in PDF generation
* Hide selected projects section when catalog is empty
* Avoid projects section flash while catalog is loading
2026-02-18 22:31:59 +00:00
Shaheer Sarfaraz
5ed74bb59c
Tracer links ( #174 )
...
* initial commit
* format links right
jobops.dakheera47.com/cv/shaheer-google-de
* don't support legacy
* remove phishing look
* smaller links
* readiness check in settings
* rework UX
* right col
* pop a modal
* modal improvements
* show links
* documentation disclaimer
* fix(tracer-links): preserve descriptive resume link labels
* fix(tracer-links): classify bot user agents before browser families
* fix(tracer-links): reject non-http redirect destinations
* fix(tracer-redirect): disable caching for tracked redirects
* fix(origin): prefer canonical public base url over forwarded headers
* fix(auth): protect tracer analytics routes behind basic auth
* fix(ui): rename misleading tracer drilldown human metric
* style(tests): format tracer-links invalid-destination assertion
* fix(tests): prevent mocked fs from breaking sqlite data-dir resolution
* style(docs): format versioned docs json for biome
* fix(tests): mock tracer-links in pdf skills validation suite
2026-02-18 22:05:15 +00:00
Shaheer Sarfaraz
c5c6675f04
feat: add Adzuna extractor with orchestrator integration ( #177 )
...
* feat(settings): add adzuna source fields and country compatibility
* feat(discovery): integrate adzuna extractor into pipeline
* feat(client): wire adzuna in source selection and run budgeting
* docs(extractors): add adzuna guide and configuration notes
* chore(workspaces): register adzuna extractor in lockfile
* fix(adzuna): run extractor via npm script instead of npx
* fix(adzuna): execute extractor via node+tsx without shell
* fix(adzuna): prefer npm run start without shell, fallback to tsx
* fix(docker): include adzuna extractor workspace in image
* chore(adzuna): reuse shared type-conversion utilities
* type-check adzuna
* formatting
* deeedooop
* better instructions
2026-02-17 16:49:42 +00:00
DaKheera47
420299fffe
race condition 2
2026-02-15 22:20:56 +00:00
DaKheera47
2fc692557f
race condition
2026-02-15 22:20:56 +00:00
DaKheera47
2536e184a7
add tests
2026-02-15 22:20:56 +00:00
DaKheera47
8b8120bf1d
single thread
2026-02-15 22:19:55 +00:00
DaKheera47
f9abd6ff74
rename code
2026-02-15 22:17:19 +00:00
DaKheera47
672eb3d2b9
Ghostwriter always enabled
2026-02-15 22:16:50 +00:00
DaKheera47
00531c83c4
initlal commit
2026-02-15 22:16:50 +00:00
Shaheer Sarfaraz
d0b4091a60
Ghostwriter Introduced ( #166 )
...
* initlal commit
* Ghostwriter always enabled
* rename code
* ghostwriter panel
* separate component
* ui improvements
* single thread
* copy improvement
* dont pop up keyboard shortcuts
* markdown renderer
* ghostwriter button placement
* better UX
* ghostwriter copy
* meta shortcut
* better settings menu
* formatting
* doocumentation
* add tests
* race condition
* race condition 2
* pass title
* more comments
* comments
* formtting
2026-02-15 22:03:37 +00:00
Shaheer Sarfaraz
f8b5dc2f42
In progress flow ( #163 )
...
* initial commit
* move from applied to in-progress
* KANBAN BOARD!
* backfill jobs
* backfill rejected jobs
* drag events 😋
* fix backfill bug
* UI improvements
* remove applied
* gold near offer
* team match meeting swim lane
* formatting
* Add tests for InProgressBoardPage and enhance job stage handling
2026-02-15 00:45:45 +00:00
Shaheer Sarfaraz
687fd5e91f
feat(post-application): automatically pull from email ( #145 )
...
* feat(post-application): add schema and shared types for provider ingestion (#136 )
* test(orchestrator): ensure full localStorage shape in vitest setup
* feat(post-application): add provider registry and dispatcher framework (#137 ) (#146 )
* Implement Gmail provider credential persistence (#147 )
* Add unified post-application provider action API (#148 )
* Implement Gmail ingestion sync with 95/60 relevance policy
* Implement Gmail ingestion sync with 95/60 relevance policy (#149 )
* feat(post-application): add job mapping engine with llm rerank fallback
* feat(post-application): add inbox review APIs with transactional approve/deny (#151 )
* feat(post-application): add tracking inbox UI with provider controls (#152 )
* oauth implementation
* UI changes
* see past runs in more detail
* occurred at comes from email
* state mismatch
* better UI representation
* comments
* comments
* comments
* comments
* documentation
* explainer
* set things manually
* scrolling
* any found email can be pending
* searchable download
* Email-to-Job Matching Decision Tree
* email viewer list improvement
* simplification initial commit
* exclude discovered jobs
* show only resady
* dropdown
* mermaid
* syntax
* targets is the same as logging that is done manually
* event label
* duplicate avoidance
* clean up html
* token saving
* print
* send idx not uuid
* remove logging
* formatting
* better documentation
* documentation
* comments
* process all
* comments
2026-02-12 19:48:25 +00:00
Shaheer Sarfaraz
fe0aebe01a
Small bits and bobs, codebase quality ( #129 )
...
* initial change
* nav highlighting
* icon change
* deeeedoooop
* text
* show version number on all pages
* icon
* remove unused code
* add knip
* formatting
* remove unused code
* types fix
* remove notion completely from the codebase.
* update test for new url structure
* clean up the fucking shop boys
* make a "create job" factory and use that
* moar factories
* formatting
2026-02-10 20:01:58 +00:00
Shaheer Sarfaraz
4e1ea28301
Enable Glassdoor as a JobSpy source ( #126 )
...
* feat(shared): add glassdoor to job source model
* feat(jobspy): support glassdoor site in scraper and discovery
* feat(pipeline): include glassdoor in source selection and API schema
* feat(ui): add glassdoor toggle to jobspy settings and run estimates
* test/docs: cover glassdoor jobspy integration end-to-end
* fix(jobspy): make glassdoor always-on without settings toggle
* fix(jobspy): fallback glassdoor when location is country-level
* refactor(jobspy): drop direct pandas usage in wrapper
* feat(pipeline): gate glassdoor by supported countries
* fix(jobspy): restore pandas output and keep glassdoor disable copy
* fix(jobspy): map country-level glassdoor searches to city fallbacks
* feat(ui): require glassdoor city for country-level runs
2026-02-10 17:57:49 +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
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
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
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
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
5c2eef2fc8
ran check:fix in orchestrator
2026-01-25 12:41:44 +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
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
1dd5a34447
comments
2026-01-23 12:41:00 +00:00
DaKheera47
fa13709738
tests
2026-01-23 12:25:00 +00:00
DaKheera47
9dfb862649
ready panel now works with external resume json instead of local
2026-01-23 11:40:34 +00:00
DaKheera47
7a358db317
settings page can pull and save resume details from v4 api template
2026-01-23 11:06:25 +00:00
DaKheera47
4798846483
v4 api based, with the same code facing api as v5
2026-01-23 00:55:44 +00:00
DaKheera47
44779c96fa
Merge branch 'main' into reactive-resume-v5
2026-01-22 22:57:37 +00:00
DaKheera47
9e7bd43a42
default model should be google/gemini-3-flash-preview
2026-01-22 22:20:21 +00:00
DaKheera47
e1ee291337
tests
2026-01-22 21:39:05 +00:00
DaKheera47
9c1252c7fd
onboarding validation for each field
2026-01-22 21:29:05 +00:00
DaKheera47
6955a77af8
update default location of uploaded file to be at data/
2026-01-22 20:53:08 +00:00
DaKheera47
8684f2f9f3
Merge branch 'main' into user-onboarding
2026-01-22 20:37:28 +00:00
Anas Syed
0aed4e06a2
remove validateAndRepairJson function and tests
2026-01-22 20:32:13 +00:00