Applye v0.25.0
Fixed
- The competitor feature-adoption analysis no longer ships in the repo.
AGENT_PROMPT_CAREER_OPS_ADOPTION.mdanddocs/product/CAREER_OPS_ADOPTION.mdmapped career-ops features to Applye as an internal adoption checklist - fine as a working doc, wrong to publish. They're untracked and gitignored; the public credit and comparison to career-ops in the README and website stays as is. - The desktop webview now runs with a real Content Security Policy.
tauri.conf.jsonshipped withsecurity.csp: null(no restriction at all); it now sets an explicit policy scoped to what the app actually loads (self-hosted fonts, data/blob URIs for the CV photo, Tauri's own IPC/asset origins), so the packaged app can't load arbitrary scripts or connect to arbitrary origins. - Cargo package metadata pointed at the wrong GitHub owner.
apps/desktop/src-tauri/Cargo.toml'srepositoryfield saidvkasap/applye; it now matches the real remote,vitala89/applye. - Discover now recognizes locations properly. Job locations are classified with a rewritten, unit-tested engine: US cities and states (
Austin, TX,Denver, CO) land in North America instead of Other, South American countries (Brazil, Argentina, Uruguay, Chile, Colombia, Peru…) get their own region instead of falling into Other, and European/Asian/Oceania/Middle-East/Africa places are recognized too. Ambiguous two-letter codes no longer cross-classify (SF, CAis California, not Canada), and ordinary words never trigger a false country. Feed cards that previously showed no location now derive one from the feed's category or a "Location:" line, and clearly-remote jobs are labelled Remote - so the location actually shows and the Locations filter works.
Changed
- Discover groups the feed by your target roles. The inbox now shows a "For you" section - openings whose title matches one of your profile's target roles - above a "More openings" section with everything else the scan found. Nothing is hidden; it is a soft ranking, so you still see the rest. With no target roles set, the feed stays a single plain list.
- The sidebar was redesigned. Navigation is now grouped under section labels (Workspace, System) with the primary items (Dashboard, Discover) above them; the wordmark is the lowercase
applyelockup. The footer replaces the old AI-mode indicator with a profile card that opens your profile. Item names and destinations are unchanged. - The Pipeline search moved to the left. The board's search field now sits at the start of the summary strip instead of the far-right edge, so it stays reachable when the window is wide.
- The Job Tracker no longer repeats its title. The page kept both the top-bar title and a second "Job Tracker" heading; the duplicate heading is gone, leaving just the top bar and the one-line description.
- The app icon is now the Applye logo mark. The launcher/dock icon (and the full bundled icon set used when publishing - macOS
.icns, Windows.ico, and every PNG size) is a dark rounded tile carrying the brand mark (the angled slash + indigo cursor bar), replacing the old placeholder. No wordmark, just the mark. - The dark theme was recolored to warm graphite. The dark palette moved from cool blue-grey neutrals to a warmer graphite set: the app canvas, cards, surfaces and borders are all a touch warmer, primary text is now an off-white (
#f4f2ed) instead of cool white, and the left navigation rail has its own dedicated recessed shade so it reads as a distinct plane from the canvas. The indigo accent, focus rings and status colors (success/warning/danger) are unchanged. Light theme is unaffected. (Mirrors the updated Applye design system.) - The AI privacy note now shows for every cloud provider, not just DeepSeek. In Settings, choosing any provider (Anthropic, DeepSeek, OpenAI, Google) now displays a note explaining that in API mode your job description and profile text are sent to that vendor's servers, that your API key stays in the OS keychain and never touches the local database or logs, and that AI is always opt-in. DeepSeek additionally keeps its China-jurisdiction warning on top of the shared note.
- Language pickers now read in each language's own name. The UI-language and document-language selectors in Settings show "English, Deutsch, Русский, Español, Français, Українська" instead of raw codes (en, de, ru...), so you can always find your own language even if the app is currently in another.
- The Job Tracker has a new design. It opens focused on six essential columns (company, role, status, date applied, next action and its date) instead of a wall of 19; the rest live in a Columns side panel. Company is a link back to the job, status shows as a colour-coded pill, and the index + company columns stay pinned while you scroll sideways. A row is read-only until you open its Edit action, which turns the row's own fields into inputs with Save / Cancel; job-derived fields (company, tech stack, blue-card) are always read-only and marked as such. A summary strip carries the totals, and there are proper loading and empty states.
- Exporting the tracker report now shows a preview and asks where to save it. "Export report" opens a preview of the report document (letterhead, applicant, period, table and totals) so you can review it first, then Save as PDF or Save as CSV via a native Save dialog where you choose the folder and name - instead of the file landing silently in Documents/Applye/reports. You choose the report format - Germany (the official Eigenbemühungen document, in German) or International (English) - and the page orientation (A4 portrait or landscape). The report now shows your own visible columns (including custom ones and Next Interview), not a fixed set. It works out how many columns fit an A4 page for the chosen orientation and tells you: Fit to page keeps only what fits, All columns keeps everything by wrapping the extras onto a second line under each row - and a note lists exactly which columns are affected. The saved PDF is the exact same render as the preview (it prints the preview's own page), instead of a plain monospace text layout. CSV always includes every visible column (a spreadsheet has no width limit).
- The website drops "forever" from the "free" claims. The hero, FAQ,
/compare,/press, the/sustainpage, and the site meta tags now describe Applye as free and MIT-licensed rather than "free forever".
Added
-
The repository is dressed for open source. The README was rebuilt in a launch-ready shape - centered wordmark and hero placeholders, a six-language switcher (English, Español, Deutsch, Русский, Українська, Polski) with full translations at
README.<lang>.md, badges, a features table with the 0-token contract, quick start, the core loop, project structure, tech stack, screenshots section, author note, and disclaimer. New community files:CONTRIBUTING.md(setup, conventions, what will not be merged),CODE_OF_CONDUCT.md(Contributor Covenant 2.1),SECURITY.md(private reporting policy), plus GitHub issue forms and a PR template. ALEGAL_DISCLAIMER.md(acceptable-use terms) is linked from the README, media placeholders are inventoried indocs/assets/README.mdwith production prompts indocs/assets/ASSETS_BRIEF.md, anddocs/design/WEBSITE_PLAN.mdbriefs the site design work. The GitHub repository metadata (description, homepage, topics) is filled in. -
The docs grew a step-by-step User guide. Nine new pages under
/docs/guide/*(first run & tour, profile, add a job, score, tailor & export PDF, Discover, Pipeline & Tracker, Interviews & Analytics, Settings & AI) walk through the app screen by screen, honest to what ships today - PDF-only export, no AI interview questions, real provider list (Claude, OpenAI, Gemini, DeepSeek + CLI bridge). Every screenshot/GIF/video slot is a styled placeholder box stating exactly what to capture; the same claims were corrected on the landing page and in all five READMEs. -
The website grew five pages: Manifesto, Compare, Press, Privacy, Sustain.
/manifestostates the six principles (augmentation not automation, fewer better applications, your data is yours, honesty over inflation, pay for judgement, open source forever) with a signature block;/compareis an honest table against cloud SaaS trackers, career-ops, and a spreadsheet;/pressis a self-serve press kit (boilerplate, fact sheet, asset placeholders);/privacyis the plain-language privacy page for the app and the site;/sustainexplains the free-forever model and how to support it. The footer now carries the full page list (Docs, Manifesto, Methodology, Compare, Blog, Changelog, Press, Privacy, Sustain) plus social icons - GitHub and LinkedIn live, Discord and X appear once those channels exist. -
Discover is now a real screen: jobs come to you. The "coming soon" placeholder is replaced by a working discovery inbox. Applye scans legal, machine-readable job sources - the built-in Tier-2 feeds (Remotive, We Work Remotely, Himalayas), public ATS company boards (Greenhouse / Lever / Ashby, added by company slug), and any RSS feed you add - entirely with deterministic code: no AI reads the sources, nothing leaves your device except plain HTTPS requests to public feeds, and the scan costs 0 tokens. Fetched openings are filtered locally before they ever reach you: a per-source title keyword filter (auto-derived from your profile's Target Archetypes until you customize it), your geographic scope from Settings, and dedupe against every job already in your database. Hitting Scan shows a terminal-style scan console that logs each source's result line by line (
remotive ... 128 fetched · 117 filtered out · 11 new), then collapses into a summary strip (LAST SCAN 12:04 · 14 NEW · 183 FILTERED · 0 TOKENS). The feed itself is a fast triage list: each row shows the role, company, source, location, age, and which of your keywords matched; Save puts the job into My Jobs as a saved application, Dismiss hides it forever (with an inline Undo), and clicking a row expands a description preview with a link to the original posting. A Sources panel manages where openings come from - toggle the built-ins, add a company's ATS board or your own RSS feed (https only, with a note on what Applye will and won't read), remove your own sources, and see each source's last scan result. Closed boards (LinkedIn, Indeed, StepStone, Glassdoor) are deliberately not scanned - that is a product stance, not a gap. -
Analytics is now a real screen. The "coming soon" placeholder is replaced by a working analytics view that answers "how is my job search actually going?" using only data already on your device. A period selector (30 days / 90 days / all time) filters everything. Four counters lead - applications sent, response rate, interviews, and offers - each with a change vs the previous period and a small trend spark. Below them, an application funnel (Saved to Applied to Interviewing to Offer) shows the count and stage-to-stage conversion at each step, with rejected/withdrawn tracked separately as leakage, and an applications-over-time chart plots your volume per day/week/month with your follow-up activity overlaid. When you have very few applications it shows raw counts instead of misleading rates, and a brand-new user sees a calm "no data to analyse yet" state. The visuals are terminal-native (flat bars, a single thin accent line) to match the design system; no charting library, no external or benchmark data. It also shows a match-score distribution - a histogram of the ATS-fit scores of the jobs you applied to, with the median and a scored/unscored count, so you can see whether you are applying to well-matched roles or spraying (it appears once some of your jobs have been scored). A companion score vs outcome view compares your average match score across offers, interviews, and no-interview, so you can see whether higher-fit applications actually get further. A time to response card shows the median days from applying to the first employer response, with fastest/slowest and a day-band histogram. A pipeline aging card shows how long your active applications have sat in their current status (flagging any stalled past 14 days), and a where you're applying card ranks your top locations. (Follow-up counts reflect follow-ups drafted in the app; Applye never sends mail.)
-
The Dashboard is now a real home screen. Landing on Applye now opens a working command center instead of a "coming soon" placeholder. A greeting leads into four at-a-glance counters (active applications, upcoming interviews, overdue follow-ups, offers - the overdue tile turns amber when anything is due). Below them, a Needs attention queue surfaces the next action to take right now - an overdue follow-up to draft, a half-finished tailoring session to resume, an interview in the next 48 hours to prep for, an out-of-date scoring profile or pitch to regenerate, or a profile to finish - each with a single button that jumps straight to it. When nothing is pending it shows a calm "all caught up" state, and a brand-new user sees "Complete your profile" and "Add your first job" instead. Two panels list your upcoming interviews and most recent jobs, and a quick-actions bar offers Paste job, New tailoring and Import CV. Everything is derived from data already on your device - no new storage. The queue also flags per-job stale scores: when you regenerate your scoring profile, any job scored against the old one shows a "Score is stale for X" prompt (highest-fit jobs first, capped so it can't flood the list) that jumps to the job to re-score.
-
Interview Prep has a new design. The list now leads with a summary strip (interviews tracked, upcoming, and the next date) and a proper empty / loading state, and each row has a Remove from Interview Prep action (with a styled confirm) that clears that application's stages while leaving the job itself in My Jobs and Pipeline. The detail screen is now a timeline of stages: each stage is a card with its status shown as a colour-coded menu you click to change, a formatted date, the interviewer, notes, and reorder / edit / delete controls. Adding or editing a stage now happens in a modal (opened by a single "Add stage" button) instead of a large form permanently pinned to the bottom of the page, and deleting a stage uses a styled confirm dialog instead of the browser's. (Per-stage AI interview prep - generated questions and answers - is briefed for a follow-up.)
-
Delete all data (factory reset). A new Data section in Settings wipes everything Applye stores on this device - every job, application, document, note and cache - clears your saved API keys from the OS keychain, and returns you to onboarding with a clean slate. It is gated behind an explicit "Yes, delete everything" confirmation and cannot be undone.
-
Settings gained an Appearance section and an About section. Appearance carries the light/dark theme toggle (previously only in the top bar); About shows the app version. (Controls for geographic scope, score-notify thresholds, and export format were intentionally left out: those data-model fields have no behaviour behind them yet, and export currently ships PDF only, so surfacing them would have shown settings that do nothing.)
-
You can archive, restore or remove a Job Tracker row. Each row's actions menu offers Archive (moves it out of the active grid but keeps it in your exported report - toggle the Active / Archived segment to see them), Restore, and Remove (a two-step confirm that hard-deletes the job and its application, same as My Jobs).
-
You can add your own columns to the Job Tracker. The Columns panel has an "Add custom column" form (name + type: text, date, number, yes/no or single-select). Custom columns are editable per row like the built-in fields and are saved to the database; remove one from the same panel.
-
The Job Tracker shows your next scheduled interview. A "Next Interview" column surfaces the soonest still-upcoming interview stage you logged on the Pipeline board (its label and date) - so a scheduled technical or final round shows up in the tracker, not just the first two stages.
-
The Pipeline board has a new design. A summary strip shows how many applications are active, how many are overdue, and lets you search across company, role and location. Rejected and cancelled columns collapse into slim side rails (an "archive") that you reveal with one click, so the board stays focused on live applications. Cards now carry a company monogram, the location, a colour-coded ATS score, and - for interviews - a segmented stage-progress track. The quick-view now leads with status and ATS fit, shows the interview as a step-by-step tracker, and groups every section clearly.
-
Leaving a half-finished application no longer loses your place. If you start tailoring a CV for a job and then click away - to Documents, to another job, anywhere - a "Finish tailoring" button now follows you and brings you back to the exact step you left, instead of dropping you at the job list to start over.
-
Your profile now holds your email, phone, website and LinkedIn. They were already being read off your resume, but the profile had nowhere to put them, so they were never yours to edit — and were thrown away the first time you saved. Four fields now sit under Location in the profile form.
-
The scoring profile tells you when it is out of date. The card now reads "out of date · regenerate" once you have saved a change to your profile text, and "unsaved changes" while you are still editing. Previously it only ever said "cached · 0 tokens".
-
The elevator pitch now tracks its own freshness, and can always be refreshed. The pitch card gained the same "out of date · regenerate" / "unsaved changes" badge as the scoring card. It also fixes a real trap: the pitch used to share the scoring profile's cache key, so regenerating your scoring profile made the pitch report as "cached" even though it was written from an older version of your profile — and you could not refresh it. The pitch now remembers the exact profile text it was written from (a new
pitch_hash), so it goes stale and regenerates independently of scoring.
Fixed
- "Parse & filter" now finds the company name in the posting body, not only in a "Company:" header. A job like "Newfire Global Partners is a leading technology firm..." was flagged "No company name found" because the extractor only read explicit
Company:/Employer:labels. It now also recognizes the company from the posting text - an "About X" / "Join X" heading, or the classic " is a/an/the ..." opening sentence - while still rejecting sentence fragments like "We are a ...". Re-parsing a job also keeps a company/title it already had (e.g. from Discover) instead of dropping it, and a re-parse backfills a missing company/title without overwriting an existing one. - The salary check no longer says "not mentioned" when the pay is stated without a currency symbol. Postings that write pay as
80k-120k,90,000 EUR, or120000 USD(no €/$/£) were treated as having no salary; the detector now recognizes thekshorthand and EUR/USD/GBP amounts, and the keyword list was widened (base pay, wage, OTE, per annum, salary range, ...). Truly salary-free postings are still flagged. - The Interview Prep back button no longer shows two arrows. The "← ← Interview Prep" control was rendering an arrow icon plus a literal arrow character in its label; it now shows a single arrow.
- The Job Tracker row-actions menu no longer gets cut off. The Edit / Archive / Remove menu (the "…" button) used to be clipped by the scrolling table; it now floats above the table (a proper popover with a click-away backdrop and a clearer two-step Remove confirmation) so it is always fully visible. The table also scrolls sideways properly when many columns are shown, with the index and company columns pinned in place.
- The Job Tracker now fills the window width. The table used to sit in a narrow centred column with large empty margins; it now stretches to the full content width (with the standard page gutter), like the Documents screen.
- Pipeline cards stay accurate right after you move them. Dragging a card into Applied or Interview (or changing its status from the quick-view) now refreshes the card's dates and its "overdue" badge from what the database actually recorded, instead of showing stale values until the next reload. The follow-up drafter in the modal appears or hides based on the correct, up-to-date state.
- A failed status change on the board now tells you. If moving a card to another column fails, the card snaps back and an error toast explains why, instead of silently reverting.
- The pipeline quick-view modal is keyboard-friendly. It now closes on Escape, traps focus inside the dialog while open, and returns focus to the card you opened it from.
- Returning to a job mid-generation shows it still working, not "Create" again. When a CV or cover letter was generating and you left the page, coming back used to offer "Create" again as if nothing was happening (and a second click started a duplicate run). The button now stays a disabled spinner while the draft is still being generated in the background, and swaps to "Review" the moment it lands.
- CV and cover letter can generate at the same time. Starting one no longer silently ignores a click on the other - they run as two independent streams, each button reflecting only its own progress.
- The floating "Finish tailoring" button now actually takes you there from another job. Tapping it while viewing a different job used to just make the button vanish and leave you where you were; it now loads the in-progress job.
- The "start here instead?" cross-job warning is a proper dialog. It used to appear as an inline banner that could be scrolled off-screen; it is now a centered modal with clear "Start here anyway" / "Cancel" choices.
- Leaving the app mid-step no longer wipes your progress. Whenever a long apply-wizard step was running - tailoring your CV, updating the score, or preparing your documents - switching to Pipeline or the job tracker used to abandon it and show the step as skipped or reset when you came back. Each step now keeps running in the background while you are away, the "Finish tailoring" button turns into a live spinner naming what is in flight ("Tailoring your CV…", "Scoring your tailored CV…", "Preparing your documents…"), and the finished result is waiting for you when you return. (Also fixes a hang where leaving while the CV gap-fill questions were open would leave the generation stuck forever.)
- The Dashboard's "Draft follow-up" action now actually opens the follow-up drafter. Clicking it on an overdue application used to just land you on the Pipeline board with nothing else happening; it now opens that job's quick-view modal straight away, scrolled to the follow-up section.
- The Analytics application funnel reads better in light theme. Its non-primary bars (Saved, Interviewing, Offer, and the other funnel-style charts) used a flat, warm dark-gray fill that didn't adapt to light theme and looked muddy against the near-white background; they now use a lighter, cooler gray on light theme. Dark theme is unchanged.
- The onboarding AI-provider cards show real brand marks. Claude and DeepSeek now show their official logos (in their brand colors) instead of a generic glyph; OpenAI shows its official mark too, rendered to stay visible in both themes.
- Discover feed cards separate the role from its metadata more clearly. The company name moved out of the title line onto its own line with a building icon; the source, location and age sit below it as icon-labelled chips; matched keywords carry a small "MATCHED" label; and the "NEW" marker is now a bordered colored pill instead of plain accent-colored text, so it reads as a status badge rather than part of the title.
- Scanned jobs no longer leak into My Jobs. Running a Discover scan used to make every collected opening appear in My Jobs (and its pickers) immediately; discovered jobs now stay in the Discover inbox until you explicitly press Save - only then does the job join My Jobs. Openings scanned before this fix that you never saved disappear from My Jobs automatically.
- Clicking a Discover row now opens a full job screen, not a truncated inline teaser. The old expansion showed 400 characters that cut off mid-sentence. A row click now opens a dedicated detail screen: a hero with the company monogram, source, age and location; the complete stored description rendered with structure - section headings, paragraphs and bullet lists recovered deterministically from the feed text (0 tokens, no AI); an Apply now button (opens the original posting; Applye never submits anything for you) and the original-posting link; an "About the job" facts card; and a Skills found in posting chip list detected by a fixed tech dictionary. A sidebar shows a raw match score - a deterministic keyword-fit ring (your profile keywords vs the posting, no AI, no tokens) with an honest "RAW KEYWORD FIT · NOT YET TAILORED" note, a verdict band, and an Applye tip: a strong raw match says "no re-score needed", anything lower offers Score with AI, which saves the job and jumps straight into its scoring flow. Because the full text was already stored at scan time, a saved job arrives in My Jobs with its complete description ready for scoring and tailoring.
- Discover's filters are now checkbox menus driven by what's actually in your feed, and Settings knows about your search scope. The old three-option location select conflated geography with work mode. Filtering is now three checkbox popovers where an empty selection means "all": Sources (the real sources present in the current feed), work type (Remote / Hybrid / On-site, detected deterministically from each posting's location text), and Locations. The Locations menu is a three-level tree built only from what your feed actually contains - region -> country -> city (Europe -> Germany -> Berlin), where each level appears only when scanned jobs match it (Singapore shows under Asia only when a Singapore job was found, Berlin under Germany only when a Berlin job was found). Ticking a region ticks all its countries and cities; ticking a country covers all its cities; ticking a single city narrows to just that city. Remote-anywhere and unrecognized locations are their own Other bucket - a normal, selectable option, not an always-match, so picking Taiwan no longer also drags in "Anywhere in the world". The country dictionary was filled out (all EU countries incl. Croatia, plus a North America region with the USA and Canada, so an "Ontario" posting classifies correctly). All detection is deterministic and local (0 tokens, no AI), reading each job's stored location text. Separately, the Sources panel's "SCOPE: ..." footer used to point at a setting that didn't exist anywhere; Settings now has a Job search section where you pick the scan scope (Worldwide / Europe / USA / Asia) that the scan engine honors when filtering openings - the Asia scope was added to the engine's region list so the setting and the Discover region filter agree.
- The Discover job detail no longer shows two buttons that do the same thing. "Apply now" and "View original posting" both opened the same page, and the sidebar repeated both again. The detail now has a single Apply now action (with a short line stating it opens the original posting in your browser and never submits anything for you); the redundant view-original link and the duplicate sidebar apply card were removed.
Changed
- The Tailor step starts from your profile by default. The base to tailor from was the first CV in your library; it now defaults to your profile ("from scratch"), unless the job already has its own tailored CV, in which case that one is the default so you build on it.
- Generated CVs and cover letters are labelled with the role, not just the company. A file is now named like "Acme - Senior Frontend Engineer - Tailored CV", so the Documents list tells you which job each one belongs to.
- "Start over" on the last step now actually starts over. It used to clear some hidden state and leave you on the same screen, so nothing appeared to happen; it now discards the tailoring and takes you back to the Tailor step.
- "Change status" is now "Edit", because that is what it did. The button never changed your status; it unlocked the job description for editing and retailoring. It is renamed, and if the application has already reached Interview or beyond, it asks for confirmation first - the resume is already sent, so reopening it should be deliberate. (Status itself is set on the Pipeline board and shown, read-only, on the job page - which now stays in sync with the board.)
- Fit scores now read as a single percentage everywhere. The score panel used to show three different scales side by side - a number out of 100, a star rating out of 5, and per-category scores out of 10 - which invited exactly the "so which one is it?" confusion. It is now one scale: an overall "82% match", each category shown as a percentage on the same bar, and one word verdict (Strong fit / Consider / Reject). The star rating is gone (it duplicated the overall score and, oddly, never dropped below one star). Colours now mean the same number on every bar.
- "Save this job" and "Mark as applied" are now two different things. On a job you pasted, the secondary button was "Add to Pipeline" - but it created an applied application, the exact same outcome as "Mark as applied", so the two buttons did the same thing. "Add to Pipeline" is now "Save this job" and saves the job as a tracked lead (status Saved, in My Jobs / Job Tracker) without claiming you applied. "Mark as applied" still records a real application (status Applied, on the Pipeline board). One saves, one applies - no more duplicate.
- "Create application" / "Update application" now builds and files your documents. The last wizard step's button is "Create application" the first time (was "Mark as applied") and "Update application" afterwards. It now makes sure the tailored CV and cover letter actually exist - generating either one if it is missing, and regenerating a stale one after you re-tailored - then files them in your Documents, labelled with the company and role, before marking the job. Previously "Update application" only saved the score and left the documents untouched. The button shows a working state and is disabled while it generates.
- Tailored CVs and cover letters no longer land in your Documents library until you apply. Generating a draft in the apply wizard used to immediately add it to Documents, cluttering the list with half-finished attempts. The draft is now held privately to the application - you can still Review, edit and export it - and only becomes a Documents entry once you export its PDF or mark the job applied (step 5, Export & Apply). The buttons read "Generate" / "Regenerate" instead of "Create", matching that nothing is filed until you commit.
Added
- The CV generator asks about what the job needs and your CV is missing. Before it writes a tailored CV, it now checks the job against your CV and, if there are gaps (a technology, concrete experience, a language level), asks you a few quick questions. Answer the ones you can, skip the rest, and optionally save the answers to your profile so it does not ask again. If your CV already covers the role, it generates straight away.
- Starting to tailor one job warns you if another is unfinished. If you leave a tailoring session and start one for a different job, the app now tells you the first one will be cancelled - and names it - so you can go back and finish it (via "Finish tailoring") instead of losing it silently.
- You can cancel a tailoring run. The Tailor step now has a Cancel button while it works. It stops before the next pass and drops the partial result, so you can back out and adjust the source instead of waiting out a run you no longer want. (The pass already in flight finishes, then its result is discarded.)
Fixed
-
A generated CV or cover letter now stays generated. After it finished, the "Review" button used to flip back to "Generate" a few seconds later, and returning to the job showed "Generate" again as if nothing had been made - so a second click ran (and paid for) a duplicate. Root cause: the link from the application to its document was never actually saved (the two id columns were missing from the write path since the library shipped), so the moment the app re-read itself the link was gone. The link now persists; Review stays Review, on the page and on return. (This also silently fixed one-doc-per-job: regenerating updated the same document instead of piling up duplicates.)
-
An Education entry with no degree no longer shows a stray comma. A university with the degree left blank rendered as ", Odessa National University" in the preview and the exported PDF; the separator now appears only when both the degree and the institution are present.
-
Apply-wizard review step: sharper, calmer, more legible. A design-system pass on the Tailor wizard's score-review step: the score/verdict row and the two-column dimension grid now stack cleanly when the window is narrow (instead of crowding), the per-dimension score bars reveal with a GPU-friendly transform and honour "reduce motion", and the small mono labels (kicker, step counter, cache chip, score-max) moved off the faint tertiary grey - which fell below the contrast floor at 11px - onto a legible secondary tone.
-
The document step shows one clear action per card. Before a draft exists you now get a single "Generate" button, instead of "Create" and a greyed-out "Regenerate" side by side; once it lands you get "Review" plus "Regenerate". No more guessing which of two buttons to press.
-
A harmless browser hiccup no longer pops a scary error toast. The "ResizeObserver loop completed with undelivered notifications" message - which the document preview can emit as its layout settles, and which fixes itself - used to surface as an error toast. It is now recognised as benign and swallowed.
-
The wizard no longer looks stuck while a step is working. Updated score (and document generation) run when you enter their step, and Next is disabled until they finish - correctly. But Back was still live, so stepping back landed you on a page whose Next was greyed out, looking broken. Back is now disabled alongside Next while a step is working, so you simply wait it out on the step that is doing the work.
-
"Review CV" and "Review letter" open on the finished document, not the raw editor. Reviewing means looking at the result first; the editor now opens in preview mode, and you can switch to Edit when you want to change something.
-
A tailored CV now fills in every section, not just the summary. Generating a CV in the apply wizard put the whole document into the Summary box and left Experience, Education, Skills, Languages and your contact fields empty. The tailored resume is now read into its real sections the same way an imported or onboarding CV is, so the editor opens with everything in its place.
-
One job now keeps one CV and one cover letter, not a pile of duplicates. Tailoring, then retailoring, kept creating fresh " - Tailored CV" documents, so a single application left several near-identical copies in your library. Retailoring now updates the document already attached to the job, and the CV is only written when you actually click Create or Regenerate - never silently on opening the review step.
-
You can no longer skip ahead of the apply wizard while it is still working. Next and Continue are disabled while the wizard is tailoring, rescoring or generating a document, so you cannot land on a step whose content has not been produced yet.
-
"Run final checks" waits until you have a CV. The button is disabled, with a short note, until a CV is linked to the application, instead of running the checks against nothing.
-
The Create and Regenerate buttons show they are working. Generating a CV or cover letter now shows a loading animation on the button rather than only greying it out.
-
The scoring profile no longer claims to be cached after you change your profile. The card decided it was up to date by asking whether the form had unsaved edits, which is not the same question. Saving cleared the edits, so the moment your scoring analysis actually went out of date was the moment the card started calling it cached again. It now compares your saved profile text against the text the analysis was built from, so a stale analysis says so and you know to regenerate it before your next application.
-
Your phone number is no longer your job title, and your contact details survive a save. A resume imported through onboarding wrote your details as one run-on line, which the profile form read by position: the phone number landed in "Current role", and your email, website and LinkedIn had no field at all — so the first time you pressed Save in Profile, they were deleted from the profile text for good. That text is what every AI scoring and tailoring call reads, so they were gone from those too. Contacts are now stored under a labelled heading where nothing depends on position, and an existing profile is repaired the moment you open it: the phone goes back to Phone, the address to Location, the website and LinkedIn to their own fields. Open Profile and press Save to write the repair down.
-
Anything the profile cannot file away is kept instead of dropped. A tagline under your name, a second personal site, a
- GitHub: …line you added by hand — none of it fits a field, and all of it used to vanish on save. It is now preserved verbatim under a "Notes" heading in the profile text. -
Exported PDFs are readable by machines again. Every CV and cover letter exported since WYSIWYG PDF shipped looked correct on the page but carried broken text: "Software Engineer" extracted as "So+ware Engineer" or "SoCware Engineer", "Analytics" as "AnalyGcs", "applications" as "applicaMons". Anything that reads the text rather than looking at it — an applicant tracking system, a recruiter's parser, a copy-paste, Applye's own resume import — got those words. macOS writes the PDF's character map one entry per glyph, and a ligature (the single joined glyph a font draws for pairs like
ft,ti,fi,fl) stands for two characters and so has no single character to map to; macOS wrote an arbitrary wrong one. Documents now render those pairs as separate glyphs, so the exported text says what the page says. The visual difference is a fraction of a millimetre per pair.
If you have already sent out a CV exported from Applye, re-export it — files produced before this fix keep the broken text layer. -
Importing a resume with a damaged text layer no longer carries the damage into your CV. The same macOS flaw affects PDFs from Pages, Word and Preview, so a resume you never exported from Applye can arrive as "Senior Frontend SoCware Engineer". Import now restores those words when the surrounding letters leave no doubt, and says so in the review step's notes so you check rather than trust. It only puts back characters the extraction destroyed — it will not touch a token that is legitimate as written, such as
C++orES6+, and leaves anything ambiguous exactly as it found it. -
Re-running onboarding no longer destroys your profile scoring and pitch. Finishing the wizard a second time wrote the profile row with only the two fields the wizard authors, blanking the scoring analysis and elevator pitch you had generated — both paid AI calls. They now carry through. Changing your resume still marks the scoring stale, which is what prompts Profile to offer a re-score.
-
Re-running onboarding no longer drops your target roles. The wizard opened blank, so the final screen reported "0 roles selected" and Finish wrote an empty list over the roles you had. Your existing roles are now loaded in, and a fresh suggestion adds to them instead of replacing them.
-
A re-run that only changes targeting is saved. With no new resume the wizard saved nothing at all, so re-running purely to adjust your roles was a silent no-op. It now keeps your existing profile text and saves the new roles.
-
"Suggest again" no longer throws you off the targeting step. Asking for fresh role suggestions jumped straight to the final screen, because the suggestion always advanced the wizard regardless of who called it.
-
Re-suggesting keeps the roles you chose. Roles you typed in by hand were dropped and ones you had unchecked came back. The first suggestion seeds your selection; every later one only adds roles you have not already rejected, and a compensation range you edited is left alone.
-
Skipping the resume no longer shows an empty review screen. With nothing parsed, the wizard now goes from the resume step straight to targeting, and the review step stays out of reach from both the Back button and the stepper.
-
A key from an earlier run is recognised. Re-running onboarding with a key already in your OS keychain reported "Not connected" on the final screen; the wizard now reads the keychain per provider on open. A key already in the keychain also survives a later paste that fails or is mistyped, which previously reset the wizard's view of it.
-
A second click on Continue no longer skips a step. The button stayed live while the resume parse or role suggestion ran, so an impatient double-click started a second (paid) AI call and advanced twice — past Review, or past Targeting to the final screen. Continue and Back now disable while a call is in flight, and Continue says so instead of sitting silently on "Continue".
-
Skipping the resume after it was already parsed actually skips it. The profile was still written from the parsed resume while the summary said "Skipped"; changing or dropping the resume source now discards what was parsed from it.
-
Skip is hidden on the final step, where it sat next to Finish and would have discarded the profile you had just built.
Changed
- The Profile page was rebuilt to match its redesign. The AI tools now lead with an icon and read as cards you act on: the scoring profile collapses open to show its summary with a Regenerate control and a freshness chip, and the default pitch carries its own header and Regenerate. Generating either shows a live "working" indicator instead of a silent wait. Each target role is one row - name, how well it fits, and a remove control - with its "when it fits" note tucked underneath, and the section now describes what a target role actually is instead of the old free-text framing. The completeness and freshness cues carry an icon, and the whole page sits on the shared design tokens for light and dark. Nothing about what the page does changed; only how it looks and reads.
- The Experience field admits it is Markdown. It holds Markdown, and always has: a resume imported through onboarding fills it with
###headings, which the field then displayed as if they were a typo. The field is now set in a monospaced typeface and says what it expects, so the headings read as formatting rather than as damage. What you type is unchanged and nothing is reformatted for you. - The last onboarding step has one way out. "Analyze a job" and "Open documents" sat next to "Finish setup", offering three ways to end the same flow and jumping you into the app from a screen that had not saved anything yet. Finish setup is now the only action; it saves, then returns you to the app, where those destinations are a click away in the normal navigation. The summary no longer claims your setup is already saved when it is not.
- The API key step says what it does. The button was "Validate" and the result "Key valid", but nothing ever contacts the provider — it is a copy-paste format check plus a save to your OS keychain, and the wording now says so. An invalid or revoked key still surfaces at your first AI action.
- The review step explains itself: contact details are editable there, while experience and skills are shown as parsed and refined later in Documents.
- Removed a duplicated paragraph on the AI setup step, which printed the same explanation twice, and a mislabelled "Setup —" prefix on the coming-soon note.
Fixed
- Discover's location recognition was rewritten - US cities, South American countries and more no longer land in Other. The classifier now lives in one pure, unit-tested module (42 tests). Whole-word country/city names match anywhere; short codes (
CA,DE,IN,NL...) match only as a standalone segment or an uppercase token, soSF, CAresolves to California, not Canada, and "priorities" no longer matches the city "Rio". Adds South America (Brazil, Argentina, Uruguay, Chile, Colombia, Peru...), every US state plus DC, the Canadian provinces, and Oceania / Middle East / Africa regions with many more cities. - Discover cards from RSS feeds that omit a location tag no longer show a blank location. The scan now falls back to a place-like category tag, a "Location:"/"Standort:" label in the posting body, or "Remote" when the posting is clearly remote-only.
- Choosing a job-search scope in Settings now actually takes effect. The scope picker only updated a local field until the page's shared Save button was pressed separately - easy to miss, so a scan could run against Worldwide right after picking Europe. Toggling a region now saves immediately, the same way Discover's own Sources toggles already do.
Added
- The Discover feed now leads with roles that match your target roles. Openings whose title matches one of your profile's Target Archetypes are grouped under "For you", with everything else below under "More openings" - a soft ranking, never a hard filter, so nothing is hidden.
- You can clear the Discover inbox. A "Clear list" action (with a confirm dialog and a toast reporting how many were removed) deletes every scanned-but-unsaved job so you can start a clean scan; jobs you already saved stay untouched in My Jobs.
- The job-search scope can now be several regions at once, including South America, Oceania and the Middle East. The old single-choice picker (Worldwide / Europe / USA / Asia) is a checkbox grid: pick Europe and Asia together, or any combination of Europe, North America, South America, Asia, Oceania, Middle East and Africa. North America now correctly covers Canada and Mexico too, not only the US.
Changed
- The Discover feed no longer loads every scanned job into memory and the DOM at once. The feed is capped server-side and renders incrementally - about 30 rows at a time, growing as you scroll - instead of mounting the entire list up front.
- Discover's filter bar and Clear list now stay reachable while you scroll a long feed. The filter row is pinned to the top of the list instead of living only in the footer, where it required scrolling to the very bottom to reach.
- The Sources drawer scales better with many sources. It now opens with a summary bar (how many sources are active, how many are failing, and the current geo scope), and the Built-in / Company boards / Your sources groups are collapsible.