Changelog

What’s new in Apply with AI

Release updates for Upwork proposals and job scoring, LinkedIn application runs, and the AI connections shared across both workflows.

Release 0.18.2

Fixed

  • **A form that comes back empty after Save is not filled the same way again and again.** On a company site, filling fields counted as moving on every time, so a lap of "+ Add experience" → fill → Save → "Apply now" that landed back on the same empty form (careers-page.com, three laps and forty rounds; hibob's Notice period and Apply twice over; Paradox's Yes/No then Send) reset the stuck count and the time budget with every lap, and the agent neither gave up nor was shown another way. A lap that fills the same form the same way and lands on the very page it landed on before (same step, same empty fields, same words) now counts as the page not moving: the AI is told plainly that the site did not keep what was entered and asked for another way, the rescue rounds and the time budget run on, and the job is given up instead of looping. A site that keeps each entry (its page names the entry) is unaffected, so one entry per past job still works.

Explore the feature list, including AI connections, or download the approved release from your account.

Previous releases

Select a version to read its release notes.

Version 0.18.1

Changed

  • **Shorter "Needs you" waits when nobody is there.** On company sites a CAPTCHA, an emailed code or a sign-in the agent cannot clear itself waits three minutes for you before the job is skipped. A week of reports showed some fifty such waits ending with nobody pressing anything, in runs nobody was watching. Once two of them in a row went unanswered in a run, the next ones wait one minute, and the card, the panel and the popup say so; the first press on any of the site's buttons (Continue, Pause, Skip, Stop) puts the waits back to three minutes. The hand-over before Submit with auto-submit off keeps its full time.
  • **The "verify your email" wait says how to end these waits for good.** When the Apply with AI mailbox is not the email on applications, the card, the panel and the popup add where the switch is (Settings → LinkedIn → Company sites → Email on applications): with the mailbox, the codes and links are read and typed by themselves and this wait is never reached. Eighteen of these waits ended unanswered in a week.

