== Changelog ==

The full release history for PSM SEO Site Console, called Planet Social Console
before it joined the WordPress.org directory. Recent releases are
also in readme.txt; WordPress.org trims a long readme changelog, so the
complete history lives here.

= 2.52.0 =
* Everything built while the plugin was in directory review arrives. The dashboard has six tabs, one job each: Console, Inbox, Search, Tracking, Keys and Settings. The tag builder reads what is already live in your Tag Manager container and builds only what is missing. The Inbox checks your sitemaps against Search Console, finds YouTube videos that no longer play, and applies descriptions in bulk. Regional hreflang tags pair each page with its own version. The detail is in the entries for 2.49.0 to 2.51.1 below.
* Switching from the copy downloaded from planetsocialmarketing.com is safe. While this plugin is active, deleting that copy no longer takes the settings, keys and SEO fields the two share, and while the old copy is still active this one waits and says what to do instead of stopping with an error.
* This plugin's own uninstall keeps everything while another copy is still installed.

= 2.51.1 =
* The plugin header now declares Requires at least: 6.0 and Requires PHP: 7.4, the same as this readme, so WordPress will not activate the plugin where it cannot run.
* Keys and the Google connection are stored encrypted with PHP's OpenSSL extension. On a server without it, the Keys tab now says so and refuses to save, where before it stored nothing without a word.

= 2.51.0 =
* New: Read what is live, on the Build your tracking tags card. It reads the published version of your Tag Manager container, the tags your visitors' pages run right now, and shows its Google tag, the GA4 events it already sends, any tag forwarding events by pattern, and every other live tag.
* Each set of events then shows what it would add and what is already live, so you build only what is missing. Show me what it would build and the GA4 recipe on Cerebro leave out what is already live, and the configuration tag starts ticked off when the live container already has a Google tag for your measurement ID.
* Reading changes nothing in Tag Manager and happens only when you press the button. It uses the Tag Manager access the tag builder already has.
* Messages from Tag Manager in the dashboard's notices are escaped.

= 2.50.1 =
* Fixed: the business profile's website, booking link and social profiles, and the default share image, could save a typo as an address, because WordPress puts http:// in front of anything. Each is now checked. A bare address such as example.com gets https:// in front, and anything that is still not an address is left out and named in the notice.
* The same check runs when a profile is imported as JSON or saved from the console, and again when the schema graph and share tags are printed, so an address an earlier version saved that is not one never reaches a page.
* The notice after fixing a video escapes the post's title.

= 2.50.0 =
* The dashboard has six tabs instead of nine, one job each: Console, Inbox, Search, Tracking, Keys and Settings. Old links and bookmarks still land on the right tab.
* New: the Keys tab holds every key, ID and connection in one place: Google, your tracking IDs, Stape, PageSpeed, search engine ownership, the connect key, the application password and alerts. A card elsewhere that needs a key links straight to it.
* New: the Search tab gathers searches and indexing, sitemaps, schema, site speed, IndexNow and regions. IndexNow and regions were only in the docked console before.
* New: the Sitemaps card reads every sitemap the site offers the way a crawler does, and compares them with the list Search Console holds. It names typos, duplicates, redirects, and sitemaps never submitted.
* New: the Videos card in the Inbox finds YouTube videos in your posts that no longer play, and empty boxes where one used to be. Fix this post removes them, and WordPress keeps the version before in the post's revisions. Nothing is sent to YouTube until you press Check videos.
* The Tracking tab holds Cerebro, the tag builder, your Analytics numbers and usage. Settings gains the Display and Diagnostics cards, which were tabs of their own.
* The Inbox tab shows how many fixes are waiting. A link to a card opens that card's details. Commander Alien opens only when clicked.
* The docked console leaves its Tracking and Search engines rooms out on a site running this version, so each setting has one home.

= 2.49.2 =
* Fixed: hreflang tags named the region front pages on every page, which told search engines that a page such as About and the Korean front page were the same page. Each page now names only its own versions in other regions, and a page that exists in one region only gets no tags at all.
* A regional version counts only when it exists: a post or page at that address, the region's own front page, or a theme that serves regional pages saying so through the new psconsole_region_url_exists filter.
* The sitemap lists every region's front page and every regional version of a listed page, found the same way as the hreflang tags, so the two always agree.
* The region switcher links each region to this page's version there when it has one, and names each region in its own language, so the lang on each link is true. og:locale:alternate names only the regions that have the page.
* A region address typed without its closing slash is treated as the folder it is.

= 2.49.1 =
* The tag builder card shows one set at a time. The menu names the sets, and what the chosen one builds, with any double counting warning, shows under it and follows the menu. The Tag Manager access switch folds to one line once it is on, and the longer explanations moved into Why this matters.
* Fixed: checkboxes on the dashboard stretched into full width bars.
* New: a build reads the container first and keeps what is already there instead of adding it twice: a Google tag for the same measurement id, a GA4 tag already sending the same event, and anything with the same name from an earlier build. A container that already loads GA4 never gets a second configuration tag, whether the box is ticked or not.

= 2.49.0 =
* New: the Audit Inbox applies descriptions in bulk. Tick the cards you want and press Apply ticked descriptions. Each write gets the same length check, read back and undo as a single apply, and a bulk run never removes a description or rewrites one with the same words.
* New: an empty description box comes with a suggestion from the page's own words: its excerpt, the description a pasted page still carries, or its first real paragraphs. Read it and change anything before applying.
* New: Check pages again reads each waiting page as a visitor would and brings its card up to date, so a page fixed some other way shows as Fixed instead of waiting. Clear fixed and tools empties those in one click.
* New: tool files, such as a console or a phone app a theme serves as its own HTML file, are marked Tool instead of Critical and never count as waiting. Their titles and descriptions live in the file.
* Fixed: on the dark dashboard the High badge had a corner bracket drawn through it, because its colour was taken for a white card. Every badge has its own colours now: Critical red, High amber, Medium cyan, Clear grey, Fixed mint, Tool outlined.
* New: the tag builder can measure FAQ opens. A listener sends Google's select_content event with content_type faq and the question as content_id, counting only boxes a visitor opens; other drop down boxes come through as accordion. GA4 reads both into its own Content type and Content ID dimensions.
* New: built event tags send their details. Until now a tag sent only the event's name, so a search arrived without its search term. Each event gets a variable for every detail Google defines for it, and only shop events ask for ecommerce data.
* New: the tag builder leaves out the GA4 configuration tag when GA4 already loads on the site, and starts with that ticked when it sees Site Kit placing GA4. A second one counted every page view twice. The recipe download offers the same two choices.
* Fixed: after Show me what it would build, the business type went back to the first choice, so Build the tags could build a set nobody had previewed. The form keeps what you chose now.

