https://github.com/mwinters0/hnjobs
Find your best match on Who's Hiring
https://github.com/mwinters0/hnjobs
automation hackernews jobsearch terminal-ui tui
Last synced: 5 months ago
JSON representation
Find your best match on Who's Hiring
- Host: GitHub
- URL: https://github.com/mwinters0/hnjobs
- Owner: mwinters0
- License: mit
- Created: 2024-10-29T17:46:59.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-06-24T19:24:05.000Z (12 months ago)
- Last Synced: 2025-06-24T20:31:05.459Z (12 months ago)
- Topics: automation, hackernews, jobsearch, terminal-ui, tui
- Language: Go
- Homepage:
- Size: 180 KB
- Stars: 18
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-cli-apps-in-a-csv - hnjobs - Console tool to find the best match on Who's Hiring. (<a name="productivity"></a>Productivity)
- awesome-tuis - hnjobs
- awesome-cli-apps - hnjobs - Console tool to find the best match on Who's Hiring. (<a name="productivity"></a>Productivity)
README
[](https://goreportcard.com/report/github.com/mwinters0/hnjobs)
# hnjobs
A console tool to find your best match on Who's Hiring. Exports to JSON for automated ennui.

It:
1. Finds the latest Who's Hiring post and fetches / caches all job comments locally in sqlite.
2. Scores job postings according to your criteria.
3. Provides a TUI to help you review the jobs and track which ones are interesting / applied to / ruled out.
## Installation
```shell
go install github.com/mwinters0/hnjobs@latest
```
Or grab a binary from the [releases](https://github.com/mwinters0/hnjobs/releases)
## Usage
On first run, a config file is created at `UserConfigDir/hnjobs/config.json`. (On linux this is
`~/.config/hnjobs/config.json`.)
👉 **You should edit the config file**👈 before running any other commands, as this is
where your scoring rules are stored. Some samples rules are provided in the generated file. Each rule is a
[golang regex](https://pkg.go.dev/regexp/syntax) which must be JSON escaped (`\b` -> `\\b`).
After you've set up your rules, run `hnjobs` again and it will auto-fetch the most-recent job story, score the jobs by
your criteria, and show the TUI.
### TUI bindings
- Basics
- `ESC` - close dialogs
- `TAB` - switch focus (so you can scroll a long job listing if needed)
- `jk` and up/down arrows - scroll
- `g`, `G`, `Ctrl-d`, `Ctrl-u` - scroll harder
- `f` - fetch latest (only fetches new / TTL expired jobs, with default TTL of 1 day)
- `F` - force fetch all jobs (ignore TTL)
- `q` - quit
- Job Filtering
- `r` - mark read / unread
- `x` - mark job uninterested (hidden) or interested (default)
- `p` - mark priority / not priority
- `a` - mark applied to / not applied to
- `s` - reload config file and re-score the jobs (useful if you've changed your rules)
- Display
- `X` - toggle hiding of jobs marked uninterested
- `T` - toggle hiding of jobs below your score threshold (set in the config file)
- `m` - select month (if multiple in your DB) / delete old months
### Commands
```shell
hnjobs # Works offline.
hnjobs fetch # Just fetch, no TUI. Run this before hopping on a plane.
hnjobs fetch -x # Fetch and set exit code according to results. 0 = new jobs available.
hnjobs rescore # Re-score the cached jobs. Only needed if you've changed your rules.
hnjobs dump # Dump the current month's data to JSON on stdout.
```
## Scoring rules FAQ
- `text_missing` rules match if the regex fails. Use this to influence the score if a word is missing from a listing.
- `why` and `why_not` tags are optional. I like to analyze my past decisions whenever I watch my credit score drop.
🤷 These will become visible in the TUI eventually.
- `colorize` is an optional boolean that defaults to `true`. Set to `false` if you don't want this rule to be colorized in the display.
## Styling
If you hate orange, you can edit your config file to use one of the built-in themes: `material` or
`gruvbox[dark|light]` (example: `gruvboxdarkhard`).
If you want to take a crack at making your own, have a look at the default theme which is generated on first-run at
`UserConfigDir/hnjobs/theme-default.json` (on linux: `~/.config/hnjobs/theme-default.json`). You can either edit this
or copy it to `theme-foo.json` and set your config's theme to `foo`.
## Misc
The database is stored at `UserDataDir/hnjobs/hnjobs.sqlite` (on linux: `~/.local/share/hnjobs/hnjobs.sqlite`).