Show HN: Tech jobs on the command line (github.com)

80 points by nico ↗ HN
Hi HN! I'm Nico and lately I've been struggling looking for jobs. I've gotten specially frustrated with having to spend hours reading through listings just to find good matches. So I built something to scratch my own itch:

Command Jobs, a terminal-based job finder and application tracker designed specifically for me, and maybe also software engineers

The app scrapes web listings, saves them, processes them with GPT[1], then based on your resume and job preferences, it gives you the best matches

This is my first open source project, and also my first public project using LLMs

I'm really excited to share this with the HN community and would love to hear your feedback, suggestions, and any features you'd like to see in the future. Please check it out and let me know what you think!

https://github.com/nicobrenner/commandjobs

I'm currently working on adding more sources for job listings, periodic scraping via cronjobs, and alerts for new matches

Looking forward to your questions, feedback and requests. Thank you

[1]: Bring Your Own (OpenAPI) Key

60 comments

[ 4.0 ms ] story [ 132 ms ] thread
[flagged]
(comment deleted)
(comment deleted)
Most of the jobs on Who's Hiring threads don't include any compensation, so I don't see how searching that source would be useful for many folks.
That’s true, and it would be a great feature to have. The scraper could “double click” on the listings and try to find salary ranges from other websites where the listing might be posted, like the careers page of the company

I’m going one step at a time, the first tedious task I wanted to automate was searching and second-pass filtering

Most job listing sites have tools to filter by many different factors, including role, location, remote, salary range and seniority level, but usually the filters are either too strict or too permissive and I still end up having to read through tens or hundreds of listings to select just a few

Command Jobs gives me better matches faster by using GPT to match my resume and job preferences with the listings

Seems like you're just critiquing the Who's Hiring thread, not this app. At this point though, I'd wager that a huge amount, if not a majority of people looking, aren't thinking about compensation first, and have accepted the reality that if they can get something that aligns even remotely with what they're interested in or are skilled at, they'd be lucky. Salaries are not going to be what they used to be.

Not defending the exclusion of salary, but I think it would be pretty naive to dismiss the fact that a profound amount of people have been forced into unemployment and can negotiate if it gets there.

Yes, it's mostly a critique of those threads as a source. There's no forum to discuss them though. Not here, and the threads discourage feedback about the format.

I think folks know there's downward pressure, but I'd rather not anyone have to waste time engaging with employers offering minimum wage for software engineers.

Love the idea of having comments on job listings! It would be amazing! Companies might hate it? Hehe
The Who's Hiring threads do allow you to ask questions, but the YC companies posting jobs threads do not.
I’ve used GPT to estimate compensation for jobs before and got pretty good estimates. I think adding said estimate to the prompt on this app shouldn’t be hard at all and might help
How do you use GPT to estimate salaries?
Not who you were replying to, but

I know of two options:

1) the simplest, is to ask GPT to tell me an estimate for a certain role, at a certain company, at a certain location/area - with the right prompt, and if it can find additional info online, it gives pretty decent guesses

2) if you are willing to code it in multiple checks and steps, you can have GPT help you navigate and scrape listings. For example, the listings in Ask HN usually have very little detail, and no ranges, but a lot of them have links to somewhere else with detailed info, including ranges - or they don't have links, but you can still find the info and ranges their careers page or some other platform

In the second case there's a lot of trial and error, for which GPT could be helpful in navigating with less supervision

One of the most challenging aspects is having a proper interface for prompt management. Right now there are 5 different elements that are combined together to form the prompt in a specific format. The prompt elements are stored in the .env file, are are read from there when running the app

Would love to get some tips or ideas on how to allow the user to manage the prompt, to make changes and test it (without braking it), from the command line

Well, you could throw in something like this - https://github.com/nicobrenner/commandjobs/compare/master......

You can also go further by writing code that prompts the user for these values, one by one, and stores them in a config file. But for a CLI application, you might reasonably wonder if the juice is worth the squeeze there. CLI users tend to be comfortable editing a config file to hold a secret.

Edit: or if some of those values are actually optional, then you would maybe exclude them from this check.

Thank you so much Excellent contribution, definitely need a ton of validations!

Also pending is getting some tests in there, especially to test consistent LLM/GPT-dependent behavior

Totally right about the difference in expectations from a cli user pov. I just want to make sure this tool is helpful to more people than just myself

Are you looking for contributors?
For sure, would love any contributions. Feel free to create a ticket, or a PR on Github

Let me know if you have any issues getting it up and running

Hey Nico, this looks awesome.

I built out pretty much the exact same thing for JSON Resume (far uglier) but uses vector embeddings to rank relevant jobs -> https://registry.jsonresume.org/thomasdavis/jobs

