=== PaintClarity - Full Changelog ===

Complete release history. The most recent releases also appear in the Changelog section of readme.txt.

== Changelog ==

= 1.2.057 =
* New Production Rates page, under Tools in the menu as "Rates". It works out how much area one painter covers in one day from the jobs you have already finished: your logged hours and the paintable area on each job. The headline is your own figure, with a breakdown per job category beside it, and the rate you quote from underneath so you can see the two next to each other.
* Every finished job in the window is listed, not just the ones that can be scored. A job with no paintable area recorded shows an "Add area" link instead of a rate, so it is obvious what is missing rather than quietly absent. You can look at the last 5, 10, 20 or 50 completed jobs.
* A job whose numbers look impossible, under 25 or over 2,000 sq ft per painter per day, is set aside in its own section with the reason explained, and is not counted. Usually it means an area was typed with a digit too many, or hours have not been logged yet.
* You have the last word on any job. "Count it anyway" puts an unusual but real job back in, "Leave out" takes a job out, and either can be undone. Four sprayers in a warehouse really do move that fast, and PaintClarity should not argue with you about it.
* New Production rate setting under Business > Pricing Rules, with an optional override per job category under Job Categories. The Labor Days & Crew Cost Calculator now starts from that figure and tells you which one it used and where to change it, instead of a general number out of a book.
* New Paintable Area field on the job form, and the Paint Calculator can save its own result straight onto the job with one click, which is what feeds the rates above. The calculator now confirms the save instead of leaving you wondering whether the click landed.
* Fixed: on a site set to metric units, the Paintable Area field could refuse to let the job form save at all.

= 1.2.056 =
* New installs now start with the calculators that suit each job category instead of just one. Residential Painting opens a quote with the Paint Calculator, the Paint Quantity Calculator and the Cabinet & Trim Calculator; Commercial Painting gets Paint, Paint Quantity and Labor Days. The category screen has allowed several calculators for a while, but every category still shipped naming only one, so four of the five sat unused in settings where nobody looks.
* The Fence and Handyman category templates were shipping with no calculator at all. Fence now comes with the Deck/Fence Staining Calculator it was built for, and Handyman with the Labor Days & Crew Cost Calculator.
* If you have already set your own calculators, nothing changes. Your selections are left exactly as you made them.

= 1.2.055 =
* Fixed five links in the app that pointed at pages which no longer exist. The Help Center button on the Help page, the "how do I do a full backup" link on the Business page, the plugin author link, and two of the starter links on the Resources page (the PaintClarity Software Tutorial and Getting the Most out of PaintClarity) were all still using addresses from before the plugin was renamed, so each one landed on a "page not found".
* If your Resources page already has those two starter links, they are corrected for you on update. A link you edited or replaced yourself is left alone.

= 1.2.054 =
* Export Personal Data now includes everything it should: the state or region on the address, the inclusions and exclusions, the itemized lines as the customer saw them on their quote, the reason they gave if they declined, and when and how many times they opened their quote link.
* Erase Personal Data now clears the state on the customer record and on every job, and the reason the customer gave for declining. Those were being left behind.
* Erasing now also tells you if scope or internal notes on the customer's jobs were kept, since free text can name someone anywhere inside it and no automated pass can tell.

= 1.2.053 =
* Fixed, and important if you ever run a data request: Export and Erase Personal Data were following the wrong link from a customer to their jobs. PaintClarity stores two different ids on a job, one for the customer record and an older one for a WordPress user account, and the data tools were reading the older one. A request could therefore miss jobs that did belong to the person, and in an erase it could have reached records belonging to someone else. Both now follow the customer record. If you ran an export or erase on 1.2.052, please run it again.

= 1.2.052 =
* Quote and invoice pages are now blocked from search engines, so a link you email a customer stays out of search results even if it gets forwarded or shared.
* Data requests: Tools -> Export Personal Data and Tools -> Erase Personal Data now search PaintClarity by email address, covering the customer record, jobs, quotes, invoices, payments and the emails you sent them.
* Erasing a customer anonymizes rather than deletes. Quotes, invoices and payments keep their amounts and dates and lose the personal details, so your books stay intact, and links previously sent to that customer stop working.
* Suggested privacy policy wording for what PaintClarity stores and who else sees it now appears under Settings -> Privacy -> Policy Guide.
* New Settings -> Privacy & Customer Data section with three optional retention limits, all off by default. Everything here is in the free plugin.

= 1.2.051 =
* Job search results: the job title and its status chips were indented further than the rest of the card. Everything in the card lines up now.
* Not Won: the Call, Text and Email strip renders as the segmented control it was meant to be in the row view as well as the board, and the row has room above it. In the row view it had been drawing as three plain links run together.
* File a Receipt, job expenses and the vehicle log: the "Scan Receipt with AI" and "Manually Enter" buttons are spaced apart. They were separated by a left margin, which does nothing once the pair wraps onto two lines, which on a phone is always.

= 1.2.050 =
* Sign out. The app had no logout anywhere: an Administrator could leave through WP Admin, but a Painter/Helper had no way off the app at all. It now sits next to your name at the foot of the menu, on both the sidebar and the phone menu, and signing out clears the cached job pages so a shared phone does not keep the last person's work readable.
* Jobs: the Not Won drawer is in the row view as well as the board. A lost lead appears in no column and no row section, so that drawer is the only route back to one, and it was only ever drawn under the board.
* Jobs: the Communication section is on the board view as well as the rows view, including its "nothing logged yet" state.
* Vehicle Log: every field on the page is one height again. Most of the form was rendering at 34px while a few fields came out at 45px, so a single row could hold a tall Date next to a short Driver. The Log and Report filter row is deliberately left compact.
* File a Receipt: the two Receipt search date boxes were taller than the Search button beside them. All three now match.

= 1.2.049 =
* Jobs board: removed the white card that wrapped the three columns. The screen was three surfaces deep, a card holding tinted columns holding job cards, and the outer one carried no information. The columns now sit on the page like the row view's sections do.

= 1.2.048 =
* Editing a job or request now shows where it sits and lets you move it: Back to Request, Mark Completed, Reopen as Job, Mark as Not Won, whichever apply. The same buttons the board has, on the one screen dedicated to editing the record, which had none of them.
* A request marked Not Won can be reopened. It drops off the board entirely, so until now there was no obvious way back.

= 1.2.047 =
* Jobs: the Actions menu on the "Needs Your Attention" rows (Completed Jobs With a Balance Due, Completed Jobs Missing Expenses) opened far away from the row you clicked, usually off the visible screen. It now opens directly under its row.
* A job with no category no longer has the word "Uncategorized" pushed in front of its name anywhere it is listed. "Deck stain", not "Uncategorized Deck stain".

= 1.2.046 =
* Painters/Helpers: "Can manage financials" now means what it says. It gives full financial access to the jobs that person is assigned to, and no longer opens the business-wide Profits and Rankings pages, which showed year-to-date profit, margin, every job in the book, and each crew member's profit share. Per-job access is unchanged.
* Painters/Helpers: Expenses, Business and Checkup are no longer shown to a painter. They led nowhere: clicking one quietly reloaded My Jobs.
* Painters/Helpers: Help now opens for a painter instead of reloading My Jobs.
* A job whose category is missing or was deleted shows "Uncategorized" instead of a bracketed number. Job titles read "Job #14 Kitchen repaint" rather than "Job #14 [0] Kitchen repaint", and the same fix reaches the quote PDF headline and customer emails.
* Permission messages are a proper card with a heading and a way back to your jobs, instead of one sentence on a blank page.
* New Quote: the "add a Google Maps key in Settings" link only shows to someone who can open Settings. Everyone else is told to ask the office.

= 1.2.045 =
* Jobs board: the empty Requests column no longer shows its own "+ New Request" button. It pointed at the same screen as the New Job button at the top of the page, so the same action was offered twice within one scroll. The column now just says what lands there.

= 1.2.044 =
* New Quote: Exclusions is now a formatted box like the Description of Work, with its own bold, italic, list and heading controls. Paragraphs, bullets and emphasis survive all the way to the quote the customer reads.
* New Quote: the Situational clauses checklist moved inside the Exclusions field, between the toolbar and the box, matching the Standard lines strip added to the Description of Work in 1.2.043. Tick a clause and it appears in the box right underneath.
* Exclusions saved before this update are plain text and keep their line breaks exactly as they were, on the job view and on the customer's quote. Nothing needs to be retyped.

= 1.2.043 =
* New Quote: the Scope wording helper is now part of the Description of Work field itself, sitting between the formatting toolbar and the text box as a "Standard lines" strip. It had been above the field, then below it, and neither read right, because it writes into that field and belongs to it rather than beside it. Tick a line and you watch it appear in the box directly underneath.
* New Quote: more room between Remove and "+ Add another option" in the add-ons, so the two stop reading as one split control when one of them deletes a row.

= 1.2.042 =
* New Quote: the "Show an itemized price breakdown to the customer?" question moved inside the itemize panel, so it appears when you open the panel to itemize. A quote that already has it ticked opens the panel by itself, so the setting is never switched on and out of sight.
* New Quote: the green "Prefilled from this job's most recent quote" banner is now a tooltip on the Description of Work label, where the question actually occurs to you. Same words, one less line of page.
* New Quote: the Description of Work box is 420px tall, up from 220px, and Exclusions is 280px, up from about 96px. Both are minimums, so they still grow with what you type.
* New Quote: Optional add-ons is an accordion. It folds away on a quote that has none and opens itself, with a count, on a quote that has some.
* New Quote: a little more room under the AI Job Photo Estimator link.
* The Price List reference window is readable on a phone. It was missing the one tag that tells a phone to lay a page out at screen width, so the whole thing was being rendered wide and then zoomed out to fit.

= 1.2.041 =
* New Quote: every tool in the Quote Tools drawer has its own icon, and the calculators dropped the "Use The" from their names. "Use The Paint Calculator" is now "Paint Calculator".
* New Quote: fixed a real problem from the last release. After running a calculator the page reloads and reopens it, but the drawer had closed, so the answer was computed and invisible. The drawer now opens itself whenever a calculator is coming back with numbers.
* New Quote: the Scope wording helper sits directly above Exclusions, so the two wording libraries stand together. Ticking a line now says what it inserted and where, because the description is above it.
* New Quote: unticking the last line of standard wording no longer leaves a blank line at the foot of the customer's description.
* The Request acceptance rate moved off the New Quote screen and onto Business, in its own Request Performance section above Outstanding Balances. An all-time rate is a fact about the business, not about the quote in front of you.
* The little "i" tooltips read properly again. They used to open upward into the app bar, which clipped them, and on a phone they ran off the side of the screen. They open downward now, and on a phone they sit at the bottom of the screen where the whole note fits.