= 2.48.3 =
* The plugin header declares Requires at least: 6.0 and Requires PHP: 7.4, the same as this readme, so WordPress will not activate the plugin where it cannot run.
* Keys and the Google connection are stored encrypted with PHP's OpenSSL extension. On a server without it, the screens say so and refuse to save, where before they stored nothing without a word.

= 2.48.2 =
* Renamed to PSM SEO Site Console, with the slug and text domain psm-seo-site-console that WordPress.org assigned. Same features, same settings.
* Readme: Nextdoor's Member Agreement and Privacy Policy are named rather than linked, because the Help Center they live in sends an incomplete certificate chain that link checkers report as broken.

= 2.48.0 =
* Security: an uploaded verification file is no longer served the way it arrived. Each one is rebuilt when it is requested and escaped as it prints: a text file through esc_html, an HTML file through wp_kses with only the tags a verification page uses, and Bing's BingSiteAuth.xml from its own template. The old check refused script tags but let an event attribute through. A file that fits none of those shapes is refused with the reason, and one stored by an earlier version that no longer fits is marked Not served.
* Open Graph and Twitter tags, the region switcher template tag and the Android app links file now escape at the moment they print.
* Fixed: the version this plugin stamps on its own files had been stuck at 2.38.2 since that release, so a browser or a host's cache could keep showing an older console after an update, and the console reported the wrong version. It follows the real version again, and the build now refuses to package if the two disagree.
* The IndexNow guard that stops the same address being sent twice in an hour is stored under the plugin's own prefix, so uninstall removes it too.
* Removed the pods_render_language_switcher and pods_get_language_switcher aliases. Call psconsole_render_language_switcher and psconsole_get_language_switcher.
* UpCity closed in late 2025 and its address now leads nowhere, so Foursquare takes its place in the eleven Presence directories.
* The console in this plugin no longer tries to reach a desktop service on your own computer after a crawl. That service is part of our own tooling, not something you have, and current Chrome asks your permission before a website may talk to your computer.
* Opened outside your dashboard, the console sends its anonymous feature counts to the site it runs on. One fallback pointed at planetsocialmarketing.com.
* Fixed: the AI crawler switches on the Settings tab showed no choice selected, so the screen never said what was saved, and WP_DEBUG reported three undefined variables. Found by testing on a clean install with WP_DEBUG on.
* The console in this plugin no longer registers the app's offline service worker. That file lives on our own site, not in the plugin, so every dashboard logged a 404 for it.
* Readme: External services names every address the plugin contacts or links to, what is sent and when, and each service's terms and privacy policy, including IndexNow.

= 2.47.3 =
* Readme: the External services section now describes the Tag Manager API that tag building uses, what is sent and when, and that the plugin never asks for permission to publish. Its numbering is fixed.

= 2.47.2 =
* Fixed: the Commander helper in the dashboard corner showed as a plain white box and did nothing. Since 2.44.2 its styles and script were written with a newline PHP does not turn into a newline, so the browser read every style rule after the first as belonging to an element that does not exist, and refused the script outright. The alien is drawn and the briefing opens again.
* Fixed: the same fault had left the Pods SEO box in the post editor unstyled: the character counters lost their colours and an empty image preview showed as a broken box.
* Fixed: the Home tab showed two Commanders, the dashboard's own and the one inside the docked console. The console carries its own, with a briefing for every room, so the dashboard one now stands down on Home and stays on every other tab.
* Fixed: the Arcade room showed your site's "Page not found" page instead of the game. The console looks for the game beside itself and the plugin never shipped it, so the request fell through to WordPress. It ships now. This copy reports no analytics: inside your dashboard it has no business sending game events anywhere.
* Fixed: on a phone, some words in the Benchmark, crawler and Calendar tables were split in two. The earlier fix for tables running off the screen let a column shrink to a single letter wide. Now a column never gets narrower than its longest word, and only a long web address may break mid way.

= 2.47.1 =
* Fixed: on a phone the Benchmark table lost the compared site's column off the right, the AI crawler table lost the crawler names off the left, and the directory list put its second column off screen with the Sync button cut in half.
* All three were the same mistake in three places. Something with a minimum width that cannot shrink, a cell set never to wrap, an address with no space in it to break at, a card name set never to wrap, sat inside a container assumed able to shrink. A width of 100 percent cannot go below that minimum, so the panel grew instead and the far side left the screen.
* Measured rather than eyeballed: at 320 pixels the crawler table was 117 pixels wider than the space it had. It now fits at every width from 320 up.

= 2.47.0 =
* New: two switches that write AI crawler rules into your robots.txt, on the Settings tab. The console could already tell you which crawlers a site turns away. Now it can change it, without anybody editing a file.
* They are separate on purpose, because there are two kinds of AI crawler and one blanket rule takes out both. Refusing the ones that collect pages to train a model is a licensing decision about your own work. Refusing the ones that fetch a page so an assistant can quote you, with a link back, just removes you from the answer and leaves the citation to a competitor.
* Three states, not two. Leave alone writes nothing and keeps whatever your robots.txt already says. Allow writes an explicit rule, which overrides a blanket Disallow that something else wrote, because a crawler obeys the group that names it and only falls back to the star group when none does. Ask not to turns them away.
* It says when it cannot work. If a robots.txt file sits at your web root, WordPress never serves the one these switches write, and the card says so rather than looking like it did something.
* New: a dry run for the tag builder. Show me what it would build lists every tag and trigger with the name it would have in your container, and calls nothing. It is there so that testing does not need a second container.
* The dry run and the build read the same list, so a preview cannot drift away from what actually gets made.
* Fixed: building tags stopped with a name error before anything was created. The workspace name carried a timestamp containing a colon, and Tag Manager refuses a colon in a name. Every name now passes a guard on the way out.
* Fixed: a refused Google sign in said only to check the OAuth app configuration, discarding the reason Google gave. It now reports what Google said and names the fix for the common ones, including the missing Tag Manager permission, which breaks the whole sign in rather than only Tag Manager.

= 2.46.2 =
* Fixed: the field guide said the console has four rooms. It has eleven. Four is how many seats the curved bar on a phone has, which is a fact about the bar, not the console, and Repairs, Clients, Calendar, Benchmark, Campaigns and Reports were never added to the list.
* Fixed: the answer about the field manual said eleven pages. The current edition is sixteen.

= 2.46.0 =
* New: which AI crawlers a site lets in, read from its own robots.txt, in the Schema room and in the printed report. It works on any site you crawl, including a prospect's, because robots.txt is public.
* It separates the two kinds that get confused. Some crawlers collect pages to train a model, and saying no to that is a decision about your own work. Others fetch a page so an assistant can quote it, with a link back to you. Blocking the second protects nothing and removes you from the answer.
* Most sites that block AI do it with one blanket rule and take out both. The report says so in a sentence rather than handing you a checklist.
* It reads robots.txt the way a crawler does: a bot obeys the group that names it and only falls back to the star group when none does, so a blanket rule does not govern a bot with its own group.
* It says "asked not to", never "blocked". robots.txt is a request that well behaved crawlers honour, and claiming otherwise would sell a lock that is really a sign.

