Releases: vitala89/applye
Release list
Applye v0.29.2
Download the installer for your OS below. This release was generated automatically.
Applye v0.29.0
Downloads
| Platform | File | Status |
|---|---|---|
| macOS, Apple Silicon (M1-M4) | Applye_0.29.0_aarch64.dmg |
available below |
| macOS, Intel | - | not yet built |
| Windows | - | not yet built |
| Linux | - | not yet built |
Windows, Linux and Intel macOS builds come from the release workflow and will land with the next tagged version. Until then, build from source - it is three commands.
First launch on macOS
This build is not signed with an Apple Developer certificate and not notarized, so macOS will refuse to open it on the first try. That is Gatekeeper reacting to the absence of a paid certificate, not to anything about the app.
To open it: right-click (or Control-click) Applye in Applications and choose Open, then confirm. You only do this once. Alternatively, clear the quarantine flag:
xattr -dr com.apple.quarantine /Applications/Applye.app
Auto-update is not wired into this artifact - the updater signature is produced by the release workflow. Watch this page, or the repository, for the next version.
sha256 a38a8cccf55c92f110c732b44f973c2952fb0f47a1176b2436d42d9fda9e7cf1
What is in 0.29.0
See CHANGELOG.md for the full entry.
Applye is a local-first desktop app for an AI-assisted job search: it scores roles against your profile, tailors your CV per posting, drafts cover letters and follow-ups, and tracks the whole pipeline on your own machine. No account, no telemetry, no cloud. AI is opt-in and uses your own keys. It never submits an application for you.
Applye v0.28.0
Removed
- Interview Prep AI generation is no longer offered in the UI. The "Generate" button and the prep panel it opened hung on "Generating..." in native testing. Interview prep is going to become its own larger section later, so rather than patch this surface twice the generation button, panel, and the component state behind it are removed for now. Nothing server-side changed: the
list_interview_prep/save_interview_prep_batchcommands, theinterview_preptable, and theinterview-hr/interview-technical/star-rskills stay in place for that future section. - Gemini CLI is no longer offered for CLI bridge mode. Google shut it down for personal accounts on 18 June 2026 - Google AI Pro, AI Ultra and free accounts all stopped being served, leaving only enterprise Code Assist licences and API keys. That is exactly the opposite of who this mode is for, so keeping it would only have offered a provider that cannot work. Claude Code and Codex CLI are unaffected. If your settings still pointed at Gemini they move to Claude Code automatically, and Gemini remains listed for API mode where it is unaffected.
Added
- Onboarding can now set up CLI bridge mode. The AI step only ever offered "paste an API key", with a note promising subscription sign-in was "coming soon" - which had been shipping for a while by then. It now starts with a choice: paste an API key, or use a CLI you already pay for. Picking the CLI route lists Claude Code, Codex CLI and Gemini CLI with what is actually on your machine, and offers an Install button for any that are missing or broken so you never have to open a terminal to get started. The button runs npm for you and tells you plainly when it cannot - if Node.js is missing entirely it says so and links to nodejs.org rather than failing with a wall of output. Installing a CLI does not sign you in, and the wizard says so rather than letting you find out at your first real task.
- The same Install and Repair buttons are in Settings, so a CLI that breaks later can be fixed without going back through onboarding.
- Onboarding now shows exactly how to set up the CLI you chose - the two commands, in order: one to install it, one to sign in. A CLI that already runs gets a line instead, because running is not the same as being signed in: if a task later fails with an authentication or plan error, the command to fix it is right there.
- Your profile now stores a first name and a last name, not just the full name. Generated documents and future job-board autofill need the parts, not just the whole - so your profile now keeps both alongside the display name you already had. When a resume parse cannot tell where the name splits, the onboarding review step asks you to check it, without blocking you from moving on. If you saved your profile before this change, the first and last name are filled in from your display name the next time you open it.
Fixed
- Onboarding now remembers which AI provider you picked. It saved your API key but never the choice itself, so picking OpenAI or DeepSeek and pasting that key still left the app set to Claude - and every task failed with "no key stored for claude". The provider and the mode are now saved when you finish the wizard.
- Switching AI mode no longer leaves you with an unusable model setting. Going to CLI mode clears the model boxes on purpose (so the CLI picks its own), but switching back to API mode left them empty and every request was rejected. Coming back now restores your provider's models.
- The health check tells the truth in CLI bridge mode. It reported "no stored key needed - OK" without ever checking whether the CLI it would call actually works, so a missing or broken CLI still showed a clean bill of health. It now runs the CLI and reports the version, or fails with the reason.
- Settings no longer claims a broken CLI is ready to use. The CLI bridge checked only that a command with the right name existed, so a half-finished install showed a green tick and then failed on the first real task. These CLIs are small wrappers around a platform binary, and an interrupted install leaves the wrapper behind with the binary missing. Applye now actually runs the CLI to check it, and shows one of three things: working (with its version), found but broken (with the exact reinstall command and the error it printed), or not installed. "Send a test prompt" is only enabled for a CLI that genuinely runs.
- You can now pick a CLI model from a list instead of typing its name. CLI mode used free-text model fields, which assumed you knew what your CLI calls its models - and a leftover name from API mode could be sent to a CLI that does not recognise it. Each CLI now offers a dropdown: CLI default, which is the recommended choice and simply lets the signed-in CLI pick whatever your subscription covers; the model names that CLI accepts; and Other, which reveals a text field for anything not listed. Claude Code offers
sonnet/opus/haikuand Codex itsgpt-5.xnames; Gemini CLI publishes no list that can be read without signing in, so it offers the default and a text field rather than names that might be wrong. - The bottom of long pages keeps its breathing room. Scrolling to the very end of a page (your Profile, for one) could leave the last card pressed against the window edge; every scrolling page now keeps a consistent gap at the bottom.
- The welcome screen fits a window that is not maximised. Its spacing was fixed rather than proportional, so on a half-height window the very first screen you ever see arrived with a scrollbar and the health check pushed off the bottom. The layout now scales with the window: a large screen looks exactly as before, a smaller one tightens up instead of scrolling.
- The Profile header no longer clips its buttons. On a narrow window the status text and the Save / Re-run onboarding buttons could run off the right edge; the row now wraps instead.
- Dashboard attention cards read more clearly. The needs-attention cards used a thin colored stripe down one edge; they now use a full colored border with a subtle tint, easier to read and consistent with the rest of the interface.
- Consistent dashes across the interface. Every user-facing string and separator now uses a plain hyphen, in line with the project's typography rule.
Added
- CLI bridge mode works. Settings has offered a "CLI bridge (coming soon)" mode since the first AI release, but choosing it returned "not implemented yet". It is now real: if you already pay for Claude Code, Codex CLI or Gemini CLI, Applye runs that CLI for its AI work and stores no API key at all. Settings shows which of the three it can find on your machine, with the path it resolved, and a Re-check button - a GUI app does not inherit your shell's
PATH, so Applye also looks in the standard install locations itself. Each run is a one-shot subprocess with a fixed argument list (never a shell), the prompt goes in over stdin rather than the command line, the working directory is a scratch folder rather than your own files, Codex additionally runs in its read-only sandbox, and a CLI that hangs is stopped after 10 minutes. Model names in CLI mode are free text passed straight through; leave them empty and the CLI picks its own default.
Changed
- The ATS check is now a measurement, not an opinion. It used to be a single true/false the scoring model emitted alongside a one-line note - so it read as a number while actually being a guess, it never looked at the CV that would be uploaded, and it could disagree with itself on identical input. It is now computed locally in Rust at zero token cost, and gives the same answer every time. The result is a 0-100 score built from two halves: keyword coverage (60 points) matches the posting's own requirement terms against your tailored CV, weighting terms inside a requirements block double because that is where a recruiter's filter comes from, and matching whole words so "Java" no longer counts as covered by "JavaScript"; and parsability (40 points), which flags the things that actually lose information in a parser - no findable email or phone, table layouts, missing section headings or creative ones a parser will not recognise, no years to compute tenure from, an export that came out suspiciously short, and a photo only in markets where a photo is a liability (a Bewerbungsfoto is normal in DE/AT/CH and is not flagged there). Every finding is shown with the reason attached, and the missing keywords are listed so you can decide rather than trust a number. Requirement headings are recognised in English and German. The model's own ATS remark is still shown, now clearly below the computed result as advice.
- Date ranges in exported documents use a plain hyphen. A CV or cover letter exported from Applye wrote its date ranges with an en dash ("2020 - 2023" was actually "2020 - 2023"). Some applicant tracking systems and older parsers mis-read that character, and it was inconsistent with the rest of the app. Exports now use a plain hyphen throughout. Documents you exported earlier are unaffected until you export them again.
- The first launch now welcomes you. The first time you open Applye it greets you with an animated screen: the logo, a one-line summary of what the app does, and two clear choices - take a short guided setup, or skip it and fill things in yourself. The 0-token health check stays on the same screen so you can confirm everything is set up. Skipping never blocks you, and the empty-profile hint still nudges you from inside the app. The animation stands down when your system asks for reduced motion.
- The top-bar buttons use the shared button styles. The theme toggle and Paste Job button had their own one-off styling; they now use the same design-system buttons as the rest of the app, so sizing, foc...
Applye v0.27.0
Added
- The local market picker now lists only markets Applye can actually serve: Germany, USA, Russia, Ukraine and Poland. United Kingdom, Spain and France are gone from the list - picking one enabled nothing, because no built-in source serves them, and left whichever market was picked before it still scanning. They come back the moment a source for them is added; jobs from those countries are still correctly excluded from the other five markets' results in the meantime.
- Discover now tells you when your market has changed since the results on screen were scanned, and offers a one-click Refresh. Refresh clears the old unsaved results and runs a new scan for the current market; saved jobs and dismissed jobs are never touched by it. Ignoring the banner leaves everything exactly as it was.
- Local markets: search by country instead of by continent. "Where to look for openings" only ever offered whole continents, so a job seeker in Poland had to search all of Europe and sift out the rest. Settings' Job search section now offers Local market underneath: Germany, USA, Russia, Ukraine and Poland, and you can pick several. The two are alternatives, not layers - picking a market switches the search to those countries and the regions above step aside (they grey out and say so, and clicking one switches straight back); clearing the last market returns you to Worldwide, exactly like clearing the last region already did. Picking a market also narrows the Discover Sources drawer to boards for those countries plus worldwide ones, with everything else behind a "show all sources" toggle. Sources you added yourself are never narrowed, and a source you have switched on always stays listed whatever your market - it keeps being scanned, so it must stay somewhere you can see it and switch it off. Remote postings still come through in either mode: a remote job is not "somewhere else". Picking a market now also offers to switch the right sources on: choose Ukraine and Applye asks once whether to turn on DOU.ua and Djinni.co and turn off the boards for other markets, listing the exact hosts it would contact, and changes nothing until you say yes. Worldwide sources stay on and are filtered instead: a job from one of them has to name your market or be open to anyone, so "Remote - US only" no longer counts as a Ukrainian job on the strength of the word "Remote". A board that is itself national vouches for its own postings, because those feeds routinely carry no location field at all.
- Seven new built-in Discover sources, all shipped disabled like every other built-in - no request reaches any of them until you turn one on. Four cost zero new parser code, being standard RSS: DOU.ua and Djinni.co (Ukraine), Habr Career (Russia), Jobicy (a remote-first board weighted toward the US). Three needed a new JSON parser each, all probed live before being added: TrudVsem (opendata.trudvsem.ru, the Russian federal labor service's open-data API, 540k+ postings), Arbeitnow (a German-market board), and No Fluff Jobs (a Polish IT board). Every endpoint above is public and needs no key.
Fixed
- No Fluff Jobs postings now show their full content in Discover - required skills, nice-to-have skills, the requirements text, the day-to-day responsibilities and the salary - instead of a three-word category/technology/seniority summary. No Fluff Jobs' list endpoint carries no description, so the scan now fetches each posting's detail page (
GET /api/posting/{slug}), the same pattern already used for the German federal agency (Arbeitsagentur), under the same shared per-scan detail budget. Every other Discover source already stored a real description, so this was a No Fluff Jobs-specific gap, not a general one. Because the old three-word stub was the only text the detail description, the salary line, skill detection and the raw keyword score all read from, fixing it restores all four at once. Złoty (PLN) salaries are also now detected - the salary extractor previously recognised only euro, pound, dollar, EUR, USD and GBP, and silently missed every PLN posting. - Region-mode "Europe" no longer drops Ukrainian jobs. Ukraine was missing from the list of European countries the region filter matches against, so picking the Europe region silently excluded every Ukrainian posting. Ukraine is on that list now. This is a plain filtering fix, independent of the local markets work above.
- With a local market selected, a job with no location at all is now dropped instead of shown. A worldwide source occasionally carries a job with no location field whatsoever, and with no location there is nothing to tie it to your market, so it is filtered out. Sources for the market itself are exempt from this, because their feeds often omit the field entirely and a national board already vouches for its own postings.
- An AI request could hang forever with no error and no way out. Every API-mode call used an HTTP client with no timeout of any kind, so a connection that was accepted and then went quiet - a dropped wifi link, a laptop that slept mid-request, a stalled provider - was waited on indefinitely. Nothing downstream could recover: the request never returned, so the screen that was waiting on it sat on "Generating…" or "Scoring…" permanently, with no error to explain it and nothing to retry. This affected every AI feature in API mode (CV tailoring, cover letters, scoring, interview prep), and it is what made Interview Prep's generation appear to hang. Requests now have a bounded budget: 15 seconds to connect, so an unreachable provider is reported in seconds rather than never, and 10 minutes overall to match what CLI bridge mode already enforced - long enough for a genuinely slow answer, finite either way. The same missing timeout was found and fixed in paste-from-link, where a stalled job board could hang the import the same way.
- Buttons that sat alone in a Settings card stretched across its full width. "Re-run onboarding" was the visible case. The card is a stretch-aligned column, so any button dropped straight into one filled it; "Send a test prompt" only looked right because it carried a one-off override. Fixed for every such button at once, so a new one cannot inherit the bug.
- Built-in sources could silently fail to install if you had added your own sources first. Every built-in-source migration (including Bundesagentur fuer Arbeit, added earlier) hardcoded a low row id and depended on it being free.
sources.idis an ordinary autoincrementing column that your own added sources use too, so on an install with a few of those already, a new built-in's id could already be taken - the insert then silently did nothing instead of adding the source, with no error anywhere. Found live against a real database with four custom sources: Bundesagentur fuer Arbeit had never actually been installed despite shipping weeks ago, and the same bug was about to repeat for four of the seven local-market sources above. New built-in sources are now inserted without a fixed id (same as one you add yourself gets) and de-duplicated by URL instead, so this can't recur. Existing installs get Bundesagentur fuer Arbeit and any local-market sources that were silently skipped backfilled automatically on next launch - nothing to do on your end.
Applye v0.26.0
Added
- Interview Prep can now generate study cards. The stage timeline shipped in v0.16.0 could only log dates and notes by hand - the skills behind it were unwritten stubs, so nothing behind the page actually used AI. Each stage now has a Prep panel: HR/final rounds get behavioral Q&A (STAR+R format) plus comp-negotiation talking points and smart questions to ask the interviewer; technical/system-design rounds get Q&A with working code examples where relevant; behavioral rounds get full STAR+R stories. "Generate 5" becomes "5 more" once cards exist, and re-generating with nothing new since the last batch is a 0-token cache hit.
Fixed
-
AI responses shaped as a JSON array no longer lose their outer brackets. The shared JSON-cleanup helper used by every AI-generation flow only ever looked for
{...}, so a response like[{"question":"..."}]had its list brackets stripped down to a bare object and broke on.map(). It now detects whichever bracket type opens first. Affects the new Interview Prep skills; cover letter and CV generation were already object-shaped and are unaffected. -
Discover can now scan the German job market. The three built-in sources are remote-first and English-speaking, so setting the geo scope to Germany scanned feeds that carry almost no German posting. Discover ships a fourth built-in source, the Bundesagentur für Arbeit job search - the federal employment agency's own public job index, by far the largest in Germany. Like every built-in source it arrives switched off; enable it in the Sources drawer. Full posting texts are fetched only for the jobs that pass your title and location filters, so a scan does not pull hundreds of descriptions you will never see.
-
Company boards on Personio can be added as Discover sources. Personio is the ATS most German small and mid-size employers run their careers page on, and its board feed is public XML. "Add company board" now offers Personio alongside Greenhouse, Lever and Ashby - enter the company's slug (the
musterinmuster.jobs.personio.de) and its openings join the scan, with the full German posting text including the "Aufgaben" and "Dein Profil" sections. -
A German city on its own no longer hides a job from a Germany filter. German boards routinely give the location as just "Berlin" or "München", with no country anywhere in the text, so a Germany geo scope silently dropped the very jobs it was set up to find. The largest German cities now count as Germany, in both German and English spelling.
-
German letters now date and close the way DIN 5008 expects. A generated letter carried an ISO date (
2026-07-23), which reads as foreign on a German letter, and models kept prefixing the subject with the "Betreff:" label the standard dropped decades ago. In a German letter the date now renders as23.07.2026and the label is stripped - both display-only, so a date or subject you typed yourself is left exactly as written. The letter also takes an Enclosures line ("Anlagen: Lebenslauf, Zeugnisse"), printed under the signature when you fill it in and absent when you do not, because a German application travels as a Bewerbungsmappe rather than a single letter. -
The cover letter can now state your start date and salary expectation. A German posting nearly always asks for a frühestmöglicher Eintrittstermin and a Gehaltsvorstellung, and a letter that answers neither is routinely filtered out before anyone reads it. The letter editor has an Availability and salary card - earliest start date, salary expectation, notice period, all free text, so "ab sofort" and "01.10.2026" are equally valid answers. What you write is worked into the closing paragraph in your own words, never converted or reworded. Leave a field empty and the letter says nothing about it: no "salary negotiable", no invented availability. The answers travel with the letter, so tailoring it for the next job keeps them.
-
One reusable applicant photo lives on the profile. A CV written for the German market conventionally carries a photo, but that photo lived inside a single document, so every new application meant uploading and re-cropping the same headshot. The profile now has a Photo section that reuses the CV editor's crop tool, storing the image already cropped to the CV frame; it saves the moment the crop is confirmed. The image stays in the local database, is never uploaded, and is not sent with any AI call.
-
The tailor wizard raises the German photo convention at the moment it matters. Setting a CV's market to Germany now shows a short explainer with a yes/no choice - a photo is expected there and unusual (sometimes discouraged) elsewhere. "Yes" writes the profile photo into the linked CV; with no photo saved yet, it leads to the profile's Photo section instead. Asked only for Germany, and only once per visit to a job.
-
Target roles collapses like every other profile section. It stayed permanently expanded - five role cards, each with a free-text box - pushing the rest of the page off screen.
-
The apply wizard can be cancelled. The only way out was Back, which stepped to the job summary and left the tailored passes and the generated draft CV and cover letter behind - a user who decided partway through that a job was not worth applying to had no way to say so. The footer now has a Cancel that confirms first, names what is lost, and then deletes the draft documents and the saved wizard progress. Documents already exported or filed keep their place in the library, and the job stays in My Jobs.
-
The sidebar collapses to an icon rail. 240px is a lot to hold permanently for navigation you already know, especially on the Job Tracker and the CV preview where horizontal room is what the content is short of. A control by the logo drops the labels and keeps the icons, and the choice is remembered per machine.
-
The CV live-style panel collapses sideways. Its fixed 340px is exactly the width the preview wants when you are reading the CV rather than restyling it; it now folds to a tab and hands that width to the paper.
Fixed
-
The German tracker report is now German throughout. The Eigenbemühungen sheet is a German-office document, but only its fixed headings followed the chosen report format - the column headers ("Company", "Role", "Status") and the period ("Last 3 months") followed the app's UI language, so a German report handed to the Agentur für Arbeit arrived half in English. Every string printed on the sheet, including the CSV and plain-text exports, now follows the report format; the export dialog around it stays in the UI language.
-
My Jobs: a job's score no longer disappears after you edit your profile. Scores are cached per profile version, so adding a target role or rewriting the profile Markdown changed the hash and the cached score became unreachable - the whole scoring section vanished and the job looked as though it had never been scored. The most recent score is now kept on screen behind an explicit "your profile changed after this score" notice, with the rescore action next to it.
-
The tailor wizard names the market and the language instead of showing codes. The two pickers read "DE / US / UK / GENERIC" and "EN / DE / RU", which hid the very distinction they draw: the first picks the market a CV is written for, the second the language it is written in. They now show "Germany"/"United States" and the same language endonyms Settings uses.
-
The Job Tracker column drawer dropped its misleading LOCKED tag. On a visibility toggle, "LOCKED" read as "this column cannot be shown", when it meant "this value is read-only, it comes from the job posting" - a fact that still belongs on the grid cell, where the tooltip already states it. The redundant pin icon went with it (the pinned column's toggle is already disabled).
-
Release hygiene: the workspace lints clean again.
nx run-many -t lintfailed with 51 errors andcargo clippy -- -D warningsfailed with 10, so neither gate could be trusted before a release. Both are green now. On the Rust side: the deadfiles.rsplaceholder (an emptyFilesstruct with only Phase-1 TODO comments, never constructed) was deleted, two manualsplitn(2, ':')parses becamesplit_once, a doc comment that started a line with>was reflowed, and the two lints that are wrong for their context -PhotoPlacement's variant prefix (the names are the serialized wire format) and the macOS print FFI's argument count - carry an#[allow]with the reason. On the Angular side: the five form labels in the interview-stage dialog are now bound to their inputs withfor/id, the two column-manager toggles in the Job Tracker became real<button role="switch">controls (previously click-only<span>s inside a<label>that wrapped no control, so they were unreachable by keyboard), and the remaining click handlers - page-shell click-away, bubble stoppers, and modal backdrops - are annotated as deliberately keyboard-inert.x != nullstays allowed in templates via an expliciteqeqeqoption instead of being flagged at each site. -
Discover: target-role matching no longer fires on a generic word like "engineer". An archetype such as "Senior Angular Engineer" was matched to a job when any of its name words appeared, so every engineering opening ("Value Engineer", "Staff System Engineer", "Software Engineer - SAP ABAP") was flagged as a Primary-role match on the shared word "engineer". A match now has to be anchored by a distinctive word (angular, frontend, react, ...); seniority and bare role-family words (senior, engineer, developer, ...) still add coverage but can no longer trigger a match on their own.
-
Discover: the archetype-fit badge no longer disappears on row hover or stretch across the job-detail header. The badge filled with
--surface-sunken, which in the light theme is the exact same colour as the row's hover bac...
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,...