= 1.2.040 =
* New Request: a filter box above "Select Existing Customer". Type part of a name or an address and the list narrows as you type. Words can be in any order, so "peterson dana" finds "Dana Reyes, 88 Peterson St". It filters the list already on the page, so there is no waiting and it works with no signal.
* New Request: the customer list is capped at your 500 most recent, chosen by who you last did a job for rather than by where their name falls in the alphabet. If you have more than that, a line under the list says how many are not shown and links to Customers. A customer the page was opened for is always in the list, however long ago you worked for them.
* New Request: the page is much lighter for a busy shop. At 3,000 customers it was 848 KB, most of it a hidden block of customer data rather than the dropdown itself. It is now under 200 KB.
* New Request: Customer Info, Job Info and Scheduling each start with a marked heading band, so the three parts of the form read as three parts.

= 1.2.039 =
* New Quote: one "Quote Tools" drawer at the top holds Google Earth measuring, the price list and this job category's calculators. They used to be two loose rows of links half a page apart. Each tool is now its own row with its name and what it does, laid out in as many columns as fit.
* New Quote: Exclusions is one section again. The situational clauses write into the exclusions box, so they now sit above it inside the same bordered block instead of underneath it looking like a separate checklist.
* New Quote: "Show an itemized price breakdown to the customer?" moved inside the itemize card, where the lines it governs are. The card header now reads as something you can open, and it says what happens if you do not.
* New Quote: the Quote Total note no longer points the wrong way. It said to adjust the labor line "below" when that line has always been above it. Plurals are right too, so it reads "1 worker" rather than "1 worker(s)".
* The AI description tools are off the new request form. They exist to improve wording the customer will read, and a request never leaves the office. They are on the quote builder, against the Description of Work.

= 1.2.038 =
* The New Job button on the Jobs page is aligned properly on a laptop and on a phone. The title now sits on its own line with one rule under it, and the button and the View All / Board links sit in a clean row beneath, the same shape as the Expenses page.

= 1.2.037 =
* The Profits page reads properly on a phone. The year cards used to hold the stats beside the big Profit figure no matter how narrow the screen got, which squeezed them to nothing: every label was cut to two letters ("SALES TA...") and the dollar figures ran into each other. On a phone the card now stacks, Profit first, with the stats under it in as many columns as actually fit.
* Same fix on a small laptop window. At 1024px the stat strip was holding five columns in the space for three and clipping the same way.
* The Top and Bottom jobs ranking no longer pushes the whole app sideways on a very narrow phone.

= 1.2.036 =
* One load control in the Visualizer, not two. While the photo area is empty it is the button; once a photo is in, the toolbar button comes back as "Change photo", which is what it does at that point.
* New Job at the top of the Jobs page.
* File a Receipt at the top of the Expenses page.

= 1.2.035 =
* The empty photo area in the Visualizer is now the button. Tap or click anywhere in it to load a photo, instead of reaching back up to the toolbar. On a desktop you can also drop a file straight onto it.
* Take a photo with the camera. On a phone the empty area offers "Take a Photo" alongside "Choose a Photo", so you can shoot the wall you are standing in front of rather than hunting for it in your library.
* Selection tolerance moved up again, to directly under the file name. The hint you read once should not sit above the slider you drag all day.

= 1.2.034 =
* All three receipt forms now open the same way. Business Related asks "Scan Receipt with AI" or "Manually Enter" first, the way the vehicle and job forms already did, instead of dropping a full form on you with the scan button buried inside it.
* Removed the "File a Vehicle Receipt" button from the Vehicle Log. It sat directly above the form it linked to.

= 1.2.033 =
* One menu on a phone. The hamburger beside the search box is gone; the bottom bar and its More sheet are the menu. Everything the hamburger reached is in the sheet, including Checkup, which it was missing, plus your version, who you are signed in as, and the WP Admin link for administrators. Tablets keep the hamburger, because they have no bottom bar.
* Renamed "Completed & all jobs" to "View All Jobs".

= 1.2.032 =
* Deleting a job now clears everything it owns. Quote add-ons were being left behind entirely, and so were logged messages. Photos, notes, receipts and their images, the time clock, financials, payments, paint colors, invoices, follow-up visits and quotes all go, verified table by table against a test job built with one of everything.
* An overhead expense or a vehicle trip that was tagged to a deleted job keeps the record and loses the tag. Neither is the job's money, so neither is removed.
* Every delete in the app is now a button rather than a link: business notes, vehicle log entries, automatic vehicle costs, and the permanent job delete. A link that deletes can be fetched twice, which is what was swallowing the confirmations, and could be fired by anything that follows a URL.
* New vendor names now match what is already on your books. Type a name that differs only in capitalization or spacing and it saves under the spelling you already use. Type something close, like sherwin-williams when Sherwin-Williams is on file, and the form offers it before you save. Your choice either way, and once you take it the next receipt matches on its own.
* The Expenses page sections fold, one open at a time: Where it went, Month by month, Who you paid.
* The duplicate receipt finder moved from Business to Expenses, next to the spending it asks about.
* Taxes & Filing reads shorter. The explanation of what goes in each tax bucket is still there, folded into About this data.
* Removed two database queries that ran on every visit to the Business page and fed nothing.

= 1.2.031 =
* Business overhead is back on the Business page. The list of logged overhead, with its edit and delete, now lives inside the Business Expenses & Overhead section where it used to be, instead of on a page of its own. Filing a receipt is still File a Receipt's job.
* The Expenses page is now a summary of the year. Job materials, vehicle and overhead side by side with what each one did against last year, every category ranked largest first, who you paid ranked by size, and a month by month list you can open and check against a card statement.
* Fixed: deleting an overhead expense never showed its confirmation. The app's offline worker was fetching the delete link a second time, and the second fetch, finding the row already gone, drew the page with nothing to say. Deleting is now a button rather than a link and confirms properly.
* Fixed: opening a section on the Business page. Two sections claimed to open by default and three more worked out which should open only after they had already been drawn, so the section you got was whichever came first in the file. The page now decides once, before anything is drawn.

= 1.2.030 =
* File a Receipt is now the one place every receipt starts. Vehicle, Business Related and Job Cost each have their own form on that page, folded into three cards with one open at a time. Landing there opens none of them, because the question the page asks is which kind of receipt this is.
* Links can still go straight to the right form. A job's Add Expense page is unchanged, and the Vehicle page has a new File a Vehicle Receipt button that lands on the vehicle form with it already open.
* Fixed: on the Business Related form, picking "+ New vendor" did not open the box to type the name in, and the Scan with AI button did nothing. Both had been broken since the form moved to this page in 1.2.027.

= 1.2.029 =
* The Board and Row view switch now agrees with itself. The link text was being drawn before the click was processed, so it showed the view you had just left. The view itself was always right; only the label was a click behind.
* Moving a card on the Job Board now says so. Mark as Job, Mark as Not Won, Mark Completed and Back to Request all rewrote the record and then the card simply vanished from its column, which looks the same as a click that did nothing. Each one now names the record and what it became.
* The folded sections on the Jobs page have a light outline, so a closed section reads as a card that is shut rather than a line of text floating on the page.

= 1.2.028 =
* The Business page is a stack of accordions again, one open at a time. Taxes & Filing is first and opens by default, because it is what you came for; the roster and the vehicle list are reference and stay folded until you want them.
* The Vendors & 1099 table finally works on a phone. Each vendor is a card with its own labels instead of a seven-column table dragged sideways, so the two decisions you are there to make are a tap each.
* "Do not track" is now "1099 not needed". The decision you are recording is about the form, not about the vendor.
* The 1099 threshold moved to PaintClarity > Business > 1099 Reporting. It is a setting, not something you do while reading a vendor list, and it had been sitting inside that list's Save button making it look like the button only saved the number beside it. The Business page now shows one line saying which figure is in force and why.
* The rest of that block is regrouped: saving says what it saves, the bulk action is named in plain words and asks before it writes, and the two accountant exports sit apart under their own label.
* Two lines of page furniture removed: the paragraph describing the Business page to someone already on it, and the sentence explaining the year switch sitting directly below the year switch.

= 1.2.027 =
* File a Receipt is now genuinely the one front door for every receipt. The overhead form used to live on the Expenses page and had to be summoned with a second parameter, so the one-front-door page had one door that opened onto a different building. The form is on File a Receipt itself now, at one route with one parameter.
* The Expenses page is the ledger and nothing else: what has been logged this tax year, and editing or deleting a row in it. Its File a Receipt button goes straight to the overhead form.
* If overhead is the only place you can file a receipt, File a Receipt takes you straight to the form instead of asking a question with one answer, the same way it already did for a lone job or the vehicle log.

= 1.2.026 =
* Quotes Out and Needs Your Attention now stay folded until you open them. They were set to open themselves whenever something was in them, which on a working business is every day, so neither was ever actually seen folded. The counts in each heading are what tell you whether to look.
* Receipt search moved from the Business page to File a Receipt. Checking whether a stack of paper receipts is already filed is a filing job, so it now sits on the filing page, right above the chooser you use when the answer is no. The duplicate finder stays on Business, where the year picker it uses lives.
* The Expenses page is a ledger again. The add form sits behind a File a Receipt button, which is the one front door for a job receipt, a vehicle receipt or an overhead receipt.
* The Scan Receipt with AI and Manually Enter buttons above that form are gone. The form has its own Scan with AI button on the receipt photo field, so those two asked a question about a choice the form already offered. Picking a photo still starts a scan on its own.