= 2.45.0 =
* New: build your GA4 tags straight into your own Tag Manager container. It creates a GA4 configuration tag, plus a trigger and an event tag for view_item, add_to_cart, begin_checkout, purchase, generate_lead and sign_up.
* It creates a workspace and stops. Nothing reaches your visitors until you open Tag Manager, look at what was built, and publish it yourself. It cannot publish even if you asked it to: the plugin requests permission to edit a container and deliberately does not request permission to publish one.
* It only ever adds. Everything it writes carries the Cerebro name, and it never reads, changes or deletes a tag you already had.
* Tag Manager access is off by default and has to be switched on. Asking Google for a permission your own Cloud project does not list makes the entire connection fail, including Search Console and Analytics, so this one is opt in on purpose.
* What a Cerebro tag is now lives in one place, shared by the exported container recipe and the new builder, so the two cannot drift apart.
* Six sets to choose from instead of one list for everybody: a bit of everything, online shop, services and enquiries, content and publishing, video and audio, and downloads. A law firm has no cart and a magazine has no checkout, and the old list assumed both.
* Every event name is one of Google's own recommended events, so GA4 reports on them without you building a custom report.
* Where a set contains something GA4 already measures by itself, like file downloads or video progress, the screen says so before you build. Enhanced Measurement is on by default, and a tag for one of those counts it twice.
* Building a tag does not create the event. Your site still has to push it, and which events matter is a decision about your business that no plugin can make for you. The screen says that too.

= 2.44.3 =
* Three classes that were named Pod_IndexNow, Pod_Locale and Pod_Verify are now PSConsole_IndexNow, PSConsole_Locale and PSConsole_Verify, matching the eighteen other classes in the plugin. PHP stops with a fatal error if two plugins declare the same class name, and those three were short enough to collide with somebody else's. Nothing outside the plugin referred to them, so nothing else changes.

= 2.44.2 =
* Fixed: the plugin printed a style tag and a script tag straight into the admin in three places instead of going through the enqueue API. The commander helper and the Pods SEO meta box now register a handle and attach their CSS and JavaScript with wp_add_inline_style and wp_add_inline_script, the way the rest of the plugin always has. What is printed is unchanged; how it gets there is not.
* Fixed: the readme pointed at a Stape terms page that no longer exists. It points at the one that does.

= 2.44.1 =
* Fixed: the calendar could schedule "Expand this page, about -1 words". Minus one is what this console stores for a page whose word count was never measured, and the thin pages check accepted it as thin. It now requires a real count above zero, which is what the Opportunities check has always done.

= 2.44.0 =
* New: a Benchmark room. Crawl your site, crawl a competitor, and see what they have actually built that you have not: descriptions, title widths, one heading per page, structured data, alt text, and which tags are on which pages.
* It compares what is implemented, not where anybody ranks. A rank is somebody else's estimate and there is nothing you can do with it. "They put a description on every page and you do on five" is the same conversation with the work attached.
* Everything is read from the page source of a public site, so it needs no account, no login and nothing from the other site's owner.
* Every figure is a share of the pages read, with both page counts printed above the table, so a six page site and a two hundred page site still compare. A gap under ten points is called much the same rather than turned into a finding.
* Where either site runs a tag container, the room says so: a tag fired from inside a container is invisible in page source, and it will not let you tell a prospect they have no pixel on that basis.

= 2.43.1 =
* Fixed: the calendar produced a correct order and a useless plan. The first real run on a 65 page site gave 38 dates that all read "write the description on", because descriptions outrank the smaller fixes and sorting by severity stacks them. Faults still come strictly first, and after that no more than two tasks of one kind land in a row.
* Fixed: it scheduled work on Christmas Day. 25 December and 1 January are skipped. Nothing else, because guessing at holidays across countries would be worse than leaving your calendar alone.

= 2.43.0 =
* New: a Calendar room. Pick a start date and a pace, and it lays out a dated plan where every entry is a real finding from your own crawl, worst first: broken pages, then pages nothing links to, then missing descriptions, then the smaller fixes.
* With Search Console connected it also schedules the searches this site already ranks eleven to twenty for, which is the cheapest work on any site: the page exists, people are already searching, and page two is one revision from page one.
* Generic content ideas appear only once every real finding is scheduled, which on most sites is never. That is the difference between this and a calendar template.
* Download the whole plan as a CSV that opens straight in Excel or Sheets.
* The crawl now also reports thin pages, counted from the word count it already recorded.

= 2.42.0 =
* Fixed: rooms could not be reached. The room bar had no way to handle more rooms than fit, so on a 1280 pixel screen Campaigns, Clients and Reports sat past the right edge with no way to scroll to them. The bar now scrolls sideways, a mouse wheel over it works, and the edge fades while there is more to reach.
* The map colour key is one pill that opens, instead of six labels that were hidden on any screen under 1100 pixels, which is the width the console runs at inside your dashboard. The key was missing exactly where it was needed most.
* Each colour now says what it means. "orphan" reads "orphan, nothing on the site links to it".

= 2.41.0 =
* New: Landing pages in the Visitors card and in the printed report. It shows the page each visit STARTED on, with its bounce rate beside it, because traffic with a high bounce is a page that is found and does not hold while no traffic at all is a page that is not found, and those need opposite work.
* Site verification tokens are covered on screen now, with a Show the tokens box. They are not secrets, they are published on your own site by design; covering them keeps them out of screenshots and screen recordings.

= 2.40.0 =
* New: a Clients room in the console. It says which site is yours and which are clients, shows what each one last scored and when, and audits any of them in one press. Your own site is whichever address is in your business profile, or whichever you mark by hand.
* The roster builds itself: every site you crawl lands there. Add one by hand to keep it on the list before you have crawled it.
* Your own site can show its visits, bounce rate and where people came from, read from the Analytics connection on this site. Client sites cannot, because nobody has an Analytics account for a site they do not run, and the room says so rather than showing an empty panel.
* The printed report can carry a Visitors section, and it appears only when the crawl is of your own site AND the numbers were read for that same address. Crawling a client never prints your numbers on their report.

= 2.39.0 =
* New: Visitors and where they came from, on the Credentials tab. With your Google account connected it reads your own Analytics property and shows visits, people, bounce rate, average visit length, pages seen, and anything bought, for the last 28 complete days.
* It separates the two questions that get confused: traffic acquisition is where each visit came from, user acquisition is where each person first came from. Each table says which it is.
* Figures end yesterday. Today is a part day, and including it would make every number quietly wrong by however many hours have passed.
* If this site connected to Google before Analytics was part of the plugin, the card says so and tells you to press Connect Google again, instead of showing an error. Search Console keeps working either way.
* The console can read Analytics, searches and speed in one call now, and each part says whether it can answer rather than reporting zero.

