One list for every internship opening.
Radar reads the job boards companies already publish and ranks every opening against your CV. On your own disk, no API key.
The whole thing in 40 seconds.
Radar filling its catalogue, ranking it against a CV and opening a posting. It has sound.
Internship listings live in a hundred career pages, each showing a different slice. Newsletters throw the data away after sending it. Radar keeps one list on your own disk, and tells you which openings match your CV.
Ranked against your CV. No model, no tokens.
Paste your CV once. SQLite FTS5 and bm25() order the Para ti ("For you") tab by match and show the words that hit. Title matches come first.
SELECT j.*, bm25(jobs_fts, W_COMPANY, W_ROLE, 0.0) AS score, bm25(jobs_fts, 0.0, 0.0, 1.0) AS score_txt FROM jobs j JOIN jobs_fts ON jobs_fts.rowid = j.id WHERE jobs_fts MATCH :your_cv ORDER BY (score = 0) ASC, score + W_TIE * score_txt
Software Engineer Intern, AI/ML & LLM
Microsoft, Redmond, WA
- Matches in the title
- aillm
- Matches in the posting text
- promptusercomputerpythonproductsengineering
The rest of the job. Done while you sleep.
Fills itself
Walks 89 company boards on public ATS APIs plus community GitHub boards. A first run takes about five minutes; after that it refreshes when you open it, or nightly from source.
Reads the posting for you
descr.py fetches the actual job description, so you can judge a role without leaving the app. Postings that can't be read say why.
Europe first, by your rules
Filters by graduation year, summer-only, degree level and region, all set in one config file.
Tells you what's new
Shows what came in since your last visit and flags openings the source stopped confirming, instead of letting them rot in the list.
Prepares the application
One button builds a prompt with the posting and your CV inside. You paste it into any assistant; it marks what to fill in by hand rather than invent it.
From the author's own catalogue.
Snapshot of the local database on 22 September 2026, the same one the film shows.
Three files and a database. All standard library.
ingesta.pyWalks the boards and writes through
db.upsert(), nothing else.db.py + jobs.dbEvery SQL statement in the project lives in one file, and FTS5 lives inside
search().app.py + index.htmlA Python
ThreadingHTTPServeron127.0.0.1and one HTML file. Nothing is ever exposed to your network.
Install on your Mac. About a minute.
The third step happens only the first time.
-
Drag it into Applications
Open Radar.dmg and drag Radar onto the Applications folder.
-
Open it. macOS stops it. Click Done.
macOS says Apple could not verify “Radar” is free of malware. It says that about every app that isn't notarized by Apple. Click Done, not Move to Trash.
-
Open Anyway, once
Open System Settings → Privacy & Security, scroll down to Security and click Open Anyway next to “Radar” was blocked. Confirm with your password or Touch ID. From then on it opens with a double-click.
- Then let it fill, and paste your CV
The first time it reads every board (about 5 minutes, with a progress bar). Then paste your CV in Mi CV and open Para ti. It refreshes by itself when you open it.
Why the warning? Notarizing an app needs a paid Apple developer account ($99 a year). This is a free side project, so it isn't notarized. The full source code is on GitHub, and you can check that your download is exactly the file I built. In Terminal:
shasum -a 256 ~/Downloads/Radar.dmg
should print 8a5e582dc6603458bd5d41c67ef7482c263bc6d74919ddb61fc8bd928e158dfb
Prefer the Terminal for step 3?
xattr -dr com.apple.quarantine "/Applications/Radar.app"
Or run it from source.
There is no hosted demo, on purpose. Radar holds your CV and your applications, so it runs on your machine at http://localhost:8000 instead of on somebody's server. You need Python 3.9+ with SQLite FTS5, nothing else.
git clone https://github.com/nachoie123/radar.git cd radar chmod +x instalar.command Radar.command ./instalar.command # macOS: sets up the nightly agents and opens the app # Linux / Windows python3 ingesta.py # fills the catalogue (~5 min the first time) python3 app.py # serves http://localhost:8000