= 1.2.025 =
* Message History can now start the next contact, not just write down the last one. Call, Text and Email open your own phone or mail app and log themselves into the history below; Email Quote, Send Follow-Up Email and Text Follow-Up are the same composed sends the quote screen and the alerts card already offer, shown only when they actually apply to the record.
* Record a contact folds away on that page. It was six fields sitting above the history, so reading what had already happened started with a scroll past a form nobody had asked for. It reopens by itself if an entry fails to save.
* The Communication section on Jobs folds away too, alongside Quotes Out and Needs Your Attention.
* Mark quote declined now appears only when there is something to decline: a request with a quote on it the customer has not accepted. A request nobody has priced and an already accepted quote no longer offer the button, and the same test is enforced when the form is submitted, not just when it is drawn.
* The Communication section's replies say whether they worked. Four of its five messages are refusals and every one of them was being drawn in the green success box.
* Today's Crew is gone from the Jobs page. It listed the jobs scheduled for today, all of which were already in Active Jobs at the top of the same page with more detail; on the commonest day it was a card that existed to say nothing was scheduled.

= 1.2.024 =
* The Jobs page is now organized by what you can do about it. Active Jobs and Upcoming come first and are always open; Quotes Out and Needs Your Attention fold away underneath, opening on their own when there is something in them worth looking at.
* Every job list has column headers now, so the date, the crew and the value are labeled instead of guessed at. On a phone, where the rows stack, each value keeps its own small label.
* Wrapping Up is gone. Every row it drew was already in Needs Your Attention one heading higher, and it was drawing them from the same two scans, doubling the work the page did on every load. Its Collect link and its Actions menu moved up into Needs Your Attention, so nothing you could reach from it is lost.
* Two bugs went with it. Staff who are not allowed to see money were reading balances in Wrapping Up that were hidden from them in the card above. And a completed job that already had an unpaid invoice was counted twice, once as a job and once as an invoice, which is the double-counted total the September 16 fix corrected in one place and not the other.
* New Communication section at the foot of Jobs: the last contact logged against each open job and quote, and a picker to start the next one. Pending quotes are in the picker too.
* From that same picker you can mark a quote declined. It moves out of Quotes Out and into Not Won, where Board view's Back to Request brings it back if the customer changes their mind.
* Request Performance moved to a page of its own, reached from the acceptance rate shown on the New Quote screen, where the number is worth a glance before you price something. It charts the rate by year and keeps the year by year figures in a show and hide underneath.
* Completed & all jobs and the Board and Row switch moved up beside the Jobs heading on a wide screen, instead of sitting at the bottom under three lists of rows.

= 1.2.023 =
* The 1099 threshold now follows the year you are reporting on. The IRS figure was $600 for payments made through 2025 and is $2,000 from 2026, so those two years are no longer judged against the same number. If your site still had the old $600 sitting in it only because that used to be the shipped default, it is cleared for you. Type your own figure any time to override it.
* The Upgrade to Pro button turned purple once you had clicked it. It was falling through to the browser's default link colors.
* Color Visualizer: selection tolerance moved out of the right rail to sit directly under the photo, where you can see what it is doing while you drag it. This matters most on a phone, where the rail sits below the photo entirely. Its minimum is now 1 instead of 4, for finer cuts.
* Color Visualizer: the color card moved above the surface card. Colors get changed over and over while trying options in front of a customer; the surface is set once.
* The AI Job Photo Estimator moved above the Description of Work instead of sitting in a drawer below it. It writes that field, so it now comes before it.
* The estimator has its own box to say what is being painted, with guidance. It used to quietly send whatever was in the Description of Work, which on a new quote was nothing at all.
* The estimator's result is more compact. Paint and supplies sit side by side, and the write-up with its Insert buttons sits directly under the figures instead of a screen below them.

= 1.2.022 =
* Moved paintops_render_settings_page(), paintops_render_business_settings_page() and paintops_render_workers_page() into includes/admin-pages.php, unchanged. The main file was 523KB; Freemius's deployment edits the main file's header after re-emitting it, and above roughly half a megabyte of printed output that edit silently yields a zero-byte paintops.php. Proven on 2026-09-19: the edit works at 490,687 printed bytes and fails at 561,037. Main file is now 374KB.
* 1.2.021 was a diagnostic build only and was never released.

= 1.2.020 =
* Housekeeping. The plugin now states where its own updates come from, so a Pro install is never offered the free version by mistake. Nothing you can see has changed.

= 1.2.019 =
* Renamed to Message History, and moved into the job's More Actions menu directly above Call Customer and Text Customer. Reading the history and making contact are the same errand, so they now sit together as one group.
* The record-a-contact form is properly laid out. Fields line up on one baseline, labels read as labels, and the date and notes boxes match every other field in the app instead of being whatever the browser drew.
* Two field types, date-and-time and multi-line notes, were missing from the app's form styling everywhere, not just here. They now match the rest, including the larger touch targets phones need.
* The Message History panel on the job page shows even when a job has nothing logged, and says so, rather than disappearing.

= 1.2.018 =
* Communications is now a button you can see on the job page, next to Directions and Add Expense, instead of being tucked inside the More Actions menu. It shipped one collapse away in 1.2.017, which was the same thing that hid the old log for months.
* The Communications panel on the job page no longer disappears when a job has nothing logged. It says so, and links to the full log, so you learn the feature exists before you need it rather than after.
* That panel now shows the same marks the full page does, so you can tell at a glance whether a line was sent by PaintClarity or is somebody's account of a call, and it carries a link through to record one.

= 1.2.017 =
* New: a Communications page on every job, in the job menu. Every way you talked to this customer about this job, in one list, newest first.
* Record what happened outside the app: a call from your own phone, a text thread, an email you pasted into your mail app, a conversation on site. Mark whether you contacted them or they contacted you, set the date it actually happened rather than today, and write down what was agreed.
* Every entry says how much it is worth. "Sent by PaintClarity" means the app composed it and handed it to your mail server. "Link opened" means somebody tapped a call or text link and what happened next is anyone's guess. "Recorded by hand" means a person says it happened. Those first two used to look identical, which quietly overstated the second.
* Your crew can record a contact on a job they are on, which is often the only way a driveway conversation ever gets written down. They do not see the history back; customer contact history stays in the office.
* Anything PaintClarity sent itself can never be edited or deleted, by anyone. A record you can rewrite is not a record. Entries written by hand can be corrected, and a corrected entry says it was edited, when, and by whom.
* Quotes, invoices, payment reminders, follow-ups and review requests have been logging themselves since July. That history was only ever visible in a collapsed drawer at the bottom of the job page that showed nothing when empty, so most people never found it. It has a real page now.

= 1.2.016 =
* The review request now delivers the customer their paint colors. Color, product, sheen and where each one went, in the same email that asks for the review. Give and get at the same time.
* Colors have only ever been recorded for your crew. Sending them turns a pure request into something the customer actually wants to receive, and it answers in advance the call every painter gets two years later asking what was on the hallway wall. That email then sits in their inbox with your name on it and the exact product, which is where they look when they want the trim done.
* How many gallons is deliberately left out. That is a purchasing note, it reads like a line on a bill to a homeowner, and it is no use to them when they want to match a color later.
* A job with no colors logged sends exactly the email it sends today, with no empty heading and no gap. Rows with nothing but a location are skipped.
* Place the list yourself with {paint_colors}, or leave your message as it is: one written before this existed does not need editing, the colors go in just after your review link. There is a switch under Settings > Google Reviews to turn the whole thing off.
* The preview on the send screen is the email. What you read there is what goes out, colors included.

= 1.2.015 =
* New: Vendors and 1099, under Business. Everyone the business paid in a year, added up from job receipts, business overhead, and the hours of anyone you have marked as paid on a subcontractor basis, ranked biggest first.
* Subcontractor hours count. For most painting shops the real 1099 money is the person paid by the hour who is not on payroll, and those dollars live in the time log rather than in the receipts. Tick "Paid as sub" next to someone on Painters/Helpers and their hours roll up like any other vendor, at the rate stamped when the hours were logged, so a raise in March cannot restate January.
* Record a decision per vendor once and it sticks: Track for 1099, 1099 not needed, or Undecided. Vendors over the threshold that nobody has ruled on are pulled to the top and highlighted, so a paint store you will never 1099 stops competing for attention with the drywall sub you will.
* Different capitalization and spacing fold together on their own, so "Sherwin Williams" and "sherwin  williams" are one line. For the ones that cannot fold automatically, "Same as" folds two rows into one for good.
* A printable sheet to hand your accountant, and a CSV to send them.
* It says plainly what it cannot do: whether a payment is reportable depends on the vendor's business type, whether you bought services or goods, and whether it went out on a card, none of which the app can know. It totals the year accurately and holds your decisions. It does not fill in a form.
* Spend on jobs marked "exclude from reports" stays out of the totals, as it does in every accountant-facing report here, but the amount is named on the page instead of disappearing quietly.
* Fixed: on PHP 8.4 the Export Data download wrote PHP deprecation warnings into the .csv file itself, so the export opened with warning text mixed into the rows.

= 1.2.014 =
* New: the job form now checks your crew before you save. Tick a worker who has approved time off during the job and the box will not stay ticked, with the days named. Tick someone already booked on another job in that window and you get a warning naming the job and the dates, and you decide: a supervisor covering three jobs on one schedule, or two callbacks in a day, is normal work and is not blocked.
* Time off and overlapping jobs are both checked live, as you change the dates, the length, or who is on the job, on a new job and on one you are editing.
* The check reads the whole job, not just its first day. A three-day job that runs over someone's Thursday off is caught now; the old check only looked at the start date, only ran on jobs already saved, and never looked at time off at all.
* Repeating time off is respected across years, so a standing day off still blocks a booking on next year's calendar.
* The old note on the job form saying conflicts were not checked until the job was saved is gone, because it is no longer true.

= 1.2.013 =
* New: optional add-ons on a quote. Quote the work the customer has decided on, then offer the rest as tick boxes they check when they sign. The homeowner who wants the living room and kitchen now, and is undecided about the bedrooms, gets one quote instead of two. Add them under "Optional add-ons" on the quote form with a title, description, price and your cost.
* On the customer's quote page the add-ons appear as tappable cards. Ticking one updates the total and the deposit on the spot, and whatever is ticked when they type their name is what they have agreed to and what the quote total becomes.
* Accepted add-ons are itemized on the quote document, so the signed paperwork says what was bought and not just a larger number, and the amount printed is the amount charged at the time, even if your tax rate changes later.
* Your cost for each add-on feeds the job's expected profit, so selling one raises revenue and costs together. An add-on priced with no cost is caught: Job Pulse leaves expected profit off rather than reporting it too high by the whole add-on, and tells you which one to fix.
* The quote view shows what was accepted and what was passed on, so the office knows what the crew is walking into.
* An accepted add-on is locked on the quote form: editing the quote afterwards cannot reprice or delete something the customer has already signed for.

