
Job hunting turns into a spreadsheet you stop updating. OfferTunity keeps every application, interview stage and silent week in one native macOS window — and never sends a byte of it anywhere.
Version 1.3 | Requires macOS 14.0 or later.
The app follows your system language, in English or Turkish.
Filling the same five fields by hand for every application is the reason tracking spreadsheets get abandoned. Select a job posting, copy it, and OfferTunity reads it — company, position, location, salary, link — and hands you a filled form to check.
Copied text
⌘A then ⌘C on the posting, ⌘V in the app. Read straight from the text, so it is more accurate than working from a picture of it.
A screenshot on the clipboard
⌃⇧⌘4 puts the shot on the clipboard without leaving a file behind. Paste it and the text is recognised from the image.
Image files
Drag screenshots onto the list, or ⇧⌘O. Drop several at once and they arrive in one table you correct row by row.
Nothing is saved until you say so. Every field carries a confidence badge, and the magnifier beside it shows the line it came from.
The hardest part of a job hunt is not the interviews, it is the not knowing. Every open application shows how many days it has been waiting, colour-coded, so the ones going quiet are obvious at a glance. The counter stops the moment a process closes.
0-6 days
Still early — no need to chase.
7-13 days
A good moment for a follow-up email.
14+ days
Two weeks of silence — worth chasing.
When the clipboard holds text, the parser works on the characters themselves rather than recognising them from pixels — which is why pasting beats screenshotting. Images still go through recognition when that is all you have.
Screenshots are read with Apple's Vision framework, on your Mac. The app ships with no network permission at all, so an image physically cannot be uploaded anywhere.
Applied, HR interview, technical interview, offer, rejected. Every change is recorded with its date, so you can see how long each stage actually took.
Set a date to come back to an application and it is flagged when the day arrives. Filter by status, sort by longest waiting, and search across company, position and notes.
Record what you asked for and what you were offered, in TRY, USD, EUR or GBP. The gap between the two is worked out for you.
Note how the rejection arrived and why — another candidate, experience, budget, relocation or visa, position closed — so patterns across a search become visible.
Keep the HR contact and the technical interviewer with each application, with the posting link and your own notes alongside them.
⇧⌘E writes a JSON backup, ⇧⌘I reads one back. Importing only ever adds — it never clears what you have, and the same file twice will not give you duplicates.
⌘S saves on demand, and the app also saves when it goes to the background and when it quits. Deleting always asks first, whether from the button, the ⌫ key or the Edit menu.
Built with SwiftUI and SwiftData. No account, no sync, no analytics — and it is sandboxed without network access, so your salary expectations and rejection notes cannot leave the machine even in principle.