My prompt when running it through GPT-3.5 sucks, doesn't always get location and salary. GPT-4 is way better but $$$$.

I've seen about 3-4 projects doing this with HN WhoIsHiring projects now, I wonder if we should all just share an API (of GPT parsed HN job posts) and pool some $$$. (In my version, I also created a JSON Schema that represents a Job Description)

scripts: https://github.com/jsonresume/jsonresume.org/tree/master/app... api code: https://github.com/jsonresume/jsonresume.org/blob/master/app...

Amazing, thank you! Very cool

Did you do any sort of benchmark between embeddings and direct inference?

How did you tune the distance for relevance, how did you decide on chunking and how many results would you include?

I want to try filtering using the distance of embeddings RAG style, but I wonder about how that changes the results

The current method the app uses feels pretty good, it does get you the best matches, and sometimes it also includes a few “extra” suggestions that typical filters would have left out, but that end up being potentially interesting matches

I'm not exactly sure what you mean by direct inference?

Do you mean that you pass the resume and job posting to the initial GPT prompt? and rely on the returned "fit_for_resume" property? (I'm curious if you tried using OpenAI function outputs too)

If so I didn't try that. And thinking about it, I like your style. (There's no reason why you couldn't do both anyway)

Another question; Did you try asking for a "fit_rating"?

Here is the prompt/call I used for GPT'ing the HN posts -> https://github.com/jsonresume/jsonresume.org/blob/master/app...

As for the distance of the vector similarity search. I am just using Supabase's pg_vector plugin support, with 3704 dimensions using the default search (cosine).

Sorry, yes, that’s exactly what I meant by “direct inference”; putting the resume and all necessary in the prompt and “trust” the fit evaluation done by the LLM

Thank you so much for the insightful comments and pointers

If you were expanding the functionality/features of LLM-assisted job searching, what do you think are the most useful challenges to tackle?

I have some wild ideas about distributed job searching systems running on people’s command lines hahaha

I think there is lots of crazy ideas that need to be built, the next job I find I will probably just rely on tools like these for the fun of it.

I've got a few that I will chime in later with. A simple one for now, is put a couple buttons next to the job listings in your UI.

Generate cover letter - Make a cover letter based off your resume and the job description

Generate tailored resume - Create a permutation of your resume to promote things relevant to that job description

Yes, those would be amazing

Haven’t been able to get it down though. I’ve tried a few prompts in those lines, but I never really like the outputs

The iteration is still very helpful in fleshing out a good personalized resume/cover letter, but I feel the app needs something a bit more automated/straightforward for the users

Any ideas on how to structure good prompts or a workflow to make it work well in terms of user experience?

Excellent project. Is there a way to scrape and pull jobs from workday portals. I see lots of companies using workday and usually it is a pain to go through their job postings?
Thank you! It’s been fun building it and I’m looking forward to keep improving it

I definitely want to add scrapers for more sources

Haven't tried workday, is it popular for tech jobs (ie. with people that use the command line)?

Do you have a sample url with listings you could share?

Here's some with tech jobs listed:

https://workday.wd5.myworkdayjobs.com/Workday https://shipt.wd1.myworkdayjobs.com/en-US/Shipt_External

It doesn't seem like there's a global listing across myworkdayjobs.com sites - each company using it has its own sub-domain. Which sort of makes sense - Workday is an internal HR/employee portal tool licensed to companies.

One of the best application of LLM!
This is awesome. I've been looking for a way to scrape Who's Hiring for my site https://200kjobs.com, thanks for sharing.
Thank you for posting your site! Will definitely explore it. Great and simple concept

Might try scraping it too ;)

Btw, random observation that surprised me when scraping Ask HN, most jobs (100+) are posted the first day of the month, but there are about 15-25 additional jobs posted everyday. This means it’s worth it as a user to get those extra daily listings, but it’s a pain to search through them

I came across this site which scrapes and shares job postings. The challenge is finding salary ranges: https://hnhiring.com/

Feel free to scrape 200kjobs: https://200kjobs.com/feed

Thank you! Will definitely go through the feed and try to add it to Command Jobs :)

As an aggregator it’s true that finding salary ranges is quite the challenge

As an applicant, I’ve settled for just only applying to the positions that have a range

If Im really curious about a company without ranges in their listings, GPT/Google sometimes give decent estimates

But also, after seeing 100+ listings, I’ve noticed that for the positions I’m looking for, there’s a pretty standard range, which doesn’t vary too much, unless it’s a FAANG or super hot company

In any case, using Command Jobs I only get 5-20 job matches, which are also pretty easy to check manually, and it’s not too annoying, given that usually the matches are very interesting and also it’s not 100s of jobs to r