= 2.38.2 =
* Fixed: 2.38.1 read Stape's success message as an error. A good answer from Stape carries "All good" in the same place a failure puts its reason, so the container list showed "Stape answered with an error: All good". Only a failure code counts as an error now.

= 2.38.1 =
* Fixed: connecting Stape said an account with a container had none. Stape's API wraps every answer in an envelope that its own documentation leaves off the container list, and the plugin read the envelope as if it were the list. It reads what is inside now, uses Stape's default address when a container has no custom domain, and if Stape ever answers in a shape it cannot read, it says what arrived instead of calling the account empty.
* Fixed: Cerebro sent its server side events to the bare root of your server container, where no client listens, so every forward and every test answered 400. They go to /data now, the address the Data Client by Stape listens on, in the same format as Stape's own PHP library. Your server container needs the Data Client installed, and a 400 on the test now says so.
* The purchase event sends its product count as item_count instead of items, which is GA4's name for the list of products itself.

= 2.38.0 =
* Every room and every dashboard tab is on the same cards now. Repairs, Redirector and Schema join the rooms converted in 2.37.0, and in your dashboard so do Settings, Schema, the Audit Inbox, Accessibility and the three tabs that moved into the console. Each card says what is true and what to press next, the settings wait in a drawer, and the explanations are one tap away.
* In Repairs, each finding shows its fix up front, with why it ranks where it does, what links to it and the cause one tap away. Copying the AI brief is the first thing in the room.
* A Security and your responsibility note, under every dashboard tab, in the console's Settings and in this readme: these tools hold powerful keys, every release is checked with the official Plugin Check tool from WordPress, no software is flawless, and your own browser, devices and accounts are yours to keep safe.
* Fixed: opening the Schema room in the docked console wiped the WordPress schema card for the rest of the session. The room is built once now, so it stays.
* Fixed: on a phone, the More rooms list ran each room name into its description.
* Fixed: on a laptop with a touch screen, including inside the dashboard, the Arcade collapsed to its heading and the game could not be seen.
* Fixed: the Cerebro, Insights and Error Report tabs still pointed at a panel under Structure. They point at the Tracking room, where those blocks moved in 2.37.0.
* The readme listed four rooms. It lists all of them now.

= 2.37.0 =
* The console rooms are calmer. They had been growing into long pages of paragraphs with the controls somewhere inside them. Each thing in a room is now a card whose face says what is true and what to press next, with a Pod that shows at a glance whether it is fine, needs you, or is broken. The settings wait in a drawer and the whole explanation is one tap away under Why this matters, so nothing was taken out to get there. A line of statuses at the top of each room jumps to the card that needs you. Search engines, Tracking, Presence, Campaigns and Reports all work this way now.
* The Credentials tab in your dashboard gets the same cards: Google Search Console, Searches and indexing, Site speed, Stape and Notifications. The card you just saved opens again when the page comes back, so a save lands you where you were.
* Fixed: in the Presence room, saving your profile wiped the Everywhere you use Pods block and the WordPress profile block for the rest of the session. The room rebuilt itself on every save and neither block ever drew itself twice. It is built once now, and only the insides repaint.
* Fixed: a Google client id could be saved without its secret, or the reverse, over a pair that worked, which broke the connection. Both are needed now, and the pair on file is kept when one is missing.
* Fixed: Site speed said every page had been measured while a check was still out with Google.
* On a phone, the dashboard screens were padded for a desktop and left a narrow column for their content. They use the width of the screen now, and a wide table scrolls inside its card instead of pushing past the edge.

= 2.36.1 =
* Fixed: pressing Check the next page under Site speed could end in a 500 error. A PageSpeed answer can take most of a minute, and the page waited for it inside a single request, which is what a host cuts off. Sometimes the check had already succeeded behind the error. The press now hands the check to WordPress's own scheduler and returns straight away, so you can leave the page while Google works. The panel shows what is out with Google until it lands, keeps the reason if a check fails, and says so after ten minutes if one never comes back.
* Uninstall also removes any check still waiting in the scheduler.

= 2.36.0 =
* Connect Stape with one key instead of copying a container address by hand. Paste an account API key, pick your container by name, and the address is read from Stape rather than retyped from Stape. That address is the one value in server side tagging nobody can check by eye, and a single wrong character produces a setup that looks finished and sends nothing. Every call is read only: it never creates, changes or deletes anything in your Stape account. It is a key and not a sign in, because Stape offers no sign in for this and the screen says so.
* Site speed, from Google, free, with one key. PageSpeed Insights answers the question you get asked after every redesign, and this keeps its two answers apart instead of blending them. What real Chrome visitors experienced over the last 28 days leads, and only exists where enough people visited, which is a real answer rather than a gap. The simulated score is labelled a simulation every time it appears. One check per press, because a check takes about twenty seconds, and the first one also returns the reading for your whole site.
* Pasting a list of addresses now checks them. It always accepted one address per line and then recorded every one as answering 200 without fetching a single one, so a list of pages you had just fixed came back looking perfect whether or not it was. Each address is now fetched through the same pass the Repairs room uses, and the screen says plainly that a list carries no link data so orphans are not scored.
* Uninstall also clears the PageSpeed measurements, and the readme changelog moved to changelog.txt, which is where WordPress.org expects a long one.

= 2.35.0 =
* The Reports room makes a report you can print. It already said "what to send a client" and could produce a paragraph and a spreadsheet, which are two things you then have to turn into a report yourself. Now it builds the report: the cover, what changed between two real crawls, what is wrong now worst first, what to do about it in order, and how it was measured.
* It prints through your browser's own print to PDF, so no PDF library is bundled and nothing is uploaded anywhere to make it. Choose Save as PDF in the print dialog.
* The report refuses to print one site's faults under another site's name. The room lets you pick any site in your crawl history, while the detailed findings only exist for the crawl in memory, so when those two are different it says so and leaves the findings out rather than borrowing them.
* Findings are capped per section and the number left off is stated, because a forty page list of orphans is not a report anybody reads and printing twelve of them silently would be a lie.

= 2.34.0 =
* Search engine ownership now works out which method your token belongs to instead of publishing it and hoping. Every one of these engines offers a tag and a file, and the two tokens are not interchangeable: Naver's tag value is a bare string of letters and digits, while its file is named naver then a code then .html. Paste the second where the first belongs and the tag publishes cleanly, reads plausibly, and can never verify, because the engine is comparing it against something it never issued. That is now recognised and the file is served instead, with the address printed on screen.
* Verification files are served for you, so the file method works on hosting where you cannot put a file at your root at all. Nothing is written to disk. Yandex uses one code for both methods, so a Yandex code now publishes the tag and serves the file, and whichever button you press finds what it is looking for.
* You can upload the file the engine gave you. Google and Bing issue files this plugin cannot generate, because their contents are issued per account and inventing them would publish something that fails while looking right. Upload it and it is served byte for byte, exactly as it arrived, with nothing added. Text only, 8KB, and the name has to be the one the engine gave it.
* A new Search engine ownership panel on the Settings tab, with the tokens, the uploads, a Remove for each one, and one control that takes the whole section back off.
* Check what is live reads your own home page back over the internet and reports which of these tags are really in it. Worth pressing: a tag can be saved correctly and still be missing from the page a crawler fetches, when a cache is holding an older copy. The cache is left alone on purpose, because the cached copy is the one the crawler gets.
* Uninstall was leaving five option rows behind and its transient sweep matched nothing, because it looked for a prefix none of the transients use. Both are fixed, and the option list is now the whole list.
* Fixed: the plugin's stylesheet version had been frozen at 2.24.0 for nine releases, so browsers holding the old admin CSS had no reason to fetch the new one.