= 1.2.012 =
* The app now says which build you are on: "PaintClarity Free" or "PaintClarity Pro", in the sidebar, the sidebar footer, and the version lines in Business Settings. A Pro copy with no active license reads Free, because that is what it can actually do.
* Fixed: clicking the Complete / Not Complete pill on a job worked, but left you on a broken half-loaded page with no confirmation. The job flipped and the date was recorded correctly; it was the page afterward that failed. It now lands cleanly on the job with "Marked complete." (or "Marked as not complete."), and a refresh can no longer flip the job a second time.

= 1.2.011 =
* Job Pulse is honest now when nobody is logging hours. Plenty of shops do not run a clock, and the page used to answer anyway: a job with nothing on the clock showed a pace, a projection built from zero, and a per-hour figure in the hundreds of thousands. Pace, per-hour and the projection are left out when there are no real hours, and the page says so and says what still holds (revenue, costs, profit and what is owed never depended on hours).
* Fixed: being far behind the schedule's hours was marked green. Running over is a warning, running level is good, and running well under is now neither, because it can mean an efficient crew or it can mean hours are not being logged and the page cannot tell which.
* Fixed: a job could report that "every hour was logged by someone with no hourly rate on file" when no hours had been logged at all.
* The "What this job is telling you" lines now carry a mark and a verdict: Went well, Worth watching, Needs attention, or Worth knowing for the lines that are a statement rather than a pass or a fail. The colored edge alone asked you to already know what green and red meant.
* The AI's "Next time" advice has to be an instruction you can act on, naming what to change on the next quote, instead of repeating this job's hours and days back as though that were the advice.

= 1.2.010 =
* Sales tax, VAT, gross receipts tax: whatever it is called where you work, it is now tagged per JOB rather than applied to everything. Painting is not taxed in Florida, is taxed in California and South Dakota, is hit with gross receipts tax in New Mexico, and carries VAT in Germany, and a shop near a line works both sides of one. Set your rate (and what to call it) under Business Settings > Pricing Rules, then tick "Has 6.5% tax" on the jobs it applies to. Add more rates if you work more than one jurisdiction and the job form offers a picker instead.
* Tax you collect is no longer counted as money you earned. Profit, margin, profit per hour, the Profits page, crew and classification reports, job rankings, customer lifetime value, Job Pulse and the job coversheet all read the job net of tax now, and the Business Financial Report shows what you collected, the tax inside it, and your actual income as three separate lines for your accountant. What the customer owes is unchanged: the quote, deposit, invoice and balance due all still include the tax, because they still owe it.
* A job keeps the rate and the name it was tagged with. Changing or retiring a rate later never restates a year you have already filed.
* Nothing changes at all if you do not charge tax. Leave the rate at 0 and no tax option appears anywhere.
* Fixed: the credit card fee was written on every quote and never actually charged. There is now a switch for it. Off (the default) means no fee is added and the quote stops mentioning one. On means the fee shows as its own line on the payment page, and the quote, the deposit page and the pay button all say what it is before your customer commits. The fee is not counted as income on the job, the same as your processor's cut is not counted as an expense.
* Fixed: the deposit schedule could go backwards. With the shipped tiers a $4,001 job asked for $1,200 where a $3,999 job asked for $1,400, so pricing a job two dollars higher collected two hundred less up front. A deposit now only ever rises with the job. It is also worked out on the job itself rather than on the job plus tax, since the tax is not yours to finance.
* New: refunds. "Record a Refund" sits beside Add Payment on Job Financials. Enter a positive amount and the reason; it reduces what the job has collected, re-opens the balance due, puts the job back on your receivables, flips its invoice back from paid, and comes out of the year's income. Recording it here does not move money, put the refund through however you took the payment.
* Job Pulse is now a link beside the status on the job page, instead of only living under More Actions.
* Fixed: the Time Clock offered Check In on a job already marked complete. Check In is available on upcoming, active and running-long jobs, and closes once the job is completed. Anyone on the clock when a job is completed can still check out, and a punch made offline still syncs.
* Fixed: a payment logged as "check" instead of "Check" did not match the dropdown, so the next save of Job Financials silently changed its method. Existing entries are tidied up on update.
* Job Financials payments now take an optional note, so a check number or the reason for a refund lives with the row.

= 1.2.009 =
* A pass over the everyday screens, from a page-by-page walkthrough of the app. (The 1.2.008 build was an internal step and was never released; everything from it is here.)
* Fixed: Email Quote landed on the "this page needs to know which job" message instead of the email screen. The helper message added this cycle for a bare ?estimates=1 did not know about the Email Quote address, which carries the quote id rather than the job id. All four ways into the quote screens are recognized now.
* Links are underlined now, everywhere except menus, buttons and tiles. Working out what is clickable should not take a guess.
* Hovering a button no longer washes out its text. Some WordPress themes set their own hover color for buttons, which on a light theme could put white text on a near-white button and leave it unreadable. Every button and menu row in the app now states its own hover colors, so the theme cannot repaint them. This showed up on the invoice reminder buttons, on Add Payment and Add Hours on Job Financials, and on Mark Completed and Actions on the Jobs list.
* Invoices: a new invoice reads "Not sent" rather than "Draft", which is what it actually means. Opening your own copied customer link to check it no longer records the invoice as sent. Only a real customer opening it does that.
* Invoices: More Actions is a proper menu now, the same as the ones on the job pages, and the long pay link that used to wrap inside it is an "Open the customer pay page" row.
* Jobs list: the date column sits beside the status it belongs with, and the status says Started or Scheduled instead of carrying its own copy of the date.
* Jobs list: "Completed & all jobs" and the Board/Rows switch moved up under Today's Crew, where they can be found while scanning the page.
* Request Performance sits under its own heading like every other section on the page, reads in title case, and no longer says "quoted", since a request can be a quote, an estimate or a bid.
* Job view: More Actions opens under its own tile instead of at the far left of the row, and floats over the page rather than pushing it down. An empty Job Description now says so and links to the edit form, instead of printing a heading with nothing under it.
* Job Financials: an Update button sits with the Billable amount. It saves the whole page, exactly as the Save Financials bar does.
* Job edit: the Directions gear is visible on this page again (it was being painted the same color as its own icon), the stray colored square above the worker list is gone, and a Color Visualizer link joins the other job links at the foot of the form.
* Quote form: one heading instead of three, the customer and schedule read as context rather than as a field to fill in, the reference tools and calculators read as links rather than as fields, and the two paragraphs of small print moved to where they apply, beside the total and beside the save button. Row spacing is even throughout.
* Callback / Punch List: only the visit type you picked is explained, the date and arrival time sit together, and the billable wording is shorter.
* Notes & Photos: each section says how many photos and notes it holds, or "none yet", so you can see what is there without opening it.

= 1.2.007 =
* Includes everything from the 1.2.006 build, which was an internal step and never released.
* The Color Visualizer is now on the job menu, so you can open it from a job instead of from the main menu and start over. Going in that way fills the customer name and service address onto the printed sheet for you. It is on the job's own page, on the job cards, and on the Search Jobs list.
* The Color Visualizer print is a proper document now. Your business name, logo and contact line sit at the top with the date and who it is prepared for, then the render, then the color list. The app's sidebar, search bar and menu no longer print with it, and the photo gets the full width of the page. Open the Visualizer from a job with the job link and the customer name and service address fill themselves in, or type whatever should appear.
* Every render now carries a short note that a color on a screen is an approximation and not a color match, and that a physical sample or a test patch should settle it before paint is ordered. It prints on the sheet and it is written onto the downloaded PNG as well, since that is the file that usually gets texted to the customer on its own. That PNG also no longer carries your selection outline.
* Picking the same surface several times now reads as one line. Working across a stucco elevation takes several clicks, and each one used to print as its own identical row on the customer's sheet. They group into a single entry that says how many areas it covers, and changing the color or the paint code moves all of them together.
* "What is this" now decides how the surface gets picked, which it was supposed to do all along. Brick, Concrete block and Cabinets switch to Similar color, because a plain fill from one brick face stops at the mortar and gets you one brick. Everything else uses Connected. If you have already selected something, changing the type re-cuts it, and changing it back puts it exactly as it was.
* The controls are reordered so the tolerance slider is on screen with the photo instead of below the fold. The color wheel folds away behind its swatch and opens when you want it, which puts the whole panel in view at once. The photo scrolls with the page again rather than staying fixed.
* Fixed: the floating Install PaintClarity button and the offline banner were printing on top of documents. Neither appears on paper now, on any page the app prints.
* Smaller things: the three selection mode buttons no longer read as one cramped block, the paint code box now shows a hint instead of what looked like a real paint already entered, and the tolerance number flashes when the tool tightens it for you so you can see what moved.

= 1.2.005 =
* On a wide screen the photo now stays put while you scroll. Reaching a control further down the panel used to take the picture off the top of the screen, which is the one thing that should not happen while you are editing it.
* Two explanation paragraphs are now hover tooltips instead: the note about what to put in Paint color code, and the note about how each selection mode spreads. The panel is shorter and the wording is still one hover away.

= 1.2.004 =
* New Color Visualizer, in the menu above Notes. Load a photo of the house or the room, select the surface you want to paint, and turn the color wheel until it is the color you are proposing. The wall changes color and keeps its own shading, grain and texture, so stucco still looks like stucco and the shadow under the eave stays a shadow.
* Three ways to select. Connected spreads from where you click and stops at edges, which suits stucco, siding and a single wall plane. Similar color picks up every matching area in the photo, which is what brick and block need, because a plain fill from one brick face stops at the mortar and gets you one brick. Box lets you drag a rectangle over the whole surface at once, which is the fastest way to take a big flat wall: shift-drag adds another box, and holding Alt while you drag cuts one back out for the windows and the doors.
* The tolerance slider re-cuts the surface you have selected as you drag it, so you can see the selection grow and shrink instead of guessing. Each surface remembers how it was built, including everything you shift-clicked or boxed, so it is rebuilt properly rather than approximated.
* A selection that starts spreading across most of the photo tightens itself and says so. A white wall, a white ceiling and a pale tile floor all measure about the same, and without this a fill that started on the wall would walk out over the floor.
* Put the Sherwin-Williams or Benjamin Moore number on each surface and it prints with the render, so the customer has the color in hand. Hold to compare flips back to the original photo, and the render saves as a PNG or prints to PDF.
* Everything on the page runs in your own browser. No photo of a customer's house is uploaded anywhere, and there is nothing to configure.

