Skip to main content
Home
GrN.dk

Main navigation

  • Articles
  • Cases
  • Services
  • Your Digital Project Manager
  • About Greg Nowak
  • Image Gallery
  • Contact
User account menu
  • Log in

Join my community / free newsletter — sign up here

Breadcrumb

  1. Home
  2. Cases

A private job radar that reads seven boards every morning — and throws away most of what it finds

Client
GrN.dk — internal build
Sector
Personal automation, public-source scraping and AI-assisted filtering
Period
Built July 2026 · fetching every morning at 06:45 since 9 July 2026
The job finder's job list, captured from a throwaway demo copy seeded with invented rows — the header reads "Job finder — demo data" beside the list of sources. Each card carries a job title, a source chip (jobindex, verama, freelancermap, emagine, weworkremotely, amino), an AI score out of 5, an optional contact-mail chip, a location and a seen-date, then three actions: applied, draft email, and discard with a "why discard?" note. No real advertisement or employer appears.

At a glance

This one has no link on it, and that is the point: jobs.grn.dk answers 401 to the internet and always has. It is an internal tool — a job radar, built for its owner's own search for work. Every morning it reads seven contract and job boards, drops everything that cannot match a written profile, has what survives judged by a language model against that profile, and presents the handful worth reading as one screen with three buttons: applied, draft email, discard.

Because it holds one real person's live job search, nothing of it is published here. The screenshot above is a throwaway demo copy of the same interface, seeded with invented rows — every company, title, location and address in it is a placeholder, and it labels itself "demo data" in the header so it can never be mistaken for the live board.

Seven job boards read every morning at 06:45 — no manual browsing
522 listings stored and judged since 9 July 2026; 47 still open, the rest filtered out or expired
Private by design: HTTP basic auth, no public page, and no employer or applicant data published

The challenge

The manual version of this is twenty minutes a day of reading seven boards to find, on a good day, one advertisement worth answering. What makes that hard to automate is not the scraping. It is that the two things which decide whether a listing is relevant are the two things job portals describe worst.

"Remote" on a job board rarely means remote. A listing tagged Poland · Remote or Portugal · Remote means remote from inside that country — local residence, a work permit, local tax presence. The requirement here is the opposite: work that can be done remotely from Denmark, or work that is genuinely open to anywhere in the world. Listings located in Denmark qualify, worldwide listings qualify, EU/EEA/Nordic-wide listings qualify, and so does the Øresund region across the bridge — a country label next to the word "remote" usually disqualifies. No portal has a filter for that distinction, because only the ad's own words can settle it.

The wanted engagement is not the one boards are built for. The target is part-time and delivery-based work — a defined task with an agreed outcome, on a schedule the person sets themselves — not a permanent full-time position. Portals do carry engagement facets, and where they publish one it is gold; but a bare search for freelance or konsulent on a general board returns mostly permanent on-site employment that happens to use the word.

Two further constraints shaped the design. A language model cannot be the filter — judging every one of hundreds of daily listings with a model is slow and expensive, so the model had to be spent only where a machine-readable field genuinely cannot answer the question. And a filter that throws away too much is worse than no filter, because you never see what it discarded: whatever it dropped had to be droppable for a stated reason, and the human had to be able to correct it without touching code.

The solution

Seven sources, each read the cheapest honest way. jobindex.dk through its RSS endpoint — which answers the same query string as its HTML search, so the portal's own facets (Freelance, Deltid, 100% hjemmearbejde) do the first round of filtering for free; emagine and Verama through their public JSON APIs; rightpeoplegroup out of the JSON its own pages ship with; amino.dk through RSS plus its public detail pages; freelancermap through its public facet pages; weworkremotely through the single all-categories feed that is the only one carrying an engagement type, a country list and skills. Every source has a hard politeness cap on how many detail pages one run may fetch, and a runaway-paging stop.