= 2.33.0 =
* Ask Google whether a page is actually indexed. Impressions can tell you a page is being shown; they cannot tell you a page is missing from the index, because no impressions might mean new, might mean ranking badly, and might mean not indexed at all. The URL Inspection check answers that directly, and the pages with no impressions are checked first, because that is where the three cases look identical from the outside.
* It arrives with a budget rather than a loop. Google allows 2000 checks a day for your property and this plugin will only ever spend 200 of them, because the rest are yours and a tool that quietly eats a daily quota breaks something else you were relying on. A page checked in the last seven days is not checked again, and one press checks at most twenty. The remaining budget is on screen before you press, not after.
* A broken address that Google has in its index rises in the redirector queue, because it will go on being offered to people until it is fixed.

= 2.32.0 =
* Search Console now changes what gets fixed first. The connection already pulled your top queries, which is interesting and changes nothing. It now also pulls impressions and clicks for every page, and a page Google actually shows outranks one nobody has ever seen. The number is always printed in the reasons, so you can disagree with the ranking rather than take it on faith.
* Impressions only ever raise a finding, never lower one. A page with no impressions may be new, blocked, or simply not ranking yet, and none of those mean the fault does not matter.
* Google is only called when you press refresh, never while a screen is drawing, and the answer is kept for six hours. With no Search Console connected nothing changes and nothing complains.
* The same numbers are offered to the Planet Social Redirector plugin, so a 404 that Google is still showing rises to the top of its queue.

= 2.31.0 =
* Meta descriptions get the same loop the redirects have. Before a write, a description outside the length worth writing is questioned once and then applied anyway if you say so, because it is your sentence. After a write, the page is fetched and the description read back out of its head, so the screen reports what the page says rather than what it hoped. Every change is recorded with the description that was there before, and one click puts it back.
* The Audit Inbox is worst first instead of newest first, with the same four words the rest of the tools use, and each card says why it is ranked there.
* The console reads every page description during a crawl and can send the weak ones to the inbox in one go, so the inbox is no longer limited to pages sent one at a time from the extension.

= 2.30.0 =
* The console can send redirect fixes straight to your site over the connection you already set up for your business profile. The site stores them as a plan for you to approve in wp-admin; nothing is created by the send itself. Needs the Planet Social Redirector plugin active, and says so plainly when it is not.

= 2.29.7 =
* The galaxy layout is now a solar system: your home page at the centre, one ring for every click away from it, and each section of your site on its own arc. The old view drew a ball, and it was right to. On a real site almost every link is the nav and the footer, so the link graph is nearly complete, and a layout that pulls along every link can only produce a hairball. This one is computed from two facts instead, how far a page is from home and which section it is in, so the same site draws the same picture every time and can be compared with last month.
* Pages nothing links to now sit on their own ring outside the rest, labelled, instead of being lost in the middle.
* The word galaxy is reserved. When one profile can hold several sites, a galaxy of solar systems is the right name for seeing them together.

= 2.29.6 =
* Fixed on a phone: the deploy and controls sheet could become unreachable. Its handle was positioned at the top of a box that scrolls, so scrolling carried the handle off screen and left a strip with nothing to press. The sheet no longer scrolls while it is collapsed, and the handle stays at the top of it at every scroll position.
* Fixed on a phone: the header ran wider than the screen and cut off the control at the right hand end. The full business name now sets on two lines in the app bar, which fits without losing a word or a button.
* Rooms change on a swipe now, left and right, anywhere except the map canvas, the controls sheet and the tab bar, where a sideways drag already means something else. Arriving in a room fades it in rather than cutting to it.
* Each room in the navigation reads as its own block. The divider between them was nearly invisible, so on a narrow screen the plain description of one room ran into the name of the next.

= 2.29.5 =
* The console header says Planet Social Marketing, which is the name of the business. It said Planet Social, which reads as a different company to anyone who meets the tool before the site, and the tools are increasingly what people meet first.

= 2.29.4 =
* Every room in the console now says what it is for underneath its name: how your pages link up, what to fix first, your business details, fixing broken pages, what search engines read. The rooms explained themselves once you were inside them, which is too late, because the choice of where to go happens in the navigation. In the installed app, where the tabs are too small for a second line, the same words are the spoken label.
* The plugin tabs in your dashboard do the same. Cerebro, Audit Inbox and Error Report are our names for things, and each tab now prints what it is for under the tab bar.

= 2.29.3 =
* Housekeeping from the official Plugin Check: the readme now states the current WordPress version, the connect key header is sanitised where it enters rather than at the end of the function, and the sitemap query drops its exclusions in memory instead of asking the database for a NOT IN, which is the clause that slows first as a site grows. Nothing you use changes.

= 2.29.2 =
* The Repairs room now says which broken page to fix first. Every one carries a severity, worst first, built from what the crawl can prove: how many of your pages link to it, whether your sitemap declares it, whether it sits on a main path, whether the server failed rather than the page being missing, and whether a destination is ready. Each card lists those reasons, so you can disagree with the order rather than take it on faith.
* Exported redirect rules now carry their evidence, so a fix proposed here arrives in WordPress with the reasons attached instead of as a bare pair of addresses.

= 2.29.1 =
* Fixed: the Analytics events panel called every event "never sent" on any site whose tags send through its own domain rather than through Google's. Server side tagging can use any address the owner chooses, so the panel now recognises an analytics send by what it carries, a measurement protocol hit naming a G- measurement id, instead of by where it is going. On the site this was found on, everything it had been reporting as broken was arriving correctly.

= 2.29.0 =
* The Analytics events panel now reads what it could only count before. Analytics sends several events in one batched request whose names travel in the body, which the browser's timing list does not expose, so events that had already reached Google were shown as never sent. The panel reads those sends properly and reports each name.
* Refused analytics consent is now its own answer rather than a failure. When a visitor has not accepted analytics cookies nothing can be sent, and calling that the same thing as a missing tag sent owners hunting for a fault that was not there.