= 1.1.002 =
* The AI buttons now show they are working. The sparkle on the button pulses while it waits for an answer, and the button no longer greys out, so there is no wondering whether the click registered.
* Need a logo? The Business screen now offers four ready-made ones under the Logo URL box. Pick one and it appears on your quotes, invoices and customer pages straight away. They are shared with other businesses using PaintClarity, so your own logo is still the better answer once you have one.
* The free version now shows the Pro features in the menu instead of hiding them. Profits, Expenses, Business and Vehicle appear with a small Pro marker, and opening one explains what it does. Before this, a free user had no way to know PaintClarity had financials in it at all.
* Fixed the search icon sitting on top of the words in the jobs search box on some themes. The padding that held the icon clear could be overridden by the site's theme; it no longer can.
* New Activate License item in the PaintClarity menu for anyone who bought a license before installing the plugin. WordPress only offers the license box on the Plugins screen, and the Upgrade screen is a checkout with no key field, so this takes you straight to it.
* The "updates are paused" notice no longer appears on a brand new Pro install that has not been set up yet. It was competing with the setup screen and pointing at the wrong place.
* Settings now explains how to switch from Pro to the free version, including why the plugin search screen shows PaintClarity as already installed and which route works instead.
* Better text contrast in a number of panels across the app, and on the jobs board, badges, tooltips and the calendar's today marker. Several were hard to read on the darker themes.

= 1.1.001 =
* PaintClarity now tells you inside the app when a new version is available, instead of only on the WordPress Plugins screen. Most owners work on the app page and never open that screen, so updates could sit unnoticed for months. The notice appears only for people who are allowed to update plugins, and it carries an Update now button.
* New "Updates" item under Settings > Setup Health showing which version you are on, whether anything is waiting, and a one-click update button when there is.
* New setting: install PaintClarity updates automatically. This uses WordPress's own automatic update list, the same switch as the Auto-updates column on the Plugins screen, so the two always agree. Recommended, and it means the office never has to remember to update.
* If your host has switched automatic updates off for the whole site, the setting explains that rather than offering a switch that would do nothing.
* The in-app notice can be dismissed. Dismissing it hides that one version only, so the next release brings it back.
* New installs now open the Jobs screen in the row layout instead of the board. Existing sites are not changed, and the Board and Rows switch at the bottom of the Jobs screen works as before.
* Pro sites running without an active license now say so in the app. Such a site receives no updates from either channel, which was completely silent before. The notice can be dismissed and returns monthly, and it offers both ways out: activate a license, or switch to the free version.
* Clearer guidance on where a fuel receipt belongs. The Vehicle page now explains that on the standard mileage method you log the trip rather than the receipt, because fuel is already inside the per-mile rate.
* File a Receipt now asks one question first: Vehicle, Business, or Job. It offers only the destinations your account and plan can actually reach, and the camera opens on the next screen.
* Painters can file receipts themselves. File a Receipt used to be office only; crews now reach it from their own menu, and the job list shows only the jobs they are assigned to.
* If only one destination applies to you, the question is skipped and you go straight to the camera.
* The main job search bar now appears on every layout, not only the sidebar one, and the Job Board's duplicate box is gone.
* Themes: eight are now five. Modern, Mist and Fresh have been retired after a contrast audit. Sites using one are moved to the closest remaining theme automatically: Modern to Classic, Mist to Seaside, Fresh to Dark.
* Every remaining theme now meets the WCAG AA contrast standard for body text. Faint secondary text on Classic, Industrial and Retro has been darkened, and Classic's blue is slightly deeper so buttons and links are readable.
* Themes no longer recolor the WordPress admin screens. A dark theme used to leave text on those screens almost invisible against WordPress's white panels; they now read the same whichever theme you pick, and your chosen theme still styles the app itself exactly as before.

= 1.1.000 =
* A visual refresh across the whole app. The menu is now a dark navy rail with the PaintClarity mark at the top, and the page you are on is marked with a blue bar rather than a filled pill.
* Every screen now has a proper page header: the screen name, a thin rule under it, and, where the page already knows it, a short line of context such as how many customers are listed or which year the Profits page is showing.
* Text sizes are consistent everywhere. Helper sentences used to render at whatever size your WordPress theme happened to use, which on many themes made them larger than the headings above them.
* Money columns in every table now line up on the right with their decimal points stacked, so a column of figures can be read down.
* Buttons now have three clear levels: one solid action per screen, bordered buttons for everything secondary, and plain links for the rest. Previously almost every button looked equally important.
* The job stat tiles lead with Profit, marked with a rule across the top. On some themes the old highlight made the most important figure look like the faded one.
* Cards and tables are flatter and tighter, with a hairline border instead of a shadow. Shadows are now used only for menus and panels that genuinely float above the page.
* Keyboard users get a clear focus outline on every control in the app.
* The company logo you upload is unchanged everywhere it belongs: quotes, invoices, expense reports and your customer payment pages. Only the app menu shows the PaintClarity mark.
* Accessibility: icons, the job search box and the phone menus now keep their screen-reader attributes, which WordPress had been stripping. Form fields across the app that had no label now have one.
* Editing a customer's address from the Customers list now opens the full Edit Customer form instead of a small editor inside the row. One form, one save, one set of rules, so the two can never drift apart.
* Fixed a typo in one of the starter Resource links, "12 Mistakes That Loose Sales". New installs were already correct; sites set up before the fix have the title corrected automatically, and if both spellings ended up on your site the misspelled one is moved to the trash where you can still get it back.

= 1.0.301 =
* The Actions menu on the jobs list now opens as a dropdown over the page, lined up under the Actions link you tapped, instead of opening at the far left of the card and pushing every row below it down. Click anywhere outside it, or press Escape, to close it.
* New: "Invoices" in the job actions menu, right above Job Financials, so a job's invoices are one tap away instead of something you scroll for.
* The app icon, and the sidebar logo when you have not set your own, now use the PaintClarity artwork. If you already added the app to a phone's home screen, remove it and add it again to pick up the new icon.
* Fixed: the bottom navigation bar is back on phones. The sidebar layout was hiding it on every screen size, and since the sidebar itself slides away behind the menu button on a phone, that left phones with no navigation bar at all.

= 1.0.300 =
* The job actions menu (Directions, Add Expense, Edit Job, and so on) is now a compact dropdown instead of a full-width panel.
* Scheduling a follow-up now shows the right fields for the visit type you pick: Add-On Work goes straight to the agreed-price field since it's always billable, while Callback and Punch List keep the optional "billable" checkbox for the occasional paid touch-up.

= 1.0.299 =
* New installs now open the jobs list in Board view by default. Existing sites keep whatever view they're using; you can switch any time with the Row/Board toggle.
* Business page: the "Include jobs marked exclude from reports in these stats" toggle now also folds those jobs back into the Income, Job Materials and Total Deductions tiles while it's on. This is an on-screen view only; the coversheets and Business Financial Report still never include excluded jobs.
* Company Profile: the Website field now accepts a plain domain (like yourcompany.com) instead of demanding a full https:// address, so the profile saves cleanly. The address is normalized for you when it's used as a link.
* Removed the stray "+" from the "New Note" button on Business Notes.
* Resource link names carrying the old product name are updated to the current name automatically on upgrade.
* Search Jobs: results now sort by schedule date with the most recent first by default, the sort option reads "Schedule Date", and the tinted background on result cards was removed for a cleaner list.
* After marking a quote as won, the confirmation now offers a direct link to set the job's schedule.

= 1.0.297 =
* New installs now place the in-app workspace page at the /paintclarity/ address (existing sites keep their current page and address).
* Added a "WP Admin" link in the app sidebar footer for administrators, handy since the full-screen app hides the WordPress toolbar.
* The private workspace page and the WordPress login page are now marked no-index and kept out of the XML sitemap, so they no longer get picked up by search engines.

= 1.0.296 =
* PaintClarity: the plugin is now called PaintClarity (formerly PaintOps). Same plugin, same team, same data. Only the name and branding changed. All your jobs, quotes, customers, crews, and settings stay exactly where they are, and updates continue to arrive automatically as always.

= 1.0.295 =
* Fixed: some in-app cards (including the painter "My Jobs" home screen) could show overlapping text on certain sites, because an inline display style was being stripped by WordPress's HTML sanitizer. The cards now render correctly.
* Fixed: add-on and follow-up visit jobs now show their dollar value on the Job Board. Previously the Value column was blank when the amount came from the Financials page instead of a quote.
* Fixed: opening a job that had no scheduled arrival time (or was not scheduled yet) could show a blank page. The job view now renders in every case.
* Hardening: the Time Off page no longer errors if a stored date is malformed.

= 1.0.294 =
* New: a per-user option on the Profits and Business pages to include jobs marked "exclude from reports" in the on-screen stats. It is saved per user and remembered.
* Note: your Business Financial Report / accountant sheet never includes these excluded jobs, regardless of this setting; it only changes what you see on the dashboards.

= 1.0.293 =
* New: the Row view now has a per-row Actions menu (Mark Completed, Back to Request, and the usual job actions), matching what the Board offers, styled to fit the row rather than as buttons.
* Improved: link colors are now consistent across the app; job titles in the Row view use the same accent color as everywhere else.
* Changed: removed the search box from the Jobs page, since the search now lives in the app-wide top bar.

= 1.0.292 =
* New: the job search box now lives in the top bar next to + New, so you can search from anywhere in the app, not just the Jobs page.
* Improved: the Schedule a Callback / Punch List Visit page now carries the same job section menu as the rest of a job's pages, instead of a lone back link.
* Improved: on the quote builder, the AI Photo Estimator and the AI feedback / rewrite / materials buttons are tucked into a single "AI Tools" drawer, keeping the Description of Work area clean.