Your site looks really nice and addresses a real problem. Are you targeting US only remote roles? If not then including any domicile or timezone restrictions in job snippets may be helpful. Also thanks for providing the feed.
That’s helpful feedback, thank you!
I'm the author of hnhiring.com, I see you mentioned in another comment. You don't need to scrape Hacker News. You can query Algolia instead:

First search for the "Who is hiring post?": https://hn.algolia.com/api/v1/search_by_date?query=hiring&re...

Note the ID of the first (latest) post and then get the comments: https://hn.algolia.com/api/v1/items/39562986

Excellent tip, thank you!

hnhiring.com looks super cool, I'm curious if you have any stats or infographics about the data

have you played with the data and LLMs to try to get some insights?

Nice work! I did something similar with a personal project a few months ago using an open source llm. Also, not sure if you know, there is an api you can use. https://github.com/HackerNews/API
Awesome, did not know about the HN api, nice!

What open source LLM did you use? Anything that would run on a CPU of a 5 year old MacBook Air (which I’m using as my home server)

Do you have the code for your project? Or maybe some features/ideas that you could share?

Thank you

I'm using https://github.com/ggerganov/llama.cpp and currently mistral 7b (on a m1 macbook pro). I'm sure with some prompt examples you can get pretty good results on a smaller model.

At the moment I don't have it open sourced due to it being part of a larger project that I'm working on that contains tailwindui licensed components.

A cool feature that I'm working on is creating a firefox plugin so you can save/index job postings from other sites and extract out meta information via an LLM. Very similar to this chrome plugin. https://chromewebstore.google.com/detail/huntr-job-search-tr...

Love the extension idea, definitely useful for tracking opportunities

Thank you for the perspective on running local LLMs

Do you think that saas or local LLMs will be the most popular in the next 5 years?

Congrats Nico. Came here to tell you about the HN API (https://github.com/HackerNews/API) but I see cheesehead beat me to it. Using the API it is much easier to pick up the latest thread each month and setup a cron job.
That’s an excellent tip, thank you very much. It will definitely come in handy soon when implementing the cron :)

Are you using the API on some project?

Yes, I am building an application tracking system(ATS) that also includes a job board. Among other sources, I used HN to populate the job board. My project is not open source, but I am happy to share the HN scraping code with you if you like. My email is in my profile.
would be interesting to turn this into something like `npx commandjobs` or `ssh commandjobs.com` so you wouldn't even need to install new software
Love the ideas, especially the ssh one, it's something that I had been fantasizing about

My first year of college, the school had a Telnet-based application to request classes, it would be amazing to build something like that

Any pointers on how to build the npx installer?

I've always wondered how to build SSH based applications. If anyone has any pointers I'd be extremely grateful.
My uninformed understanding, is that you allow people to login into an actual user account within the system, but then you replace their shell (usually you change something like /bin/sh to /usr/bin/ssh_application in the entry for that account within the /etc/passwd file), so when someone logs into that account, instead of running an "open" shell, they get the application instead, and when the application exits, the session ends

So essentially you should be able to create an ssh application with just a shell script

Very nice project. Thanks for sharing it here. I saw you used beautifulsoup to scrape, but HN has a public API which works great and it doesn't need any token or auth.

I recently wrote a minimal wrapper for that: https://github.com/mfiro/hnconnector

Really appreciate it

Super cool wrapper, love the methods that make it super easy to get the content

What would be the best way to for example, get the latest Ask HN: who's hiring page and all it's top level comments?

Thank you

Here's a quick rundown, you can pull a list of up to 200 "Ask HN" stories using this endpoint:

ask_stories = client.get_askstories()

then you have the ids and you can sort them reversed to catch the latest stories.

client.get_item(<id>) will give you the story's details, in which you'll find item['kids'], which are the IDs for the top-level comments. You can then loop through these comment IDs to get more info on each comment.

Another option is to use Algolia's API for HN. But that's not yet supported in my wrapper.

I have not read all the code closely but it looks like you are scraping the HTML directly. True?

It would be easier to use the JSON feed for a couple of reasons: - the data is segregated into types of things that you otherwise have to back out from the HTML/CSS - you don't need logic for parsing multiple pages

Have a look at code I wrote on this: https://github.com/hughdbrown/who-is-hiring

The code to get a month of Who Is Hiring posts just hits `https://hn.algolia.com/api/v1/items/{article_id}` with a GET request for a particular article_id. Finding the monthly article_ids is the only manual maintenance.

The code is split into multiple commandline tools that extract JSON from HN, preprocess the JSON, and filter on what I was interested in (rust job postings). You should be able to replace downstream parts like preprocessing and filtering.

See if any of this is helpful.

Cool, thank you

Yes, scraping the html directly was relatively easy

Will try Algolia and the api when doing a cron job for it