Release log · Extension builds

Changelog & updates

Every Chrome extension build we ship — new features, fixes, and improvements. Reload the extension after updating from the Web Store to see the latest in-app.

v10.132Current build
205Releases logged
June 2026Latest entry

Add to Chrome — Start Today

  1. Version 10.132Current build

    New

    • Connects spent captured at publish time for cost-per-proposal and cost-per-hire KPIs in portal reports

    Update

    • Extension scrapes Connects from the job page and sends connects_spent with each published proposal
    • Reports dashboard: Connect spend tile, cost/proposal, and cost/hire metrics
  2. Version 10.131

    New

    • Job category and skills tags saved at publish for richer portal analytics

    Update

    • Proposal job type and experience level stored for reports breakdowns
    • Reports: job categories, proposal style mix, top skills, and experience level panels
  3. Version 10.130

    Fix

    • closing-line swap now replaces the old ending instead of keeping the previous question

    Update

    • Removed the 'first two weeks' win question — default close is now the 20-minute call invite
    • Cover letter always rebuilds from 70/20/10 sections so pricing_next matches the picker
  4. Version 10.129

    Update

    • Closing line style picker — swap between 20-minute call, two-week win question, speed/cost/scale, or auto by job type
    • Change closing anytime in the job panel after generation without re-running Claude
    • Settings default for closing style; landing page copy clarifies Message/Hire are client-only on Upwork
  5. Version 10.128

    Fix

    • content script syntax error that blocked the job panel and generation on Upwork pages
  6. Version 10.127

    Update

    • Landing page CTA now links to your Upwork freelancer profile (not the job URL)
    • Profile URL saved on publish when you have visited your upwork.com/freelancers/~… page
  7. Version 10.126

    Update

    • Free tier fraud lock: one license per email + one free account per computer (device ID)
    • Extension sends install device ID on validate and hosted AI proxy calls
    • Free licenses bind to your machine on first activation — second email/key on same PC is blocked
  8. Version 10.125

    New

    • Free plan — 10 hosted proposal runs/month (no Claude API key required)

    Update

    • Free tier: classic theme only; section toggles and custom domain show upgrade prompts
    • Hosted AI routes through secure n8n proxy; popup shows runs remaining on free plan
    • Setup wizard skips Claude key step for free accounts
  9. Version 10.124

    Update

    • My Proposals: Email dashboard link button — sends magic link to your license email (no confusing URL redirect)
    • Clearer labels: ✉ Email dashboard link vs ↺ Refresh; per-card ✉ Dashboard edit
  10. Version 10.123

    Update

    • My Proposals: Open full proposal dashboard in browser (magic-link login at upworkwizz.com/app)
    • Dashboard button per card — edit landing pages, themes, sections, and analytics on a full screen
  11. Version 10.122

    Update

    • Job panel after generate: compact variant style cards, landing sections accordion, attach hidden until next job
    • Job panel: Proposal economics scrolls with proposal content (no longer clipped below the fold)
  12. Version 10.121

    Update

    • Job panel: Proposal economics now scrolls with proposal content after generate (was clipped below the fold)
  13. Version 10.120

    Update

    • Settings: default landing page style — pick preset or custom accent for all new proposals
    • My Proposals cards show a live style preview chip (accent + preset name) on each proposal
  14. Version 10.119

    Update

    • Per-proposal landing page themes — pick a built-in preset or custom accent/light-dark for each proposal
    • Six style presets: Classic Wizz, Midnight, Studio, Warm trust, Bold, Executive — plus save your own named presets
    • 🎨 Style panel on My Proposals cards and in the job panel (before generate + after publish)
    • Proposal viewer applies content.theme CSS variables per page (accent, background, text)
    • n8n workflows 11 + 12 — list and patch theme on proposals (re-import required)
  15. Version 10.118

    Update

    • AI Reply: matches the open message thread to your stored proposal — injects job title, cover letter, and key requirements so replies stay on-subject
    • AI Reply panel shows which job/proposal is in context (and whether the link was viewed)
    • Viewed badge: blue ✓ on My Proposals cards and on the job apply panel when your landing page has been opened
    • n8n workflow 11 — proposals/list now returns cover letter excerpt for reply context (re-import required)
  16. Version 10.117

    Update

    • Custom domain: block root/apex domains (e.g. techtonic.works) — must use a subdomain like proposals.yourdomain.com
    • DNS instructions show CNAME host label (proposals) instead of the full FQDN
    • n8n workflow 14 — same apex validation server-side (re-import required)
  17. Version 10.116

    Update

    • Hard version enforcement — outdated extensions are blocked until you update from the Chrome Web Store
    • New update-required screen with store link and version check
    • License validate sends extension version to server (n8n workflow 04 — re-import required)
  18. Version 10.115

    Update

    • Uma shortlist signals panel — scores profile, job nouns, list preview, screening answers, timing, and platform stats
    • Before-submit checklist (manual): Profile highlights, profile alignment, final apply-page review
    • Removed auto profile-highlights modal — reminds you to add up to 4 highlights yourself after Fill
    • Fill status shows Uma reminder when profile highlights or profile tweaks are still needed
  19. Version 10.114

    Update

    • Settings: Send feedback link (upworkwizz.com/feedback) + Leave a Chrome review link
    • Chrome review prompt opens the store reviews tab (/reviews) for faster ratings
  20. Version 10.113

    Update

    • Target niche / industry field on Profile — proposals write as your specialist lane
    • Niche positioning block in Claude prompt: proof only from profile sources, narrow pitch on weak fit
    • Credibility snippets fire when job matches your niche (not just automation keywords)
    • Reply scorecard: new Niche match dimension (9th, /90 total) with skip-or-narrow coaching
  21. Version 10.112

    Update

    • Micro-commitment CTAs — timed call/walkthrough closes (e.g. 20-minute call on first 30 days) for strategy & high-ticket jobs
    • Fallback close uses call invite when Claude omits pricing_next on consulting posts
    • Scorecard rewards specific timed call invites; warns only on passive let me know closes
  22. Version 10.111

    Update

    • Top 1% letter style for strategy & high-ticket jobs — hook, reframe, proof, week-one step, chat CTA
    • Auto length: strategy jobs use compact (~180 words); architecture-first sequencing in prompts
    • Scorecard penalises call invites and stack dumps; coaching tips for CTA and proof polish
  23. Version 10.110

    Update

    • RAG / AI / telemetry / CNC jobs now qualify for architecture, workflow, and stack diagrams
    • Telemetry + RAG Mermaid templates when Claude omits diagrams on data-science posts
    • Diagram warrant check uses full job scope text — fewer false negatives on technical AI jobs
  24. Version 10.109

    Update

    • 2026 reply-readiness scorecard — 8 dimensions (/80) with coaching tips in popup and job panel
    • Client preview strip shows first lines as the client sees them before opening
    • Question-led CTA closes (one strategic question) replace generic discuss-scope endings
    • Job-type detection (simple / technical / strategy / high-ticket / discovery) tunes length and best variant
    • Cover length: Auto, Compact, Medium, Long — compact for simple execution jobs
    • Job age badge (fresh / cooling / late) and boost/profile alignment coaching
    • History outcome tracking — mark Replied, Interview, Hired, or No reply per proposal
  25. Version 10.108

    Update

    • Required proposal opener detection — parses e.g. begin your proposal with: JOB HUNTER AI (colon/newline tolerant)
    • Enforces exact opener as line 1 on every variant before fill — client filter phrases cannot be skipped
    • Job panel shows amber Start with: pill when the post requires a magic opener
  26. Version 10.107

    Update

    • Optional proposal landing page — toggle per job in popup and job panel
    • When off: no publish step and cover letter fill omits Full breakdown + proposal link
    • Settings default for landing pages; section toggles hidden when landing is disabled
  27. Version 10.106

    Update

    • Rotating credibility blocks fully editable in Profile — your saved text replaces the default
    • Toggle to enable/disable blocks on automation jobs; multiple variants separated with ---
  28. Version 10.105

    Update

    • Rotating proposal credibility blocks — built-in automation/Make/n8n/LegalIntel snippet on variant 4 (Proof-Led)
    • Profile: optional extra rotating blocks (separate with ---); picks per job for variety
  29. Version 10.104

    Update

    • Gentle review prompt after 4 successful uses (generate or fill) with Chrome Web Store link
    • Not now dismisses for 21 days; stops after Leave a review or 3 prompts
  30. Version 10.103

    Update

    • Popup Generate uses same screening pipeline as job panel (shared runGenerationJob)
    • Truncated Claude JSON no longer drops screening answers — salvage extracts answers[] + follow-up API call
    • Popup merges job-post previewQuestions with live apply-page questions before generation
  31. Version 10.102

    Update

    • Stronger Vue textarea fill (execCommand fallback) for .inner-textarea screening boxes
    • Index-order screening fill when answer count matches question count
    • Job panel Generate waits for screening fields; debug scan-cached-answers for page console
  32. Version 10.101

    Update

    • Fix screening questions on FreelancerProposalsManagerNuxt apply page (.fe-proposal-job-questions)
    • Stop treating first inner-textarea as cover letter — was blocking all additional-question fills
    • Fill screening answers even when cover letter step fails; Vue InputEvent on textarea setter
  33. Version 10.100

    Update

    • Screening / additional questions: detect Air 3 apply fields (contenteditable, role=textbox, air3-form-item)
    • Fill screening answers via rich-text paste path, not only textarea/input
    • Retry field scan on apply page when SPA loads late; job panel fallback fills all fields
  34. Version 10.99

    Update

    • Clearer error when section toggles fail — points to re-importing n8n workflow 12-proposal-update.json
    • n8n workflow 12: hidden_sections patch + updated_at on save (re-import required on server)
  35. Version 10.98

    Update

    • Key requirements: reject hiring-intro scraps (looking for…, include a…); split compound include-lines into separate bullets
    • Extract from client Core MVP Features / numbered lists; EdTech domain fallback when scrape is thin
    • Claude prompt shows good vs bad key_requirements examples (warranty-style outcomes)
  36. Version 10.97

    Update

    • Key requirements: block UI scraps (needed, then fill), consultant cover-letter lines, and fix need/needed regex bleed
    • Claude prompt spells out what key_requirements must contain — client features only
    • Extraction prefers job description over full page scrape (less Upwork chrome)
  37. Version 10.96

    Update

    • Filter Upwork UI from key requirements: Supported until…, Hourly Protection, Includes Upwork, etc.
  38. Version 10.95

    Update

    • Fix landing page synthesis using CRM/HubSpot boilerplate on non-CRM jobs (e.g. EdTech MVPs)
    • Strip Upwork UI junk from key requirements (Connects, Required for proposal, etc.)
    • EdTech-aware project scope, phases, and diagrams; deliverables/timeline without budget on viewer
  39. Version 10.94

    Update

    • Per-proposal landing page sections — show all by default, hide any section for that job only
    • Toggle sections after generate (apply panel) or anytime in My Proposals → Sections
    • Viewer respects content.hidden_sections (requirements, scope, architecture, deliverables, about, etc.)
  40. Version 10.93

    Update

    • Fix Upwork page crash: duplicate UWIZZ_VARIANT_LETTER_MARKERS_RE in proposal-702010.js (already in proposal-json.js)
  41. Version 10.92

    Update

    • Project Scope is no longer the short Upwork cover letter — thin text is rebuilt from phases + job brief
    • Strips access-request closings from landing scope (Send me access…)
    • Viewer synthesizes rich scope for older publishes that stored only the variant letter
  42. Version 10.91

    Update

    • Fix popup crash on open: refreshPublishStatus was not visible to init()
    • Publish status and proposal base hint helpers moved to module scope
  43. Version 10.90

    Update

    • Fix stack overflow when saving/publishing malformed deep JSON from Claude
    • Support log: export diagnostic .txt from Settings (phase + stack trace per failure)
    • Generation pipeline logs which step failed (prepare, hydrate, post-process, publish, stringify)
  44. Version 10.89

    Update

    • Fix Maximum call stack size exceeded when creating proposals (safe text coercion + JSON publish)
    • Stops re-processing variants 3× before publish; repair pass can re-run post-process safely
    • Landing project_scope no longer steals ambiguous scope field or fails 70/20/10 master validation
  45. Version 10.88

    Update

    • Landing page: detailed Project Scope (separate from short Upwork 70/20/10 letters)
    • Architecture defaults to 3 rich phases with 2–4 components each (like reference proposals)
    • Viewer section renamed from Cover Letter to Project Scope
  46. Version 10.87

    Update

    • Fix missing Regards + proposal link on Upwork job panel (content script now runs the same letter polish as the popup)
    • Always append Full breakdown + URL when publish returns a slug, even if the popup re-parses the result
    • Sign-off uses profile name or title; Regards still added when name is blank
  47. Version 10.86

    Update

    • Cover letters: no pricing or budget lines (Upwork + landing page hold commercial terms)
    • Strips duplicate closings and re-appends Full breakdown click below + proposal URL after publish
    • Fixes missing proposal link when the popup re-processed generation without the published URL
  48. Version 10.85

    Update

    • Cover letter close: invite scope discussion instead of access/credential homework (no more "Reply with HubSpot access…")
    • Standard sign-off: Regards + your profile name, then Full breakdown click below + proposal URL
    • Post-process rewrites bad milestone/access closings and enforces the new ending template
  49. Version 10.84

    Update

    • Landing page diagrams backfill when Claude JSON truncates before proposal.diagrams
    • Synthesizes architecture, workflow, and stack Mermaid from job scope (Make.com, HubSpot, CRM builds, etc.)
    • Accepts graph TD/LR from Claude and normalizes to flowchart for rendering
  50. Version 10.83

    Update

    • 70/20/10 cover letters: markdown format with max 3 sentences per paragraph (no wall-of-text blocks)
    • Auto-split oversized paragraphs after generation; tighter sentence caps for scannable letters
    • Landing page Cover Letter renders markdown (bold, subheads, paragraph breaks)
  51. Version 10.82

    Update

    • Fix sparse landing pages when Claude JSON truncates: hydrate cover letter, key requirements, and architecture from variants + job scope before publish
    • Salvage partial proposal/estimate objects from truncated responses
    • Proposal viewer backfills missing sections from stored variants on read (existing slugs)
  52. Version 10.81

    Update

    • Landing page Architecture: infer milestone count from job post (up to 10 phases) instead of always 3–4
    • Prompt tells Claude to mirror numbered milestones — not compress seven steps into three generic phases
  53. Version 10.80

    Update

    • Sanitize restored proposal cache so object-shaped cover letters cannot crash the popup on load
    • Detect JSON-dump payloads stored as objects, not only strings
  54. Version 10.79

    Update

    • Fix txt.replace is not a function when cover letters or answers are non-string values
    • Coerce all variant and answer fields to plain text before display and fill
  55. Version 10.78

    Fix

    • raw JSON no longer dumped into the cover letter when Claude output is truncated

    Update

    • Salvage all four variant letters from partial JSON; normalize coverletterproblem field names
    • max_tokens raised to 8192 for full 70/20/10 payloads
  56. Version 10.77

    Update

    • Client scoring: heavy spenders ($50k+) no longer penalized hard for 3.5–3.9 ratings
    • Spend tiers up to +4 for $100k+; hire rate 55%+ earns +1; jobs posted and member tenure count
    • Shared client-scorer.js for panel, popup, and queue
  57. Version 10.76

    Update

    • Proposals now use the 70/20/10 framework (problem 70%, solution 20%, price + one next step 10%) — replaces winning formula
    • Client language bank from job post, uploads, and regen notes; four opener tones kept
    • Validator + one automatic repair pass if problem section is not longest
    • Cover letter length: medium default; short option removed
  58. Version 10.75

    Update

    • Critical fix: content script syntax error (extra brace) that prevented the extension from loading on Upwork tabs
    • Added parseFixedBudgetAmount for $4,000 Fixed-price sidebar detection
  59. Version 1.0.447

    Update

    • Fixed-price on apply page: read bridge budget, parse $4,000 Fixed-price from sidebar, ignore client avg hourly in scope
    • Hourly vs fixed classification no longer treats $4k fixed jobs as hourly when budget line says Fixed-price
  60. Version 10.74

    Update

    • Proposal prompts enforce winning formula: clearest specialist, insight-first open, fast proof, low-risk close
    • Four variants and master cover letter must pass the formula checklist before output
  61. Version 10.73

    Update

    • Hardened job scrape and panel (scoped budget, fewer runtime errors on apply page)
    • Fixed-price detection from $100+ including $500 jobs
  62. Version 10.72

    Fix

    • fixed-price jobs ($500, etc.) detected again — ignore client "avg hourly rate paid" on apply page

    Update

    • Parse budgets like "$500 Fixed-price" from job details sidebar
  63. Version 10.71

    Fix

    • Generate Application panel opens again (removed broken isApplyPage reference in buildJobPanel)
  64. Version 10.70

    Fix

    • Generate Application button works again after reloading the extension (no tab refresh required)

    Update

    • Proposal panel starts hidden until opened; safer toggle after upgrade
  65. Version 10.69

    Fix

    • Create Proposal no longer throws when job scrape or panel UI elements are missing

    Update

    • Job panel shows Generate/Fill after SPA navigation to the apply page
  66. Version 10.68

    Update

    • Release build v10.68 — refreshed Chrome Web Store package (upworkwizz.zip)
  67. Version 10.67

    Update

    • Cover letter CTA: 'Full breakdown click below 👇' with proposal URL on the next line (replaces click HERE inline)
    • Landing page strips the CTA block; legacy HERE format still supported
  68. Version 10.66

    Fix

    • project proposals missing Timeline/Deliverables when Claude JSON omits deliverables[] — auto-synthesize from phases + budget before publish

    Update

    • Landing page shows Timeline/Deliverables for older publishes that stored phases but no deliverables array
  69. Version 10.65

    Update

    • Deliverable due dates scale with job duration (e.g. 1–3 months → ~5 week advance, ~8 week final) instead of fixed +14/+28 days
    • Scrape project duration from Upwork job details; landing page shows readable dates (16 Jun 2026)
  70. Version 10.64

    Fix

    • apply page reads full job description + budget from Upwork Nuxt state (not only visible DOM)
    • $5k+ budgets in post text set fixed-price even when Upwork omits the “Fixed” label

    Update

    • Healthcare / platform team SOW titles classify as project mode; progress shows Project vs Discovery before Claude runs
    • Landing page trusts engagement_mode project (no false discovery layout from empty deliverables alone)
  71. Version 10.63

    Fix

    • $80k+ SOW posts no longer stay discovery when Claude returns interview layout — scoped job post overrides model JSON

    Update

    • Scope detection uses full apply-page text (rawPageText), not truncated sidebar description
    • Prompt includes up to 12k chars of job scope for large enterprise posts
  72. Version 10.62

    Update

    • Large fixed-price SOW posts (budget in description, numbered modules, advance/final payment) classify as project mode even when Upwork omits budget on the DOM
    • Parse fixed budget from job description for $5k+ posts before engagement detection and proposal economics
  73. Version 10.61

    Update

    • Floating pill on the job page: "Generate Application" opens the panel; inside the panel the green action stays "Create Proposal"
  74. Version 10.60

    Update

    • Restore Proposal economics on apply page for all jobs (was hidden on discovery/unscoped posts in v10.56)
    • Discovery jobs: hourly rate override only — fixed total hidden so vague posts are not forced into priced milestones
    • Scoped fixed-price jobs: fixed total + hourly overrides work as before
  75. Version 10.58

    Update

    • Scoped project landing pages can include optional architecture, workflow, and tech-stack Mermaid diagrams when the job warrants them
    • Discovery/unscoped jobs never publish diagrams; non-technical posts skip diagram generation
  76. Version 10.57

    Update

    • Widget and popup: primary action renamed from "Generate Application" to "Create Proposal" (clearer vs submitting on Upwork)
    • In-panel loading state shows "Creating…" while drafts generate
  77. Version 10.56

    Update

    • Unscoped/vague job posts (no budget, milestones, or real SOW) auto-detect as discovery — no fabricated hours, $ totals, or paid phase breakdown
    • Landing page uses interview-style sections only; cover letter avoids commercial "Week 1 Deliverable" template
    • Proposal economics UI hidden on discovery/unscoped jobs
  78. Version 10.55

    Fix

    • Fill Into Page on Upwork apply pages that use rich-text (Tiptap) cover letter editors — uses safe synthetic paste like Messages

    Update

    • Clear errors when the cover letter box is missing or paste fails (clipboard fallback + Ctrl+V instructions)
    • Screening answers only count toward filled fields when text actually sticks
  79. Version 10.54

    Update

    • Setup wizard license step: email and key fields stay editable unless validation succeeds (fixes masked read-only fields after failed restore)
    • Removed auto-lock on any saved license key — lock only after successful validate/restore
    • Change email or license key button when license is active; auto-unlock when stored license is inactive
  80. Version 10.53

    Update

    • Chrome Web Store short description updated to match listing (co-pilot, client intel, preview before send)
  81. Version 10.52

    Update

    • Setup wizard: Subscribe button + auto-open checkout when no subscription exists for the email
    • Security: proposal generation, AI Reply, and queue jobs require server-validated license (not just a pasted key)
    • Cannot skip license step or finish setup without validated license + locked key on device
  82. Version 10.51

    Fix

    • Proposal economics override ($8,888 etc.) now flows into Claude prompt and landing page — DOM + saved prefs, not silent fallback to scraped $8,000

    Update

    • Generate always mounts economics UI first; progress shows “Fixed proposal total (your override)”
  83. Version 10.50

    Fix

    • Chrome "already been declared" error after reloading extension — refresh Upwork tab once, or guards skip duplicate injection
  84. Version 10.49

    Fix

    • fixed-price landing page totals always rescale to Proposal economics override (e.g. $8,888 not hourly math)
    • deliverable included flag — string "false" no longer skips paid-milestone scaling
    • auto-queue generation now passes economics overrides and regen notes

    Update

    • Due dates normalized to YYYY-MM-DD before publish
  85. Version 10.48

    Update

    • AI Reply: "Didn't get the role? Ask for feedback" — drafts a polite message asking the client for constructive feedback to improve future proposals
  86. Version 10.47

    Fix

    • duplicate Proposal economics block on job panel (race between panel build and open)
  87. Version 10.46

    Fix

    • proposal economics accordion — safer init, no console errors on job panel reopen
    • corrupted word-boundary regex in profile standing scrape

    Update

    • Proposal economics: compact dropdown (collapsed by default) with live summary
  88. Version 10.45

    Update

    • Proposal economics before Generate: override fixed project total or hourly rate for this job only
    • Overrides flow through Claude prompt, estimate, deliverables, and published landing page (replaces scraped budget / Settings rate)
    • Values remembered per job in popup and floating job panel
  89. Version 10.44

    Update

    • Partnership/shortlist landing pages: interview layout (cover letter first, Relevant experience sections — no Architecture phases or pricing)
    • Claude model dropdown syncs from Anthropic API (includes Opus 4.8); Refresh list in Settings; built-in fallbacks if offline
    • Discovery proposals use discovery_sections instead of phased build plans
  90. Version 10.43

    Update

    • Discovery/partnership jobs (shortlist, trial, future work): auto-detect and suppress 📋 Estimate, deliverables, and timeline
    • Landing page hides pricing sections when suppress_commercial is set; partnership-focused cover letter prompt
    • Fixes fabricated $/hour totals on jobs with no scoped budget (e.g. partner shortlist posts)
  91. Version 10.42

    Update

    • Custom proposal domain: optional setup wizard step + Settings UI; active domain replaces upworkwizz.com for new publishes and My Proposals links
    • Publish syncs domain from Supabase on each proposal; status badge shows your hostname
    • Marketing site section + FAQ for connecting proposals.yourcompany.com
  92. Version 10.41

    Update

    • Subscription gate: cancelled or expired accounts see a Renew screen; co-pilot blocked until active again
    • License + checkout email verified on popup open and before every generate (key cannot be used with another email)
    • Clearer setup wizard and success-page copy: same email as Stripe + key from confirmation email
    • Renew flow: one-click subscribe link, Stripe billing portal, and re-check after payment
  93. Version 10.40

    Update

    • Fix wrong job title: match URL job id in Nuxt state, prefer Job details sidebar DOM, clear stale titles on navigation
    • Landing page title forced to scraped Upwork title (not another job left in Vuex)
    • Popup cache uses same gen_job_<id> key as panel — drops cache when title changes
  94. Version 10.39

    Update

    • Fixed-price proposals now read $80k-style budgets from the full job post (not just the UI budget chip)
    • Deliverables and phases auto-scale to the client fixed budget (55/45 or advance/final split when stated)
    • Landing page strips leftover {{PROPOSAL_URL}} if publish did not inject the link
  95. Version 10.38

    Update

    • Stay Active on Apply tab (home) — start/stop presence without opening the menu
    • Removed ping count and uptime boxes from Stay Active UI
    • Marketing homepage: new Stay Active section + feature card
  96. Version 10.37

    Update

    • New step-by-step Setup wizard: license → Claude API key → GitHub (optional) → preferences — saves and activates as you go
    • Popup opens on Finish setup until license + API key are configured; re-run anytime from Settings
    • Apply tab banner and disabled Generate until setup is complete
  97. Version 10.36

    Update

    • Custom proposal domain in Settings: connect your subdomain (Cloudflare for SaaS), DNS verify, SSL wait, enable/disable toggle
    • n8n workflows 14–17 (custom-domain add/status/remove/enabled) + Supabase migration for custom_hostname columns
    • Proposal publish URLs and My Proposals links use your active custom domain when enabled
  98. Version 10.35

    Update

    • My Proposals: dark cards (no bright white), Draft label removed, proposals grouped by date in collapsible accordions for easier scrolling
  99. Version 10.34

    Update

    • Added n8n import files 11-proposals-list, 12-proposal-update, 13-profile-update — fixes My Proposals 'List failed (500)' when workflows were never deployed
    • Clearer error hint when proposals/list webhook is missing on the server
  100. Version 10.33

    Update

    • Profile proposals stats: '8 proposals sent', bar labels, and Last 7 days pill now use light text on dark surfaces (were dark gray on black)
  101. Version 10.32

    Update

    • Fix unreadable GitHub pills on Apply tab and Profile — repo stats and @user badge now use dark surfaces with light text (were white boxes with pale gray text)
  102. Version 10.31

    Update

    • Extension UI matches upworkwizz.com: dark surfaces (#0a0a0a / #111), green accent #14a800, Manrope + Inter
    • Popup, job application panel, and AI Reply panel restyled — removed leftover light/blue button styles
    • Shared wizz-theme.js tokens for on-page widgets (client intel, estimates, floating buttons)
  103. Version 10.30

    Update

    • Transactional email uses proposal.upworkwizz.com: n8n sends from hello@proposal.upworkwizz.com with reply-to on the same address
    • Proposal page URLs unchanged — still www.upworkwizz.com/<slug>
  104. Version 10.29

    Update

    • One email per account: license key must match the email registered at Stripe checkout — server rejects mismatches
    • Restore my account only looks up existing Supabase rows; new signups must subscribe at upworkwizz.com (no free active keys from the extension)
    • Publishing proposals sends your locked email to n8n so the backend can verify key + email together
  105. Version 10.28

    Update

    • Settings: license key and licensed email lock after first save — fields become read-only so a shared key cannot be copied or swapped to another account
    • Locked license key displays as UPWK-****-****-****-XXXX (last segment only); email shows as d***@d***.com with middle characters hidden
    • Generate Key and email entry are hidden once locked; use Clear all saved data to enter a different license
  106. Version 10.27

    Update

    • Settings → Subscription: new link to manage your Stripe subscription (cancel, renew, update card, view invoices)
    • Opens the Stripe Customer Portal — sign in with the email you used at checkout
  107. Version 10.26

    Update

    • Removed the n8n Host field from Settings — the webhook base URL is now baked into the extension and cannot be changed by users
    • License key generation and proposal publishing always use the preset n8n host (https://n8n.srv1362157.hstgr.cloud)
  108. Version 10.25

    Update

    • Rebranded the extension popup header from 'Autofill v…' to 'Wizz v…' — matches the Upwork Wizz product name
    • Chrome extension list name updated from 'Upwork AI Autofill' to 'Upwork Wizz'
  109. Version 10.22

    Update

    • Fixed job-title extraction on the Apply page (/nx/proposals/job/.../apply/) — the H1 is 'Submit a proposal' there, not the real title. New extractor: tries [data-test="job-title"], [data-cy="job-title"], .job-title, [class*="JobTitle"] and the Job Details sidebar selectors first; blacklists page-heading phrases like 'Submit a proposal', 'Apply now', 'Application'; only falls back to a generic H1 if it passes the blacklist; finally falls back to document.title with Apply/Submit prefixes stripped
    • Result: proposals generated from the apply page now correctly capture the actual job title (e.g. 'AI Implementation Manager – Automation & SaaS Integration (Legal Tech)') and bake it into the cover letter, landing page H1, Supabase upwizz_proposals.job_title column, and notification messages
  110. Version 10.21

    Update

    • Removed stale 'proposal.upworkwizz.com' subdomain references throughout the extension UI — Proposals tab card links, popup help copy, and publishing toast now all show 'www.upworkwizz.com/<slug>' matching the live custom domain
    • Reminder: n8n's WF10 (Proposal Create) Build Response node generates the URL server-side — if you still see Vercel URLs in cover letters, re-import 10-proposal-create.json into n8n (or manually update BASE_URL in the Build Response Code node) and re-activate the workflow
  111. Version 10.20

    Update

    • Cover letter CTA reworded to 'Full breakdown — click HERE: <URL>'. Upwork shows the URL auto-linked next to the call-to-action. On the landing page, this exact sentence is re-rendered as 'Full breakdown — click HERE' with HERE itself as a bold underlined link (raw URL hidden) — a polished hyperlinked CTA, matching the proposal-style landing pages
    • Updated Claude prompt to emit the exact CTA sentence so well-formed cover letters come out clean before any post-processing
    • Landing-page CoverLetter component now detects the 'click HERE: <url>' pattern (em-dash, hyphen, or colon variants tolerated) and renders HERE as the link
  112. Version 10.19

    Update

    • Cleaner URL in cover letter: instead of dumping the full URL inline ('Full breakdown of the architecture, deliverables and timeline here: https://www.upworkwizz.com/abc...'), the cover letter now ends with a short two-line label/URL pair ('Full breakdown:\nhttps://www.upworkwizz.com/abc') so Upwork's chat auto-linker renders it as a clean clickable link on its own line
    • Updated Claude prompt to emit the URL placeholder on its own line with a short lead-in, so well-formed cover letters come out clean before any post-processing
    • Landing page CoverLetter component now auto-detects URLs in the cover letter text and renders them as styled text links (green accent, underline) showing the domain + path label instead of the raw https:// URL — clients see 'www.upworkwizz.com/abc' clickable, not the full noisy URL
    • Footer reworded: '© 2026 Generated with love for Automation · N views' replaces the previous 'Generated with Upwork Wizz' tagline
  113. Version 10.18

    Update

    • Custom domain live: proposal landing pages now use https://www.upworkwizz.com instead of the temporary https://upwork-wizz.vercel.app. Updated DEFAULT_PROPOSAL_BASE in background.js — every new proposal URL embedded in cover letters and new-view notifications routes through the branded domain
    • WF10 Build Response node updated to use the new base URL. Re-import 10-proposal-create.json to apply
  114. Version 10.17

    Update

    • Profile avatar now renders at the top of every proposal landing page (right next to 'Proposal from <name>') AND in the About section, replacing the green initial-letter circle once you have an avatar URL set
    • GitHub Connect: when you connect your GitHub account, the GitHub avatar is auto-saved to settings.profile.avatarUrl (unless you've manually set one) — so the next published proposal renders your photo with zero extra clicks
    • Avatar / display_name / headline / bio now sync to Supabase on EVERY proposal publish — WF10 was extended with a CTE that updates upwizz_licenses in the same transaction as inserting the proposal. Edit your profile in the extension, publish, and the next proposal landing page picks up the change automatically
    • WF00 license/create: when an existing email regenerates a key (Use Existing branch), profile fields are now refreshed via a new 'Refresh Profile' Postgres node — so old licenses with empty avatar_url get backfilled the next time you click Generate Key
  115. Version 10.16

    Update

    • Critical fix: cover letter populated with raw JSON dump — Claude's response was being truncated mid-JSON at 4000 max_tokens (4 variants + master proposal + phases + deliverables + estimate easily exceeds that). Bumped max_tokens to 8000 (Sonnet's safe upper bound) so the closing braces always make it through
    • Robust JSON extraction: replaced the brittle /^```json/ regex with a balanced-brace walker (extractFirstJsonObject) that survives every Claude output shape — ```json fences, ``` fences with 'json' on its own line, prose-prefixed responses, trailing notes after the closing brace. Same extractor mirrored in popup.js so cached results parse too
    • Safety net: when parsing fails the cover letter is no longer populated with the raw JSON dump (which is what put 12,908 chars of '{"bestVariant":1,...}' into Upwork's composer). Cover letter stays empty, Fill Into Page is hard-blocked, and a red error banner explains what happened with an expandable raw-response viewer for debugging
    • Stale-cache cleanup: on popup open, if the cached generatedData for this URL looks like a JSON dump from a pre-v10.16 broken run, it's wiped automatically so you don't keep seeing the old garbage every time you reopen the popup
    • Parse failure also blocks the publish step (no JSON → nothing to publish → no spurious /webhook/proposal/create call with broken data)
  116. Version 10.15

    Fix

    • 'nothing was sent to WF10 /proposal/create' — the license key generated via the Settings tab no longer requires a separate 'Save Settings' click. The key + n8n host are now persisted to chrome.storage.local.settings immediately on generation so the very next proposal publish has the credentials it needs
    • landing page link missing from cover letter — Claude was outputting {{PROPOSALURL}} (no underscore) and field names like coverletter / isfixedprice / whatyouget instead of the expected snake_case. Added two safeguards: (1) a lenient placeholder regex that matches {{PROPOSAL_URL}}, {{PROPOSALURL}}, {{proposal-url}}, etc., and (2) a normalizeProposalFields() pass that maps every common misspelling back to the canonical snake_case names
    • WF06 webhook URL had a UUID prefix (/webhook/<uuid>/proposal/:slug) because n8n auto-prefixes webhooks with path parameters. Switched 06-proposal-public-read.json to read slug from a query string (?slug=abc), giving a clean /webhook/proposal-read URL. proposal-viewer/src/lib/n8n.ts updated to match — Vercel viewer now calls /webhook/proposal-read?slug=<slug>

    Update

    • Visible publish status: during proposal generation the progress bar now shows 'Publishing landing page to Supabase…' between Claude finishing and the popup rendering. On success: '✓ Landing page <url>'. On failure: '⚠ Publish failed: <reason>' so silent skips never happen again
    • Apply page now renders a red banner with the publish error and a hint pointing to Settings → License Key / n8n workflow Active toggle when the proposal generated but the landing page didn't
  117. Version 10.14

    Update

    • Proposal viewer base URL is now driven by DEFAULT_PROPOSAL_BASE constant (https://upwork-wizz.vercel.app) with optional override via settings.proposalBaseUrl — flip to proposal.upworkwizz.com once the custom domain is wired
    • Notification click handler no longer hardcodes proposal.upworkwizz.com — opens the resolved base URL instead, so view-notification clicks land on the actual Vercel deployment
    • Added two new importable n8n workflows: 10-proposal-create.json (extension publishes a proposal here, returns slug + URL) and 06-proposal-public-read.json (Vercel viewer reads from here on every page render)
    • Both new workflows follow the upwizz_ prefixed schema + SQL-quote escaping pattern proven in 00-license-create.json
  118. Version 10.13

    Update

    • AI Reply: strict no-markdown output — Claude prompt now explicitly bans **bold**, *italics*, # headers, `backticks`, ### sub-headers, [links](url), and other markdown that would appear as literal asterisks/hashes in Upwork's plain-text composer
    • AI Reply: paragraph structure preserved — multi-question answers now use plain '1.', '2.', '3.' numbered paragraphs (no markdown emphasis around the numbers)
    • AI Reply: subtle emoji allowed — 0 to 2 professional emojis per reply (👋 ✅ 👍 🙌 💡 ⚡ 🚀) to feel more human; never at the start of the message, never two in a row; emojis like 🤖 / 😂 / 🎉 / 💯 / 🔥 explicitly banned
    • AI Reply: em-dash and en-dash still banned (use commas/periods/and instead) — keeps replies looking human-written
  119. Version 10.12

    Fix

    • clicking into the composer after Insert wiped the reply (Tiptap RangeError: Position X out of range) — root cause was the v10.10 insertReply falling back to innerText assignment + chunked execCommand, which corrupts ProseMirror's internal document model

    Update

    • Insert now uses ONLY a synthetic paste event for contenteditable composers (the safe ProseMirror-friendly path); if that doesn't take, falls straight to clipboard with a clear 'click the box and press Ctrl+V' message
    • Removed all direct DOM mutation strategies (innerText, chunked execCommand) — they were the cause of the disappearing text
    • Detection more lenient: whitespace-normalized probe + length-grew heuristic so Tiptap's paragraph normalization no longer triggers false 'paste failed' falsebacks
    • Status message updated after insert: '✓ Inserted — click in the box to edit, then press Send'
  120. Version 10.11

    Update

    • AI Reply length selector: selected option now lights up bright brand-green (was a subtle white pill that was easy to miss) — Short/Medium/Detailed is clearly a 'pick one length, generate one reply' setting, not three different generation actions
    • Default still Medium; choice persists across sessions; click Generate to produce ONE reply at the chosen length
  121. Version 10.10

    Update

    • AI Reply panel (Upwork messages): new Short / Medium / Detailed length selector — segmented pill control above the textarea, choice persists across sessions
    • AI Reply: Detailed mode now uses up to 2500 max_tokens and explicitly instructs Claude to answer EVERY numbered question (was truncating multi-part answers at 2/3 questions)
    • AI Reply: when the client's latest message contains numbered items (Question 1, 2, 3...), the prompt explicitly counts them and tells Claude not to stop early
    • AI Reply: max_tokens now scales with length — Short=400, Medium=900, Detailed=2500 (was hardcoded 400 for everything)
    • Insert button: completely rewritten for long text + React/Slate-controlled composers — tries synthetic paste event first (best for Slate/Draft/ProseMirror), falls back to chunked insertText with micro-waits, then direct innerText, then clipboard. Long replies that previously failed silently now insert reliably
    • Insert button: better composer detection — finds the real visible editable, skips the AI Reply panel's own textarea, drills into Upwork's wrapper divs
    • Insert timeout for Detailed replies bumped to 60s (large generations can take longer)
  122. Version 10.9

    Fix

    • license generation crashed when profile bio contained an apostrophe (e.g. "If you're losing time...") — n8n workflow now SQL-escapes single quotes before inserting

    Update

    • 00-license-create.json + 01-trial-start.json: Validate Input/Email nodes now double up ' to '' (PostgreSQL string-literal escape) for email + all profile fields
    • 01-trial-start.json: Check Existing License set to Always Output Data + Already Exists? now checks for a non-empty email field (matches the fix shipped in 00-license-create.json)
  123. Version 10.8

    Update

    • Settings → license email field is now a full-width input on its own row (was cramped next to the Generate Key button)
    • Generate Key button is now full-width below the email field — much easier to read and tap
  124. Version 10.7

    Update

    • n8n host is now baked-in (https://n8n.srv1362157.hstgr.cloud) — no setup needed; field is pre-filled and the host is in manifest host_permissions so Chrome doesn't ask for permission
    • Generate License Key now works with just an email — host field can be left untouched
    • Publishing badge now reflects license-key state only (host is always available)
    • Settings field labelled 'preset — leave as-is unless you self-host'
    • background.js + popup.js fall back to DEFAULT_N8N_HOST whenever settings.n8nHost is blank
  125. Version 10.6

    Update

    • Supabase: all tables renamed with upwizz_ prefix (upwizz_licenses, upwizz_proposals, upwizz_proposal_views) so you can host other apps in the same project
    • Views, indexes, triggers and the proposals_with_stats view all carry the new prefix
    • n8n workflows 00-license-create.json and 01-trial-start.json updated to target the prefixed tables
    • SUPABASE.sql ships with an optional ALTER TABLE rename block (commented out) for installs that already ran the old un-prefixed schema
    • Workflow specs (02-10) + SETUP.md + SPEC.md updated to reflect new table names — no behaviour changes, just a clean migration
  126. Version 10.5

    Update

    • Settings: Generate License Key button — calls the new 00-license-create.json n8n workflow to self-issue a UPWK-... key (status='active', unlimited proposals) without needing the email/trial flow
    • Generate Key flow auto-pushes your current Profile fields (name, title, bio, avatar) into the new licenses row so landing pages have an About block immediately
    • n8n host moved above License Key in Settings (you need the host first to generate a key)
  127. Version 10.4

    Update

    • Stronger cover letters — new prompt produces nedthomas.co.uk-style master letter: direct opening, specific past project as proof, sharp framing, week-by-week phases, Bonus paragraph, concrete next step
    • Every generated proposal can now be published to proposal.upworkwizz.com/<slug> automatically (when license key + n8n host are set in Settings)
    • Proposal landing pages include Key Requirements, Architecture phases with components, Cover Letter, What You'll Get, Deliverables table, Timeline, About
    • Link is woven into the cover letter and a Full breakdown here line is appended as a safety net
    • NEW Settings: Upwork Wizz License Key + n8n Host (optional — leave blank to keep current direct-Anthropic flow)
    • NEW Profile field: Avatar URL — shown on every proposal landing page
    • NEW tab: My Proposals — list every proposal with view counts, status (draft/sent/replied/archived), visibility toggle (unlisted/private), copy/open link
    • Profile save now syncs the About block (display name, headline, bio, avatar) to Supabase so landing pages always show current info
    • First-view notifications: Chrome alert when a client opens your proposal link for the first time (and on each new view); click the notification to open the landing page
  128. Version 10.3

    Update

    • Infrastructure groundwork for shareable proposal landing pages at proposal.upworkwizz.com/<slug>
    • Supabase: new proposals + proposal_views tables, license About fields (display_name, headline, bio, avatar_url)
    • n8n: /generate now inserts each proposal into Supabase, returns slug + URL, auto-appends Full breakdown link to every variant
    • n8n: new workflows for GET /proposal/:slug, POST /proposals/list, POST /proposal/update, POST /profile/update
    • New Next.js proposal viewer app under proposal-viewer/ ready to deploy to Vercel (unlisted by default, password-protectable)
  129. Version 10.2

    Update

    • AI Reply: improved sender ownership detection so thread owner/client messages are distinguished from your own messages
    • AI Reply prompt now explicitly treats 'Me:' lines as your previous messages and replies only to the latest client context
  130. Version 10.1

    Update

    • Proposal generation upgraded: stronger implementation-plan style inspired by high-converting proposal structure
    • Cover letters now mirror client requirements, include concrete delivery phases, and avoid generic emoji-heavy phrasing
  131. Version 10.0

    Update

    • Profile Optimizer: Upwork title sanitized — only letters, numbers, space, hyphen, period, pipe allowed
    • Profile Optimizer: strips · — • and other special chars; prompt tells Claude to use only allowed chars
  132. Version 9.9

    Update

    • Profile Optimizer: Upwork title limit 50 chars — prompt enforces it, UI shows count, Copy truncates if over
  133. Version 9.8

    Update

    • Profile Optimizer: results now persist — survive tab switch and popup close
    • Profile Optimizer: '↺ Run again' button to refresh analysis when you have new job history
  134. Version 9.7

    Update

    • Profile Optimizer: fixed — was reading wrong storage key (gen_history). Now uses 'history' where your generated proposals are saved
    • Profile Optimizer: correctly maps jobTitle, relevantSkills, estimate from history entries
  135. Version 9.6

    Update

    • Fixed 'Extension context invalidated' error — safe guards when extension reloads while Upwork page open
    • Queue panel and job panel polling use safeStorageGet/safeStorageSet; intervals stop when context invalid
    • Green color scheme: Queue Jobs button, queue panel, job panel, popup, and Queue tab now use green (#14a800) throughout
    • Replaced purple/indigo accents with green — attach button, skills pills, badges, filters, progress bars
  136. Version 9.5

    Update

    • History: background now saves when generation completes — works even if popup/panel closed
    • History: project estimate shown correctly (fixed-price uses client budget)
  137. Version 9.4

    Update

    • Attach documents, Generate Application, Fill into page — only on apply page
    • On job page: shows 'Open the apply page to generate your proposal'
  138. Version 9.3

    Update

    • Client stats cached from job page — shown on apply page until you switch jobs
    • Notice when no stats: 'Return to see client stats'
  139. Version 9.2

    Update

    • Risk assessment: when client stats not found (e.g. on apply page), show notice instead of 'High risk'
    • Notice: 'Client stats not available — open the job page to view details'
  140. Version 9.1

    Update

    • Hourly jobs: no underpriced warning or budget advice — hourly has no fixed budget constraint
    • Underpriced banner and 'above stated budget' note only for fixed-price jobs
  141. Version 9.0

    Update

    • DOCX and PDF support: attach .docx and .pdf files — text extracted and sent to Claude
    • Uses mammoth.js for Word docs, PDF.js for PDFs (text-based PDFs only)
  142. Version 8.9

    Update

    • Attach documents button: cleaner dashed-border style with hover state
    • Long file names truncated to 24 chars + … + extension (e.g. DHC_Autonomous_Fran….docx)
    • DOCX error message: 'DOCX not supported — save as .txt or paste into Regeneration notes'
  143. Version 8.8

    Update

    • Attach documents: upload .txt, .md files with job spec — content sent to Claude in the prompt
    • In-page Generate Application panel: 📎 Attach documents button before Generate
    • Popup Apply tab: same Attach documents option
    • DOCX: save as .txt or paste into Regeneration notes (browser DOCX parsing not yet supported)
  144. Version 8.7

    Update

    • Fixed Job spec dropdown: description now extracted via multiple selectors + fallback parsing of card text
    • Job spec shows 'No description from card' when unavailable; uses job.description for alert-sourced jobs
  145. Version 8.6

    Update

    • Queue job cards: Job spec dropdown — expandable preview with description snippet, skills, budget, job type, location
    • Queue job cards: Budget display — shows 💰 Hourly $X/hr or Fixed $X clearly on each card
    • Queue job cards: Client location — 📍 scraped from job cards (with country fallback), shown on card and in spec
    • Queue job cards: Score analysis — replaces raw number with labels: Worth applying / Proceed with caution / High risk / Skip — low value
    • Scan: Added clientLocation and descriptionSnippet to scraped job data from search results
    • Queue panel and popup Queue tab: both updated with same enhancements
  146. Version 8.5

    Update

    • Fixed Stay Active menu dot — now correctly appears next to Stay Active (not Changelog) when keeper is running
    • Fixed Changelog new-version dot alignment using inline layout instead of broken absolute positioning
    • CSP fix: removed inline onmouseover/onmouseout handlers from Refresh button, replaced with CSS hover
  147. Version 8.3

    Update

    • CSP compliance: removed all inline event handlers that violated Content Security Policy
    • Refresh button now uses CSS class for hover styling instead of inline JS handlers
  148. Version 8.2

    Update

    • Proposals section redesigned to match Upwork's own bar chart layout
    • Horizontal proportional bars with cyan-to-blue gradient for Sent / Viewed / Interviews / Hired
    • Timestamp and 'Last 7 days' pill shown in proposals header
  149. Version 8.1

    Update

    • Job Success Score now correctly scraped from upwork.com/nx/my-stats/ (was reading wrong page)
    • Proposals stats (Sent, Viewed, Interviews, Hired) added to Account Health card
    • Refresh now syncs both account-health and my-stats pages and merges results
  150. Version 8.0

    Update

    • Account Health card redesigned: white theme with shadow, replaces dark card
    • Animated SVG speedometer gauge for Job Success Score with colour-coded arc and needle
    • No auto-check on popup open — card only loads cached data, Refresh button triggers sync
    • JSS scraping added to account health page scraper
  151. Version 7.9

    Update

    • Account Health card added to My Profile tab with Platform Access and Account Standing tiles
    • Sync button opens account-health page in background tab, scrapes and caches status
    • Colour-coded status: green (Full/Good), amber (Fair/Limited), orange (At Risk), red (Suspended)
  152. Version 7.1

    New

    • Sync from Upwork button on Profile tab

    Update

    • Scrapes your live Upwork profile page: name, title, bio, skills, hourly rate
    • Also captures JSS, total jobs, total hours, Top Rated badge, location
    • Works on your open profile tab — no URL needed, detects it automatically
    • Multi-strategy DOM selectors: tries data-test attrs, Air3 class patterns, regex fallbacks
    • Falls back to scripting injection if content script not yet active on profile tab
    • Auto-saves profile URL so future syncs find your page instantly
    • Sync status bar shows scraped summary: name, JSS, rate, Top Rated badge
    • Scraped data auto-saved to storage — no need to click Save Profile separately
  153. Version 7.0

    New

    • Job Alerts — polls Upwork RSS feeds every 90s for new matching jobs
    • Profile Optimizer tab — AI analysis of your last 20 applied jobs

    Update

    • Browser notifications fire instantly with job title, budget, and client score
    • Notification buttons: Queue & Generate (auto-queues + starts generation) or View Job
    • Create unlimited saved searches with filters: keywords, job type, min budget, min score
    • Auto-queue option: new alert jobs go straight to queue and generate while you sleep
    • Alert log shows last 100 jobs detected with score, budget, and alert name
    • Rewrites your profile title and overview opening based on actual job patterns
    • Keyword gap analysis: skills appearing in jobs but missing from your profile
    • Skills to add (green) and skills to remove (red) — based on real job data, not generic advice
    • Positioning insight: explains your strongest niche and one specific profile strategy change
    • Copy buttons on all suggestions for instant paste into Upwork profile
  154. Version 6.4

    Fix

    • storage listener now calls chrome.storage.local.get('settings') before running reply generation

    Update

    • Fixed: 'settings is not defined' error crashing AI Reply generation
    • Root cause: storage.onChanged listener had no access to settings variable — only runGenerationJob did
    • Model preference now correctly applied to AI Reply (was always falling back to Sonnet default)
  155. Version 6.3

    New

    • Anti-AI instruction detector — reads job description and extracts any human-proof rules the client has set
    • Model selector in Settings — choose between Sonnet 4.6 (default), Opus 4.6 (most capable), Haiku 4.5 (cheapest)

    Update

    • Detected rules injected into Claude prompt as ⚠ HUMAN-PROOF INSTRUCTIONS block — applied to all 4 variants
    • Catches: start with 'phrase', include the word 'X', favourite colour test, no AI/ChatGPT rules, prove you read this, quoted openers
    • Selected model persists in storage and applies to all generation: cover letters, estimates, AI reply
    • Stronger human-voice rules on ALL proposals: banned AI opener phrases, filler buzzwords, generic salesy language
    • AI Reply prompt updated: vary sentence length, never start with AI openers, sound like a real experienced person
  156. Version 6.2

    Update

    • Fixed: Log tab was hidden — all 7 nav tabs now fit in the popup header
    • Nav tab padding reduced (12px → 6px), font size 12px → 11px, gap removed
    • Added overflow-x: auto with hidden scrollbar as safety net for future tabs
  157. Version 6.1

    Update

    • Fixed: Opening a queued job via 'Open Job & Apply' showed blank Generate Application panel
    • loadCachedJobResult() now searches autoqueue_jobs storage as fallback — matches by job ID fragment (~xxxxxxx)
    • Queue result promoted into gen_job_ cache on first match so future opens are instant
    • Background processor now writes gen_job_<id> cache key at moment queue job completes
    • Result restore works even for jobs generated before v6.1 via the queue fallback scan
  158. Version 6.0

    Update

    • Fixed: Generated proposals no longer restore when reopening job panel — was a cache key mismatch
    • New jobCacheKey() extracts stable job ID (~022029...) from URL — no more fragile btoa() mismatches
    • Cache load now accepts results with variants[] array OR top-level coverLetter
    • Fixed: 'Open Job & Apply' button in popup Queue tab silently failed — aqOpenTab() was called but never defined in queue.js
    • Added aqOpenTab() definition to queue.js with chrome?.tabs?.create guard + window.open fallback
    • Fixed bare chrome.tabs.create in popup.js find-work redirect
  159. Version 5.9

    Update

    • Fixed: Uncaught TypeError 'Cannot read properties of undefined (reading create)' on search pages
    • Root cause: extension context invalidation makes chrome.tabs undefined even though chrome object exists
    • Added aqOpenTab() helper in queue.js — checks chrome?.tabs?.create before calling, falls back to window.open
    • Same guard added to popup.js Open & Apply button
  160. Version 5.8

    Update

    • Fixed: Queue panel Preview/Hide button text was white on white background after processing
    • Added explicit color:#333 to .uqp-btn-sm — affects Preview, Hide and Remove buttons
  161. Version 5.7

    Update

    • Fixed: Jobs showing Upwork's native 'Applied' badge were still being queued on scan
    • Scraper now detects [data-test='applied-badge'], [class*='AppliedBadge'], and any visible element with text 'Applied'
    • Applied cards skipped at DOM level before storage deduplication — never enter the queue
  162. Version 5.6

    Update

    • Fixed: Re-scanning a search page re-queued jobs already marked as applied
    • Storage-level deduplication checks both url and applyUrl fields
    • Job ID fragment matching (~abc123) catches URL format mismatches between card and apply page
    • Applied jobs silently skipped — not counted as skipped in the queue stats
  163. Version 5.5

    Update

    • Fixed: /ab/notifications/ and /nx/proposals/ list page showed Queue button
    • New isUtilityPage() guard covers notifications, proposals list, my-jobs, reports, homepage
    • isJobPage() now explicitly rejects bare /nx/proposals/ and /ab/proposals/ list paths
    • Queue panel and button removed when navigating to utility pages
  164. Version 5.4

    New

    • Regeneration Notes — add context to guide Claude without overriding the client's job scope

    Update

    • ↺ regen button in job panel opens a notes textarea before regenerating
    • Popup Apply tab ↺ button also opens notes area + 'Regenerate with Notes' button
    • Notes injected into Claude prompt as protected instruction block — e.g. 'Client uses React + Supabase, avoid Next.js'
    • Notes cleared automatically on Clear
  165. Version 5.3

    New

    • Queue Jobs button now opens a slide-in panel — same UX as Generate Application

    Update

    • Panel shows stats bar, Scan & Queue This Page button, filter controls, live job cards
    • Job cards have ▾ Preview expand, Open & Apply, Mark Applied buttons
    • Process Jobs / Stop in footer — starts/stops background generator
    • Live 2s refresh with inline progress bar updates; previews stay open during refresh
    • Panel cleaned up on SPA navigation away from search pages
  166. Version 5.2

    Update

    • Fixed: /nx/proposals/job/~/apply/ page showed Queue button instead of Generate Application
    • tryInjectQueueButton() now checks isJobPage() and isMessagesPage() first and bails immediately
  167. Version 5.1

    Update

    • Fixed: Queue panel preview collapsed every time the mouse moved over the Upwork page
    • Replaced subtree MutationObserver with URL-polling interval — no more DOM churn from mouse events
    • Queue auto-refresh skips full re-render when a preview card is open; updates progress bars inline only
    • Added aq-prog-fill and aq-prog-step classes to progress elements for inline targeting
  168. Version 5.0

    New

    • Auto-Apply Queue — bulk generate cover letters for multiple jobs hands-free

    Update

    • Purple ⚡ Queue Jobs button appears on Upwork search results pages
    • Scans all visible job cards, scores each client, skips red-flag clients automatically
    • Background generates cover letters one by one with 90-150s human-like delay between jobs
    • Queue tab: stats dashboard (Queued / Ready / Applied / Skipped), live progress bars per job
    • Start / Stop button controls background generation without closing the popup
    • Filter controls: skip red clients, min client score slider, max queue size, auto-generate toggle
    • Ready cards: expand to preview cover letter + matched skills, then Open Job & Apply in one click
    • Mark Applied button tracks which jobs you've submitted
    • Auto-refresh: Queue tab updates every 2s while generation is running
    • All state persisted in storage — survives popup close, browser restart
  169. Version 4.7

    New

    • Auto-Queue system — semi-automated pipeline to scan, generate, and review applications at scale

    Update

    • Queue tab in popup: stats dashboard (queued / ready / applied / skipped), filter controls, job cards with preview
    • Queue Jobs button (indigo) appears on Upwork search results pages — scrapes all visible job cards
    • Filters: skip red-flag clients, minimum client score slider, max queue size, auto-generate toggle
    • Background processor: picks pending jobs one at a time, runs full generation pipeline, 90–150s human-like delay between jobs
    • Start / Stop Processing controls — you stay in full control of when generation runs
    • Ready cards: preview cover letter, matched skills, Open & Apply button, Mark Applied button
    • Generating cards: live mini progress bar + step label per job
    • Skipped cards: show reason (score too low, queue full, already applied)
    • Auto-refresh: Queue tab polls every 2s while jobs are generating
    • All filters persist across sessions in chrome.storage
  170. Version 4.5

    Update

    • Job panel now shows full job preview card: title, 💰 budget pill, job type, experience level, skill tags
    • Budget (e.g. '$18.00 - $40.00') displayed prominently in green pill at the top of the panel
    • Skills shown in indigo tags matching the popup display exactly
  171. Version 4.4

    Update

    • Job panel now mirrors popup exactly: client intel, estimate panel, estimate toggle, variant tabs
    • Client Intelligence panel in job panel: traffic light score, all signals, expandable Details toggle
    • Estimate panel: full phase breakdown, hours, cost, underpriced warning in the slide-in panel
    • Append estimate to cover letter checkbox works in the panel (same as popup)
    • 4 variant tabs with ★ on recommended, hook hint line, bestVariantReason callout
    • Matched Skills (green) + Portfolio repos (indigo) pills shown after generation
    • Fill button appends estimate text to cover letter if toggle is checked
    • Direct fill fallback: if background route fails, fills current page fields directly
  172. Version 4.3

    Update

    • Fixed: ReferenceError 'Cannot access jobPanelEl before initialization'
    • All job panel state variables moved above onUrlChange() where they are referenced
    • Removed duplicate let declarations that caused the temporal dead zone error
  173. Version 4.2

    New

    • Generate Application slide-in panel on all job listing and apply pages

    Update

    • Green ⚡ Generate Application button appears fixed bottom-right on /jobs/ and /proposals/ pages
    • Full generation pipeline triggered from page — no need to open the popup
    • Live progress bar + step log inside the panel during generation
    • Variant tabs, cover letter editor, Fill into page button all in the panel
    • Results cached per job URL — reopening the panel restores last generated application
    • SPA-aware: button appears/disappears as you navigate between job and message pages
    • background.js FILL_FROM_PANEL handler routes fill to the active tab's content script
  174. Version 4.1

    Update

    • Fixed: AI Reply textarea showing dark background with invisible text
    • Reply textarea now explicitly sets background:#fff and color:#111 — unaffected by Upwork dark theme
  175. Version 4.0

    Update

    • Fixed: 'No API key' error in AI Reply panel — key is stored as settings.apiKey not top-level apiKey
    • Fixed: 'Message channel closed' errors eliminated entirely for AI Reply
    • New architecture: content script writes msg_reply_ key to storage, background watches storage.onChanged
    • No sendMessage involved for reply generation — zero timeout risk, no channel errors
    • Background picks up pending requests via chrome.storage.onChanged listener
  176. Version 3.9

    Update

    • Fixed: 'Could not read messages' — rewrote scraper with 3-strategy DOM approach
    • Strategy 1: data-qa attributes (most reliable); Strategy 2: air3- component classes
    • Strategy 3: nuclear DOM TreeWalker — crawls entire page for message-like leaf text nodes
    • Deduplicates parent/child text overlaps, filters timestamps and nav elements
    • Fixed: 'Message channel closed' for reply generation — switched to storage polling pattern
    • Content script writes replyKey to storage, background writes result back, content polls every 500ms
  177. Version 3.8

    New

    • AI Reply panel for Upwork Messages — works on /messages/rooms/ pages

    Update

    • Floating green ⚡ AI Reply button appears when you open any message thread
    • Slide-in panel reads the last 20 messages, sends to Claude, drafts a warm friendly reply
    • Tone: friendly and warm, no stiff greetings or sign-offs mid-thread, plain text only
    • Insert button fills the Upwork composer directly (falls back to clipboard if needed)
    • SPA-aware: button appears/disappears as you navigate in/out of message threads
  178. Version 3.7

    Update

    • Fixed: 'Extension context invalidated' crash when extension reloads while tab is open
    • Added isContextValid() guard — Stay Active interval self-stops cleanly if context is lost
    • Added safeSend() wrapper — all chrome.runtime.sendMessage calls now silently swallow context errors
    • Auto-start on page load skipped if extension context is already invalid
    • New Upwork logo icons (16/32/48/128px): green rounded square with bold white U and ⚡ badge
  179. Version 3.6

    Update

    • Fixed: question autofill failing on apply form — added Strategy 0: label-walking
    • Strategy 0 targets Upwork's actual React apply form DOM: walks every label, finds associated input
    • Text-similarity matching: answers matched to fields by shared keyword score, not array index
    • answeredQuestions array from AI response used as anchor for similarity matching
    • Debug info added to GET_APPLICATION_FIELDS: field count + first 40 chars of each question
  180. Version 3.5

    New

    • Stay Active tab — keeps Upwork from marking you offline when switching tabs

    Update

    • Dispatches mousemove events every 25 seconds with random coordinates
    • Overrides document.visibilityState to always return 'visible'
    • Blocks visibilitychange and webkitvisibilitychange events from reaching Upwork
    • Live ping counter and uptime display (Xs / Xm Xs / Xh Xm format)
    • Pulsing green dot animation when active; grey when inactive
    • Badge 'ON' shown on extension icon when Stay Active is running
    • Auto-restarts on page reload if previously enabled (persisted in storage)
  181. Version 3.4

    Update

    • Comprehensive question scraping: 3-strategy approach covers aria-labelledby, label[for], numbered lists, parent text
    • Scrapes questions from job listing page (before apply form loads) via previewQuestions
    • Background merges listing questions + apply form questions so nothing is missed
    • GitHub URL and Website fields added to Profile tab — auto-answers 'Include a link to your GitHub' questions
    • Claude given explicit GitHub URL / website from profile when answering URL-type questions
    • Covers input[type=url] and input[type=email] fields in addition to textareas
  182. Version 3.3

    Update

    • Client Intelligence Panel: traffic light score (red/amber/green) shown before generating
    • Scores payment verification, rating, hire rate, total spend, avg hourly vs your rate
    • Score -10 to +10: green = Strong client, amber = Caution, red = High risk — consider skipping
    • Expandable Details section shows each signal with icon and context
    • Client meta: location, jobs posted, member since shown as pills
    • Avg hourly paid checked against your rate — warns if client historically underpays
  183. Version 3.2

    Update

    • Fixed: ReferenceError setStatusText is not defined — replaced with renderProgress
    • Fixed: init() re-attach code now calls renderProgress instead of the deleted setStatusText
    • Confirmed: old GitHub pipeline code fully removed from popup.js
  184. Version 3.1

    Update

    • Fixed: entire generation pipeline moved to background.js — switching tabs no longer breaks it
    • Live progress bar with % (2% → 100%) updates from background every 600ms
    • Step log panel: each stage appends a new line (Starting up, Matching GitHub, Reading READMEs, Writing, Waiting for Claude)
    • Active step shown bold; completed steps greyed out
    • Progress box auto-hides when generation completes or is cancelled
  185. Version 3.0

    Update

    • Cancel button (✕) appears next to Generate while generation is in progress
    • 90-second hard timeout: auto-fails with clear error if Claude takes too long
    • Elapsed time counter shown in status text
    • Cancel cleans up background job storage so a fresh generate works immediately after
  186. Version 2.9

    Update

    • Fixed-price job detection: reads isFixedPrice + budgetValue from the page
    • Fixed-price: phases shown as % of client budget, total anchors to their stated budget
    • Underpriced warning: amber banner + note if your hourly rate exceeds the fixed budget
    • Estimate panel shows 'Fixed-Price' vs 'Estimate' label depending on job type
  187. Version 2.8

    Update

    • Fixed CSP violation: removed all inline onclick= handlers blocked by Chrome extension policy
    • Browse Jobs button now uses chrome.tabs.create instead of window.open
    • History job link (↗) uses data-url + delegated addEventListener
  188. Version 2.7

    Update

    • Checkbox: Append project estimate to cover letter when filling
    • Estimate appended in cover letter paragraph style — plain sentences, no dashes or bullets
    • Live preview updates instantly when toggling the checkbox
    • Toggle preference persisted across sessions
  189. Version 2.6

    Update

    • Generation now runs in background.js — closing or switching tabs no longer cancels it
    • Reopening popup mid-generation re-attaches to the in-progress job automatically
    • Claude selects the best fitting variant for each job and explains why (shown as blue callout)
    • Active variant tab shows a ★ marker; clear button (✕) resets the output panel
  190. Version 2.5

    Update

    • Banned em dashes (—) and en dashes (–) from all generated text — a known AI writing tell
    • Double-layer removal: stripMarkdown in popup.js + strip() in content.js both catch dashes at fill time
  191. Version 2.4

    Update

    • 4 proposal variants per job — each with a different opening hook strategy
    • Strategies: Workflow Bottleneck / Architecture Question / Scaling+Outcome / Direct Proof
    • Variant tab switcher in output panel — click to preview, fill whichever you choose
    • Hint line under tabs shows the opening angle for quick picking
    • Claude token budget increased to 4,000 to support all 4 variants in one pass
  192. Version 2.3

    Update

    • GitHub repos scored by keyword relevance against the job — most relevant ones selected automatically
    • READMEs fetched for top 5 matching repos and fed into Claude as real project detail
    • Claude weaves in specific project names and README details as portfolio proof
    • Portfolio Used badge shows which repos were referenced in each generated application
  193. Version 2.2

    Update

    • GitHub integration — connect via Personal Access Token to include real projects in proposals
    • Fetches all public and private repos (paginated) with language, topics, description
    • Claude automatically references relevant repos by name as proof points in cover letters
    • GitHub PAT stored securely in chrome.storage.local — never leaves your browser
  194. Version 2.1

    Update

    • Fixed 'Illegal invocation: TypeError' when filling the cover letter field
    • Native value setter now explicitly uses HTMLTextAreaElement prototype
  195. Version 2.0

    Update

    • Cover letters now written in short paragraphs with blank lines — no walls of text
    • Sentences capped at 20 words for punchy, scannable writing
    • Preview renders each paragraph separately with proper spacing
  196. Version 1.9

    Update

    • Copy button on Project Estimate panel — copies as clean plain text
    • Copy button confirms with 'Copied!' feedback then resets
  197. Version 1.8

    Update

    • Cover letters include 2-4 relevant emojis matched to project type (🤖 AI, ⚡ automation, 📊 CRM, etc.)
    • All markdown stripped before insert — no asterisks, headers, or bullet points in form fields
    • Double-layer markdown stripping: after Claude response and again in content.js before fill
  198. Version 1.7

    Update

    • Complete UI redesign — clean light theme, Manrope headings + Inter body typography
    • Underline tab navigation, solid button hierarchy, soft shadow cards
    • Blue accent system; estimate panel uses blue header bar with white cost display
  199. Version 1.6

    Update

    • Rate increase dropdowns auto-set to Never on fill
    • Project cost estimator: breaks job into phases with hours and cost per phase
    • Estimate uses your hourly rate from Settings to calculate total project cost
  200. Version 1.5

    Update

    • Fixed 'message channel closed' spam — popup uses safe PING-first messaging
    • Fill now shows specific error if not on the Apply page vs general failure
    • Apply tab shows warning when extension needs a page reload to connect
  201. Version 1.4

    Update

    • Generated application persists when popup closes — no need to regenerate
    • History tab — browse, expand, copy and delete past cover letters
    • Fill reports how many fields were successfully filled
  202. Version 1.3

    Update

    • Fixed CORS error — added anthropic-dangerous-direct-browser-access header
    • Fixed message channel closed errors in background.js and content.js
    • Switched to claude-sonnet-4-6 model
  203. Version 1.2

    Update

    • Pre-loaded full skill stack (Automation, AI, CRM, Dev, Scraping etc.)
    • Improved Claude prompt — picks only 2-4 most relevant skills per job
    • Matched Skills badge row in output panel
  204. Version 1.1

    Update

    • Profile tab with name, bio, skills, rate, tone, achievements
    • Settings tab with API key, cover letter length, auto-fill mode
    • Output panel with cover letter preview before filling
    • Regenerate button + screening question detection and auto-answering
  205. Version 1.0

    Update

    • Initial release
    • Job spec scraping from Upwork listing pages
    • Claude AI cover letter generation
    • Auto-fill into Upwork application form fields

Build audit synced 24 June 2026 · Home · Guided tour

Changelog & Updates — Upwork Wizz Chrome Extension