Structured fields are filtered at fetch; only prose is sent to the model. Where a source publishes a real structured country or engagement type, the geography and engagement rules are applied before the advertisement's body is even downloaded. Measured on the probe days: 160 of 173 open Verama assignments, 21 of 35 freelancermap rows and 96 of the 100 newest weworkremotely advertisements were dropped at fetch — unscored, unstored, and never costing a model call. The model is asked only about the listings where the answer genuinely lives in the prose.

One JSON file is the entire tuning surface. Excluded technologies, unwanted language requirements, per-source queries and on/off switches, the geography accept-lists, the engagement preference ranking and the pruning window all live in rules.json next to the script — no code change to retune the radar. The interface edits that file directly and validates as it saves: every pattern is compiled as a regular expression before it is accepted, and the raw JSON editor refuses anything that is not a valid object.

The judge reads a written profile, not a keyword list. Each scoring prompt is assembled from a plain-language candidate profile, the current geography and engagement rules, and the accumulated feedback, and it returns a 1–5 score per listing. Two verdicts are acted on automatically — an advertisement that requires recurring on-site presence, and one whose "remote" is bound to another country — and each auto-discard is written back with the reason it was dropped, so a wrong call is visible rather than silent. Advertisement text reaching the prompt is explicitly framed as untrusted data and not as instructions.

Feedback is durable, and deliberately asymmetric. Asking for an email draft or marking a listing applied is a positive signal; discarding it with a note is a negative one, in the user's own words. Both go into a learnings table that is never pruned and is read into every later scoring prompt, so a correction made once keeps applying. Everything else expires: listings that vanish from their feed or are discarded are deleted after a fortnight — unless they were applied for, which is never removed.

The interface is one screen, and it is locked. Jobs best-first by AI score, source and score chips, contact addresses lifted out of the ad body, and the three actions. It sits behind HTTP basic authentication with a second lock behind that: because browsers replay basic auth automatically on every request, each state-changing POST also has to prove its origin matches the host it was reached on, or it is rejected.

It writes the morning mail, and it feeds an approval loop rather than an applicant robot. A daily digest mails what is new. A separate connector reads the same database and proposes the best one or two candidates as Trello cards for a human to approve or reject — and only an approval releases the expensive half that builds a tailored application. Nothing is ever submitted to an employer automatically: the last step is an email to a human, and that human presses send. The paid lane ships disarmed behind an explicit switch.

The results

What exists, read off the live installation on 26 July 2026: a radar that has been fetching unattended every morning since 9 July, with 522 listings stored and judged in that time across seven sources — 259 from jobindex, 230 from emagine, and the remainder from Verama, freelancermap, rightpeoplegroup, weworkremotely and amino. 474 of them have been scored by the model. 47 are still open in the interface; 388 were discarded, most of them by the rules or the judge with the reason recorded, and 87 disappeared from their own feeds and were retired automatically. Eight application emails have been drafted. Everything dropped at fetch time on geography or engagement — the large majority of what the seven boards actually publish — is not in those numbers at all, because it was never stored.

What it has not proven, stated plainly: this is a sourcing and filtering machine, not a hiring outcome. One listing is marked applied. No engagement has been won through it, and there is no reply-rate or interview-rate figure worth quoting yet — the pipeline that would measure that is built but deliberately switched off, and the lane that spends money on tailored applications only runs for a job a human has explicitly approved on a card. The honest claim is about the funnel: the daily reading is done by the machine, the discards carry their reasons, and a correction taught once keeps holding.

Why there is no link and no real screenshot. The tool is private by design — one person's live job search, complete with which employers were contacted and what was said about them. It answers 401 to every unauthenticated request, so there is nothing to demonstrate publicly and no wish to. The interface shown here is a throwaway copy of the same code fed invented rows; the real board's contents are not published, quoted or described in this case.

"Remote" alone is not enough — the work has to be doable remotely from Denmark, or be genuinely open to anywhere in the world.

The candidate profile the scorer reads before it judges any advertisement
  • Automation
  • AI agents
  • python
  • Custom Development
  • scraping
  • remote work
  • cron