= 1.0.291 =
* New: the Jobs page search box is now a live search. Type three or more characters to see matching jobs as you type, and pick one to jump straight to it.
* New: an "All Fields" search option that matches your term across customer name, email, address, phone, job title, and job number at once. Pressing Enter in the live search runs a full All-Fields search.

= 1.0.290 =
* Fixed: on mobile, the menu (hamburger) button is now a crisp, high-contrast icon that no longer depends on a web font loading, so it's always clearly visible.
* Fixed: app icons could render blank on some screens (and inside the installed app), which made the app look half-styled; the icon font is now loaded on every app screen.

= 1.0.289 =
* Added: a Search button at the top-right of the Jobs page that opens the full Completed & all-jobs search.
* Fixed: on the Board view, the "Completed & all jobs" link is back, and the Board/Row toggle now matches the same clear accent-link style as the rest of the footer.
* Fixed: on the Seaside theme, the Board/Row switch link was hard to read and vanished on hover; it now stays a legible accent color, hover included.

= 1.0.288 =
* Improved: the job actions menu now appears on the Job View page too (with "View Job" marked as the current page), so it's identical across every job section.
* Changed: renamed the menu's "Job" tile to "View Job".
* Fixed: on a job's sub-pages, the More Actions menu now stays collapsed by default (its tile is highlighted when the current section lives inside it) instead of opening automatically.
* Added: the Job Profit Report Summary now shows an "Admin only" note above the figures, making clear your painters can't see profit numbers.

= 1.0.287 =
* Improved: on the Profits page, This Year and Last Year now line their columns up exactly, so the two years are easy to scan and compare side by side.
* Improved: the Job View action icons (Directions, Add Expense, Notes & Photos, More Actions) now match the crisp line-icons in the main menu.
* Improved: every job section (Add Expense, Notes & Photos, Financials, Edit, and the quote view) now carries the same job actions menu with the current section highlighted, instead of a lone back link, so moving between a job's pages is one consistent, permission-based menu.
* Improved: when a quote's More Actions has only one option (Replace Quote), it now shows as a plain action instead of a single-item dropdown.

= 1.0.286 =
* Improved: the Profits page is redesigned to read at a glance. Each year now leads with a single Profit figure and lists the rest as light supporting stats instead of a row of boxed tiles, This Year and Last Year share the same layout for easy comparison, and the Profit-per-hour ranking cards use a compact stat line.
* Improved: unified the link styling in the Jobs list footer so the "Completed & all jobs" link and the Board/Row view toggle match.