= 2.28.0 =
* Fixed: the Pods app could not send a connect key to any site other than the one it is served from. WordPress answers every REST preflight with a fixed list of allowed request headers, and the connect key header was not on it, so browsers refused the request before it left. The header is now allowed. Allowing it grants nothing; the key is still checked like any credential.
* Fixed: the Audit Inbox tab showed the full findings endpoint as the only URL on screen, and that is what people pasted into Site address, which made every connection fail as "plugin not found". The tab now shows the site address to paste, and labels the endpoint as troubleshooting information. The app and the extension also clean up a pasted endpoint automatically.
* Fixed: the sign in diagnostic could report a stripped header while the connect key was arriving fine, because WordPress runs permission checks for preflight requests, which carry no credentials. Preflights are now ignored and each request is recorded once.
* A connection is now checked once per request rather than several times, so the per address rate limit counts real requests.
* Fixed: on hosts that cache anonymous requests, a refused connection could be cached and handed back to the next attempt even with the correct key, because WordPress only sends no-cache headers when a user is logged in. Every answer on the bridge and findings routes now says no-store, which also prevents a successful answer from ever being cached and shown to someone without a key.

= 2.27.0 =
* New connect key. The extension and the app can now connect with a single key generated on the Audit Inbox tab, instead of a WordPress username and application password. This is the route that works on hosts which never hand the Authorization header to WordPress, where the application password route cannot work at all and fails as a 401 that reads as a wrong password.
* One field to paste rather than three, and no trip to the user profile screen.
* Only a hash of the key is stored. It is shown once at creation and cannot be read back. Generating a new one stops the old one working immediately, and Revoke removes it entirely.
* The key is compared in constant time, refused over plain http, rate limited per address, and grants exactly what the two bridge routes already granted and nothing else.
* Application passwords still work everywhere they worked before. The key is a second door, not a replacement.
* The sign in line on the Audit Inbox tab now also reports whether the connect key header reaches the site, so the first test answers the question instead of raising it.

= 2.26.0 =
* Fixed: the extension and console bridges could never sign in on hosts that do not hand the Authorization header to WordPress. Every attempt returned 401, which reads as a wrong password, so the natural response was to generate another one that also could not work. The plugin now reads Basic credentials out of the header itself, over HTTPS only, never overriding what the server already provided, and granting nothing: a wrong password still fails.
* New: a sign in line on the Audit Inbox tab that says which of the two failures you are looking at, a rejected password or a header that never arrived, based on the last real connection attempt rather than on the page you are reading.

= 2.25.0 =
* New Analytics panel: the events report, rebuilt from what the page actually sent. Every event name the page put on the dataLayer, how many times, and whether a request carrying that name really left the browser for analytics.
* A tag that never fires and a tag that fires and sends nothing both leave an empty report and neither reports a fault. The panel separates them, so an event that is pushed and never sent is visible instead of silent.
* Events the measurement library generates on its own, such as page views and scrolls, are listed as what they are rather than counted as missing.
* Parameter values are shown while the page is open and never written to storage. Only parameter names persist.
* The structure score chart moved to where it belongs, under the grade it measures.

= 2.24.0 =
* New Repairs room. Every fault the crawl finds arrives with what caused it and the fix: the pages that link to a broken address, the page it was most likely meant to be (the same words in a different order, a plural, a file ending, a typo), a page that should link to each orphan with the anchor text, and one click actions to send a fix to Redirector, copy it, or mark the page private.
* A broken link and an orphan that are one mistake seen from both ends are paired, so you know one edit clears both.
* Visit before judging. Pages only your sitemap lists are now fetched before they are counted, and what they turn out to be decides how they count: a real page nobody links to is an orphan, a missing one is broken, and a redirect is a redirect.
* Not everything is scored. WordPress media and attachment pages, WordPress system addresses, pages the crawl could not reach, and pages past where it stopped get null points: listed in Repairs with the reason, counted neither for nor against. You can set aside your own patterns too.
* Redirects are seen at last. A link that lands on a different page is recorded as a redirect instead of a healthy page, and the redirect count means something.
* A stale cache is caught. When a host or CDN serves an old sitemap, the console reads the current one, uses it, and tells you to clear the cache, with the steps for WordPress.com and Cloudflare.
* The AI brief replaced the list of bare URLs: it is written for your site, carries the cause and suggested fix of every finding, says what not to spend time on, and asks for the answer in terms of your platform. Your business name and category come from Presence on the device; your address is never included.
* Redirector rows start with the likeliest destination instead of the home page, and a row left blank stays out of the export rather than becoming a soft 404.
* The pointer becomes a pod over the console, amber over anything clickable. Turn it off in Settings, Appearance.
* Fixed: wp-login.php slipped past the crawler's system filter. Relative links now resolve against the page's real address. The WordPress admin bar's links are no longer treated as part of the public site.
* Fixed: the console's cache busting version had been stuck at 2.23.0, so browsers could keep an older console after an update.

= 2.23.0 =
* New Reports room, for the numbers you have to put in front of someone else. Pick a site and a period, and it compares two real crawls: last 30 days, a 90 day review, month over month, year over year, or everything on record. Grade, pages, orphan pages, broken pages and internal links, each showing whether the change is an improvement, because fewer orphans is progress and more pages is neither.
* Nothing is estimated. It compares the latest crawl in your period against the last crawl from before that period began, and if that crawl does not exist it says so and names the oldest one it has, rather than quietly comparing against whatever is first in the list and calling it year over year.
* Every report states its evidence: which two dates, and how many crawls fall between them.
* One button copies a plain English write up you can paste straight into a review, an update, or an investor note. It ends by saying the figures came from two real crawls on the dates shown and that nothing was estimated, so the claim travels with the numbers.
* Export every crawl for a site as CSV.
* Says plainly that the history lives on the machine that ran the crawls, so a report from one laptop does not silently present itself as the whole picture.

= 2.22.0 =
* Fixed: the Tracking and Regions rooms opened onto a blank screen. The console's layout rules are keyed to which room is open, and rooms added after the page loads were not announcing themselves, so the console kept the site map layout underneath a settings screen. Every room now announces itself and scrolls back to the top when you open it, as the original rooms always did.
* Fixed: opening a room left you wherever you had scrolled to, so a long room appeared to be empty until you scrolled up.
* Rooms added in future need no layout work of their own. The rules are now written once for any room rather than listed by name, which is what caused this in the first place.
* Outside WordPress, the Presence room now says which rooms need the plugin and why, and links to it. Tracking and Regions write settings to a site, so they cannot appear in the phone app or on the website. They are not behind a purchase and the wording says so.

