Personal project · Search & filtering automation · September 2026
Job search abroad
3,494 listings across five countries, narrowed into 178 shortlisted postings. A personal search turned into a repeatable data workflow.
- My role
- Workflow, filtering & review
- Scope
- Five Asian countries
- Tools
- JavaScript · CSV · Apps Script
- Period
- September 2026
Give a large search a useful shape
For an overseas job search, a familiar title is only the beginning. A data role can hide a working-language requirement, a senior scope or an experience floor that rules it out. I wanted a way to compare the actual requirements against my situation without starting from scratch on every listing.
I worked from scraped LinkedIn exports covering China, Japan, South Korea, Thailand and Vietnam. The saved files contain 3,494 distinct posting IDs. Filtering and review produced 178 shortlisted postings: 75 priority and 103 second tier. That is 5.1% of the collected postings, not an interview or hiring rate.
- Distinct source postings
- 3,494
- Countries searched
- 5
- Postings in the final lists
- 178
- Share retained by posting
- 5.1%
Start by checking what was actually collected
I kept the original exports separate from candidate pools, rejection files and final lists. Posting IDs make it possible to trace a decision back to its source and keep a later review from being counted as another collected job.
The China archive is a useful example of why that matters. It contains the same 981 IDs as the main export, but preserves 913 descriptions missing there. Matching the files by ID recovers the text without adding a single posting. Across the five countries, 3,301 records have a saved description and 193 still lack one.
Screen against a profile, not a job title
The search used an engineering background, Python and JavaScript experience, C1 English and a conservative junior profile. I was open to adjacent roles and learning a new stack, while needing to understand whether an employer could support an international hire.
The workflow separated three questions: can I meet the written requirements, am I a plausible fit for the work, and is the hiring arrangement practical? Language, mandatory experience and graduate-program restrictions were assessed before a closer review of technical and domain fit. An unstated requirement stayed unknown rather than becoming a positive signal.
From collected listings to an application list
- Collect & preserve — Keep original fields and posting IDs; distinguish sources from derived files.
- Parse & screen — Clean scraper markup and interpret language, experience and eligibility requirements.
- Review & recover — Read plausible roles, revisit suspicious rejections and inspect missing information.
- Prioritize — Keep reasons, uncertainty and next actions with each retained opportunity.
Try to prove the first filter wrong
The most interesting work was in the exceptions. Scraper tokens could swallow the first digit of an experience range. “0–2 years” then looked like a strict two-year minimum. The parsing code preserves the range, distinguishes required from preferred sections and checks what the number actually refers to.
Vocabulary needed the same care. A description mentioning a senior colleague does not necessarily describe a senior vacancy. “Fresh graduates welcome” does not mean that only recent graduates may apply. In Vietnam, revisiting that distinction restored three postings: one priority and two second tier. The review pool grew from 210 to 213 before the deeper review produced its final list.
Make the shortlist explain its choices
The final lists keep the evidence and the next action beside the role. Priority means the saved review found a credible reason to apply; second tier keeps a possible route visible while flagging a technical, domain or practical gap. South Korea’s Strong and Technical Stretch categories are aligned with those two groups in the chart.
The 178 posting IDs correspond to 175 opportunities after within-country deduplication: 12 in China, 45 in Japan, 4 in South Korea, 76 in Thailand and 38 in Vietnam. Separate posts can point to the same opportunity. The review uses saved opportunity keys where available and company/title matching for the simpler China and Korea lists.
These are September 2026 search results. Collection coverage and review depth differ between countries, and sponsorship or current availability can remain unresolved. The useful output is a reasoned place to start an application, with the remaining questions attached.
Keep follow-up connected to the search
A separate Google Apps Script helper handles the next organizational problem: LinkedIn notifications arriving in Gmail. It imports labelled notification emails into a Google Sheet and uses the Gmail message ID to avoid duplicate rows.
The sheet keeps notification metadata, profile and conversation links, plus fields for company, job ID, status and the next action. The configured schedule is every 15 minutes. Where the email contains no actual message text, the script records a notification and leaves the conversation to be opened manually. Replies and applications remain my decision.
A personal search became a reusable method
I ended with country-specific lists, reasons I could inspect and a reusable screening prompt for a different candidate profile or dataset. The process includes a second look at both rejected and retained roles, so a convenient rule does not become an unquestioned conclusion.
The result I can show is the organized search itself: thousands of collected postings reduced to a manageable set of leads, with source context and uncertainty preserved. The saved material does not establish how many applications became interviews or offers.


