Ghost job listings are a growing frustration for job seekers. Many applicants spend hours applying to roles that appear active but are no longer being filled. These listings can remain online for months, wasting candidates’ time and distorting the job market. PhantomHire was inspired by this problem: we wanted to build a tool that could quickly flag suspicious listings and help people decide whether a role is worth applying to.

Our approach was to analyse common signals that appear in ghost listings. Many of these jobs are reposted repeatedly, contain vague or generic language, or remain open for unusually long periods. PhantomHire combines these signals into a simple Ghost Score that estimates whether a listing is likely active, unclear, or likely ghosted. The aim is not to make a perfect prediction, but to provide transparency and help job seekers make more informed decisions.

The system was built with a Python backend using FastAPI. The analysis engine extracts textual features from job descriptions, such as vagueness and specificity, and compares new listings against previously analysed ones using TF-IDF similarity to detect reposted descriptions. These signals feed into a deterministic scoring system that produces the Ghost Score along with explanations for why a listing was flagged. Analysed listings are stored in a SQLite database, allowing similarity detection to improve as more jobs are analysed.

On the frontend, we built a simple interface that allows users to paste a job listing and instantly receive a score and explanation. The interface prioritises clarity: the score is displayed visually, and the explanation highlights the specific signals that influenced the result. Our goal was to make the system understandable rather than opaque.

One of the biggest challenges was reliability. Many job platforms block scraping or load job descriptions dynamically, which makes automatic extraction difficult. To ensure the tool works consistently, we focused on a stable workflow where users can paste job descriptions directly. Another challenge was balancing simplicity with meaningful results. Instead of building a complex machine learning model, we chose a transparent rules-based system that judges and users can easily understand.

Through building PhantomHire, we learned a lot about designing explainable systems, integrating a backend analysis engine with a frontend interface, and working around real-world constraints like data extraction and API compatibility. The project reinforced the importance of building something reliable first, and then iterating on sophistication later.

PhantomHire is a small step toward making the job search process more transparent. Even a simple signal that a listing may be outdated or suspicious can help candidates decide where to invest their time.

Share this project:

Updates