= 2.21.0 =
* New Campaigns room: build tagged links so you can tell which channel actually brought someone. Presets for Google Ads, Microsoft Ads, affiliate and partner referrals, unpaid referrals, email, LinkedIn, Facebook, Instagram, X, YouTube, paid social, podcasts, and QR or print, each setting the source and medium the way analytics expects. Campaigns can be named by period: annual, quarterly, monthly, or seasonal, folded into the campaign name so a year of activity stays comparable.
* Everything is lowercased with spaces removed, and that cannot be switched off. Analytics treats Email and email as two separate sources, and once split data is recorded it cannot be merged back.
* It warns you about the mistakes that cost real money, only when they apply: that Google and Microsoft tag their own clicks and your tags can create a duplicate campaign beside the real one; that a tagged link between two of your own pages starts a fresh visit and throws away the source that actually brought the person in; that nobody can click a long link read out on a podcast; that personal data in a tagged link ends up in your analytics and in every link a reader forwards; and that Acme, acme-co and acme_co become three different partners in your reports.
* Save links to a list on your device and export the lot as CSV. Nothing is uploaded.
* Works whether or not the console is docked in WordPress, because tagging a link needs no server.

= 2.20.0 =
* Prove the site is yours to Google, Bing, Naver, and Yandex from one screen. Paste each engine's token and the plugin publishes it in your page head. Tokens are checked before they are published, so pasting a whole meta tag by mistake cannot put broken markup on every page.
* Korea: Naver Search Advisor support, and an honest account of what is left for you. The ownership tag is handled here. Registering the site and submitting your sitemap happen on Naver's own console and cannot be done from a plugin, so the screen says so instead of implying otherwise. It also checks whether Naver's crawler, Yeti, is blocked by your robots.txt, which is the commonest reason a Korean listing never appears. It reports that rather than rewriting your robots.txt, because that file is yours.
* Japan: nothing to switch on, and the console explains why. Yahoo! JAPAN has run on Google's search index since 2010, so there is no separate submission and no separate console for organic search. Visibility there comes from a verified Google property, a ja-JP region, and the language declared in your structured data, all of which this plugin already does.
* Your pages now declare their language and their alternate regions to social platforms as well as to search engines, which is also what Naver reads when deciding how a result looks.

= 2.19.0 =
* Instant indexing, in the Regions room. When a page is published, updated, or removed, the plugin can tell the search engines straight away instead of waiting to be crawled. One submission reaches Bing, DuckDuckGo, Yandex, Ecosia, and Naver, because they share submissions with each other. Google does not take part in IndexNow, so this is extra reach on top of your sitemap and never a replacement for it, and the console says so on screen.
* Fixing a broken page now reaches search engines the same hour. When the Planet Social Redirector creates a 301, both the old address and the new one are submitted, and the old one matters most: it is the address sitting in an index pointing at nothing. A 301 is otherwise worthless until an engine happens to re-crawl the old URL, which can take weeks. Temporary redirects are deliberately left alone, because a 302 says the opposite.
* The console shows what was actually submitted, when, and what the engines answered, including the refusals, so you never have to read a server log to find out whether it worked. Your key file is shown as a link, because the most common failure is that file not loading and one click proves it.
* Off by default. Nothing is submitted until you switch it on.

= 2.18.0 =
* New Regions room. Tell search engines which version of a page belongs to which country, across the United States, Canada in both English and French, Mexico, the United Kingdom, Japan, and Korea. The plugin writes the reciprocal hreflang set into your page head, including the self referencing tag and an x-default fallback, and keeps your structured data's language in agreement with it. Nothing is published until at least two regions have a URL, because a set of one tells a crawler nothing and can do harm.
* A region switcher for your theme, as the [pods_language_switcher] shortcode or a pods_render_language_switcher() template tag. It marks the region you are on for screen readers, not only visually, and prints nothing until there is more than one region to switch between.
* You no longer have to open your page source to check any of this. The Regions room shows the exact tags it will publish, updating as you type, and re-reads the settings back out of WordPress after every save so a save that did not stick is visible immediately. The connection to WordPress is shown as a live state rather than assumed.
* Tracking and Regions are now their own rooms in the console rather than panels stacked at the bottom of an existing one, so a long scroll no longer stands between you and the tool you opened.
* Fixed: the arcade sat behind no guard, so once your pointer was over it the console stopped scrolling and the arrow keys drove the game instead of the page, with no way back. It now waits for a click before taking control, and Escape hands scrolling back.
* Fixed: the console's scrollable panels could not be scrolled with the keyboard at all, because they were not focusable. They are now, and they are named for screen readers.
* Fixed: the fullscreen control overlapped the title of every room.

= 2.17.0 =
* The Presence room now shows the same "one profile, three places" card the phone app shows: which of the plugin, the phone app, and the browser extension has edited this business profile, and when. The dates are stamped by the profile itself and travel inside the export file, so nothing here needs an account, a connection, or a server. Nothing is claimed that cannot be shown: a surface that has never touched the profile says exactly that.
* Cerebro tracking now sets up inside the console, so the last of the four rooms is in one place. The container and measurement ids are checked as you type and checked again on the way in, so a malformed id can never reach a script tag. Nothing secret moved: the Google sign in that is a real credential stays on the Credentials screen and the console cannot reach it. The Cerebro dashboard screen is now a pointer to the console, with the old form kept collapsed underneath as a fallback.

= 2.16.0 =
* Diagnostics and usage figures now read inside the console, beside the crawl results they relate to, through a read only connection that cannot change a setting. The matching dashboard screens are now a pointer to the console, with the old view kept collapsed underneath in case the console cannot load. Settings that only make sense as ordinary WordPress forms have deliberately not moved: the Google connection and webhook address stay on Credentials because they hold secrets, accessibility stays on its own screen because it should never depend on a frame loading, and the audit inbox stays where it is because it writes to individual posts under a different permission.

= 2.15.0 =
* The virtual sitemap can now be switched on from the Schema room, beside the schema controls, since both are things this plugin publishes for crawlers. The console screen also shows where to get the companion app for Android and Fire tablets, which runs the same console and can push a business profile back to this plugin.

= 2.14.0 =
* Two things you used to do twice now happen in one place. The Schema room can switch structured data on and choose which types publish, saving straight to the plugin. The Presence room can push the business profile you built there to WordPress, so it becomes the schema the site publishes, and pull back whatever WordPress already has. Both appear only when the console is open inside the dashboard.

= 2.13.1 =
* Fixed the console handshake. The bridge announced itself when the console frame finished loading, but the announcing code loads late in the page, so a console that was already loaded never heard it and stayed disconnected with nothing on screen to say why. The console now asks to be introduced, and retries, so whichever side is ready first the connection completes.

= 2.13.0 =
* The docked console can now read and save plugin settings without reloading the page. The console runs in a frame and never holds a credential: it names an operation, and the admin page it sits in performs the request. Only a short, explicit list of settings is reachable that way, and credentials, tokens and logs are deliberately not on it.

= 2.12.0 =
* Directory review compliance. The Customization tab and its custom CSS field were removed entirely, so the plugin no longer ships any styling insertion surface; the console keeps a fixed built-in theme. The separate marketing tab and the upgrade button were removed too. The front-end schema graph now escapes slashes and tags on output and sanitizes every value it reads from custom fields, closing a JSON-LD injection path. Unique function and class prefixes throughout, and the text domain now matches the plugin slug. The readme now fully discloses every external service, including the Google Fonts used by the console interface.

