Architecting a Solution to a Real Problem: Find a Remote Job
The Problem
I need a job. But let’s be honest—manually applying to each listing is a soul-draining task. I’ve been through this before, and chances are, I’ll face it again. So, it makes sense to invest time in making this process scalable. My soul dies a little bit everytime I do repetitive tasks, so I want to automate it and this way I also help keeping my skills sharp!
Now let's go into the details (where the devil always hides <_<).
The Challenges
Automating job applications isn’t as straightforward as it sounds. There are a few key challenges to address:
- Job boards come in all shapes and sizes—some have single-page forms, others require login, some just want an email.
- Not every job fits my background or interests.
- A single version of my CV isn’t ideal for every role (e.g., Engineering Manager vs Backend Developer vs SRE).
- Job descriptions often contain constraints like "Only candidates from X location" or "On-site only" that can disqualify me before I even start.
The (Draft) Solution
After analyzing the problem, testing a few proof-of-concepts, and sketching out some ideas, I came up with this initial idea:

Here’s a breakdown of the components and how they play together:
1. Discover Jobs from Job Boards
- Crawl job boards and collect links to job postings.
- Visit each job link and extract the full Job Description (JD).
- Store all relevant data in a database: JD text, job link, timestamp, board name, and any other useful metadata.
2. Query an LLM with the Job Description
- At this stage, we analyze the JD using a language model.
- This could be a hosted API (cheaper for personal use) or a self-hosted LLM on GPU-based machines (more scalable if turned into a SaaS).
- The LLM extracts useful attributes like required experience, location, role, stack, and constraints, which we then store in the database.
3. Filter Jobs
- Use SQL queries to exclude jobs that don’t match my criteria (e.g., minimum experience, required tech stack, location).
- This keeps the system from blindly applying to irrelevant roles.
4. Tailor the CV to Each Job
- Use a CV template as a base.
- Programmatically adapt the content to better align with each job—highlighting relevant skills, tweaking summaries, and emphasizing applicable past experiences.
- This step makes the application feel more personalized without doing it by hand.
5. Apply to Jobs
- Automate the actual application submission.
- Depending on the platform (e.g., greenhouse.io, lever.co), different automation strategies are used.
- If a board isn't supported yet, the job is skipped for now.
Each job will move through several states in the pipeline, such as: DISCOVERED → LLM_EXTENDED → FILTERED_OUT or TAILORED_CV → APPLIED (or APPLY_NOT_SUPPORTED if the job board is still not supported)
Final Thoughts
This isn't a one-size-fits-all solution—it's more like a foundation I can build on. Even if it starts simple, the idea is to architect something that can grow, improve, and maybe even help others facing the same challenge in the future.
I think that every single process mentioned here adds value to the actual full process of searching for jobs, so even if not all are implemented at once, each has value for its own so I can start simple with one of them and improving as I continue my search in parallel.
What do you think about this? Do you see any improvement or new challenges to the potential application?
Let's see how it goes next week! Happy weekend