Fixed

  • **A run with a dead AI connection holds for you instead of working through the jobs.** When Claude's or ChatGPT's session was revoked (its refresh is refused), the key is wrong, or the account's access ended, no wait mends it; yet the run treated it like an outage: each job was opened three times on the company site, given up as "AI unavailable" and recorded as failed, and the next job followed a minute later. One installation went through forty company sites that way in eighteen hours. The run now says the AI needs reconnecting, charges no job for it, and carries on by itself the moment the provider is connected again in Settings (or on Try now, or after half an hour). A real outage or rate limit is still waited out, and its waits now keep growing across jobs instead of starting at one minute again with each.
  • **An inline script in a form is not read as a field's words.** A site that puts a script tag inside a field's wrapper had the CV field named `CV — mustfelder['jquery_mustfield_3628']=""` and the page text full of code; script and style content is left out of every label and of the page text now.
  • **A plan on a company site runs through to its button.** A click on a pick list, a tick box or a section toggle ended the turn as if it had loaded a new page, so "open the list; type; ArrowDown; Enter; Save and Continue" ran its first click and nothing else, round after round (Workday's "How Did You Hear About Us?", BambooHR's State list, Paradox's Yes/No, among many). Only a button or a link ends the turn now; everything planned after a click that opens something on the page is carried out.
  • **iCIMS applications are worked inside their frame.** iCIMS draws its sign-in, form and questions in a frame of its own portal; the agent read only the portal's header and footer around it and spent its rounds "closing what covers the page". A same-site frame that holds the form (or is still loading it) is handed the wheel like one from another site, the frame gets a fresh agent each time it moves to the next step, and a frame agent that stood down starts again when the page is handed over later.
  • **Apply links in Dutch, German, French and Italian are found.** "Solliciteer direct", "Solliciteren", "Jetzt bewerben", "Postuler", "Candidati" and links whose address says apply were left out of what the agent reads, and it reported job pages "with no apply button" (eight Dutch and German sites in one day). A styled button whose words sit beside an empty link laid over it (Webflow careers pages) is read by those words.
  • **Enter in a pick list no longer sends the form.** Pressing Enter in Oracle Recruiting's Country search box sent the page's form the plain way, and the site answered with a server error page ("URL did not match any mappings"), losing the application; the same could happen in any search box. Enter in a pick list now only chooses from its list, a key the page handled itself is not sent again, and Enter in an ordinary text box still sends its form.
  • **The field a site marks wrong is named.** SuccessFactors and Workday say "Please correct the errors below" at the top while the marked field sits in a collapsed section or far down the page; the agent pressed Apply and "Expand all sections" round after round. The page facts now name the fields the site marked as wrong and what they hold.
  • **A site that moves through its steps as full pages is not timed out as standing still.** The time budget on a company site runs from the last time the page moved on; a page load was never counted as moving on, only a change within the page. A portal that goes through eligibility, sign-in, account, form and upload as six separate pages (iTrent) was given up at six minutes as "without moving on" although every step went forward. A new page now counts as progress, like a changed form does; a page that stands still is still given up as before.
  • **The emailed code is typed into all of its boxes.** Oracle Recruiting draws six boxes for its verification code without marking them as one-character boxes, so the code's length went unknown, a five-figure job number from the email passed for the code and five of the six boxes were filled. Boxes named "digit 1 of six" are now counted like one-character boxes, a code drawn one character per cell in the email is read as one, and when the page says how long the code is, a number of another length is never taken for it (the mail still counts for its link; otherwise the next mail is waited for).
  • **The form's own required CV field gets the resume.** A page that parses the resume to prefill the form ("Upload your resume" holding the file) kept its own required "CV" field empty, and the agent would not attach the resume again because the page already showed it, so the form never went through (five rounds on one German form). A required field that asks for the CV by name is fed even when the file shows elsewhere; optional fields for other documents are left alone.
  • **A Hebrew confirmation is read as one.** "We will be in touch shortly" and "thank you for applying" in Hebrew were called "no confirmation" after the CV was sent (jobsseek.info).
  • Smaller: a job Avature says you already applied to (the words on its Apply link) is recorded as sent rather than called unconfirmed; Workday's skills list is read without the "not checked" tick state after each entry, so the next pick is searched by the entry's own words; and a Google search, map, video or social tab a job page opens is never followed as the place the application continues.
Version 0.18.0

Changed — far fewer profile pages (LinkedIn's "unusual activity" notice)

  • **Invitations go from the search results page.** A connection campaign finds each person's card on the results page it read, presses its Connect there, and answers LinkedIn's invitation window on the spot: no profile page is loaded for an invitation, and the results page stays in the tab between invitations rather than being loaded again (a load is a search). The note is written from what the card shows (name, headline, location). A card that is gone or offers no Connect falls back to the invitation window by address.
  • **"Read each profile first"** is a per-campaign choice (off by default, in Settings and on the website): the profile is opened before inviting, for a note from About and Experience, one profile page per invitation.
  • **One budget of profile pages for the account.** "Profile pages a day" in Settings → LinkedIn (and the Control page's `connect.profiles` card): 40 by default, 5 to 200. Every step that opens a profile page (a campaign reading profiles, the invitation window by address, a withdrawal not found on the Sent page, a message to someone whose Message button is not known) counts against it and, when it is used up, waits for tomorrow with a message saying so; nothing is dropped. Today and this week are shown. Search results, the feed, the connections page and the Sent invitations page are not profile pages.
  • **Profiles are remembered for a month** (name, headline, location, About, Experience, and the Message route a sequence found), so a person is never read twice: a campaign set to read profiles skips the visit for someone read before, and a sequence goes straight to the conversation.
  • **Withdrawals start on LinkedIn's Sent invitations page**, which stays loaded in the tab for half an hour; the person's profile is visited only when the list does not show them. At most 20 a day (was 40).
  • **A calmer pace**: invitations 8 to 20 minutes apart (was 4 to 14); at most 50 a day per campaign (was 100).
  • Schema 0.18.0: `readProfile` on campaigns and the start form, the `connect.profiles` card (`PROFILE_BUDGET_SET`), `profileViews` in the connect view; `PROFILE_VIEWS_GET` for the settings page.
Version 0.17.3

Fixed

  • Website answers check that this account is still paired and its session is valid at the instant the answer is saved, including after queued asynchronous work. A changed or expired session saves nothing.
Version 0.17.2

Fixed (the website's review of 0.17.1, PR #51 there: R2 follow-up)

  • **An answer's two lists are written in one storage write**, issued at once after the authority check. There is no second write that a re-pair could slip in front of, and no moment where the answer is remembered but the question still waits (A).
  • **A licence read that straddles a re-pair no longer authorizes.** The licence state carries a revision, moved synchronously the moment the state is written in this context or seen to change from another; the final guard takes the revision before its read and refuses if it moved by the time the read resolves, so a snapshot taken before the re-pair and resolved after it is stale (B).
  • Schema 0.17.2 (no vocabulary change).
Version 0.17.1

Fixed (the website's review of 0.17.0, PR #51 there)

  • **One queue for every change to the questions.** The agent adding a question, an answer from Settings, an answer from the website, Remove and Forget all go through a single serialized read-modify-write in storage, so none of them can overwrite another's work (R1): a question added while an answer was being saved is kept, and the second answer to the same question is refused rather than silently winning. Settings now answers, removes and forgets through the background the same way.
  • **The website's authority is checked right before the write, not before the read.** A re-pairing or an expiry during the read refuses the answer and writes nothing (R2).
  • **Every waiting question is reachable, 25 a page.** The Jobs section says "Showing x–y of n" with Previous 25 / Next 25 (`LINKEDIN_ASK_PAGE`); a page of 25 questions with 100 choices of 2000 characters each stays inside the website's node and character budgets, and no question is dropped from a long queue (R3). A page past the end shows the last page.
  • **A choice can be 2000 characters end to end** (the form's options, the queue, the answer check and the schema shape), where 300 was cut off before (R4).
  • Schema 0.17.1.
Version 0.17.0

Added

  • **Questions for you can be answered from the website.** The Control page's Jobs section shows each waiting question with an answer box (or the question's own choices); Save answer sends `LINKEDIN_ASK_ANSWER` straight to the extension, which checks the question is still the same (a stale answer never overwrites the first or removes another question), takes only one of a choice question's options, trims and bounds the answer (1 to 2000 characters), remembers it like an answer given in Settings, and lets the jobs that waited be tried again. The reply says only that it was saved; views, command records and the website's caches carry no answer. The schema declares the website's new `sensitive`, `showWhen`, `editorLabel` and `success` metadata (an older website shows the questions read-only with "Answer in the extension" instead). Up to 100 questions are shown, as the extension keeps. Schema 0.17.0.
Version 0.16.4

Fixed

  • **A saved posting campaign's kind on the website is a single-choice segmented control**, not a drop-down with a blank "Choose an option" that could clear it and hide the campaign's fields (the website's third look at R3 in PR #48).
Version 0.16.2

Fixed (the website's review of 0.16.1, docs/CONTROL-EXTENSION-REVIEW-0.16.1.md there)

  • **Remove removes.** The auto-reply has a real Remove (a new `remove` command: the campaign and its lists go, its tab closes) in the extension and on the website; "Clear this list" keeps its honest name there. A posting campaign's Remove now removes it whatever its state (before, a running one was silently left running), closing its tab.
  • **Starting beside a running connection campaign says so.** The website's Start confirmation no longer speaks of replacing the current campaign; it says another one starts beside it and that the invitations a day add up.
  • **A saved posting campaign shows its editors on the website.** Its kind is part of the saved form (read-only in effect: Save never sends it), so the topics or the watched profiles, the interval and the screenshot switch show as they do in Settings.
  • **Limits match the extension's.** Event campaigns up to 250 a day in the view and the forms; the job run's target up to 500; posting intervals up to 48 hours and 30 topics; auto-reply checks up to every 24 hours and 100 replies a day. The event campaign's Latest list is keyed by the invitee's key (an invitee known by name only has no address).
  • **Command replies carry nothing but an acknowledgement.** A command's reply over the bridge is `{accepted: true}`; the state the page needs comes through the views, which carry only what they declare. Before, a handler's full return (a run with its form answers, an auto-reply with earlier message snippets) could cross the bridge and be kept in the command's reservation.
Version 0.16.1

Added

  • **Several connection campaigns at once.** "Start another campaign" adds a campaign beside the ones running instead of replacing them (up to 10). Each keeps its own source, note, purpose, follow-up messages, invitations a day and its own Pause, Stop, Remove and Duplicate. One account, one pace: the campaigns share one background tab, invitations go out one at a time with the same 4-to-14-minute gap whichever campaign sends, and the due campaigns take turns (the one that stepped longest ago first); a person already on another campaign's list is skipped ("in another campaign"); LinkedIn's invitation limit and its sign-in wall pause every campaign, not just the one that met them. The card shows the invitations a day of all running campaigns together and asks before a new campaign would take the total past 20. The campaign running before the update carries on as the first of the list; CONNECT_CONTROL and CONNECT_UPDATE take a `campaignId` (without one they address the campaign working, or the first live one, as before). The website's Control page shows each campaign as its own card (schema 0.16.1).
Version 0.15.4

Added

  • **Control from applywithai.app.** The website's customer panel can now operate this installation: a page on applywithai.app, open in the same Chrome and holding a control token the service signed for this installation and account, asks the extension for its control schema (the Outreach cards: connection campaigns, their messages, withdrawals, event invitations — fields, buttons and wording exactly as Settings shows them), reads the same views the settings cards read (nothing secret, nothing undeclared), subscribes to live updates on a port, and presses the cards' buttons; each press runs through the same validation and handler as the settings page's own request, once per command id however often it is delivered. Only the website's origin is heard, only with a valid token (signature, audience, purpose, account, installation, activation generation, 15 minutes), and only the commands the schema names. The schema is written to docs/control-schema.json and docs/control-strings.json with every build so the website can render ahead of an installed extension. Pairing done before 0.15.4 is asked to pair again once, from Settings → Account, so the licence carries the control generation. Jobs, Setup, Presence and Activity cards follow.

Fixed

  • **The personal note of a running connection campaign can be changed.** Under the campaign's Personal note switch there is now the note itself (Settings → LinkedIn, and the website's Connection campaign card); a change applies from the next invitation, and an empty note hands the notes back to your AI. Before, the note could only be set when the campaign was started.

Changed (the website's review of 0.15.3, docs/CONTROL-EXTENSION-REVIEW-0.15.3.md there)

  • **A live update checks the clock last.** A push on a subscribed port reads the view and the licence state first, then judges membership, the current time and ownership in one go before sending; a token that expired during those reads (including a wall clock that jumped forward past the expiry timer) ends the stream with "Control session expired." and sends nothing.

Changed (the website's review of 0.15.2, docs/CONTROL-EXTENSION-REVIEW-0.15.2.md there)

  • **Identity and time are judged after the signature check, not before it.** A control token's signature is verified first; the account, installation, activation generation and expiry are then checked against a licence state and a clock read after that (asynchronous) verification, so a re-pair or an expiry that lands during it is seen. The last check before a command's handler runs is made by the background adapter itself, after its own waits for restored stores.
  • **Duplicate carries the messages.** The connect view's campaign now includes its sequence's steps (joined in the extension), so Duplicate on the website fills the message steps as Settings does.
  • **Bounds declared and enforced alike.** Steps fields declare `integer`, `delayMin` {hours 0, days 0}, `delayMax` {hours 8760, days 365} and `maxLength` 3000; daily counts declare `integer`; the wire validator refuses a day delay above 365 (hours above 8760) and a message campaign without a message with text in it, as the handler always has.

Changed (the website's review of 0.15.1, docs/CONTROL-EXTENSION-REVIEW-0.15.1.md there)

  • **Authority is checked after every wait, not only on arrival.** A polled batch of views is built first and verified again (token, account, installation, generation) immediately before it is returned, and discarded whole if any of that changed meanwhile; a command is verified again after its reservation is written, right before it runs, and a refusal there is recorded against the id so it can never run later; pushes on a port are built one at a time per stream and take their revision only when sent, so a slower build never carries a newer state under an older revision.
  • **Reservations are never evicted.** At the limit (5000 per pairing) a new command is refused before any effect and repeats still answer from their record; the re-pair cleanup runs under the same lock as the commands, so no fresh reservation is lost to a late cleanup.
  • **Two start cards instead of one.** "Connect with new people" and "Message my connections" are separate cards on the website, so "All my connections" is offered only where the extension accepts it; "Connection campaign" carries the running campaign's state, buttons and lists. Message steps are bounded at 3000 characters; counts and delays say "a whole number" (the renderer has no integer or delay-range vocabulary yet; the extension's validator remains the final check).
  • **Status follows sign-in and permissions.** While a page is subscribed, the status view is rebuilt every 15 seconds and pushed only when it changed.
  • **The shared test now covers rows and boundaries.** With the website checkout beside the extension's, every command action (not only Start) is built from the website's initial form for seeded sequence and event rows, 3000/3001-character steps and 8760-hour delays are checked on both sides, and the races above (blocked reads and writes across a re-pair or an expiry, capacity, cleanup overlap, overlapping pushes) are reproduced against the fake Chrome.

Changed (the website's review of 0.15.0, docs/CONTROL-EXTENSION-REVIEW-0.15.0.md there)

  • **Shared vocabulary.** The schema uses only what the website's renderer knows: list columns are text or time, the placeholder helper's list is named `placeholders` and it inserts only into text fields (the message steps carry the placeholders in their hint instead); every form field the extension's validator requires has a default (empty strings, an empty step list), limits match the validator's (who/search 2000, purpose 1000, event address 500), and "All my connections" says it is for "Message my connections". The status view carries `linkedinSignedIn` and `upworkSignedIn` (true, false, or null when no tab of the site is open; read from open tabs only, never cookies) and is the contract's fixed view rather than a declared shape. The polling fallback returns the same full AWAI_VIEW envelopes as the port, on a stream of its own per worker life.
  • **Tighter authority.** A control token is valid strictly until its `exp` (no grace after expiry), and is checked again when a queued command's turn comes; a subscribed port is bound to the account and activation generation that opened it and ends the moment the installation is re-paired, with nothing pushed after the change. Reservations (commandId, account, generation, command, payload digest) are kept for the whole activation generation rather than the last 200, a reused id with another command, payload or account is refused, and the content-free audit history is separate.
  • **Checked against the website itself.** When the website checkout is beside the extension's, the control test runs the website's own schema parser, form builder, validator and snapshot tracker over the schema and real snapshots, and sends each primary action's payload through the extension's validator.
Version 0.14.10

Fixed

  • **The release preflight checks the feature inventory the way the website does, everywhere.** 0.14.9 passed the preflight in a worktree (where the website's parser is not beside the checkout, so that check was skipped) and the website then refused it over one bullet with two version markers. The preflight now carries the website's rules itself and never skips them; 0.14.10 is 0.14.9 with the inventory line corrected.
Version 0.14.8

Added

  • Company-site CAPTCHA assistance now includes Google's supported 3×3 and 4×4 image grids. Your configured vision-capable Claude or ChatGPT connection receives only the numbered puzzle tiles and the challenge instruction, chooses matching tiles, re-reads replacement images, and presses the CAPTCHA's own Verify control. The agent continues only after a fresh verification response appears on the application page. An uncertain answer, a block, an unsupported challenge or the bounded attempt limit leaves it for you; images and AI answers are not stored. This uses your existing AI connection and may consume its usage allowance.
  • **Your Apply with AI mailbox on company sites.** Switch it on in Settings → LinkedIn → Company sites and the agent applies with your `@ailavo.com` address, reads the verification code or link the site sends from that mailbox, and goes on by itself instead of stopping for you; every email field on the site gets that address, and a field the site filled with another one (parsed from your CV by an "import your profile" step) is set back to it; your personal address stays in Settings and receives the forwarded mail. On by default (switch it off there if you want your own email on company sites); the mailbox and the Mail page live on applywithai.app.
  • **The toolbar card opens on LinkedIn.** LinkedIn is the first tab and the default view; Upwork stays one tap away (and can be made the default again in Settings → LinkedIn). The LinkedIn view has Open settings and Open LinkedIn Jobs at the top, and the run card's controls are a tidy row: Pause/Resume, Stop, and an "Open tab" link.

Fixed

  • **Company sites: documents sections are read and filled.** A file field now carries its section's heading and words ("Anlagen *", "My Documents — Upload a Resume", "your upload must include your CV"), is required when they say so, and gets the resume: a documents or attachments field takes the CV, a cover-letter or photo field alone does not. Uploads are checked against what the site shows: a refusal message or a dropped file means the PDF version is tried, and a site that refuses both says so in the history instead of the form looping on "the page did not move". On a stuck page the agent attaches the resume to any empty file field before asking the AI for another way; the "page did not move" facts list the file fields and whether a resume is saved. File inputs inside hidden upload frames (SuccessFactors) are read too. (JobRad and L3Harris, 2026-10-10.)
  • **Company sites: every Yes/No pill group is read.** Custom radio groups that share their option words (Oracle Recruiting's Yes/No pills, Uber) were de-duplicated by their first option, so only the first question had buttons the agent could press; each group is its own question now.
  • **Mailbox codes from the employer's domain.** A portal hosted by a vendor (oraclecloud.com) sends its code from the employer (uber.com); the lookup now reads every new mail and prefers a sender match instead of filtering by the site. A code split over six one-digit boxes is recognised as one field.
  • **Company sites: "Don't have an account? Create one now" is a way in.** A registration link whose own words say little was dropped from the page reading, so a sign-in wall with a plain "create one now" link was handed to you as "offers no way to create an account"; the sentence around a link now counts (Imperial Brady / Dayforce, 2026-10-11).
  • **Company sites: a sign-in that fails leads to registration.** When the saved details do not get in and the page offers "Create account", the agent registers (the account for your mailbox address may not exist yet on a site it used before with your old email) instead of asking you to sign in yourself (Dollar Tree, 2026-10-11).
  • **Company sites: labels read from the right block.** A dropdown whose first empty option is its label ("Geschlecht*") is named by it and counts as required; the paragraph right before a field names it; a label is never taken from the column before ("Ort*" for "how did you hear about us"); the label option is no longer offered as a choice. "Wie bist du auf uns aufmerksam geworden?" and its French/Spanish forms get LinkedIn like the English question.
  • **Failure reports never left the extension.** The background filed each report through a dynamic `import()` of the storage module, which Chrome forbids in a Manifest V3 service worker; the call threw inside a catch, so no report reached the service since the feature shipped (0.14.0). The import is static now, and the build refuses a service worker bundle that uses dynamic `import()`.
  • **Company sites: "Application submitted" shown in a dialog is seen.** The confirmation dialog sits outside the form, so the agent read the form behind it and pressed Submit again; dialog text now comes first in what the agent reads (Mekari Talenta, 2026-10-11).
  • **Failure reports: the last send is kept.** Settings → Account shows how many reports wait and what the service answered last, so a quiet outage of the improvement loop is seen rather than guessed.
  • **Workday: Sign In and Create Account work.** Workday lays an invisible "click filter" over those buttons and only a press that lands on it counts; the agent pressed the button underneath, which swallowed the click, so every Workday sign-in or registration stood still (TD Bank, Boeing, Maersk, Airbus, J&J, Nordson, Dollar Tree and more, 2026-10-10/11). A press now lands on the clickable control drawn over a button, as a person's would, on any site. A sign-in or account form that still does not move after a plain try and a rescue is handed to you ("Needs you") instead of two more rounds of pictures of the same form; left alone, the job is skipped as "sign in was needed".
  • **Workday: "How did you hear about us?" and "Country Phone Code" are chosen, not typed.** Those prompts are plain text boxes whose words must be searched (Enter) and picked from the matches; the agent typed into them and Workday kept asking for a value (Boeing, Saia, U.S. Bank, VXI, Bob's, 2026-10-10/11). They are read as pick lists now: typed, searched, and the matching option pressed; the box keeps its focus until the list has been read.
  • **Company sites: error messages that only a data attribute names reach the AI.** Workday and other React sites give their messages generated class names and say "error" in a data attribute or an id; those are in the "page did not move" facts now, and messages drawn out of sight are left out.
  • CAPTCHA assistance targets exact controls inside the application's own provider frames, not the centre of a panel or a tab-wide keypress that could hit another focused button. It checks frame ancestry and visibility, rejects stale tile decisions, respects Stop/Pause/Skip during AI work, and explains manual fallbacks. A progress update no longer discards a pending control command before returning it. The old debugger permission is replaced with webNavigation for frame ancestry; Chrome may ask you to approve the updated permission on reload.
  • LinkedIn job runs no longer count a closed posting as a failure. A job whose pane says "No longer accepting applications" is recorded as skipped with that reason (in the languages the run meets), instead of "No apply button found" among the failures; in the last run that one line stood for four failures in ten.
  • A job pane that is slow to draw its Easy Apply or Apply button (LinkedIn's "Assessing your job match" comes first on a slow page) is waited for longer and opened a second time, and a job still without its control goes back for one more go after the loop's wait before it is recorded; when the pane loaded and shows no way to apply it is a skip that says so, not a failure.
  • Company-site applications are no longer cut off for taking long while they are still moving. The "Give up after" minutes now count standing still (no new step from the agent), and a form that keeps moving may take up to three times that in all; the skip reason names which of the two it was and the last step, instead of the bare "Skipped on the external website".
  • Editing a watch campaign's list now refreshes the posts already found: a profile whose star was removed loses it on its queued posts too (they were keeping their place at the head of the queue), and finds from a removed profile are dropped.
Version 0.14.7

Added

  • Posting campaigns (Settings → LinkedIn → Posting campaigns). Two kinds. **My topics**: give a few subjects, one per line, and a day's number of posts; each post takes the least recently used topic and makes one point from your own seat in the tone you pick, 40–120 words, a first line that stops the scroll and a reason to react, never a pitch, with a picture: generated with OpenAI's image model when an OpenAI API key is on hand (the one saved under Provider when that is OpenAI's own API, or one pasted for pictures; the ChatGPT sign-in covers the chat models only), else a drawn card with the post's first line. **Watched profiles**: paste LinkedIn or X profile links, a `*` in front of the ones that come first (with many profiles and few posts a day, their new posts are looked for first and go out before anyone else's); every few hours (your interval) the extension looks at what they posted, and a new post of theirs becomes a post of yours — "Tibo just posted this on X…" — with your take (news, your angle, support, critique, friendly, in turn) and a screenshot of the original attached, taken from the watcher's own window. Ads, politics, illness and personal matters are passed by. Both kinds run in a small window of their own, between 07:00 and 22:00, spread over the day, never alongside another LinkedIn step; LinkedIn's refusals pause them for a day; each post is listed under the campaign. X profiles are read only with your permission for x.com (asked once) and while you are signed in to X in this Chrome. **Quick post**: paste one X or LinkedIn profile link and their latest post, whatever its age, becomes a post of yours right away (not held to quiet hours), beside any running campaign. **Review first** (a tick on each campaign and on the quick post; off by default): the post and its picture are put into LinkedIn's share box and left there, you get a notification, and the campaign's box lists what is waiting with "Open the share box", "Copy text" and "Done / discard"; you read, change what you like and press Post yourself. Campaigns are edited in place ("Edit campaign"): the list and its priority marks, interval, posts a day, tone, pictures, screenshots and review. **Comments answered** (on by default, a tick per campaign and on the quick post): an hour after a post goes out, and every six hours for two weeks, each new comment by someone else under it gets a reaction and a short answer written in the post's own context and the comment's, once each; the card lists the posts looked after and what was answered.
  • Auto-reply (Settings → LinkedIn → Auto-reply): every few hours the extension opens your unread conversations where the other person wrote last and answers the ordinary ones for you in your voice, one to three sentences in their language, with no promises, times or prices, from your profile, Facts Bank and the standing notes you give it. You choose what is always left for you — money, offers and contracts; commitments and scheduling; negative or sensitive; a recruiter about a job — and the AI also leaves anything it is unsure of. What is left for you is listed with the reason and a link to the conversation. One answer per message of theirs, at most your number a day; conversations older than three weeks are left alone; your own draft in a message box is never touched. LinkedIn's current Messaging page puts no link on a conversation row, so rows are opened by a click on the list; the unread filter is read first and, when it holds nothing to answer, the whole inbox once.

Changed

  • Engagement comments and replies stay on the post's own subject. The person's job, employer and field are no longer worked into a comment (no more analogies from their line of work to a post about something else), and an answer to a reply never explains a comment away; when a reply says the comment missed the point, the answer concedes in plain words and says one concrete thing about the actual topic.
  • A page that settles more than once no longer gets the same step twice: the share box was getting the same post text three times over, and one conversation got two answers. Each step and each send now runs once per tab, in the posting campaigns and the auto-reply alike. When a screenshot cannot be taken the campaign card says why. Screenshots need a permission Chrome grants only for all sites (it will not photograph a tab on less): the campaign form asks for it when screenshots are ticked, with an "Allow screenshots" button; until it is given, a quote card of the author's words goes with the post instead of a screenshot.
  • Posts about a watched profile's post are about that post, on its own subject: the writer gets the person's name and nothing else of them, so their job, employer or field never leaks in as an analogy. Topic posts stay on the topic the same way.
  • When a watch campaign finds more new posts than it has posts left for the day, the AI scores the candidates once (0–100) for how much reaction a commentary post about each is likely to get on LinkedIn (fresh, concrete, arguable, from someone widely followed scores high; vague, promotional or stale scores low), and the best go first; starred profiles still come before the rest. The card says how many were found.
  • No original is ever posted about twice, across campaigns and quick posts alike: what any of them posted about, drafted, queued or passed by is skipped by all the others (a quick post on such a profile takes their next post down). A post that wants a screenshot waits for one: when Chrome refuses for lack of the permission the post is held for up to an hour (the card says so) before going out with a quote card; a page that fails once is tried once more.
  • A watch campaign with nothing new to comment on, and posts still owed for the day, takes a starred profile's latest post as the starting point (each post once).
  • Questions for you (Settings → LinkedIn) is folded by default, showing only how many questions wait; click it to open the list.
  • When you press "Skip this job" on a company-site application, the friction signal (under the usage-reporting switch) now says which hold you skipped — a CAPTCHA, an emailed code, a sign-in, a missing portal address, the Submit hand-over, a pause, or no hold at all — as a fixed code read from the extension's own texts, never from the page. Nothing else changes; this is so the holds people never wait out can be shortened or removed rather than guessed at.
Version 0.14.6

Added

  • Catch up, part of the engagement campaign and on by default: once a day the extension opens LinkedIn's Catch up page (My network → Catch up), and every connection with a new role, a birthday, a work anniversary or a graduation gets a short note written for them in the campaign's tone, sent through LinkedIn's own "Message" button in place of LinkedIn's canned line; the post behind a card (a new role, an anniversary) gets a Celebrate or a Like. One note per person per occasion, up to 10 a day, within the messages' daily number; a person's own draft in the box is never touched; nothing canned is ever sent when the AI cannot write. The campaign box shows today's notes, the total, the reactions and the last look.
Version 0.14.5

Fixed

  • Company-site applications no longer ask you to solve a CAPTCHA that is not there. Sites such as iCIMS load an invisible hCaptcha or reCAPTCHA that scores silently and shows only a "Protected by …" line; the agent counted its hidden frames as a challenge and waited for you. Only a widget or challenge that is actually shown on the page counts now.
Version 0.14.4

Fixed

  • Follow-up messages after an accepted invitation were not going out: on LinkedIn's current compose page the recipient check also counted "Show suggested recipients", the "1st degree connection" badge and the file-drop hint as recipients, so every first message was refused as "not with this person". The recipient is now read from the Remove button and the recipients box only. People the extension had given up on for that reason get another go, ten minutes apart, after the update.
  • The campaign box now says how many people could not be messaged, beside those waiting, in progress and replied.
  • The other person's name no longer appears in failure reports about a campaign step.
  • Every page the extension works on (LinkedIn job runs and their Easy Apply steps, company-site applications, connection, messaging, event and engagement campaigns, Upwork forms) now has its waits timed by the extension's background instead of by the tab, so a tab hidden behind other windows or a locked screen no longer slows the work to a crawl. 0.14.3 covered the job run's pacing; this covers all of it. As long as the computer is awake and Chrome is open, everything keeps going.
Version 0.14.3

Fixed

  • LinkedIn job runs no longer crawl or stall when their tab is hidden (the computer locked, another window in front, Chrome minimised). Chrome slows a hidden tab's timers to once a minute after five minutes, which turned a 30-second wait between jobs into half an hour; the run's waits are now timed by the background, which is never slowed, its tab is kept from being discarded by Chrome's memory saver, and a watchdog reloads a page whose run has gone quiet, which carries on from where it was. As long as the computer is on, the run keeps going, like the engagement campaign.
  • While LinkedIn's daily Easy Apply limit holds, an Easy Apply job whose card was read before LinkedIn finished drawing it (so it looked like a company-site job) no longer sends the run round in circles on "Reading the job": the card is read again when the job opens, and an Easy Apply job is left for tomorrow without being opened.
  • The extension now notices when it is standing still and says so: a LinkedIn job run that opens the same job three times without an outcome skips it and reports it; a run whose counts have not moved for an hour, a run page the watchdog had to reload, and a campaign whose next step is more than half an hour overdue are all reported as failures, so problems that used to be invisible (nothing failed, nothing finished) reach the daily triage.
Version 0.14.2

Added

  • "What would make this easier?": a one-line box at the bottom of the popup and of Settings. Whatever you write there is sent to the makers when you press Send, and nothing else is; it feeds directly into what gets built next.
  • Friction signals, under the same switch as usage reporting: when one of the extension's own sections is opened again and again, a page is closed with nothing changed, a switch is flipped back within a minute, a run is stopped by hand, a "Needs you" hold is skipped, or a campaign is set up (its kind only). Sent as fixed codes naming the extension's own controls, never any text from a page or from you, so controls that are hard to find can be moved and features that go unused can be reconsidered.
Version 0.14.1

Changed

  • When a company-site application needs you (a CAPTCHA, an emailed code, a sign-in), its tab is brought to the front and its window focused, so the three-minute wait is not lost behind other windows.

Fixed

  • Company-site applications: after you solve a CAPTCHA and press Continue, the agent now carries on to submit instead of asking again. It recognises a solved CAPTCHA by the token the widget leaves on the page (reCAPTCHA, hCaptcha, Turnstile), and takes your Continue at its word for the next step when a widget leaves no token.
Version 0.14.0

Added

  • Failure reports now cover every surface: Easy Apply (a form that did not open or finish, LinkedIn's daily limit), connection and messaging campaigns (LinkedIn's limits and sign-in walls, a person or message given up on), and the Upwork proposal and reply writers (a draft the AI could not make). Never the job's, thread's or person's text: only the reason and where it happened.
  • Connection and messaging campaigns now show their follow-up messages inside the campaign box, each step with its delay and who is waiting, with an Edit messages button, so the messages you wrote are never hidden further down the page.
  • Company-site applications find another way when stuck. When the page has not moved after two rounds, the agent no longer repeats itself or gives up: it asks the AI for a different way, with the page facts it could not see before (how far the page is scrolled, what covers it, which buttons are disabled, which required fields are still empty, the messages shown) and a wider set of moves: a press by another way (a full mouse press at the element, the keyboard, the element's own click), a scroll to a field or to the page end, a key on a field (Enter, Tab, Escape, arrows), closing whatever covers the page (a dialog, a chat widget), a step back. A job is given up only after five unchanged rounds, three of them looking for another way. The way that got a site unstuck goes into that site's notes for the next application there.
  • A stuck company-site page is shown to the AI. When the page still has not moved after the first rescue turn, the agent takes a picture of the tab (scaled down, taken only at that moment, never kept) and sends it with the page outline, so the AI can see what the outline cannot carry: a button drawn as an icon, a stepper, a spinner that never finished, a date picker or drag-and-drop widget, an overlay or chat window, a message in red. It works with Claude (subscription or API key) and ChatGPT, which take pictures; with other providers the agent keeps to the text rescues. The tab has to be on screen for the picture (Chrome captures only what is shown); otherwise the turn goes on without it.
  • The time budget on a company site runs from the last time the page moved on, not only from the start: an application that keeps advancing keeps going (up to three budgets in all); one that stops moving ends after one budget without progress.
  • Engagement campaign: an action LinkedIn refuses for now is held for a day, the others go on. When LinkedIn answers a comment, reaction, repost or reply with "could not be created at this time", "try again later" or a limit, that action stops for 24 hours (the panel shows what LinkedIn said and when it is tried again) while the rest of the day's actions continue; when only held actions are left, the campaign waits for the hold to run out instead of counting the day as done. A comment and an answer to a reply are the same thing to LinkedIn, so a refusal of one holds both.
  • Company-site applications tick what the site requires. Consent boxes drawn as a styled square over a hidden checkbox (most careers sites) are now read and ticked through their label; required declarations with no policy named ("I certify the information is accurate") are ticked by the rules, and the AI is told to tick every box the site requires to apply (acknowledgements, background-check consent, an age confirmation the facts allow), never marketing or job-alert boxes.
  • Application forms in a frame that opens with choices ("Upload your resume", "Enter my details manually", "Use LinkedIn profile") and no field yet (Talemetry, Jobvite): the frame takes the application on that first step; the agent uploads the resume when one is attached, else enters the details by hand, never through a social profile.
  • Failure reports, under the usage-reporting switch. When an automation could not finish (a company-site application, a stuck page and the way out of it, a LinkedIn refusal, a page-reading repair), the extension sends applywithai.app a short report: the reason as a code, the form's field labels and button texts, the last few turns and the short site messages, all cut to 80 characters, with your own name, email and phone taken out first and typed values never included; no page text, job text, screenshots or prompts. Turning usage reporting off stops it and asks for the stored reports to be deleted with the usage history; the switch's position is also told to the service, which refuses reports otherwise.

Changed

  • Fewer questions for you. Both form agents (Easy Apply and company sites) now derive what plainly follows from your facts instead of asking: today's date and "date applied"; the earliest start date from your available-from date or notice period; a salary you gave in another currency or period, converted and given in the one asked (yearly, monthly, CTC, net); salary expectations from your expected salary or current salary plus about 10%; relatives or contacts at the company, planned leave, a financial interest, a non-compete and prior applications (No unless your facts say otherwise); a US state or municipality you do not live in ("outside"/"not applicable", else your own city and country); a language not in your answers (the lowest level offered); years with a tool, industry or role (the closest true number from your work history). Only a fact of your own that nothing states or implies still waits in Questions for you: a date of birth, an ID or licence number, a certificate or clearance, citizenship or a right to work your saved answers do not give.

Fixed

  • Application forms inside an embedded frame (Jobvite and Talemetry boards, Greenhouse embeds: "Apply Now" opens the form in a frame from another site). The top frame kept pressing Apply Now because the press looked like progress, and the frame's agent gave up after a few seconds when the form inside it was still loading. Now a form-sized frame that appears after a press hands the application to that frame at once; a frame whose form loads late keeps looking for a minute and may take the wheel even after the top frame took it back; a frame that loses the wheel stands down at its next report, and the top frame's panel keeps showing the frame's progress.
  • Phone widgets with a country picker (ADP, react-phone-number-input, intl-tel-input): the agent typed "+46…" into the number box while the picker said United States, and the widget kept +1 and dropped the rest, round after round. The country is now chosen first through the widget's own select or flag list (by your country name or dial code), then the national digits are typed; the whole number is typed only where no picker is found.
  • A page whose values change but never moves on (a number retyped five ways on the same form) now counts as stuck, so the rescue turns and the picture of the page come in: progress is a new step or fewer empty required fields, not a value that changed. Before, every retyped value looked like a change, and the agent never asked for another way.
Version 0.13.7

Fixed

  • LinkedIn job agent: "LinkedIn's daily Easy Apply limit is reached" was declared after a few applications when it was not (you could still apply by hand). After a submission LinkedIn moves the results to its post-apply route, where its "application sent" pop-up returns for every job selected and the details pane is slow to fill; three Easy Apply forms in a row then failed to open, which the agent took for the daily limit. Now the agent lets the page settle after each submission (and loads the plain results afresh when it does not), treats that route as the same search, and when three forms in a row do not open it first loads the results afresh and gives those jobs another go; only a second round straight after a fresh load, or LinkedIn's own notice, counts as the limit. The notice itself is read more strictly (every wording names applying or submissions, so a Premium cap or "reached your limit" elsewhere is not it), a confirmation that an application was sent is never taken for it, a submission that moved the results to the post-apply route counts as sent, and the wait shows what LinkedIn said, so a wrong reading can be reported.
Version 0.13.6

Fixed

  • "Upwork page assistance is currently unavailable" no longer flashes up because one safety-policy request to applywithai.app was slow or dropped. The policy the service confirmed within the last ten minutes keeps serving through such a moment (the Upwork page asked for it afresh on every request, so a single blip locked the page). A policy the service itself answers with, such as copy-only mode, is never overridden, and once the last confirmation is older than ten minutes the safe policy applies until the service answers again. Likewise a passing license-refresh failure (offline, a timeout, a busy service) no longer drops that confirmed policy; only a definitive refusal does.
Version 0.13.5

Fixed

  • Engagement campaign: replies to your comments are now actually found. LinkedIn's new feed keeps a post's identity (its urn, and so its own page) out of the page, so the campaign had no page to go back to and never looked for replies. The urn is now read from the page's own state and written on each card, and every comment made from now on is looked back at. Comments made before this version are not.
  • Engagement campaign, on a post's own page: the reaction on a reply and the Like on a comment are found by LinkedIn's sentence labels there ("React Insightful to Jane Doe's comment"); before, only the bare word was recognised, so no reaction was given. A bare "Reply" button is no longer taken for "3 replies" when the thread is expanded (it opened reply boxes all over the post), and a posted answer is seen where LinkedIn puts it, beside the reply rather than inside it.

Added

  • Engagement campaign: a "Check replies now" button, shown while comments are being watched. It looks at those posts for replies right away instead of at the next scheduled look (no look is added; a campaign waiting for tomorrow keeps waiting for its numbers).
Version 0.13.4

Added

  • Engagement campaign: replies to your comments are answered. The campaign remembers each post it commented on and looks back at it a few hours later, the next day and a few days on. Every reply to your comment from someone else gets a fitting reaction and an answer in the thread, written from your comment, the post and their reply, in the campaign's tone; a reply you already answered (by the campaign or by hand) is left alone. On by default, with its own number a day ("Replies answered", 30 unless you set another, up to 200), not part of the day's numbers; the card shows how many were answered and how many comments are being watched. Each answer counts as a comment in usage reporting.
Version 0.13.3

Fixed

  • Comment with AI: the AI button was missing under posts whose comment box does not say "comment", such as a celebration post ("Give your good wishes…"). A comment box is now recognised by its shape (an editor inside a post with LinkedIn's emoji and photo icons), whatever LinkedIn calls it; the engagement campaign comments on such posts too.
  • Comment with AI: the button is now one of the comment box's own icons, a small sparkle beside the emoji, GIF and photo icons, in their size and colour, instead of a pill floating over the box. A draft never waits for your profile to be read: it uses what is stored and the profile refreshes in the background for next time; the background read is more reliable.
  • LinkedIn hid the extension's buttons and panels (a new LinkedIn stylesheet hides elements placed beside the page body, where the AI buttons, the tone picker, toasts and the job agent's panel live). They now insist on being shown, on LinkedIn and Upwork alike.
  • Comment with AI: the AI button now appears on posts LinkedIn opens in an overlay (a "Suggested" post, a post opened from a notification), with the tone picker shown over the overlay; before, boxes inside any overlay were passed over as if they were the share box.
  • Replying on your own post: the AI now answers as the author, from the post and the comment you are replying to only. Your LinkedIn profile is neither read nor used there, and the Facts Bank and Upwork profile stay out. A reply goes to the person LinkedIn named in the box ("@Name"), not to whichever comment happens to sit last above it.
Version 0.13.2

Changed

  • Comment with AI and Post with AI now write from your own LinkedIn perspective. The extension reads your LinkedIn profile (headline, About, Experience, location) from your profile page, by itself on the first draft and again every two weeks, and the AI writes as the person that profile shows, in their field. It is no longer your Upwork proposal voice: the Facts Bank and Upwork profile only supply facts, and a post or comment never pitches, offers services or addresses a client. Settings → LinkedIn → "Your voice on LinkedIn" shows what was read, with "Read my profile again". The profile is read while you pick a tone, the button says what it is doing from the moment you press it ("Reading your profile…", "Writing…"), and comments and posts are drafted with light thinking, so they come faster.

Fixed

  • Post with AI: the button in LinkedIn's share box was drawn on top of LinkedIn's Proofread button, and pressing it seemed to do nothing because the tone picker opened behind the share box. The button now sits clearly to the right of the toolbar (Proofread, emoji, photo, event, "+"), and the picker, the draft and its messages show inside the share box.
Version 0.13.1

Fixed

  • LinkedIn job agent: the choice of jobs is respected always. "Easy Apply" applies only with LinkedIn's Easy Apply form; when LinkedIn's daily limit is reached it asks whether jobs on company websites may carry the run meanwhile ("Yes, company websites" / "No, wait for Easy Apply"), and goes on with them by itself if nobody answers within a minute; "No" waits the limit out. Before, an Easy Apply run went on to company websites without asking. "External sites" applies only on company websites; "All jobs" does both, and carries through the daily limit without asking.
Version 0.13.0

Fixed

  • LinkedIn job agent: an empty Location now searches Worldwide. LinkedIn filled an empty location with your own country (a "Customer Support" search ran as "Customer Support in Sweden"), so the search now asks LinkedIn for its Worldwide place when the field is left empty.

Added

  • Comment with AI under any LinkedIn post. Every comment box on LinkedIn (the feed, a post's own page, your profile's and your pages' posts, other people's and pages' posts, and the Reply box under a comment) gets a small AI button in its icon row. It opens a picker with eight tones, each with an emoji (Professional, Friendly, Funny, Witty, Supportive, Insightful, Curious, Congratulate) and an optional note. Your AI reads the whole post, its author, the comments already under it and, for a reply, the comment you are answering, and drafts one comment in that tone into the box, after any "@name" LinkedIn put there. You can ask for changes or a new version; nothing is posted until you press LinkedIn's own Comment or Reply.
  • Post with AI in LinkedIn's share box, as yourself or as one of your pages. A topic, notes, or a pasted article or link with its text, plus a tone, become a post in your voice from your profile and Facts Bank, written into the box for you to read, change and post yourself.
  • Engagement campaign (Settings → LinkedIn → Engagement campaign). A day's numbers of comments, reactions, reposts and event attendances from your home feed (recommended 30, 100 and 50; each with a switch and a number), in a tone you pick, with a blocklist of people, companies or "people from <company>". The feed opens in a small LinkedIn window of its own; a few posts at a time, with pauses like a person reading, your AI decides per post whether to pass it by (ads, your own posts, anything on the blocklist, politics, illness, sales, job posts, polls, engagement bait), which reaction fits (Like, Celebrate, Support, Love, Insightful, Funny), writes one comment worth reading and the line to repost with; only what LinkedIn shows as done is counted. When the day's numbers are done it stops and starts again about 24 hours after it began; it never runs alongside a connection, message or event campaign. Each comment, reaction, repost and attendance is a usage event (comment_posted, reaction_given, post_reposted, event_attended). A plain name or company on the blocklist also covers posts about it (its text and the companies it links to, "instantly.ai" matching a linked "Instantly"), whoever wrote them; "people from X" stays about the author. Comments are posted with LinkedIn's Comment button in the row under the box; a draft that cannot be posted is taken out again and not counted.
  • Self-healing page reading now also covers the newer LinkedIn features. Comment with AI and Post with AI (posts, their comment boxes, comments and the share box), the engagement campaign (the feed's post cards and their Like, Comment, Repost and Attend buttons) and event invitations (the people list in the invite window) each read the page by what it says first and, when LinkedIn changes the page so that nothing reads while the content is clearly there, ask your own AI once for a new way to read it, test the answer on the live page and keep it only if it works. Settings → LinkedIn → Page reading lists the three new page types with the rest.
Version 0.12.4

Changed

  • Product usage reporting counts everything the extension does, not only applications: each connection request, message, event invitation and withdrawn invitation a LinkedIn campaign sends is one event (`connection_requested`, `message_sent`, `event_invitation_sent`, `invitation_withdrawn`; LinkedIn, agent-run, seen done on the page), and a reply drafted in LinkedIn Messages is `reply_prepared` on LinkedIn. Still content-free: only the time and kind of action travels.
Version 0.12.3

Changed

  • Product usage reporting is on from install. The long card in Settings → Account is replaced by one line with the switch to turn it off and a one-sentence note of what is never included. Installs from 0.12.0 and 0.12.1 that never touched the switch are turned on; an install that turned it off (its deletion request shows that) stays off.
Version 0.12.2

Fixed

  • Event invitations: LinkedIn's filter buttons in the invite window are matched by what they show as well as by their label ("Show results" is labelled "Apply current filter to show results", "Cancel" is "Cancel Locations filter"), so a described audience's filter is applied instead of every batch reporting that the filter could not be set.
Version 0.12.1

Changed

  • LinkedIn event invitations to a described audience ("people in Sweden") use the invite window's own filters again: your AI turns the description into Locations, Current company, School and Industry, LinkedIn narrows the list, and your AI checks only what the filters cannot say on each headline. The people search, the review list and the name-by-name lookups are gone. A filter counts as set only when LinkedIn's list changed or the filter pill's own text did after Show results; if a filter cannot be set, nobody is invited on that pass and the batch is tried again.
  • Batches open the event in a tab of your own browser window, in front, and put your tab back when done (no separate window). LinkedIn draws the Share menu and the invite list only on screen.

Fixed

  • The invite window's headline is read without the connection degree ("1st • …"), and a row is never taken for the whole list when people invited already have no checkbox.
  • The Share menu is given time for its late Invite item and opened a second time before "no Invite" is reported; only two such steps in a row wait for you.
  • An ended event is reported as such (LinkedIn removes Invite from it) instead of "no Invite for you".
Version 0.12.0

Added

  • Product usage reporting in Settings → Account, off by default. When enabled, it sends a narrow, content-free record of supported actions and confirmed application outcomes for recent-use analytics. The setting explains every field, keeps license check-ins separate, and deletes queued and stored detailed history when turned off. Reporting keeps the same installation identity across extension upgrades so retries and the same confirmed application do not inflate counts.
Version 0.11.7

Fixed

  • Connection campaigns no longer stop when Apply with AI cannot verify your access for a moment. A slow answer from the licensing service used to pause the campaign until you pressed Resume, although your account was connected. Now nothing is sent while access is unverified, and the campaign checks again by itself after 5 minutes, then 10, 20, 40 and at most every hour, and carries on as soon as access is verified. A campaign paused this way before the update carries on by itself; a Pause you pressed stays. When a personal note cannot be written at that moment, the invitation still goes, without a note, as before. Withdrawing old invitations waits for access in the same way.
Version 0.11.6

Added

  • Reply with AI in LinkedIn Messaging. On the Messaging page and in LinkedIn's chat windows, a "Reply with AI" button sits just left of LinkedIn's Send button, in the same style. It reads the whole conversation and suggests the next message, or writes the one you describe, in the conversation's language. It uses your facts, saved answers, Word resume and the jobs you applied to at their company. The draft goes into LinkedIn's message box without any key being pressed; you read it, ask for changes or discard it, and press Send yourself.
  • Connection campaigns (Settings → LinkedIn). Paste a LinkedIn people search, or describe who you want to meet ("CEO USA", "HR managers in Gothenburg"): your AI makes the search and keeps only the people who fit. For each person the extension reads their profile, writes a short personal note from it and sends the invitation through LinkedIn's own invitation window. It starts the moment you press Start, at any hour: 20 a day by default, 4 to 14 minutes apart, with a caution before choosing more, and each day's batch begins about 24 hours after the last one. It carries on by itself in a background tab until the list is done, skips people already connected or invited, and pauses for 24 hours whenever LinkedIn says the invitation limit is reached, then resumes on its own (also after a Chrome restart). When LinkedIn stops personal notes on a free account, invitations go without one until the next month.
  • Old campaign invitations are withdrawn by themselves (Settings → LinkedIn → Connection campaigns, on by default). An invitation a campaign sent that is still unanswered 20 days later (you can choose 7 to 180) is taken back on the person's profile with LinkedIn's own Pending and Withdraw buttons, or on the Sent invitations page. It is checked every hour, one at a time, a few minutes apart and at most 40 a day, and never while a campaign step is running. People who accepted are left alone. Invitations you sent yourself are never touched, and the record survives removing the campaign.
  • Self-healing for LinkedIn conversations, people search results and profiles. When LinkedIn changes these pages, the extension finds things by what they are and say; if that is not enough, your AI works out the new layout once, the answer is tested on the live page, and it is kept for next time (Settings → Page reading). Invitation window buttons with new wording are picked by your AI, never Premium, Follow or anything outside the window.

Fixed

  • Cover letters no longer start with a stray ":null" line. The check that makes sure a client's code word (such as "MERCH") is on the first line also read Upwork's own page data, which is not part of the job post, and took a piece of it for a required word. Only the words you can read on the page count now, and anything that looks like page data or code is never treated as a required word.

Changed

  • A calmer LinkedIn search form in Settings and the popup. "Jobs to apply to" sits on its own line with its explanation underneath, and the chosen option is shown in white on a light grey track instead of solid black. The Start applying button is normal-sized, with a one-line explanation next to it. The other choice switches in Settings use the same style.
Version 0.11.5

Fixed

  • Jobs on company websites no longer fail with "Tab opener must be in the same window as the updated tab" when another Chrome window has the focus. The website now opens in the LinkedIn tab's own window, so a run keeps going in that window while you work in another one.
  • Registration and account forms on careers sites are completed and sent. Styled dropdowns (Select2 and similar, such as a "Country of residence" list with "Select an option") are now filled, the "I have read / I accept" terms, privacy and data-notice boxes are ticked (never newsletter, job-alert or talent-pool boxes), "How did you hear about this job" is answered with LinkedIn, and once the form is complete the button that creates the account (Register, Create account, or the form's Save or Continue) is pressed.
  • Long dropdown lists (countries, languages) are read in full, so an option far down the list, such as Sweden, is found.
  • "AI unavailable: This extension request is not allowed" on some company sites (Varbi, ReachMee): the page data sent to your AI could break the extension's own size checks (a very long dropdown option, or a button added to the page by another extension such as a password manager). The data is now always fitted to those checks, and if a request is ever refused the real reason is shown instead of blaming your AI.
  • Phone numbers are filled in fields named in one word ("Telefonnummer", "Mobilnummer"); a phone field's country-code picker shows its value, so it is not "fixed" again and again; a Send button is no longer described by its neighbour's words ("Cancel").
  • A sign-in page with a link such as "Create a candidate profile" is registered on instead of stopping with "offers no way to create an account".
  • Fields that are traps for bots ("leave this field unchanged") are left alone.
  • Every "Needs you" wait on a company website (a CAPTCHA, an emailed code, a sign-in) ends by itself after 3 minutes: the job is skipped and the run goes on, even when the LinkedIn tab is not there to count the minutes.

Added

  • Questions for you. When a form asks something only you know and nothing saved answers it (a date of birth, a driving licence, a certificate), the agent does not guess and does not stop: it keeps the question in Settings → LinkedIn → Questions for you (and on the toolbar icon), sets that job aside and goes on with the next one. Answer once and every later form, Easy Apply and company sites alike, uses your answer; the jobs that waited for it are tried again.
  • Driving licence in your answers (yes or no, and its categories, such as B), confirmed once, used for every licence question ("Har du körkort B?").
  • A PDF version of your resume. Forms that take only PDF get it: made by itself from your Word resume (real text, simple layout) or your own PDF uploaded in Settings → LinkedIn → External websites, where you can download it to check it. A site that turns the Word file down gets the PDF instead, and a form's only file field gets your CV without waiting for your AI.
Version 0.11.4

Fixed

  • LinkedIn form answers, applications on employers' websites, Qualify with AI and page repair work with the newest Claude models (such as Opus 5.5). These requests were sent with thinking turned off, which those models refuse, so every one of them failed ("Not sent: the request could not be completed"). They now use the thinking level they ask for, and a model that refuses "thinking off" (also at Thinking "Off" and in the connection test) is recognised from its answer and asked again at the lowest thinking effort.
  • Scores are back on Upwork's Best matches and Most recent. Upwork moved these lists to a new page layout whose job cards no longer link to the job; the extension now reads the new cards, and a job opened in the side panel over the list is read from that panel, not from the list behind it. Search results, which still use the older layout, work as before.
  • LinkedIn's pop-ups after an application ("Your application was sent…" with "Update profile", add skills, Premium offers) are closed with "Not now" or ✕ in more of LinkedIn's layouts, never with "Update" or "Upgrade". One that will not close pauses the run for you; if nobody is there, the results page is reloaded and the run carries on.
  • When an employer's website says an application could not be sent, the LinkedIn panel now shows the real reason instead of a generic line.
  • Applications on employers' websites no longer stop when the Apply button opens the form in a new tab or window ("the form probably opens in a new tab…"). The agent follows the application through any number of new tabs and carries on there; sign-in windows are left to the site, and a tab that closes leads back to the one before it.
  • Cookie banners on employers' websites are accepted first (the consent tool's own Accept button, in any frame), so forms behind them, or in frames that load only after consent, can be filled. A consent, video or chat frame is no longer taken for "The form is inside an embedded frame", and a page whose form is not in a frame after all carries on instead of waiting.
  • A run paused by LinkedIn's daily Easy Apply limit continues by itself after the wait even when Chrome was restarted, the extension was updated or the computer slept through the time: the wake-up is set again if Chrome lost it, and a wait that is over resumes as soon as Chrome starts.

Added

  • Self-healing page reading. When Upwork or LinkedIn change a page so that its job cards (or the Upwork job panel) can no longer be read, the extension first finds the jobs by the page's structure, and if that is not enough it asks your own AI once for a new way to read the page, checks the answer on the live page and keeps it only if it works. Settings → Page reading (under Jobs and LinkedIn) shows what each page uses, with a switch and "Forget learned rules".
  • LinkedIn runs keep going until the target. LinkedIn's daily Easy Apply limit hands the run to jobs that apply on company websites (also in an "Easy Apply only" run, once website access is allowed) until the limit passes, then Easy Apply continues by itself. Three failures in a row lead to a recovery (pop-ups closed, page read again or reloaded) instead of a stop; when your AI can't be reached nothing is sent and the job is tried again after a wait; when every job in the results is done, new jobs are looked for every 20 minutes. Questions that wait for you end by themselves after a few minutes (the job is skipped, or the run continues with the answers already filled in), so an unattended run never stalls. Jobs that failed twice lately are not ticked again automatically.
  • Your AI fixes stuck Easy Apply steps: when a step will not move on (a field the agent does not recognise, a message that keeps coming back, a button in another language), the form is shown to your AI, which fills it and presses the button that moves on; it never presses Submit or anything that leaves the form. Its answers are remembered once LinkedIn accepts the application.
  • The company-website agent learns each careers site: the route that worked and the last thing that failed are kept per site (shared by every company on the same hiring platform, such as Workday or Greenhouse) and used on the next application there. It also asks your AI again after a hiccup before giving up, and changes approach when a page does not react.
  • Claude's model list (subscription and API key) is read live from Anthropic; the other providers' lists load by themselves when Settings opens, and the Model tab marks the newest model and offers to switch to it.
  • Careers portals that want an account no longer stop the run. With no portal password set, the agent makes a strong one the first time a site wants an account, creates the account with it and keeps it in Settings → LinkedIn → External websites, so you can sign in to those portals yourself. Your AI never sees the password, whether the agent made it or you set it: it writes a placeholder that the extension replaces while typing, and passwords are never kept in the answers saved with an application.

Changed

  • When an application on an employer's website ends, sent or not, every tab it opened is closed (before, only after a successful submission); the outcome and its reason stay in the results. The switch is in Settings → LinkedIn → External websites.
Version 0.11.3

Fixed

  • A connected subscription no longer shows as disconnected a few minutes after it was checked. Access is confirmed with a short-lived pass that the extension now renews quietly in the background from the browser's saved connection, for monthly and annual plans alike, including a cancelled plan until the end of its paid period. LinkedIn and company-site steps renew it too before they continue.
  • A brief outage no longer disconnects the browser. If applywithai.app can't be reached, times out or is busy, Settings → Account says it couldn't verify access right now, keeps the connection, retries on its own (respecting the service's requested wait) and keeps Check access available. Drafting and replies stay locked until access is verified.
  • Settings → Account now tells apart: connected and verified, checking, temporarily unable to verify, subscription inactive, device removed or activation no longer accepted, and never connected. Connect account appears only for a new browser or when the service no longer accepts this browser's activation; an inactive subscription points to billing instead.
Version 0.11.2

Fixed

  • ChatGPT with GPT-6 Astra works again. Astra has no "minimal" reasoning level, so the connection test and any draft at Thinking "Off" were refused; Off and Fast now use Astra's lowest level.
  • Reasoning models on custom, local, OpenRouter and OpenCode endpoints no longer fail silently on a full proposal. When such a model spends its output budget thinking, the request is retried with a larger budget and reduced reasoning; if it still cannot answer, the message says so and suggests a model without extended reasoning.
  • When something fails, Settings and the on-page message now say what failed (for example the provider's own error) instead of one generic line, and the failure is logged in the extension's service-worker console. Messages shown on employers' own websites during LinkedIn applications stay generic.
Version 0.11.1

Fixed

  • The feature inventory carried a two-version marker on one item, which kept the 0.11.0 release from being imported by the website. No extension changes since 0.11.0.
Version 0.9.1

Fixed

  • Job scores now appear on Best Matches and Most Recent. Those pages use a different card layout from search results, so 0.9.0 found no cards there and the panel stayed empty; both layouts are read now, including the client rating and the fixed budget the feed shows differently.
Version 0.9.0

New

  • Job scoring on Upwork's job lists (search results, Best Matches, Most Recent). Every card gets a 1–5 badge computed from the card itself: client quality (payment verified, spend, rating), budget fit against your profile rate, keyword hits, competition (proposals already sent) and freshness. The badge's tooltip shows the points and a short "why".
  • Saved job filters in Settings → Jobs: include and exclude keywords (title, description, skills; any or all), hourly and fixed-price ranges, hide jobs without a budget, experience level, payment verified, minimum spend and rating, client countries to include or exclude, a cap on proposals already sent, posted-within hours, and a minimum score. Cards that fail are dimmed or hidden; the failing rule is named on the card.
  • A "Job scores" panel docked to the page: pick the filter, set the minimum score, see the page's cards newest first (or best first) with All, Qualified and Worth-it views, and open any of them. Hovering a score or a verdict shows the full explanation: the score's five components and reasons, or the model's verdict, fit and reasons. The same explanations appear on hover on Upwork's own cards.
  • "Open jobs": a filter runs as an Upwork search with its keywords and rules applied, so the results page arrives already scored and ranked.
  • Cards outside a filter can be shown as usual (default), dimmed, or hidden, and the panel names which of your rules excludes how many cards.
  • Qualify with AI: one job or the top five at once are judged against your Facts Bank and profile. Each gets Qualified / Maybe / Skip, a fit score and two concrete reasons, cached per job. Runs through your chosen provider behind the same paid-access check as drafting.
  • Score weights are adjustable in Settings → Jobs.
Version 0.8.2

Improved

  • Provider cards in Settings show each provider's own icon (Claude, ChatGPT, Claude API, OpenRouter, OpenCode Zen, Ollama), bundled with the extension so Settings still makes no network request for them.
  • The ChatGPT model list is loaded from the account's own Codex model registry, with a Refresh button, so it always shows what the subscription can use. The built-in fallback now lists the GPT-5.6 family and gpt-5.5; saved ids that Codex has retired (gpt-5, gpt-5-codex, gpt-5-mini, o3, gpt-5.4) are read as their current equivalents, and a model that rejects the chosen reasoning level is retried once at medium.

Fixed

  • A ChatGPT draft that stalls now fails within four minutes (or after 90 seconds without data) with a message naming the model and effort, instead of hanging on ‘Drafting…’ until Chrome ends the extension's worker and later clicks report ‘Extension unavailable’. Error events from the Codex backend end the request immediately.
  • Drafting, saving the job and saving history work on invitation proposal pages again. Those URLs carry no job id, so the request router rejected every request from them as ‘not allowed’.
  • Reply with AI works again in Messages. The router demanded the thread's URL equal the page's URL character for character, and Upwork's Messages app rewrites its URL as rooms open; it now requires a Messages page and an Upwork room, which is what the check was for.
  • A refused request is now logged in the service-worker console with the sender page, so the reason is visible instead of guessed.
  • Connecting a ChatGPT subscription no longer ends on a Chrome ‘blocked’ page: the packaged sign-in callback page is now reachable from the OpenAI sign-in origin, which is where that navigation starts.
Version 0.8.1

Fixed

  • The Provider tab now says when the installation has not been activated yet and points to the Account tab, instead of failing a Connect click with a policy message further down the page.
Version 0.8.0

New

  • Settings support OpenAI-compatible cloud providers, custom HTTPS endpoints, and local model servers with an explicit permission prompt before connecting.
  • Supported providers can list their available models from Settings.

Improved

  • Published-update checks refresh during normal use within five minutes instead of retaining release information for a full day. Unpacked installations still require a manual file replacement and Chrome reload.
  • Custom-provider requests validate the destination and limit request time and response size while retaining the account and subscription checks.

Fixed

  • Completions on local and free-tier models get a three-minute request budget instead of 45 seconds; a proposal prompt can take a local model longer than that to read. Model listing keeps the short budget.
Version 0.7.0

New

  • Connect your Apply with AI account from extension settings, with two installations per subscription.
  • Account, billing, device management and approved-update links are available in settings.
  • The extension checks paid access before drafting and shows a recoverable message when a connection, subscription or update needs attention.

Improved

  • A permanent extension identity keeps future keyed releases on the same installation. Earlier unkeyed development installations need the migration guidance in docs/commercial-security.md.
  • Server safety settings can pause a provider connection or page insertion. When insertion is unavailable, supported drafting flows show a copyable draft.
  • Provider credentials and installation credentials are restricted to trusted extension contexts.

Fixed

  • Opening the proposals page no longer scans outcomes automatically; syncing requires a click.
  • Clicking Submit no longer falsely records a successful application before Upwork confirms it.
  • Debug logs no longer include full draft prompts or client conversation content.
  • New customer installations no longer inherit the founder's personal default instructions.

Installing updates

The extension lets you know when an approved update is available. Download the new ZIP from your account, replace the files in the same installation folder, and reload the extension in Chrome.