= 2.11.0 =
* New Bridge: the installable Pods app can now connect to your site with a WordPress Application Password and push your business profile straight into the console, the same way the browser extension sends its findings. Two authenticated routes, both gated on manage_options.

= 2.10.1 =
* Plugin Check pass: the optional GTM noscript tag now escapes its URL inline at the point of output.

= 2.10.0 =
* Every tab now sits on a framed console panel, so the whole plugin reads as one HUD instead of bare tables on the dark background. Distinct modules still stand out as their own holo cards inside the panel. High contrast and reduced motion modes are untouched.

= 2.9.2 =
* The Google connection now requests only the read only Search Console scope, which is exactly what the plugin uses, so the consent screen and the app's behavior match. The broader Tag Manager scope returns only when a feature actually calls that API.

= 2.9.1 =
* Readability polish and a sci-fi glow up across the console admin. The information cards now read as holographic panels on the dark console palette instead of bright white, with a luminous frame rail, a HUD corner bracket, faint scanlines, a card name header, and a glow that lifts on hover. Low contrast greens and ambers were raised to the on brand mint and amber, and dropdowns gained a mint chevron and a dark option list, so nothing blinds or disappears against the dark theme. High contrast and reduced motion modes are untouched.

= 2.9.0 =
* The Google Search Console connection now does real work. Once you connect, the Credentials tab reads your verified property and shows your top search queries with clicks, impressions, click through rate, and average position, pulled live from Search Console and cached for an hour. The session refreshes itself in the background. This is the first live Google transport; the Tag Manager write path follows.

= 2.8.1 =
* A Disconnect Google button on the Credentials tab. It releases the account link, best-effort revokes the token at Google, and clears the stored tokens, and you can reconnect any time. This makes disconnecting as easy as connecting.

= 2.8.0 =
* Cerebro can now load Google Tag Manager for you. Paste your container ID, tick Load GTM on the site, and the plugin places the container on every page, so you never touch the theme header. It stays off by default and warns you when Site Kit already loads Tag Manager, so the container is never loaded twice.
* Every injection is fully reversible. Turning a feature off removes its output from your pages at once, and a new Reset and cleanup panel on Settings removes the SEO fields the plugin saved on your posts in one click. Uninstall now sweeps those fields and the audit inbox too, so nothing is left behind.
* Works alongside a tag setup you already had. When Site Kit already runs a Tag Manager container, Cerebro detects it and offers to reuse that same container so your earlier tags keep working, and the recipe guidance now walks you through exporting a backup and importing with Merge so nothing you built before is replaced.

= 2.7.2 =
* Fixed the Cerebro GTM recipe so it imports cleanly into current Google Tag Manager. The GA4 Configuration tag now carries the measurement ID in the tagId field GTM expects, and each event tag references that configuration and reads its e-commerce data from the data layer.

= 2.7.1 =
* Plugin Check pass on the Pods SEO box: every field now sanitizes and unslashes its input directly at the point it reads the request, with no helper in between.

= 2.7.0 =
* One click schema setup on the Schema tab: schema switches on with every module, and any empty profile basics (business name, tagline, email, website) fill from what WordPress already knows, never overwriting anything you typed. The tab also gained a live status badge and a preview of the exact front page graph that will print, so you can see the result before a crawler does.

= 2.6.0 =
* Meet Commander Alien, the in app helper. The pixel commander from the console boot screen now floats in the corner of every plugin tab. Click the commander for a briefing on what the current tab does, including a complete step by step Google Cloud walkthrough on the Credentials tab: create the project, enable the APIs, set the consent screen, register the exact redirect URI, and what the unverified app warning means. The briefing opens on your first visit and then remembers whether you keep it open. Fully keyboard accessible and it honors your reduced motion preference.

= 2.5.0 =
* New Pods SEO box on the post and page editor: SEO title, meta description, canonical URL, no index and no follow, and a social share card (Open Graph and Twitter) with a live title and description length preview and a media picker for the share image. The plugin now outputs the page title override, meta description, canonical, robots, Open Graph, and Twitter Card tags as a single coordinated source, so nothing is emitted twice. Settings gained social sharing defaults for a fallback share image and card style. This fills the on page SEO gap left when a previous SEO plugin was removed. All free, no license required.

= 2.4.1 =
* Plugin Check polish on the Android app links field, and copy updated to the Planet Social Redirector name across the console.

= 2.4.0 =
* New Android app links field on the Settings tab. Paste your Digital Asset Links JSON and the plugin serves it at /.well-known/assetlinks.json, so a Play Store Trusted Web Activity wrapper of your app can verify the site and drop the address bar. Nothing is served until you fill it in.

= 2.3.1 =
* Output escaping polish in the new Audit Inbox so the plugin passes the WordPress Plugin Check with zero errors.

= 2.3.0 =
* New Audit Inbox tab and a bridge with the Planet Social Redirector browser extension. The extension audits a page as you browse and sends its findings to the console over the REST API, authenticated with a standard WordPress Application Password. Each finding that maps to a post you can edit gets a one click meta description writer that prints the description in that page head. Schema stays generated site wide by this plugin.

= 2.2.0 =
* Insights grew a real analytics view: headline stat tiles (events all time, features used, most reached feature, this month with its change), a six month trend chart rendered from your server's own monthly buckets, and per surface totals for the web console, mobile app, extension, and wp admin. All of it is first party data on your server, no third party calls. New Google Analytics 4 panel with direct links to your GA4 reporting and, when Site Kit is active, your Site Kit dashboard; live GA4 charts arrive on this tab once Google completes verification of the app connection.

= 2.1.1 =
* Review readiness polish. The Customization tab in this free plugin is now a plain description with no disabled form fields; the working editor arrives with the separate Pro add on. The Upgrade button hides when the Pro add on is active. The Google connection notice now states plainly that the Search Console and Tag Manager transports arrive in a coming release.

= 2.1.0 =
* Renamed to Planet Social Console. Fully free release for the plugin directory: no license checks, no locked features, and the Search Console modules are free. Premium features moved to a separate add on available from our own site. New Contact Mothership tab. The full console with its boot sequence now ships inside the plugin.

= 2.0.2 =
* Accessibility: high-contrast mode and reduced-motion toggles for the admin console, plus aria labels and a live region on the diagnostics log. No feature changes.

= 2.0.1 =
* Coding-standards pass for the WordPress.org directory: text domain, translators comments, output escaping via wp_add_inline_style, and input sanitization hardening. No feature changes.

= 2.0.0 =
* First public release. The console now ships inside the plugin and runs on any theme.
* Structure, Presence, Redirector, and Schema rooms; virtual sitemap; schema graph; Insights; Cerebro; webhooks; diagnostics.