= 1.0.285 =
* Improved: section headers (like the dashboard's "Today" bar) are now a clean bold heading instead of a boxed, accented bar, so they guide the eye without over-drawing attention.

= 1.0.284 =
* Improved: the sidebar layout now keeps content in a comfortable, compact column instead of stretching edge to edge, so pages read cleaner on wide screens. Wide tables still scroll on their own when needed.

= 1.0.283 =
* Fixed: the dashboard "Unpaid Invoices" receivable now reflects payments you've recorded anywhere, not just the invoice's own "Mark as Paid". Recording a payment in a job's Payments log now reduces (or clears) what that invoice shows as outstanding, so a partly paid invoice shows the real balance and a fully paid one drops off. When a payment covers the job in full, its invoice is also marked paid automatically.
* Improved: the Jobs list rows now show small Crew, Date, and Value labels above those columns, so the numbers on the right aren't ambiguous.

= 1.0.282 =
* Improved: filing a receipt now highlights Expenses in the sidebar (both the File a Receipt page and a job's Add Expense screen), so it's clear where you are.
* Changed: Outstanding Balances moved from the Profits page to the Business page, where the rest of your money and tax sections live.

= 1.0.281 =
* Changed: the Sidebar layout is now on by default, so the app opens in the cleaner full-screen sidebar view with no site header. You can switch back to the classic top-bar layout any time at Settings > Appearance > Navigation > Layout.

= 1.0.280 =
* New: a Business Notes page (Free and Pro) for reminders, vendor account numbers, insurance renewal dates, anything worth keeping. New note, edit, and delete, found under More (or the sidebar's Tools group).
* New: the "+ New" button is now a chooser, New Request or File a Receipt, so filing a receipt is no longer buried. File a Receipt opens one page where you pick "Not Tied to a Job" (business overhead, the default) or attach it to a job from a searchable list.
* Improved: business and overhead receipts moved to their own Expenses page, so the Business page stays focused on tax buckets, reports, team, and backup. The Expenses page keeps the Scan-with-AI / Manually-Enter chooser and in-place editing.
* New: an optional Sidebar layout (Settings > Appearance). Shows the app with a left sidebar menu and no site header or footer, with your business logo in the sidebar. Off by default; the classic top-bar layout is unchanged unless you turn it on.

= 1.0.279 =
* Improved: the Business page Add Expense form now matches the clean job Add Expense screen. You choose "Scan Receipt with AI" or "Manually Enter" first, instead of every field showing at once.
* Added: you can now edit a logged expense (date, vendor, category, amount, and notes) in place, both on a job's expense list and on the Business page, so a mis-scanned category or a wrong amount is a quick fix instead of deleting and re-adding.
* Fixed: the job Add Expense screen no longer says AI can't read PDF receipts. It has read PDFs since 1.0.276.
* Fixed: uploading a PDF receipt no longer triggers PHP notices while saving the file (the upload always worked; the notices were just noise).
* Improved: scanning a receipt on the Business page now also fills the Notes field with a short summary of the items purchased (e.g. "2 gal SW Emerald, 3 rollers"), leaving anything you already typed untouched.
* Improved: the Business page is reorganized. One tax-year switch at the top now drives the whole page (the year is no longer buried inside a section), and a summary row shows Income, Job Materials, Vehicle, and Total Deductions at a glance. Jobs set to exclude from financial reports are left out of the page's totals, receipt search, and duplicate finder.
* Fixed: scanning a receipt on the Business page now fills in the category from your own business categories, and recognizes an existing vendor even when the receipt shows a store number (for example "Sherwin-Williams #402") instead of pushing you to create a duplicate.
* Improved: the Business page Find Duplicates tool now checks job receipts and business/overhead expenses together, matched on the same date and amount, so a receipt entered on a job and again as overhead is flagged as appearing in both places.

= 1.0.276 =
* Improved: AI receipt scanning (Pro) now reads PDF receipts as well as photos. Emailed receipts saved as PDFs can be scanned directly on job expenses, business expenses, and the vehicle log, with a page-length guardrail so only receipt-sized PDFs are sent for reading.

= 1.0.275 =
* Fixed: many in-app links (Create Quote in More Actions, calendar month arrows, back links, save banners, and others) could land on the site's blog page on sites using plain permalinks. Every link now carries the app page with it.
* Fixed: the Jobs page rows squeezed the job title to almost nothing inside themes with a normal content column. Rows now adapt to the width of their own card.
* Fixed: a false "You are offline" banner and an unstyled Install PaintClarity button could appear at the bottom of some screens.
* Fixed: new quotes printed the paint color confirmation paragraph twice in the Exclusions. The duplicate starter clause is removed and already-saved notes are cleaned up automatically on update.
* Improved: if the quote email fails to send (common on hosting without a mail service), the screen now explains why and shows the customer's accept link to copy and send yourself.
* Improved: after saving a quote you now get Open, Email It to the Customer, and Back to the Job actions instead of a bare one-line notice.
* Fixed: the customer accept page now always shows the accept-by date, even before Quote Terms are saved.
* Changed: the Complete / Not Complete pill on the job view now submits a form instead of following a link, so browser prefetching can never flip a job's status.
* Fixed: on the free plan, the Collect link on finished unpaid jobs goes to the job's Mark as Paid action instead of an upgrade screen. Pro still goes straight to the Payments log.
* Fixed: quote emails and review request emails no longer show blank spots before the business profile is filled in. The signature and business name fall back to the site title.
* Changed: the itemize section on the quote form starts collapsed.

= 1.0.274 =
* The Complete / Not Complete toggle on the job view now redirects to a clean URL after saving, so browser refresh or Back can never flip it again, and the app tells page-caching plugins never to cache its screens for logged-in users (a cached copy could show a job's old status after a change).
* The Jobs page's Collect link on unpaid finished jobs now opens the job's Financials page instead of the job view.

= 1.0.273 =
* The Jobs page has a new default view: clean rows grouped into Active Jobs, Quotes Out, and Wrapping Up, in the same order every day, with crew, dates, amounts, quote viewed/quiet states, and one-click follow-ups. The classic three-column board is still there via the Switch to Board view link at the bottom of the page.

= 1.0.272 =
* A fresh coat for the whole app: modern type, softer corners, and cleaner card surfaces across every screen and every theme. The Seaside theme also gets a soft page background so cards stand out, and its secondary text regains a readable muted tone.

= 1.0.271 =
* Pro: job receipt coversheets opened from a Business-page tax year now limit their expense lines and attached receipts to that year, so year-straddling jobs print a clean per-year filing bundle (undated entries stay included, and whole-job Profit Summary figures are labeled as such).

= 1.0.270 =
* Quotes now carry a validity date (default 30 days, configurable under Business Settings, 0 disables). The valid-until date prints at the bottom of the quote, and once it passes, the customer accept page stops taking online acceptances and invites the customer to request updated pricing. Already-accepted quotes are never affected.

= 1.0.269 =
* Pro: Google review requests. Set your Google review link and a default email under Settings, and the Jobs page suggests completed jobs whose customers haven't been asked yet, with a preview-and-edit compose screen, one-click dismiss, and every send logged to the job's communications.

= 1.0.268 =
* Pro: after upgrading from the free version, the leftover deactivated free copy is now removed automatically (with a confirmation notice). No data is affected.

= 1.0.267 =
* Jobs dashboard: quotes you know are dead can now be archived straight from Needs Your Attention; Archive marks the quote Not Won (same as the job board action, reversible there) and Not Won quotes no longer appear in the stale-quotes list.

= 1.0.266 =
* Jobs dashboard: sending a follow-up email or tapping Text Follow-Up now clears the quote from Needs Your Attention (any logged communication inside the stale window counts as activity, and the quote resurfaces if the customer stays quiet past it). The dashboard Text Follow-Up tap is also logged to the job's communications like everywhere else.
* Pro: new one-time welcome screen shown after activation with what's new and first setup steps.

= 1.0.265 =
* Time Off: the Year/Month/Day row now carries its 3-column layout inline, so it renders identically on every site regardless of stylesheet load order (it previously collided with the 4-column address-row definition and could render 4-up on some themes).

= 1.0.264 =
* Theme compatibility: the plugin's own UI elements now pin box-sizing: border-box, so buttons and multi-column forms render as designed on themes that lack a global border-box reset. No visual change on themes that already have one.

= 1.0.263 =
* Reverted the 1.0.261/1.0.262 app-wide button sizing changes; the compact height now applies only to the job board's + New Request button.

= 1.0.262 =
* App buttons: fixed the inflated button height on themes without a border-box reset (box-sizing now set explicitly) and tightened the desktop button profile to about 36px; touch devices keep the full 44px tap target.

= 1.0.261 =
* Job board: the compact action buttons inside card drawers (Reopen as Job, stage moves) no longer inherit the app-wide 44px touch-target height on desktop; touch devices keep the full 44px tap target.

= 1.0.260 =
* Security review round 3: pdf.js is now bundled with the plugin (assets/vendor/pdfjs) instead of loaded from cdnjs; the unused media.php core include was removed; nonce verification is now the first standalone statement in the reminder AJAX handler and explicit inside the calculator readers; remaining sanitize sites gained wp_unslash; token-authenticated public endpoints and read-only display filters are documented at each read site.

= 1.0.259 =
* Code quality: the Estimates, Calendar, Time Off, and Business Checkup screen files are now wrapped in named render functions, making their variables explicitly function-scoped and clearing all 575 variable-prefix warnings from the wordpress.org hosted Plugin Check.
* Code quality: documented ignores on the field-mapping loops whose keys come from fixed schema or whitelist lists.

= 1.0.258 =
* Admin notices from the licensing SDK now use a plainer tone ("Success! Your plan was successfully upgraded." instead of "Yee-haw!").

= 1.0.257 =
* Final Plugin Check cleanup: the five remaining tool warnings (array-form prepare arguments miscounted, and two documented meta-key lookups) now carry scoped annotations the checker honors. No functional changes.

= 1.0.256 =
* The Calendar screen now prints its own "Calendar" heading. It was the one screen that relied on the theme's page title, which PaintClarity hides on app pages, so on some themes the calendar had no visible title.

= 1.0.255 =
* Fix: on themes whose navigation menu or page list includes the PaintClarity app page, the menu label wrongly showed the current app screen name (for example "Calendar") instead of the page's own name. The dynamic title now applies only to the page's actual title areas.

= 1.0.254 =
* Plugin Check zero-error pass: the plugin header's "Requires at least" now matches the readme at 6.2 (this also clears every false %i placeholder error), all escaped output calls wp_kses() by its literal name so scanners recognize the escaping, the Business Checkup queries carry their fixed SQL conditions inline, the calendar's crew filter is part of one static prepared query, and the remaining tool false positives carry precisely scoped justifications.

= 1.0.253 =
* Escaping conformance polish on a handful of remaining literal outputs ahead of the WordPress.org re-review. No functional changes.

= 1.0.252 =
* Job board: Call / Text / Email on lost leads are now one tidy segmented control with icons, and History steps back visually. Invoice page: the action bar is decluttered (Print, Email, Mark as Paid stay up front; Copy customer link, the AI reminder, and the pay link live under More Actions), the AI-drafted reminder can now be sent directly from the page after review (logged to the communications history), and "Email to customer" asks before its immediate send. Quote builder: the AI description tools no longer vanish on short text; they show disabled with a note that they unlock at 200 characters.

= 1.0.251 =
* Audit follow-ups: settings saves no longer strip literal backslashes from typed text (double-unslash regression in 1.0.249); the van icon and link-arrow SVGs keep their shading and rounded strokes through output escaping; photo caption line-clamping is preserved; Stripe key diagnostics render their formatting again; several links now use the exact right escaper for their context; the calculator nonce is scrubbed from the address bar after a Calculate. Business Checkup items gained one-click action links (Create invoice, Log hours) and invoice photos now display two-up at half width.

= 1.0.250 =
* Fixes from live testing of 1.0.249: HTML badges and notices that rendered as raw markup (job view title badges, financials accordion summaries, Estimate vs Actual variance column, business/vehicle notices, worker hour dropdowns) now escape through the correct HTML-aware helper; sms: and webcal: links survive output escaping; and a latent fatal on the Business Checkup page (only triggered once a completed job had a balance due) is fixed.

= 1.0.249 =
* Security hardening for the WordPress.org plugin review. Every database query now goes through $wpdb->prepare() with %i table-identifier placeholders (WordPress 6.2+, "Requires at least" raised to 6.2 accordingly). All plugin-built HTML is escaped at the point of output through a central wp_kses allow-list; the settings pages sanitize every submitted array at intake and uploaded files are sanitized before the upload handler. The trade-calculator state and the settings deep-open links now carry nonces. The service worker, the customer quote/invoice page styles, the payment-finalizing poll, the printable report styles, and the report PDF renderer all moved out of inline tags into enqueued asset files. The legacy rl_resource post type was renamed to paintops_resource (with an automatic one-time migration of existing entries, including their URL field) and the [resource_links] shortcode is now [paintops_resources]; if you placed the old shortcode in a page, update it. The Freemius bootstrap accessor was renamed from pai_fs() to paintops_fs().

= 1.0.248 =
* Fix (Pro): a stray test clock-in with almost no time on the clock could produce absurd Profit / Hour figures (tens of thousands per hour) on the job financials, reports, and rankings. Rates past a plausibility cap (default $3,000/hour, filterable) now display as a dash instead, such jobs are excluded from the Profit Per Hour rankings, and the AI profit explainer is told the rate is not meaningful rather than being fed the bad number.

= 1.0.247 =
* Fix (Pro AI): the AI rewrite and photo estimator no longer add a "Description of Work" heading on top of their text; the quote already prints that heading itself. The model is instructed to skip it, and any heading that slips through is stripped before the text reaches the editor.

= 1.0.246 =
* Fix: the Description of Work / Inclusions saved from the quote editor lost all its formatting (line breaks, bold, lists) the moment the quote was created, displaying as one run-together paragraph. The editor's rich text is now preserved on save while still stripping anything unsafe. Quotes saved while the bug was live need their description re-entered once; new saves keep formatting.

= 1.0.245 =
* WordPress.org plugin review round 1 response. The free plugin is now fully functional with no locked features: the monthly job/quote cap is removed (unlimited jobs and quotes on free), and all Pro-only code (Stripe payments, AI tools, profit reports, vehicle and business tracking) ships only in the Pro build rather than sitting locked in the free one.
* The "Powered by PaintClarity" credit on quotes and invoices is now strictly opt-in for everyone: it stays off unless you turn it on under Business Settings > Quote & Invoice Branding.
* All of the app's CSS and JavaScript now loads through the WordPress enqueue system (as static asset files plus small dynamic fragments) instead of inline style/script tags, per WordPress.org guidelines. Customer-facing standalone documents (public quote/invoice pages, printable reports) keep their self-contained styling by design.
* Documented the Resources page's YouTube/Vimeo video embeds in the readme's External services section.
* Hardened input sanitization (quote overflow line items, time-off form) and output escaping (time-off notices, upload error details) in several spots.

= 1.0.244 =
* When the app is offline and shows a saved copy of a page, it now says so: a banner at the top shows when the copy was saved, warns that anything scheduled since then is not shown, and the page refreshes itself the moment the connection comes back. Before this, an offline snapshot looked exactly like live data, which could read as a job missing from the calendar.

= 1.0.241 =
* Fix: the Painters/Helpers admin table did not fit small screens and could not be used on mobile. It now scrolls horizontally within its own container, matching every other wide admin table in the plugin.
* Fix: a Callback or Punch List visit with no billable amount of its own, since it exists to finish or warranty its parent job rather than stand as its own job, could still show up as an entry in the "Bottom 3 Jobs" profit ranking (Pro). Non-billable callback and punch list visits no longer count as their own ranked job; a billable callback or punch list still does.

= 1.0.240 =
* Fix: a Painter/Helper opening the app's plain web address instead of a specific job link saw "Please log in to access PaintClarity" even while already signed in, and had no way in except a job's night-before email link. They now land on their "My Jobs" home (today, upcoming, and anything needing attention), a page that already existed for this but could not be reached from the plain address before.
* A worker's "My Jobs" home now has a Past Jobs list too, every completed job or visit they were on, so there's a way back to an old job for a note, a still-needed receipt, or a callback follow-up.
* Adding a receipt to a job now offers AI scanning first, same as the Vehicle Log: choose "Scan Receipt with AI" and the photo picker opens right away with the scan running as soon as a photo's picked, or choose "Manually Enter" for an empty form. (Pro with AI configured only; unchanged otherwise.)

= 1.0.239 =
* Fix: the offline app cache could get stuck showing a stale "please log in" screen for a job page even after the worker signed back in, because the background cache refresh skipped re-fetching any page it had already saved once. It now always refreshes the saved copy in the background, so offline job pages stay current with the worker's actual signed-in state.

= 1.0.238 =
* Fix: the job Time Clock (check-in/check-out) could display times up to several hours off from the actual time on servers where another plugin changes PHP's default timezone, the "Checked in at" confirmation was correct but the "Checked in since" status line, the recent time-on-this-job list, and the checkout note could all be wrong. All check-in/check-out time displays now render consistently and correctly.

= 1.0.237 =
* Fix: Plugin URI and Author URI headers no longer share the same value (wp.org submission requirement); Author URI now points to the founder's story page.

= 1.0.236 =
* Code review annotation added to the new routing rescue file. No functional changes.

= 1.0.235 =
* All date displays are now immune to other plugins or themes overriding PHP's timezone. Previously, if anything on the site changed PHP's default timezone away from UTC (WordPress pins it to UTC, but some plugins override it), every PaintClarity date rendered between midnight and the early morning hours could show the previous day, the Jobs page, calendar, and reports now show the correct site-local date regardless.

= 1.0.234 =
* The Jobs page now computes "today" exactly once per page load using the WordPress site clock, so the Today widget and the job board can never disagree, previously a page rendered while the site's clock crossed midnight could say "nothing scheduled today" above a card marked "started today".

= 1.0.233 =
* Reactivate License buttons and rescued permission errors on an unlicensed Pro install now open the Plugins page, where the Activate License link under PaintClarity works in every license state, with a bold pointer added under the button.

= 1.0.232 =
* On a Pro install that is waiting for its license key, the Upgrade to Pro buttons now read Reactivate License and open the license screen directly, matching what the user actually needs to do in that state. The free version's upgrade buttons are unchanged.

= 1.0.231 =
* The "Sorry, you are not allowed to access this page" dead-end is gone: if an Upgrade link lands on a licensing page that does not exist in the site's current license state (most commonly on a Pro install waiting for its license key after a reinstall), PaintClarity now catches the error and opens the main PaintClarity admin page, where the license screen appears whenever a key is needed.

= 1.0.230 =
* Upgrade buttons now route by license state: on an already-licensed site they open the Account page, and on the Pro build awaiting its license key (for example right after a reinstall) they open the license activation screen. Both cases previously dead-ended on a WordPress permissions message.

= 1.0.229 =
* Release build: everything through the Plugin Check zero, the premium package fix, and the address autocomplete fix. The upgrade-link routing refinements from 1.0.224/1.0.225 are deferred (edge cases around stale pages only) while a build tooling issue is investigated with Freemius.

= 1.0.228 =
* Same upgrade-button routing as 1.0.225, reformulated for the build tooling. No functional changes.

= 1.0.227 =
* Same as 1.0.225 (upgrade buttons route by license state) with the code annotations around that change simplified for the build tooling. No functional changes.

= 1.0.225 =
* On the Pro build without an active license, the Upgrade to Pro buttons now open the license activation screen (where entering your key is the actual upgrade step) instead of a pricing page that does not exist in that state.

= 1.0.224 =
* On a site that already has an active Pro license, any leftover Upgrade link (for example on a page rendered just before the license was activated) now opens the Account page instead of a WordPress "not allowed" error, since the pricing page does not exist once a site is paying.

= 1.0.223 =
* Address autocomplete no longer randomly fails to start on the job and customer forms. The Google Maps script loads asynchronously and could occasionally finish before the page had defined the function it calls back into; the loader is now printed after that function and uses Google's recommended loading=async parameter, so the race cannot happen.

= 1.0.222 =
* Build fix for the premium package: the vehicle and business expense report pages (with their printable coversheet templates and the PDF receipt printing panel) moved from the main plugin file into includes/pro-expense-reports.php. The premium build generator re-emits the main file through a code printer that cannot handle raw HTML template sections inside a premium-only block, which is what produced the empty main file. Include files are packaged verbatim, so the reports are unchanged in behavior on both tiers.

= 1.0.220 =
* Build fix attempt for the premium package: the closing comments on the premium-only blocks in the main file no longer repeat the premium marker text, so the build tool sees exactly one marker per real block. No functional changes.

= 1.0.218 =
* Build fix attempt for the premium package: the Freemius init array is now free of inline comments (one of them contained the exact token the premium build step is documented to remove, and that step regenerates this array). No functional changes.

= 1.0.217 =
* Plugin Check: the last 5 findings closed. The build generator splits compact one-line statements across lines, which pushed three footer outputs and the app-page lookup's meta arguments out from under their review annotations; each annotation now sits directly above the exact line it covers, in a structure the generator preserves. No functional changes.

= 1.0.216 =
* Build fix: the plugin header comment is back at the very top of the main file, ahead of the code review annotations added during the Plugin Check cleanup. The premium build generator requires the header there and was producing an empty main file, which made the premium zip uninstallable ("No valid plugins were found"). No functional changes.

= 1.0.215 =
* New workers are no longer stranded at the door: the "Please log in to access PaintClarity" screen now shows a Log In button that takes them to the login form and returns them to the exact page they were opening, including the specific job from a job notification email. The job notification email also mentions what to do if the login screen appears.

= 1.0.214 =
* Plugin Check round two: the 204 findings that survived 1.0.213 are closed. The build tool that produces the free version rewrites statements and relocates end-of-line comments, which silently disabled many of the 1.0.213 review annotations; all annotations in rewritten files now sit on their own line above the code they document, where the build preserves them. More real hardening while at it: pricing-rule numbers, company profile dropdowns, proxy-header reads, and the form replay token are now fully sanitized and unslashed at the source; every URL echoed on admin screens goes through esc_url() at output; month options, crew ids and diagnostic messages are cast or escaped at output.

= 1.0.213 =
* Plugin Check cleanup pass: every remaining finding resolved. Real hardening fixes: nonce values are now sanitized and unslashed before wp_verify_nonce() everywhere, quote titles, supply descriptions and work descriptions are sanitized and unslashed on save (also fixes apostrophes storing as \\' in quotes), payment/invoice tokens, routing parameters and time-off fields are sanitized, job IDs and crew IDs cast to integers in output, Google Earth links escaped with esc_url(). Everything intentionally left as-is (plugin-owned tables via $wpdb, pre-escaped HTML builders, whitelisted dropdown values, integer casts) now carries a written justification for reviewers.

= 1.0.212 =
* Fix: the free plan no longer offers or defaults to "Card deposit online" on the job form (online card deposits ride on Stripe, a Pro feature). Free records default to the cash/check deposit plan; a record already set to the online plan keeps it visible when editing.

= 1.0.211 =
* Improve: the PDF-receipt print panel now has an adjustable "Pages per PDF" cap, default 30 (was a fixed 15), so long multi-receipt PDFs render in full.

= 1.0.210 =
* New (Pro): the Business Financial Report's receipt version can now print PDF receipts in one pass. A floating "Render PDFs for printing" button converts every attached PDF into pages right inside the report, so a single browser Print captures the whole stack, no more opening each PDF by hand. Anything that fails to render keeps its placeholder card and open link.

= 1.0.209 =
* Improve: in Taxes & Filing, the receipt search now sits above the job coversheets, and the Find Duplicates button wears amber so it reads as the problem-hunting tool it is. The Business Financial Report defaults to totals only, the way accountants actually file, with a separate "+ Receipt Images" button for the full audit file; the "Receipts attached" checklist line only prints on that version.

= 1.0.208 =
* Improve: the Business page now uses the same collapsible sections as the rest of the app. Painters/Helpers, Vehicles, Business Expenses & Overhead, Taxes & Filing, and Backup & Data each collapse to a header with a glance line (roster count, vehicle count, expense totals, tax buckets), and the section you just acted on, saving vehicle owners, logging an expense, switching the year, or running a receipt search, opens automatically so the result is on screen.

= 1.0.207 =
* New: a duplicate finder next to the receipt search. One click scans the whole year for expenses sharing the same date and amount, groups them, flags same-job same-vendor pairs as "Likely duplicate", and links each entry's receipt image and job so you can verify before removing anything.
* Improve: the vehicle expense form (gas receipts) now matches the job Add Expense flow, receipt photo/PDF and the AI scan at the top, details below.

= 1.0.206 =
* Improve: the receipt search now suggests where to file an unmatched paper receipt. Under the results, "Holding a receipt that isn't listed?" lists jobs that were working around the searched dates, jobs with crew hours actually logged in the window sort first (the strongest signal someone was on site buying materials), with the scheduled work window as the backup signal, and a one-click "File Receipt Here" button on each.

= 1.0.205 =
* Improve: the receipt search's checkmark now opens the receipt file itself ("View receipt", with numbered links when an expense has several files), and searching updates the results in place without reloading the Business page. If scripts are unavailable the plain submit jumps straight back to the search section.

= 1.0.204 =
* New: Receipt search on the Business page, under the job receipt coversheets. Pick a date range and see every logged job expense in it, with vendor, category, amount, the job it's tied to, and whether a digital copy is attached, built for checking a stack of paper receipts against the books.

= 1.0.203 =
* Improve: board headers switched to the accent-underline style, a short stage-colored bar under each title with the count in a matching solid pill (icons removed).

= 1.0.202 =
* Improve: the Job Board column headers got their new look, a stage icon (inbox, roller, check) with the count as a solid color pill, steel blue for Requests, green for Active Jobs, gray for Completed, matching the card stripe palette.
* Fix: the night-before job email no longer says "0 Day Job Begins Tomorrow" for visits saved without a day count, it floors to 1.

= 1.0.201 =
* Improve: every customer-contact tap now lands in the communications log, Call/Text/Email in the Not Won drawer, the job page's customer Call/Text reveal, Call Customer and Text Customer in the job actions menu, and the Text Follow-Up nudge, alongside the quote email sends and Text Quote taps already logged. Each entry is honest about what it records: phone and mail links open the app, so the tap is what gets logged. Team-member Call/Text stays unlogged on purpose, that's coworker contact, not customer history.

= 1.0.200 =
* Improve: the board's three columns now start their cards on the same line (the glance slot under each header is fixed-height), status pills say Bid or Estimate when that's what the record is ("Bid Created" instead of "Quote Created"), and request cards show a green "Emailed Jul 20th / Texted Jul 21st" line from the communications log. Tapping a Text Quote/Bid link now logs the tap (delivery itself can't be tracked from an sms: link), and emails were already logged on send. The Not Won drawer gained Call / Text / Email links plus a History drawer on every lost lead, shown even when empty.

= 1.0.199 =
* Improve: Job Board polish pass. Requests sort by urgency (overdue visits first, then stale quotes, then newest). Each column header shows a glance line like "1 overdue visit" or "2 unpaid, $3,150 outstanding" (dollar figures only for financial viewers). Every column now collapses its long tail behind a show-more drawer with the fetch limit raised to 50. On phones, Active Jobs stacks first, columns collapse on tap, and Completed starts collapsed. Empty columns teach the flow instead of saying "Nothing here."

= 1.0.198 =
* Improve: every Job Board card (Requests, Active Jobs, Completed) now leads with one stripe that says it all, like "Upcoming - Starts Tomorrow Jul 24th", "Scheduled 4 Days Ago Jul 19th" (amber once a visit date slips), or "Completed Jul 20th", and the separate date line is gone. The whole upper card is now one big link to the job view, replacing the name link and the View Job footer link.
* Fix: records marked Not Won no longer appear on the Calendar (they still live in the board's Not Won drawer). Punch-list and callback visits now copy the parent job's State field, and the customer page merges address variants that only differed by a missing state, so no more duplicate "Other addresses on file".

Older entries: the full version history ships with the plugin's development notes and on paintclarity.com.