Got a project that needs the same kind of hands-on delivery?

Your digital project manager

Review Greg on Google

Greg Nowak Google Reviews

 

Written recommendations from Trafik og Veje, Aarhus Municipality (2011) and AgroTech (2010) — read them on LinkedIn.

Illustrated infographic summarizing: What Are Customers Asking? Let AI Find the Patterns in Support Tickets
What Are Customers Asking? Let AI Find the Patterns in Support Tickets
2026-09-04

AI-based ticket analysis can uncover recurring complaints, product defects and gaps in documentation—without the company needing yet another chatbot.

Illustrated infographic summarizing: OpenAI Has Machine Identity Now. Which Jobs Should Lose API Keys?
OpenAI Has Machine Identity Now. Which Jobs Should Lose API Keys?
2026-09-03

OpenAI’s X.509 workload identity can replace API keys for the right workloads. This practical framework helps teams decide where to start safely.

Illustrated infographic summarizing: WordPress 7.1 Exposes AI-Ready Actions. Who Gets to Run Them?
WordPress 7.1 Exposes AI-Ready Actions. Who Gets to Run Them?
2026-09-02

WordPress 7.1 helps AI agents discover and invoke site abilities. Here is how to keep exposure, authentication and permission firmly separate.

Illustrated infographic summarizing: From Sales Meeting to CRM: Automate Follow-Up Without Compromising Data Quality
From Sales Meeting to CRM: Automate Follow-Up Without Compromising Data Quality
2026-09-01

How to use AI for meeting notes and follow-up while fixed rules protect CRM data, customer matching and the sales pipeline from errors and premature changes.

Illustrated infographic summarizing: Your AI Gateway Can Name the User. Decide What That Log Is For
Your AI Gateway Can Name the User. Decide What That Log Is For
2026-08-31

Identity-aware AI Gateway logs can sharpen security and cost control, but only when attribution, access, retention, guardrails, and response are clearly defined.

Illustrated infographic summarizing: Zero Data Retention Is a Workflow Audit, Not a Checkbox
Zero Data Retention Is a Workflow Audit, Not a Checkbox
2026-08-30

Zero Data Retention covers the provider, not every copy in your stack. See how to audit endpoints, logs, storage, deletion and project-level controls.

Illustrated infographic summarizing: MCP 2026-07-28 Is an Auth Migration, Not a Version Bump
MCP 2026-07-28 Is an Auth Migration, Not a Version Bump
2026-08-29

MCP’s July 2026 release removes protocol sessions and tightens OAuth. Here’s a practical plan for migrating clients, servers and enterprise access safely.

Illustrated infographic summarizing: Turn a Technician’s Voice Note into a Work Order—Not Raw Audio
Turn a Technician’s Voice Note into a Work Order—Not Raw Audio
2026-08-28

Voice input can reduce the technician’s documentation burden when hours, materials and status are validated before the information is saved in the work order system.

Illustrated infographic summarizing: ChatGPT Disabled Personal Knowledge Sync. What Broke on Your Team?
ChatGPT Disabled Personal Knowledge Sync. What Broke on Your Team?
2026-08-27

ChatGPT retired personal sync connections for Enterprise and Edu. Here is how to find affected workflows, migrate access, and test permissions.

Illustrated infographic summarizing: Cloudflare’s September Bot Defaults Could Quietly Cut AI Visibility
Cloudflare’s September Bot Defaults Could Quietly Cut AI Visibility
2026-08-26

Cloudflare’s September bot defaults give publishers more control, but one training block could also cut search crawling and AI-driven discovery.

More articles
RSS feed

Footer

  • All articles
  • Contact

GrN.dk — AI automation, web platforms, web optimization, data handling and logistics.

© 2026 GrN.dk · LinkedIn · Contact · AI automation in Danish: nowa.dk

Behind GrN.dk: Individual Entrepreneur Codecrafter · Tax ID 305669096 · Bakhtrioni St. 22, 0194 Tbilisi, Georgia · official business register