Launching www.whoishiring.jobs

A job site build by hackers (one hacker, actually) for hackers.

I find “Who is Hiring?” posts and their sister posts “Freelancer? Seeking freelancer?” to be indispensable for discovering interesting tech companies. Sadly, Hacker News user experience is rather poor, so I tried to fix with www.whoishiring.jobs.

The app adds keyword-based filters, email notifications about matching jobs, and organizing job search with bookmarks. In this article, I’d like to walk you through the tech stack and describe a few interesting takeaways that will be described in separate articles.

Tech Stack

Ruby on Rails is one of the best choices for startups and became a basis for the product. I like to keep things vanilla as much as possible and focus on the product instead of gluing libraries together.

Turbo is the first important piece and is responsible for interactivity. I’m using both Turbo Frames and Turbo Streams. There is no need for Stimulus so far as the few bits of browser-based interactivity are implemented using vanilla JavaScript.

I dislike ERB and swapped it out for Slim. I find it beautiful and easy to write. I’m still using ERB in text-based emails because I need more control over the final rendering. Paired with Tailwind CSS and LiveReload it makes for productive and pleasant development environment.

For background processing, I decided to give Solid Queue a try. It’s a new database-backed job queue that comes from the Rails team. It’s been working really well so far!

Two other important gems are Pagy for pagination and rack-attack to cut off bots. I’ve fought a two-week long battle against bots but have prevailed.

Last but not least, I used three indispensable development aids: rubocop and a few plugins for linting, letter_opener for emails, and guard for LiveReload.

The entire app is deployed to Render and uses AppSignal for error and performance monitoring. The monthly cost is 20 USD for Render 23 USD for AppSignal, totaling around 43 USD. Hacker News data is fetched via their official Firebase API.

Lessons Learned

It’s a seemingly simple app but has allowed me to work on some interesting problems:

  • War Against Bots – the app was targeted with account spam that also caused controllers to fail; rack-attack helped me to cut off malicious traffic.
  • Creating CSS-only charts like the one on the home page or the stats page
  • Micro–interactivity without Stimulus
  • Precomputing statistics for performance reasons – the aforementioned stats page was taking over 500 ms to load and I brought this back to under 100 ms.
  • Using Solid Queue – scheduling jobs aggressively caused me to exceed my database plan limits.
  • Syncing with a third-party APIs is full of beautiful patterns that can be extracted into a gem.

Each of those problems deserves a separate article. Expect to see them over the coming weeks.

Next Steps

The product is far from finished. I’m going to implement the following features:

  • Filtering based on salary, location, type (in-office, hybrid, remote).
  • Pulling in “SEEKING FREELANCER” posts.
  • Email reminders about upcoming “Who is Hiring?” posts.
  • Browsing all jobs posted by a specific user or for a specific company.

Technically, I’m going to move the app to a VPS running OpenBSD and switch the database to SQLite3. I’ve bought a VPS at Hetzner but need to finish its Ansible configuration first.

In the meantime, if you’re looking for a tech job then consider creating an account!

Enjoyed the article? Follow me on Twitter!

I regularly post about Ruby, Ruby on Rails, PostgreSQL, and Hotwire.

Leave your email to receive updates about articles.