Skip to content
Gaurav TiwariChangelog

Plugin changelog

Core Support

A WordPress helpdesk with an agent inbox, a customer portal, and configurable email replies.

Latest
1.5.1
Releases
53
Updated
November 3, 2026
  1. Stable

    1.5.1

    Bug fixes from a review of the whole plugin: live chat, the AI assistant, email, imports, the customer portal, docs, changelogs, the roadmap and background jobs.

    Read full notes 43 changes
    • Fixed Live chat replies are emailed when the visitor didn't see them. A reply that arrived while the chat panel was closed counted as read and was never emailed. Now only replies shown with the panel open count, and a reply read just before clicking End chat isn't emailed either.
    • Fixed The Live chat screen acts on the chat you see. Picking another chat while a check was still loading could show the old chat while Join, Reply and End acted on the new one.
    • Fixed A live chat never resolves itself. With "Status after an agent reply" set to Resolved and customer reopening off, the first reply in a chat stopped the visitor from answering. Chat replies now leave the ticket waiting on the customer, and visitors can write while their chat runs.
    • Fixed "Talk to a person" keeps a returning visitor's note. When the conversation already had a ticket, the note was dropped; it's now added to that ticket.
    • Fixed A second live chat on the same page no longer repeats the first one's messages, and the widget stops fetching the visitor's own messages on every check.
    • Fixed Two agents answering one waiting chat: the second agent's reply is posted instead of failing with "This chat has ended".
    • Fixed The assistant describes only pages a visitor can open. A ?p= address could put the title and text of a coupon, form or template into the prompt.
    • Fixed Every answer counts against the daily token budget, including one whose visitor closed the page mid-answer, and answers finishing at the same time no longer overwrite each other's count.
    • Fixed Rate limits behind a load balancer. A forged CF-Connecting-IP or X-Real-IP header gave each request a fresh limit when the site trusted a proxy other than Cloudflare. CF-Connecting-IP is now read only from Cloudflare's own addresses.
    • Fixed Chat on connected sites remembers the conversation after a page change. The browser blocked the request that restores it.
    • Fixed A provider error during a streamed answer shows as an error, instead of a cut-off answer saved as complete, and a refused request reports the provider's own message.
    • Fixed One broken post no longer stops the knowledge check. A shortcode or block that throws while the post is learned is recorded on that post, and the 30-minute check moves on.
    • Fixed Forget removes every learned post of the type, not only the first 2,000.
    • Fixed Passages stay within the chunk size. Long sentences made passages up to twice as long, and Chinese and Japanese text without spaces became one oversized passage. Posts that were split correctly keep the same passages and aren't learned again.
    • Fixed Email text after an inline image is kept. Apple Mail's text, image, text layout lost everything after the image.
    • Fixed Team alerts can't loop. Alert emails now carry the markers Core Support uses to recognize its own mail, so a mailbox that receives them never turns each alert into a ticket.
    • Fixed Customer text that looks like "On Monday my colleague wrote:" is no longer trimmed as quoted mail.
    • Fixed An unusual envelope sender no longer rejects a message. Long bounce addresses and non-ASCII senders are ignored for duplicate checks instead.
    • Fixed Imports finish with oversized records. A long message in Chinese, Cyrillic or other multi-byte text, or a file too big for database storage (about 12 MB), stopped the whole job. Text is cut to fit, and oversized files are left out and listed.
    • Fixed Saving ticket details keeps the assignee when that person isn't in the agent list, for example after their role changed.
    • Fixed Personal data export and erase cover more than 500 received emails per address.
    • Fixed A bulk delete that fails partway says which tickets weren't deleted and refreshes the list.
    • Fixed The guest ticket form's character limit counts only the visitor's words, and a refused send no longer uses up one of the five an hour.
    • Fixed Signing in from a portal block on an archive, search or blog page returns there, not to an unrelated post.
    • Fixed The homepage switch no longer reverts the site's homepage when the portal settings are saved without touching it.
    • Fixed "Contact support" links are left out when the support page isn't published, instead of pointing at an unrelated /support/ page.
    • Fixed The portal recovers from a failed resume after signing in again, and old status messages clear when the ticket list loads.
    • Fixed Docs open in the right collection. Collections with non-Latin names missed their own docs, and an old or wrong collection address could redirect to a doc with the same name in another collection. It now resolves only when exactly one doc matches.
    • Fixed Docs search doesn't show text from password-protected docs.
    • Fixed Doc feedback counts visitors behind Cloudflare separately and doesn't lose votes sent at the same time.
    • Fixed Roadmap reactions from signed-out visitors are limited per item.
    • Fixed Changelog versions: "-pre" and "-preview" releases sort before the release they lead to, and a bold line that starts with a version no longer becomes a release heading.
    • Fixed A stray % in the page address no longer stops the changelog and docs page scripts.
    • Fixed Re-importing a ticket deleted here brings it back with its messages, and re-importing a CSV whose dates can't be read no longer adds the replies again.
    • Fixed An account whose email isn't confirmed is no longer attached to an existing customer record with that address.
    • Fixed The WooCommerce customer sync reads every order. An order that changed while a sync ran, or a bulk status change, could make the sync miss another order for good. A sync that is running when you update starts again from where it began.
    • Fixed Cancelling a job while a step runs keeps it cancelled.
    • Fixed The progress screen no longer reloads in a loop when a step answers with an error.
    • Fixed On multisite, the bell's new-ticket count is kept per site.
    • Fixed wp core-support jobs run waits for a step another process is running instead of spinning.
    • Fixed Saved storage keys aren't sent to a new destination. Changing the storage driver or endpoint now needs the keys entered again.
    • Fixed When the update server is down, a pending update stays listed and admin pages don't wait on the server on every check.
    • Fixed A filter returning false for the help link no longer breaks Core Support screens.
  2. Stable

    1.5.0

    Visitors can talk to a person in the chat while someone on your team is online, over WordPress or your own Cloudflare Worker. When nobody is, they get a ticket by email, as before.

    Read full notes 11 changes
    • Added Live chat with a person. Turn it on under AI and Chat → Chat and Live Chat → Live chat with a person. While an agent is Online on Core Support → Live chat, "Talk to a person" in the chat widget starts a live chat instead of opening a ticket, whether or not the visitor asked the assistant first. The conversation is a ticket, so it stays in the inbox with everything else.
    • Added The Live chat screen. Chats on the left, the conversation in the middle and the visitor on the right: whether their email is verified, the page they came from, the ticket, their customer record and what your store knows about them. Join a chat, reply and end it there. New chats chime while you're Online.
    • Added Nobody is left waiting. If nobody joins within the wait limit (5 minutes by default), the chat ends and a person replies by email. Replies the visitor read in the chat aren't emailed again; anything they missed is.
    • Added Email not verified. A visitor's address is only what they typed, so the Live chat screen says so unless they were signed in. Replies sent by email or in the portal never appear in the chat.
    • Added Live chats in the bell. The toolbar bell lists chats waiting for someone and chats where the visitor wrote last, counts them in its badge and checks again every 30 seconds. One "Waiting in live chat" alert and team email goes out per chat, following the New ticket switch, instead of one per message.
    • Added Instant delivery through your own Cloudflare Worker. Choose "Cloudflare Worker" under Live chat connection, and messages and typing indicators reach both sides at once over WebSockets. The Worker runs in your Cloudflare account; the Workers Free plan is enough for most help desks. Setup is three steps in settings: generate a secret, Deploy to Cloudflare, paste the Worker's address and send a test event. The Worker is published at wpgaurav/core-support-live-relay. WordPress still saves every message first, and if the Worker can't be reached, both sides go back to checking the site. wp core-support doctor checks the connection.
    • Added Light or dark, your choice. The workspace header and every Core Support screen have a switch: match your device, light or dark. It's saved to your account; Settings → Workspace color mode stays the default for everyone who hasn't chosen.
    • Changed The bell opens when you click it, not as the pointer passes over the toolbar. Click again, click elsewhere or press Escape to close it.
    • Changed "Chat and Live Chat." The Chat tab under AI and Chat is renamed, since it holds the live chat settings too, and the embed card has space between each site's code.
    • Changed The chat widget's question box shrinks back after sending.
    • Fixed Chat requests without a body get an error message instead of a server error.
  3. Stable

    1.4.1

    Customers can add files to their tickets, and you choose which file types the help desk takes.

    Read full notes 4 changes
    • Added Customers can add files. Signed-in customers can add up to 5 files to each message on the support page and on connected sites, of the same types. Only they and your team can open them. Turn it off with Settings → Tickets → Customers can add files.
    • Added Choose which files people can add to tickets. Settings → Tickets → Files in tickets has PDF, documents, spreadsheets, text and logs, and archives alongside images, plus a field for other extensions. Images stay on by default. A file that is not an image goes in the reply as a download link, which also reaches the customer's email. Programs and web pages are always refused, by extension and by contents.
    • Added Setup guides for each AI assistant. Settings → Team alerts → Alerts from your AI assistant links to step-by-step guides for Grok Bot, ChatGPT Dots and Claude Duet.
    • Changed Two leftover admin messages use the new screen names: AI and Chat → Embed, and the current name for customer email settings.
  4. Stable

    1.4.0

    AI assistants can watch the help desk and tell you what's new, team alerts go to several webhooks, settings are grouped by what they're for, and the roadmap takes comments and moves on the page itself.

    Read full notes 12 changes
    • Added AI assistants can keep you told about support. Core Support registers abilities with the WordPress Abilities API: check for new tickets, customer replies and feature requests since the last check, list and read tickets, send a team alert, and read, add, move, publish or decline roadmap items. Each runs as the connected account and checks its permissions. Through Site Agent, ChatGPT, Grok, Claude or Cursor can run a watch every 15 minutes and message you only when something is new.
    • Added Install Site Agent from Settings → Team alerts. A new card installs Site Agent in one click (or activates it), downloaded only from its latest GitHub release, then says how to connect an assistant. Its links go to Site Agent's page on gauravtiwari.org.
    • Added Several webhooks. Settings → Team alerts → Webhooks takes up to 10 webhooks, each with a label and its own signing secret. Each gets every alert as its own job with its own retries, and the card names the one that failed.
    • Added Show the admin bar under Settings → Header and footer → Admin bar. Off by default, so docs, changelog, roadmap and support portal pages keep leaving it out; on, signed-in people who see it elsewhere see it there too, and the docs and changelog side panels stay clear of it.
    • Added Move roadmap items on the public roadmap. Someone who can edit an item can drag its card to another stage on the roadmap's page, or use its Move to menu from the keyboard. Visitors see the board as before.
    • Added Comments on roadmap items. Published items take WordPress comments, with a count on each card. Settings → Roadmaps → Who can comment chooses Everyone (the default), Signed-in visitors or Nobody; Settings → Discussion still handles approval and replies, and a plugin that turns comments off everywhere still does.
    • Changed Settings are grouped. Core Support → Settings lists its tabs in a sidebar under Help desk, Support pages, Docs, changelogs and roadmap, and Site. Notifications is now Customer emails. Portal and Page and URL are one Support page tab. A new Docs tab holds the theme and plugin options for docs pages, which were under Header and footer. Old links to a tab still open it.
    • Changed The Core Support menu follows the same order: the help desk, then docs, changelogs and the roadmap, then setup and the system screens. AI and Chat settings share one item, AI and Chat, with tabs for providers and models, Chat, Knowledge and Embed.
    • Changed Docs collections and sections use a masonry layout. Cards on the docs home and sections on a collection's page fill the space under a shorter neighbour instead of lining up by row, and keep their reading order.
    • Changed Feature requests can go to another product. On a roadmap's page the Suggest a feature form starts on that roadmap and lets the visitor choose another. On the board in wp-admin, each suggestion's Roadmap menu starts on the roadmap it was sent for and can be changed before adding it to a stage, and Add item offers every roadmap even while the board shows one.
    • Changed The roadmap's Move to menu has a quieter look with its own chevron.
    • Changed Every Save button under Settings → Header and footer saves the whole tab. Before, each card saved only its own settings, so changes in another card were lost.
  5. Stable

    1.3.6

    Chat can answer signed-in customers about their own orders and licenses and can keep to your site's content, docs section pages say what each page covers, and wp-admin confirmations show as toasts.

    Read full notes 4 changes
    • Added Chat can answer customers about their own orders and licenses. With "Answer customers about their own orders and licenses" on, a customer signed in to your site gets answers from their recent WooCommerce, FluentCart or Easy Digital Downloads orders and licenses, with license keys masked, instead of being sent to a ticket. Their account email counts only once they've confirmed it, as for their tickets, and their conversation reopens only while they're signed in. It is off until you turn it on, because those details go to your AI provider with the question, and it never applies on connected sites.
    • Added "Only what this site's content covers" under Chat → Answer questions about. Chat never answers from general knowledge, and when nothing on the site matches, it says so in one sentence on a small token budget, so off-topic questions cost little.
    • Added Section pages in docs show what each page covers. "In this section" lists each doc's excerpt under its title.
    • Added Toasts in wp-admin. Confirmations such as "Settings saved." and the agent workspace's short messages show as a toast that hangs from the admin bar, in the brand's colors for light and dark mode. Errors stay until dismissed. Long messages, and every customer page, keep the inline notice. Built on Notch Toast with WordPress's own React, so customer pages load no React.
  6. Stable

    1.3.5

    Footer links follow the light or dark text colors, and header and footer links can use their own colors.

    Read full notes 2 changes
    • Changed Footer links on docs, changelog, roadmap and support portal pages use the text colors of light and dark mode instead of the accent color, with a soft underline. Footer widget links match.
    • Added Header and footer link colors under Settings → Header and footer. Each part can use Contrast (the default), the accent color from Branding, or custom colors for light and dark mode. Buttons keep the accent color.
  7. Stable

    1.3.4

    Roadmap cards in wp-admin show characters as written, and tickets opened from a chat read as plain text.

    Read full notes 2 changes
    • Fixed Roadmap cards in wp-admin show apostrophes and other characters as written. Before, a card's text could show customer's instead of "customer's".
    • Fixed Chat tickets show the assistant's answers as plain text. Before, a ticket opened from a chat kept Markdown markers, so bold text showed up wrapped in literal asterisks.
  8. Stable

    1.3.3

    Deleted tickets leave no order links behind, roadmap requests keep when they were sent, and a few messages and hints say what they mean.

    Read full notes 5 changes
    • Fixed Deleting a ticket removes its order links too, so a customer's Orders card no longer lists a ticket that is gone.
    • Fixed A reply with an image that was never sent and was cleaned up after 2 days says the image is no longer available. Before, it said the image belonged to another ticket.
    • Fixed The privacy export of a roadmap feature request says when it was sent. Before, a request waiting for review showed 0000-00-00 00:00:00, and a published one showed when it was published.
    • Fixed A roadmap item's page no longer asks "Want this too?" while reactions are hidden.
    • Fixed Settings hints for feature requests point to the Suggestions column of Core Support → Roadmap, and the uninstall setting lists customers, imports and roadmaps among what it removes.
  9. Stable

    1.3.2

    Zendesk imports connect with an OAuth client now that Zendesk has retired API tokens, and imports from real Zendesk, Freshdesk and Intercom accounts come over cleaner.

    Read full notes 12 changes
    • Changed Zendesk imports connect with an OAuth client instead of an API token. Zendesk no longer issues API tokens: accounts opened since July 28, 2026 never had them, other accounts can't add one since October 27, 2026, and every token stops working on April 30, 2027.
    • Changed In Zendesk, add an OAuth client of the Confidential kind under Admin Center → Apps and integrations → APIs → OAuth clients. Enter its Identifier and secret on Core Support → Import → Zendesk.
    • Changed Core Support asks Zendesk for read-only access, keeps each access token encrypted until shortly before it ends, and asks for a new one if Zendesk refuses it during an import.
    • Changed A connection saved with an API token asks for an OAuth client before anything is sent to Zendesk. Tickets already imported stay.
    • Changed Freshdesk explains a refused API key: Freshdesk now has a per-agent "Grant API key access to the agent" setting, and the key stays disabled until it's on.
    • Changed Intercom names the permissions an access token needs: Read conversations, Read and list users and companies, and Read admins. Before, a token without Read conversations passed the check and the import then stopped with a message about administrator credentials.
    • Fixed Intercom imports found in a first run against a real workspace:
    • Fixed A conversation with no title and an empty first message, as the Messenger starts them, takes its subject from the first words written. Before, it was "(no subject)".
    • Fixed Names Intercom sends HTML-encoded, such as "WhatsApp & Social", arrive as written, on the customer, the ticket and each message.
    • Fixed A message holding only an image from Intercom keeps that image. Before, it was left out.
    • Fixed Zendesk imports show a reply from Zendesk's own system user, which writes its sample tickets and some automated replies, as a team reply from "Zendesk". Before, it showed as the customer's, with no name.
    • Added Guide links on Customers, a customer's page, Customers → Fields and Sync, Import and Incoming mail, beside the page or card title.
  10. Stable

    1.3.1

    Long imported messages stay whole, privacy exports include orders, and the command line imports from every help desk.

    Read full notes 5 changes
    • Fixed Customers → Sync no longer leaves a blank gap between the Sources card and "Which source wins".
    • Fixed A customer's page names a CSV import record "CSV rows for this address" instead of "Customer #" followed by the address.
    • Fixed wp core-support import start takes freshdesk and intercom as well as zendesk.
    • Fixed An imported plain-text message over 50,000 characters keeps all of it in an attached original-message.txt. Before, the attachment held the shortened text.
    • Fixed The privacy export for a customer lists their linked orders with number, status, total and date.
  11. Stable

    1.3.0

    Every person who writes in or buys becomes one customer record, found by any of their email addresses, and help desks move over from Zendesk, Freshdesk, Intercom or a CSV file.

    Read full notes 56 changes
    • Added Core Support → Customers, beside Incoming mail:
    • Added Search by name, any address or #ID, and filter by source.
    • Added Each customer's page shows their details, tickets, email addresses and where each detail came from.
    • Added Agents can correct a detail, which keeps it as set even when a later sync says otherwise. "Use the synced value again" undoes that.
    • Added Managers add or remove addresses, change the primary one, merge duplicates and delete records. Two customers are never merged automatically.
    • Added Every new ticket is linked to its customer, created on the first ticket from an address. After updating, a background job links existing tickets the same way; wp core-support customers backfill runs it by hand.
    • Added A customer card beside each ticket for agents: customer number, phone, company, how many tickets and orders, the sources, and a link to the customer page.
    • Added Privacy tools export the customer record and erase it. An erased address is not added again from data older than the erasure.
    • Added Background jobs run in short steps that save their progress, retry with backoff and show in Diagnostics. wp core-support jobs list|run|cancel manages them.
    • Added Store and CRM sync. FluentCart, WooCommerce (HPOS and posts storage alike) and Easy Digital Downloads feed Customers:
    • Added Buyers become customers. Managers choose which order statuses count as buying; the defaults are paid, completed and refunded.
    • Added Each customer's orders are linked, with number, status, total and date. Unpaid orders are linked once the person is a customer.
    • Added FluentCRM fills in details for existing customers and never adds contacts on its own.
    • Added New orders and CRM changes arrive as they happen. An hourly pass catches anything missed, and Sync now reads everything a source already has.
    • Added Nothing is written back to the plugins.
    • Added Orders on tickets.
    • Added The customer card beside each ticket lists the orders linked to that ticket. Agents link one of the customer's other orders, or unlink one.
    • Added A ticket opened from a "Get help with this order" button links that order when it belongs to the person who opened it.
    • Added Each customer's page lists their orders with the tickets about each one.
    • Added Customers → Fields. Define custom fields once: text, paragraph, number, date, list of choices, yes or no, email, web address or phone. Map each to a WooCommerce, EDD or FluentCart meta key or a FluentCRM custom field, and choose whether agents see it beside tickets.
    • Added Customers → Sync.
    • Added Turn each source on or off and choose who counts as a buyer.
    • Added Order which source wins when two disagree, with up and down buttons. A hand edit still wins over every source.
    • Added Watch each sync's progress. The page keeps a running sync moving while it is open, even where WP-Cron does not run.
    • Added GET core-support/v1/customers and GET core-support/v1/customers/{id} for agents. Agents can also link and unlink orders with POST core-support/v1/tickets/{id}/orders and DELETE core-support/v1/tickets/{id}/orders/{link}. Managers can follow jobs with GET core-support/v1/jobs/{id} and POST core-support/v1/jobs/{id}/step.
    • Added Import from Zendesk on Core Support → Import:
    • Added Connect: with an administrator's API token. Core Support only reads, and the token is encrypted.
    • Added Check before importing: see how many tickets there are and which Zendesk team members match people here. A matched team member's replies appear as them; the others keep their name.
    • Added What comes over:
    • Added each ticket with its status, priority and dates
    • Added every public reply and private note, in order, with inline images and attachments up to 20 MB
    • Added the requester, who becomes a customer, with Zendesk user fields mapped on Customers → Fields
    • Added What goes into a private note at the top of each ticket: tags, type, channel, CCs and ticket fields.
    • Added Nothing goes out: no emails to customers and no alerts to the team.
    • Added Run again safely. Anything already imported is skipped. "Import changes" brings over what changed since the last import, for a final pass when you switch.
    • Added Undo an import. The tickets, replies and customers it added are removed. Customers who also bought or wrote in here are kept.
    • Added The report lists what was left out: requesters without an email address, deleted tickets and oversized files.
    • Added Rate limits pause the import instead of failing it. While the page is open, it keeps the import moving.
    • Added Command line: wp core-support import start zendesk [--since=DATE|--changes] and wp core-support import undo <job>.
    • Added Import from Freshdesk and Intercom on the same screen, each in its own tab, with the same check, report, re-run safety and undo.
    • Added Freshdesk:
    • Added the ticket description becomes the first message
    • Added custom statuses map by their names, and the check lists the result
    • Added the 300-page list limit is handled by moving the start time forward
    • Added inline images and attachments are copied
    • Added Intercom:
    • Added US, Europe and Australia hosting
    • Added the workspace is named by the check
    • Added conversation parts that say something become replies or internal notes; events without words are left out
    • Added anonymous visitors without an email address are listed as left out
    • Added Import from a CSV file:
    • Added customers, one row per person, read by column name
    • Added or tickets with their conversations, one row per message
    • Added templates with example rows, encrypted storage of the upload until the import finishes, and wp core-support import file <path> for large files
    • Added Possible duplicates. When a store lists one customer's address for another record, as Easy Digital Downloads does for a customer's other addresses, both customer pages say so and offer a merge.
    • Changed Ticket storage version 6 adds the customer link to tickets, and who wrote each message for imported conversations.
  12. Stable

    1.2.0

    Easy Digital Downloads stores running Stackless for EDD get the same support entry points as WooCommerce, and agents see what each Stackless customer has on either store.

    Read full notes 8 changes
    • Added Stackless for EDD in the customer panel. Beside each ticket, the Easy Digital Downloads panel adds an entitlement line ("Annual, active until …", "Lifetime", "License expired …"), active subscriptions, subscriptions with renewal mode, next payment and recurring total, Stackless licenses with site counts and expiry, and open invoices and quotes, each linking to its Stackless screen. EDD Software Licensing keys still show beside them.
    • Added Support tab on the Stackless account page, showing the signed-in customer's tickets like the WooCommerce My Account tab.
    • Added "Get help" buttons on Easy Digital Downloads purchase receipts (with or without Stackless) and on each Stackless subscription and license. They open a new ticket with the subject filled in and a typed reference, such as [stackless-sub:45].
    • Added Chat product facts for EDD downloads include Stackless subscription terms and license terms (sites, validity, current version, requirements) for each price option.
    • Added Switches for each part on Core Support → Integrations, shown while Stackless for EDD is active.
    • Added Stackless for WooCommerce in the customer panel, beside WooCommerce Subscriptions: the same entitlement line, subscriptions, Stackless licenses and open invoices and quotes, with its own switch on the WooCommerce card.
    • Added "Get help" on Stackless for WooCommerce subscriptions and licenses in My Account, and WooCommerce order buttons now carry a [wc-order:ID] reference.
    • Fixed "Get help with this order" in WooCommerce My Account filled in only "Order" because the # in the subject cut the link short.
  13. Stable

    1.1.5

    AI gets its own screen, and docs without a section read as pages.

    Read full notes 5 changes
    • Added Core Support → AI, just above Chat settings, for everything AI that is not Chat itself: the provider API keys with Refresh list and Test connection, the model and thinking level for Chat answers, the search model, the models for other tasks, the AI for your team features (unanswered-question summaries and ticket reply drafts) and the daily token budget, which Chat answers, conversation titles, summaries and reply drafts share. Saved settings are unchanged; each screen now saves only its own.
    • Changed Chat settings keeps turning Chat on, "Talk to a person", where the button shows, the conversation, answer rules and the other limits, and the Knowledge and Embed tabs.
    • Changed "Same as answers" reads "Same as Chat answers", and the answer model fields are "Model for Chat answers" and "Thinking for Chat answers". Docs insights and the reply draft messages point to Core Support → AI.
    • Changed Docs with no parent and no pages under them read as pages, on the collection page and in the docs sidebar, instead of each showing as a section heading. Back-to-back ones share one list. A doc with pages under it is still a section with its heading.
    • Removed The "How docs are organized" guide above the Docs list. Uninstall clears the per-person setting that hid it.
  14. Stable

    1.1.4

    The chat button stays clear of bars at the bottom of the page.

    Read full notes 2 changes
    • Changed The chat button rises above bars fixed to the bottom of the screen, such as a sticky buy bar or a cookie notice, and comes back down when the bar scrolls away or closes. It checks as the page scrolls or resizes, and every 1.5 seconds for bars that appear on their own. Full-screen layers such as menus and dialogs are ignored, and the chat window shrinks to fit above the raised button.
    • Changed On phones the chat button is a 56px round icon. Its label, "Ask a question" or your own, is still read out by screen readers.
  15. Stable

    1.1.3

    Chat that fits a phone, and room for dropdown arrows.

    Read full notes 4 changes
    • Changed Chat on phones (480px wide or less) opens as a panel over the lower part of the page instead of covering the whole screen. Its close button is a 44px target, and the question box and "Talk to a person" fields use 16px text, so iOS no longer zooms the page in when one is tapped. The chat button hides while the panel is open. On larger screens the close button grows from a small "✕" to a 36px icon.
    • Changed Guide links for the newest features: the guest ticket settings sit last on Settings → Tickets under "Visitors without an account", with a link to their guide, and the AI for your team card in Chat settings and the Questions Chat could not answer card on Docs insights link to theirs.
    • Changed Messages that named the old Chat menu now say Chat settings: the Sites page link to the Embed tab and the two AI reply draft errors.
    • Fixed Dropdown arrows overlapped long values in the agent workspace and the support portal. Selects kept 12px of space on the right, where the arrow sits, instead of the intended 32px.
  16. Stable

    1.1.2

    Your own font on Core Support's pages.

    Read full notes 2 changes
    • Added Custom font. Settings → Branding → Font has a Custom choice, with a font list such as "Inter", system-ui, sans-serif, used on every Core Support page, in the portal blocks and in wp-admin. Only font names, quotes, commas and hyphens are accepted.
    • Changed Support portal, changelog and roadmap pages keep other plugins' fonts: their @font-face rules and font preloads now load, so a font from a fonts plugin can be used. Every other style or script from plugins and the theme is still left out.
  17. Stable

    1.1.1

    A ticket form for visitors without an account, footer widgets, and a guide to how docs are organized.

    Read full notes 3 changes
    • Added Visitors can open a ticket without an account, when "Let visitors open a ticket without an account" is on under Settings → Tickets (off until switched on). Signed-out visitors see a short form under Sign in, and replies reach them by email. A hidden field, a signed start time, an hourly limit per address and, when it is active with a key, Akismet keep spam out; a message Akismet calls spam waits in Incoming mail and opens no ticket. "Hold tickets from visitors without an account for review" sends every one to Incoming mail first.
    • Added Footer widget areas. Appearance → Widgets has three Core Support footer columns, shown above the footer on every docs, changelog, roadmap and support portal page.
    • Added A guide above the Docs list: a collection holds sections (docs with no parent), and each section holds pages (docs with that section as their parent). It counts docs with no parent and nothing under them, which readers see as sections of one. Each person can hide it.
  18. Stable

    1.1.0

    Notifications for the team, AI help with docs gaps and ticket replies, and Chat that fits each connected site.

    Read full notes 11 changes
    • Added A bell beside "Howdy" in the toolbar lists recent tickets and roadmap suggestions waiting for review, marks tickets new since you last opened the inbox, and can mark them all as seen. Core Support → Tickets and the Core Support menu show how many tickets are new.
    • Added Team emails. Each new ticket emails the site admin, on until switched off, and each new roadmap suggestion can too, off until switched on. Both can go to other addresses instead, under Settings → Team alerts. They go through the site's own email, one email per address.
    • Added Questions Chat could not answer are listed on Docs insights. With summaries on (Chat → Settings → AI for your team), a model groups the last 30 days of them into topics once a day, each with a doc to write; "Summarize now" writes one at once.
    • Added Draft with AI in the reply box writes a reply to a ticket from what Chat has learned and the public conversation, with notes in brackets where the docs fall short. An agent checks, edits and sends it; private notes are never sent to the model. It has its own model and thinking level, and is off until switched on.
    • Added Chat on a connected site can answer from chosen docs collections and changelogs only, set per site under Connected sites. With none chosen it answers from everything, as before. Ticket drafts for tickets from that site follow the same choice.
    • Added Chat knows the page a visitor is on at a connected site, by address and title, with the query string left out. Each question in Chat conversations shows the page it was asked from.
    • Added Updates and help on the License page: the Core Support changelog, roadmap, documentation and customer support on GauravTiwari.org.
    • Added A core-support class on the body of every Core Support page, in wp-admin and on the site.
    • Changed The Core Support menu is grouped, with a rule between groups: the inbox, docs, product updates, setup, then diagnostics and license. Its first item is now called Tickets.
    • Changed Chat conversations has its own menu item below Chat settings, for everyone who answers tickets; Chat settings are for people who manage Core Support.
    • Changed The agent inbox no longer shows the portal's footer credit and links.
  19. Stable

    1.0.4

    Creating a post through the REST API with a slug works again on sites running Core Support.

    Read full notes 1 change
    • Fixed Creating a post or page through the REST API with a slug ended in a critical error. For a new draft or pending post, WordPress checks the slug before the post exists and passes no ID or parent to wp_unique_post_slug. The docs slug filter added in 0.8.2 required both as integers and threw a TypeError, so POST /wp/v2/posts with a slug, and any editor or tool that sends one, failed. It now treats a missing ID or parent as 0.
  20. Stable

    1.0.3

    Fixes from a review of the whole plugin: docs and pages that need sign-in stay private everywhere, Chat keeps its context, and an account sees tickets from its address only once it proves the address.

    Read full notes 25 changes
    • Security Docs in sign-in-only collections stayed readable to visitors through WordPress's REST API, the site's own search and embeds. The doc page asked visitors to sign in, but /wp-json/wp/v2/csp-docs/…, a theme's search results and ?embed=true showed the text. All of them now treat those docs as the page does; password-protected docs keep WordPress's usual handling.
    • Security Chat could describe a password-protected page, or a doc that needs sign-in, to anyone. The page a visitor is on goes into Chat's instructions only when that visitor could read it. A doc that becomes restricted is forgotten by Chat at once, including from Quick Edit and while Chat is off, and answers never use passages from a restricted doc.
    • Security An account picked up every ticket sent from its email address without proving it owned the address. Where accounts can be created without confirming the email (some checkouts, registration plugins, accounts an administrator adds), someone could register a customer's address and read their tickets. Earlier tickets from an address now join an account once the customer confirms it with an emailed code, offered in the portal when such tickets exist, or a sign-in to a connected site's portal with a code. Tickets already linked stay linked. Sites whose registration already proves addresses can return true from the new core_support_email_verified filter.
    • Security A changelog's access token could be sent to another server. It now goes only to the server it was saved for, and is removed when the source moves to another server.
    • Security Changing a server address kept the saved secret for it. Changing the GitLab or Gitea address, the webhook address, the mail provider, or a mailbox's IMAP server now needs the token, secret, API key or password entered again, so a saved secret never follows an address someone else typed.
    • Security Only a site administrator can switch on "delete all data on uninstall". Support managers see it read-only.
    • Fixed Chat lost the recent turns of longer conversations. Its history was the first twelve messages instead of the last twelve, so from about the seventh question answers lost context. Resuming a conversation and the transcript handed to a ticket keep the newest messages too.
    • Fixed Chat answers with Anthropic failed when thinking was off. Claude models since Opus 4.1 refuse requests that set both temperature and top_p; Chat now sends one.
    • Fixed Choosing a new search model before adding its API key stopped Chat. It keeps answering with the model its passages were learned with, and the missing key is shown on Knowledge.
    • Fixed Chat dropped a question typed while it was still answering, and Talk to a person could open its form more than once.
    • Fixed Saving ticket details in the workspace switched the reply box to the other kind of reply, so a private note could be sent to the customer.
    • Fixed An email could reach a customer twice when a mail provider answered a send with a server error after queuing it. Every attempt of one notification now uses the same message and idempotency key.
    • Fixed IMAP messages were skipped for good during a storage outage, while the mailbox looked healthy. Outages now pause the import, show on the mailbox, and no longer count against a message.
    • Fixed A ticket's reply address could leak into the next email WordPress sent in the same request.
    • Fixed The same message sent again on a later day through a connected site or an automation was acknowledged but dropped. Requests without an idempotency key merge only within the same day. Requests with too many attachments are refused instead of losing the extra files.
    • Fixed Two uploads at the same moment could fail.
    • Fixed Custom CSS lost to the docs, changelog and roadmap stylesheets. It now loads after them.
    • Fixed Items on a roadmap named in a non-Latin script redirected to themselves forever.
    • Fixed The support page could be renamed to an address another page uses, such as docs or changelogs.
    • Fixed Moving a roadmap card removed embeds and other HTML from the item for team members who cannot add unfiltered HTML.
    • Fixed Docs search and "Was this helpful?" did not work inside sign-in-only collections.
    • Fixed Imports and redirects missed sign-in-only docs when run from WP-CLI or cron, creating duplicates on a re-import.
    • Fixed Moving a section to another collection did not move all of its pages.
    • Fixed Changelogs: a # line inside a code block no longer ends a release, Keep a Changelog link lines no longer show as text, build metadata no longer makes a pre-release look stable, and repositories with more than 100 releases keep their oldest ones.
    • Fixed A customer's own early messages showed as support replies once their tickets joined an account.
  21. Stable

    1.0.2

    Custom code for every page, and for each kind of page.

    Read full notes 2 changes
    • Added Custom code for one kind of page. Settings → Custom code now has a card for all Core Support pages, then one each for docs, changelog, roadmap and support portal pages. A page gets the code for all pages first, then its own kind's, and never another kind's. Put an analytics tag only on changelog and roadmap pages, for example, where other plugins' scripts are left out, and not on docs pages, which keep them already and would load it twice. Each card saves on its own. Code saved in 1.0.1 becomes the code for all pages.
    • Changed The code editors are sized to their fields, so the screen is shorter, and the example code shown in empty fields is gone.
  22. Stable

    1.0.1

    Your own HTML and CSS on every page Core Support draws.

    Read full notes 3 changes
    • Added Custom code, as a module. Settings → Modules → Custom code adds Settings → Custom code, with a field for HTML and one for CSS. Both load on every docs, changelog, roadmap and support portal page Core Support draws, and nowhere else: your own pages keep your theme and are left alone. The CSS loads after Core Support's styles, so your rules win; the HTML goes just before </body>, as written, so an analytics script or a chat widget runs there even on pages that otherwise load only Core Support's own scripts. Both fields use WordPress's code editor when syntax highlighting is on, and hold up to 64 KB each. Docs framed on a connected website get the CSS but not the HTML, which belongs to that website's own page. While the module is off, nothing loads and the saved code is kept.
    • Added Only people who may add unfiltered HTML (administrators, or super admins on a network) can change custom code. Support managers see it read-only. A <style> tag around the CSS is taken off when you save; one inside it is refused.
    • Fixed Hyphenated pre-release versions were badged Stable. On changelog pages, versions written as 1.0.0-beta-1 or 1.0.0-rc-2 now show Beta or RC, as 1.0.0-beta.1 already did.
  23. Stable

    1.0.0

    Roadmaps with reactions, feature requests and a planning board, formatted replies with images, and deleting tickets.

    Read full notes 14 changes
    • Added Roadmaps, as a module. Settings → Modules → Roadmaps adds public roadmaps at /roadmap/, or an address you choose: one per product, with its items in four columns (Under consideration, Planned, In progress, Shipped), and a page for each item. They look like the docs and changelog pages, in your branding, and load only Core Support's own styles and scripts. While the module is off, nothing of it loads at all: no post type, addresses, admin screens, styles or scripts.
    • Added Thumbs up and thumbs down on roadmap items. One reaction per person and item, which they can change or take back. Items people like most rise to the top of their column. Visitors are known by a random cookie token and signed-in people by their account; only a keyed hash is stored, never an IP address. Reactions load after the page, so cached roadmap pages still show each visitor their own. Settings → Roadmaps sets who can react.
    • Added Suggest a feature. A form on each roadmap page takes an idea, details and an email address (visitors who are not signed in), and points at similar ideas already on the roadmap while you type. Requests wait in the Suggestions column of the roadmap board, with a count in the menu: add one to a stage, or decline it. Who can suggest, and the wording above the form, are under Settings → Roadmaps.
    • Added A board for the roadmap. Core Support → Roadmap is a board: readers' suggestions in their own column, then Under consideration, Planned, In progress and Shipped. Drag a card to another column, or use its Move to menu from the keyboard. Add to roadmap or a drag publishes a suggestion into a stage, and Decline moves it to the trash. Add item at the foot of a stage adds an item in place, with a title and an optional description, New roadmap adds a roadmap, and the first visit asks for the first one. Show one roadmap or all of them; the item list is still a click away under List view. The board's styles and script load on that screen only.
    • Added Choose the roadmap's address. Settings → Roadmaps → Roadmap address moves the roadmap from /roadmap/ to another address, such as /feedback/ or /ideas/. Addresses WordPress or Core Support already use are refused. Links to the old address redirect to the same page at the new one, query strings included.
    • Added Team alerts for feature requests. While Roadmaps are on, Settings → Team alerts has Alert on new feature requests (off by default). Each new request then goes to every channel that is set up and switched on, with the idea's title, its roadmap and a link to review it. The requester's name, email and details are added only when Include a message preview is on. Webhooks receive the roadmap_requested event with a request object in place of ticket.
    • Added Formatted replies. The agent reply box is now a larger editor with bold, italic, strikethrough, links (Ctrl or Cmd+K), bulleted and numbered lists, quotes and code. Customers see the formatting in the portal, on connected-site portals and in the reply email, which keeps a plain-text version too. Everything is rebuilt from a small allowlist on the server, so scripts, styles and unsafe links never get through.
    • Added Images in replies. Paste a screenshot, drop an image or choose one (PNG, JPEG, GIF or WebP, up to 8 MB) and it appears in the reply where you put it. It shows in the portal and in the customer's email without signing in, at an address that cannot be guessed. Images added to a reply that is never sent are cleaned up after two days.
    • Added Delete tickets. Delete a ticket from its page, or tick several in the inbox and delete them together, after a confirmation that says what goes: every message and note, attachments, received emails and pending notifications. Administrators can delete; others can once they are ticked under Settings → Tickets → Ticket deletion. Also DELETE /tickets/{id} and POST /tickets/delete in the REST API.
    • Added Send and resolve, and Ctrl or Cmd+Enter to send, in the agent workspace. Customers can send with Ctrl or Cmd+Enter too.
    • Added A nudge toward pretty permalinks. With plain permalinks, Core Support's Settings screen (and only that screen) explains that the support portal, docs and changelogs get addresses such as ?page_id=12, and links to Settings → Permalinks for administrators.
    • Changed Stable release: the version is 1.0.0, and the remaining "beta" wording is gone from the workspace.
    • Fixed Erasing personal data left the original email in external storage. With private files, R2, S3 or Bunny storage, Tools → Erase Personal Data cleared a received email's record but left its saved original in storage. It is now removed too.
    • Fixed A docs collection's slug could be changed to a reserved word. Editing a collection's slug to page, feed, search or general now adds -docs, as creating one already did, so its address cannot clash with /docs/ pagination or feeds.
  24. Stable

    0.9.10

    Collection pages list their docs the same way section pages do.

    Read full notes 1 change
    • Changed A collection's sections use the "In this section" look. On a collection page, such as /docs/stackless-for-woocommerce/, each section's docs are now a bordered list of rows with an arrow, the same as the list on a section's own page, instead of colored links inside a card. Rows highlight on hover and show a focus ring for keyboard use.
  25. Stable

    0.9.9

    Section pages list the docs under them.

    Read full notes 1 change
    • Added Section pages list their docs. A doc with docs under it, such as a "Getting Started" section, now ends with an "In this section" list linking each of them in reading order, so a section page that only groups its docs is no longer empty. A section with no text of its own shows the list straight under its title. The core_support_docs_child_links filter changes the list or turns it off.
  26. Stable

    0.9.8

    A collection's version can follow its changelog, and addresses with spaces or other encoded characters work again.

    Read full notes 4 changes
    • Added A collection's version can follow a changelog. Collections → a collection → Current version now offers No version, Type a version (as before), or From a changelog: the current version of the changelog you pick, which updates with each new release, so docs never show an old version again. The changelog linked to the collection is listed first, each with its current version. A doc's own version still wins; if the changelog is removed or has no releases yet, the typed version shows.
    • Fixed Changelog sources with spaces in the file name stopped syncing. Saving a changelog removed the percent-encoding from its addresses, so .../blob/main/Commerce%20Bridge%20for%20Hoster.txt was stored as .../CommerceBridgeforHoster.txt and the sync got a 404. "Check source" still worked, because it never saved. Addresses now keep their encoding, and a file address is no longer encoded twice when it is fetched from GitHub, GitLab, Bitbucket, Gitea or Forgejo (%20 became %2520). A changelog saved with the broken address needs its address entered again once.
    • Fixed The same encoding loss affected a collection's Product page, Community and Source code links and a doc's Old addresses, which are now kept as entered.
    • Fixed Docs with non-Latin or other encoded characters in their address redirected to themselves. The check that sends a doc to its one canonical address read the requested address without its encoded characters, so it never matched and the page looped. It now compares the address as requested.
  27. Stable

    0.9.7

    New connected sites never vanish.

    Read full notes 1 change
    • Fixed A new connected site could vanish. About 1 in 300 new connected sites got an id made only of digits, which WordPress stored as a number, so Core Support never listed the site and its contact form, portal and docs answered "not connected". Site ids now always contain a letter. Sites created before stay as they are.
  28. Stable

    0.9.6

    Choose whether your theme's styles and scripts load on docs pages.

    Read full notes 4 changes
    • Added Your theme on docs pages. Settings → Header and footer has a new card that names the active theme, and its parent when it is a child theme, and says when Core Support recognizes it (built-in rules that also cover its add-on plugins and generated CSS). Two switches, both off by default, load the theme's styles or its scripts on docs pages:
    • Added Styles: the theme's stylesheets, theme.json global styles and Additional CSS load, so its fonts and colors reach the docs.
    • Added Scripts: the theme's scripts load and run.
    • Added Either way, the theme's header, footer and other page markup stay out: from the theme's head and footer code, only the chosen style or script tags come through. Changelog and portal pages still load only Core Support's files.
  29. Stable

    0.9.5

    Docs pages leave other plugins' video players alone.

    Read full notes 3 changes
    • Fixed Core Support restyled video players inside docs. A player from another plugin, such as TruePlayer, Presto, Plyr or Video.js, got Core Support's text-field look on its volume and seek sliders (border, padding, white background, 36px height), Core Support's fonts and focus outline on its buttons, and doc styles on its links, menus, posters and video. A forced auto height and 16:9 ratio could also resize its video or embedded YouTube frame. Docs pages now skip any element that holds media together with player controls, so the player looks as it does on any other page. Ordinary doc content keeps its styles.
    • Fixed Sliders and file pickers never get text-field styles. Range, file, submit, button, reset and image inputs are left as their own plugin or the browser draws them, on every Core Support page.
    • Added csp-not-prose class. Add it to any block in a doc (Advanced → Additional CSS class) to keep Core Support's doc typography off that block and everything inside it.
  30. Stable

    0.9.4

    Changelogs sync from private GitLab, Bitbucket, Gitea and Forgejo repositories, and every settings section links its guide.

    Read full notes 5 changes
    • Added Tokens for GitLab, Bitbucket, Gitea and Forgejo. Settings → Changelogs has a token for each service beside GitHub's, and an address for a self-hosted GitLab or Gitea/Forgejo server. A changelog can sync from a repository, a folder or file in one, or its releases on any of them. Each token is sent only to its own service. Bitbucket has no releases, so it reads changelog files only.
    • Added Exact token permissions in Settings. Each token field names what the token needs: Contents: Read-only on GitHub, the read_api scope on GitLab, Repositories: Read on Bitbucket, read:repository on Gitea and Forgejo.
    • Added A question mark beside each settings section opens its guide on gauravtiwari.org in a new tab, and a tooltip names the guide. It is on Settings, Connections, Connected sites, Integrations, Chat, Diagnostics and License. The core_support_docs_url filter points the links elsewhere, or hides them when it returns an empty string.
    • Fixed A GitHub token without file access read as "needs an access token". A fine-grained token that can see a repository but was not given Contents now gets "The GitHub token can see the repository but not its files", with the setting to change. Other services name the permission their token needs.
    • Fixed A later "not found" hid a refused token. When the first changelog file was refused and the next names were not found, the sync reported the last 404. It now reports the refusal. A 404 with a token says the token may not cover the repository.
  31. Stable

    0.9.3

    The agent inbox follows the support portal's header and footer.

    Read full notes 1 change
    • Fixed The inbox ignored Settings → Header and footer. The agent workspace always showed the logo, the brand name and "Core Support / By Gatilab" in its footer, whatever the support portal pages were set to. It now uses the Support portal pages settings: the logo, the site name (hidden from view but still read out when switched off), the label beside it, and the footer text, credit and links. The version badge and the agent links stay.
  32. Stable

    0.9.2

    Chat keeps private docs private, a Support Manager role, privacy tools for tickets, an opt-in clean uninstall, and clearer wording across the help desk.

    Read full notes 14 changes
    • Security Chat no longer learns content meant for some readers only. Password-protected posts and docs in collections set to "Signed-in visitors" were learned like any other post, so Chat could quote them to anyone. Chat now never learns them, forgets a collection's docs the moment it is closed to signed-in visitors, and learns them again when it is opened. On update, everything restricted that Chat had learned is forgotten once.
    • Added Support Manager role. Support Agent now works tickets, incoming mail, Chat conversations and docs. Support Manager does all of that plus Settings, Connections, Connected sites, Integrations and Diagnostics. Updating moves existing Support Agents to Support Manager, so nobody loses access; new agents get tickets only.
    • Added Tickets in WordPress's privacy tools. Tools → Export Personal Data includes every ticket opened with the address, with its public conversation, and email received from it. Tools → Erase Personal Data removes the customer's name, address, subjects, own messages, attachments and original emails, and keeps the team's replies.
    • Added Settings → Data: delete everything on uninstall. Off by default. When on, deleting Core Support from the Plugins screen removes its tables, settings, docs, changelogs, collections, private attachment files, roles and scheduled tasks on that site, and gives back the homepage if the support page held it. Files in an R2, S3 or Bunny bucket stay there.
    • Added Conversation titles can use no model. The Conversation titles menu has "No model: first words of the question".
    • Added A warning on Core Support screens when attachment storage needs attention, since new files go to the database until it is fixed.
    • Fixed Saving Chat settings switched model-written conversation titles off. The setting had no field, so every save turned it off. It now follows the Conversation titles menu.
    • Fixed The core_support_chat_rate_limit filter did nothing. Every Chat limit now goes through it: chat_session, chat_ip, chat_global and contact_ip, and a limit of 0 turns a bucket off.
    • Fixed Chat introduced itself with an empty name when its own brand name was blank. It now uses the help desk brand, which falls back to the site title.
    • Fixed Chat with no key for its answer model showed its button and then failed every question. The button now stays hidden until the provider has a key, and the warning on the Chat screen says so.
    • Fixed The learning card counted posts with nothing to learn. A published post with no text of its own, such as a docs section that only groups its docs, can never be learned, yet it counted as published, so Docs read 172 of 202 on a site with 30 such sections. These posts are now recorded when Chat finds nothing to learn in them and left out of the card's counts, the Knowledge tab's Published column and the "Learn all now" summary; the card says how many are not counted. A post that gains text is learned and counted again. On upgrade, published posts that were checked but never learned are checked once more by the 30-minute check.
    • Fixed The hourly limit on new tickets and replies said "Hourly demo limit reached". It now says "You have reached the hourly limit" and can be translated.
    • Fixed Delivery activity said "Handed to WordPress mail" even when Emailit, Resend, Brevo or SendGrid sent the email. It now names the mail service in use.
    • Fixed The Logo help text described the old fallback, and the connected-site portal switch asked for WordPress mail when any mail delivery except Capture only works.
  33. Stable

    0.9.1

    The Cloudflare relay Worker delivers mail again.

    Read full notes 1 change
    • Fixed The Cloudflare relay Worker never delivered a message. On Cloudflare, the bundled tools/mail-relay Worker failed every delivery before sending it: it asked fetch for redirect: 'error', which Workers rejects, and called the global fetch as a method of its dependencies, which Workers refuses as an illegal invocation. Each email was retried three times and then forwarded to the fallback address, or rejected without one, so no relayed mail became a ticket. The Worker now fetches with redirect: 'manual' (a redirect still counts as a failed delivery and is not retried) and calls fetch directly. Redeploy the Worker from this version; nothing changes in WordPress or in the signature format.
  34. Stable

    0.9.0

    Docs on your other websites, share buttons, plugin assets on docs pages, badges in any colour, and the current version in every changelog passage Chat learns.

    Read full notes 6 changes
    • Added Docs on a connected website. Core Support → Connected sites → a website → Docs on this website shows the docs collections ticked for it on that site, from one script tag that works on static sites and site builders. The docs open in a frame that grows with its content and keeps search, navigation, videos and code blocks working. Only the ticked collections appear there: search, the docs home and the navigation leave the others out, and any other collection sends the reader back to the docs home. Only that site's addresses may frame them. Collections that need sign-in cannot be shown. Embedded pages are not indexed, so the docs site keeps its search ranking. Each collection also has its own start address, for a product's own site.
    • Added Share buttons on docs and changelogs (Settings → Header and footer → Sharing): X, LinkedIn, Facebook, Bluesky, Threads, Reddit, WhatsApp, email and copy link, as plain links to each network's share page with no scripts from them. Off until you tick networks.
    • Added Badges in any colour. A badge's colour can be your own: a hex code (#7c3aed), an rgb(), hsl() or oklch() value, or a CSS variable from your theme (var(--brand)), mixed so it reads in light and dark mode. The badges editor now lists the built-in badges (New, Improved, Fixed, Removed, Deprecated, Security, Breaking) first, to recolour them or add words, with a colour picker for your own colours.
    • Changed Docs pages leave out only your theme. Every plugin's and block's styles and scripts now load on docs pages, so video players (TruePlayer, Presto and the like), Code Block Pro and analytics work. What goes is the theme's: files in the theme's folder, handles named after it, and rules for popular themes and their pro add-ons (Astra, GeneratePress, Kadence, Blocksy, OceanWP, Neve, Hello Elementor, Divi, Avada, Bricks, Storefront, Flatsome and more, and Marketers Delight); WordPress's theme layer (theme.json global styles, classic theme styles, Additional CSS); and code the theme hooks into the page head and footer. Block plugins whose names start like a theme's, such as GenerateBlocks and Kadence Blocks, stay. Settings → Header and footer → Other plugins on docs pages lists plugin handles to leave out as well, and the core_support_theme_handle_prefixes filter adjusts the theme rules; on docs pages the core_support_standalone_handles filter keeps a theme handle that would otherwise go. Changelog and portal pages still load only Core Support's styles and scripts.
    • Changed Code blocks that bring their own highlighting and copy button (Code Block Pro and the like) keep their look on docs pages and get no second copy button.
    • Fixed "What is the current version?" still answered with an old release on a changelog with many releases. On gauravtiwari.org, "what is the current Stackless version?" found the 1.0.4 release passage, not the passage naming 1.5.1, and Chat answered 1.0.4. Every passage of a changelog now starts with "{Product} changelog (current version X, released D)", so whichever release search finds, the current version comes with it. Learned changelogs are marked once on upgrade and learned again by the next 30-minute check.
  35. Stable

    0.8.5

    Chat keeps what it learned current on its own, and learns post types without an editor, such as a site's tools, from their excerpt, terms and custom fields.

    Read full notes 9 changes
    • Added Excerpts, terms and custom fields. Every learned post now also gives Chat its excerpt, its terms and its custom fields (Advanced Custom Fields or Secure Custom Fields, and meta registered for the post type), so post types without an editor are learned at all: before, a post with no content was skipped. A field group tab that opens with an on/off field that is off is left out, so a switched-off deal is never quoted; underscore fields, images, files, passwords and hash-like values are never read. Chat → Knowledge → Custom fields to leave out lists more. Filter core_support_chat_post_fields.
    • Added A custom field changed without a post save (an import, WP-CLI, the REST API) marks the post for the next check, and so does a change to any of its terms.
    • Changed Changes are learned every 30 minutes, and only what changed. Publishing or updating a post of a learned type, a store price, option or license change, a changelog's text, synced release dates, pre-releases or kept history, and a doc moving to another collection (or its collection being renamed) now mark the post as changed instead of learning it at once. A new 30-minute check (core_support_chat_sweep, schedule core_support_chat_30min) learns marked posts again, oldest change first, then posts modified since they were learned, then published posts of a learned type that were never learned, so a backlog of missed posts never holds back a change just made. Each post is embedded only when its passages differ from what was learned, so an unchanged post costs no embedding request. Up to 25 posts a check and 20 seconds (core_support_chat_sweep_batch, core_support_chat_sweep_seconds); the rest waits for the next check. Each check also compares up to 10 unchanged learned posts, oldest first, for changes no hook reports (core_support_chat_sweep_checks, 0 turns it off), and forgets learned posts that are no longer published. Three embedding failures in a row end a check; a post that keeps failing moves behind the others.
    • Changed The daily store check now compares every learned product with what Chat learned and marks the changed ones, instead of queueing every product.
    • Changed Unpublishing, trashing and deleting still forget a post at once. "Learn all now" still learns at once.
    • Changed What Chat has learned shows on the Knowledge tab only, no longer above Conversations.
    • Changed The learning card shows how many posts are waiting for the check and what the last check did. Filter core_support_chat_watched_meta lists post meta whose changes mark a post.
    • Fixed "What is the current version?" answered with an old release. Every changelog release is its own passage, and none said which one is newest, so Chat answered from whichever release matched the question best. Each changelog now starts with a passage that names the current version and its date, the newest pre-release when there is one, and the six most recent releases. On upgrade, every learned changelog is marked once so the next check learns it again.
    • Fixed A post type with no pages of its own was offered as a source link that led nowhere; it no longer shows one.
  36. Stable

    0.8.4

    Your own header and footer on the docs, changelog and support portal pages, and smaller, deferred assets.

    Read full notes 3 changes
    • Added Header and footer settings. Settings → Header and footer has a card for each of the docs, changelog and support portal pages. Show or hide the logo and the site name, change or remove the label beside them, show or hide the docs search box, and add links and buttons to the header, each a plain link, a button or a primary button, in any order. The footer can be hidden, can carry its own text such as © {year} {site}, can show or hide the footer credit, and can list its own links. Addresses can be full https:// addresses, paths on the site, or Core Support pages such as {docs} and {support}. On phones, plain header links move into a menu. The defaults match the pages before this release.
    • Added Filters core_support_header_links and core_support_footer_links change a page's links.
    • Changed Minified, deferred assets. Release builds include a minified copy of every stylesheet and script (a third smaller before compression), served unless SCRIPT_DEBUG is on. The portal and block scripts and the admin scripts now load deferred, like the docs and changelog scripts already did. Embed snippets for connected sites name the minified scripts; snippets copied before keep working.
  37. Stable

    0.8.3

    Custom badges for changelog labels.

    Read full notes 2 changes
    • Added Custom badges. Settings → Changelogs has a Custom badges editor: a label (such as Beta or Docs), a colour (green, blue, orange, red, yellow or gray) and other words that show the same badge, with a live preview. Changes labelled with those words, as [Beta], Beta: or under a ### Beta heading, show the badge on changelog pages, in feeds and the visual editor's suggestions, and come through the API as category custom-{label}. Custom words win over built-in ones, so Docs can be a badge of its own; a badge named after a built-in one (New, Improved, Fixed, Removed, Deprecated, Security or Breaking), such as Fixed | green | patch, changes its colour and adds words to it, and its category stays fixed. Up to 20 badges, stored one per line as Label | colour | other, words, which also works without JavaScript.
    • Added Filters core_support_changelog_category and core_support_changelog_tone set a label's badge and colour.
  38. Stable

    0.8.2

    Bring existing courses and changelogs over: FluentCommunity courses become docs, other changelog sites become kept release history, and every docs collection gets clean addresses of its own.

    Read full notes 4 changes
    • Added Import FluentCommunity courses as docs. wp core-support docs import fluentcommunity <course> turns a course on this site into a collection: sections keep their titles and order, each published lesson becomes a doc, and links between lessons (also into courses imported earlier) point at the new docs. --retire hides the course in the community and redirects its lesson and course addresses to the docs, although FluentCommunity still answers them. An "&" in a section title no longer turns into "amp" in its address.
    • Added Kept release history for changelogs. wp core-support changelog history <url> --changelog=<slug> keeps every release from a published changelog page (one that lists releases as <article class="release">, following its /page/N/ pages) beside the changelog's own or synced text. Syncing never removes history, and where a version is in both, the history's notes show. Feature headings become badged changes with their details below, and the one-line summary is not repeated. Chat learns the full history, one passage per release.
    • Fixed --no-images on wp core-support docs import was rejected as an unknown parameter; it now leaves image addresses as they are.
    • Fixed Doc addresses are resolved inside their collection. Two collections can each have a "Getting started" section at /docs/{collection}/getting-started/ instead of the second becoming getting-started-2, and an address always opens the doc in the collection it names. Imported top-level docs keep their clean slug, and plain-permalink doc links name the collection too.
  39. Stable

    0.8.1

    Chat finds the right passage among all of a site's docs, and relearning never leaves it without answers.

    Read full notes 6 changes

    Upgrading

    • Changed Search reads every passage. Each question is compared with every learned passage instead of a shortlist of about 50, and that ranking is combined with the database's word search, so a passage that names the exact product, setting or error code still comes first. Only the best passages' text is read. With a persistent object cache (Redis or Memcached), the vectors are kept there. Above 5,000 passages at 512 dimensions (proportionally fewer with longer vectors, and 2,000 for keyword search without FULLTEXT), Chat compares a shortlist as before; the core_support_chat_full_scan_max_chunks filter changes the limit. See the [retrieval benchmark](docs/chat-retrieval-benchmark.md).
    • Changed Smaller vectors. OpenAI text-embedding-3 and Voyage 4 search models store 512 numbers per passage instead of 1,536 or 1,024, so search reads a third to a half of the data, at a small cost in accuracy. The core_support_chat_embedding_dimensions filter sets another size, or 0 for the full one.
    • Changed Every passage knows its doc. Passages start with the doc's title and the product it documents ("Core Forms › Install the plugin"), both for search and for the model, and follow the doc's H2 and H3 sections instead of breaking in the middle of one. A long section's later passages repeat its heading. Text from neighboring blocks no longer runs together.
    • Changed A new search model keeps Chat answering. After you choose another search model, every post is learned with it in the background while Chat keeps answering with the old one; Chat switches once every post is learned, then deletes the old passages. The learning card on the Knowledge and Conversations tabs shows the progress. Before, answers stopped until everything was learned again by hand.
    • Fixed Safe relearning. A post's passages are replaced in one database transaction, so a failed save keeps the old ones and a question never meets a half-written post. One process learns a post at a time; a post saved while it is being learned is learned again right after. Duplicate passages left by earlier versions are removed, and the database now refuses new ones.
    • Fixed Updating from 0.8.0 learns every post again in the background, with one embedding request per post for OpenAI and Voyage search models. Chat answers from the stored passages until it finishes. While Chat is off, this waits until it is turned on.
  40. Stable

    0.8.0

    Chat answers more directly and on point, and learning shows its progress as it happens.

    Read full notes 11 changes
    • Added How Chat answers. Chat → Settings has a new card: answer length (short, balanced or detailed), what Chat answers questions about (this site and its products, or anything with the site's content first), asking one short question when a question is unclear, suggesting a person for accounts, orders, billing, refunds and bugs, and your own rules, one per line (up to 20). Your rules win over the built-in ones, except never asking for passwords or keys.
    • Added Built-in answer rules. Chat answers the question in its first sentence, uses the docs for facts about the site and copies names, prices, menu paths and setting labels exactly, answers for the product, plan or version the visitor means, writes steps as a numbered list, replies in the visitor's language, and ends without filler.
    • Added Limits in every answer. Each answer length has a word limit (about 80, 180 or 400 words) and a matching output cap, never above "Longest answer". Chat asks at most one question and adds at most two links per answer, never says it checked, changed or sent something, never promises refunds, prices, dates or features the docs do not state, keeps to the docs on legal, tax, medical and security questions, and ignores instructions hidden in docs or messages that try to change its rules.
    • Added A model and thinking level for each task. Chat → Settings sets the thinking level for answers (off, low, medium or high) and, for follow-up questions and conversation titles, its own model and thinking level. Follow-up questions such as "what about teams?" can be rewritten by a model into a full search, so the right docs are found; the built-in rules stay the default. Test connection checks every chosen model once.
    • Added Store data in Chat's knowledge. WooCommerce products, FluentCart products and Easy Digital Downloads are learned with their store data, not only their description: price and sale price, options and their prices, SKU, stock status, attributes, categories, subscription terms (billing period, trial, sign-up fee), and license terms (sites per license, validity, current version, WordPress and PHP requirements). Stackless subscription and software licensing terms on WooCommerce products are included while those Stackless modules are active. Products are re-learned when their prices, options, stock status or terms change, and once a day for changes no hook reports; unchanged products are skipped without an embedding call. The core_support_chat_product_facts filter adds facts for any post type.
    • Added Learn all now, five posts at a time. The Knowledge tab learns a post type in batches of five while the screen is open, and the Learned column, the summary and the progress bars update after every batch. A failing key stops the run with the provider's reason instead of working through every post. Without JavaScript the old background queue still runs.
    • Fixed Token usage on streamed replies. OpenAI and DeepSeek streams now ask for usage, Claude streams count input tokens from the start of the reply as well as output tokens, and a reply from a provider that sends no usage is estimated from its text, so the daily token budget holds. Follow-up rewrites and conversation titles count toward the budget too.
    • Fixed Thinking level for Claude. The level is sent as Claude's effort, thinking is switched off where the model allows it (Claude Haiku 5.5, Sonnet 5 and Opus 5; Sonnet 5.5 drops up-front thinking), and Opus and Sonnet 4.6 to 4.8 think when a level above Off is chosen. Before, the setting did nothing for Claude.
    • Fixed Room to think. Thinking tokens count toward a reply's output cap on every provider, so answers, titles and connection tests get extra output room when thinking runs, and a thinking model no longer spends the cap before it writes a word.
    • Changed Background learning runs in batches of five posts instead of twenty, and the Learned column and summary update while jobs are waiting.
    • Changed "Extra instructions" is now "Tone and extra instructions" under How Chat answers, added after your rules.
  41. Stable

    0.7.0

    Docs, Changelogs and Chat join the help desk: product documentation at /docs/, release history at /changelogs/ synced from GitHub or written in wp-admin, and an AI assistant that answers from the docs and hands over to a ticket. Telegram joins team alerts.

    Read full notes 25 changes
    • Added Changelogs at /changelogs/. One changelog per product or service and every release across products, with a product list, Stable only filter, an address per release (#v1.2.0), RSS and a JSON API. Each changelog's releases are one text in WordPress readme or Markdown style, written in wp-admin or synced every 24 hours (customizable) from a readme.txt, CHANGELOG.md or changelog.txt at any address, a GitHub repository (private ones with a token) or its GitHub releases, or wordpress.org. Undated versions take their dates from GitHub releases. Labels such as [NEW], [IMPROVED], [BUG FIX] and [REMOVED] become badges. See [integrations](docs/integrations.md#changelogs-release-history-at-changelogs).
    • Added Changelog editor. The Releases panel starts with a choice: write releases here, or sync them from GitHub or a file. Written changelogs have a visual editor (release cards with version, date, summary and labeled changes, Enter for the next change) and the same changelog as text, kept in step through the site's own parser. Synced changelogs show what an address points at, Check source to preview it before saving, which token applies, the schedule, a status card with the file being read, Sync now in place, and the synced releases read-only.
    • Added One GitHub token for changelogs. Settings → Changelogs holds a fine-grained token used for every changelog synced from GitHub (private repositories included) unless a changelog sets its own. Saving it re-checks failed changelogs at once, and failed syncs are retried hourly.
    • Added Current models built in: GPT-6 Astra, GPT-6.1 Sol and GPT-6 Luna (default), Claude Fable 5.1, Opus 5.5, Sonnet 5.5 and Haiku 5.5, and DeepSeek V4.1 Flash, each with the previous generation. GPT-6 models are sent as reasoning models, "Off" reasoning becomes "low" for Astra and Sol, and Claude 5 models are sent without temperature.
    • Added Test connection for Chat. Chat → Settings sends a one-line test to the chosen chat and search models, with a key typed in the form or the saved one, and says whether each answered, how fast, and why not (refused key, unknown model, rate limit, server error). Nothing is saved and keys never come back.
    • Added Learning progress. The Conversations and Knowledge tabs show how much of the chosen content Chat has learned, per post type, and what is waiting; the bars update while learning runs.
    • Added Chat model lists stay current. With an API key saved, each provider's newest models and up to three previous versions are listed, refreshed daily.
    • Added Chat learns from any post type. Chat → Knowledge lists every public post type with what it has learned, Learn all now and Forget.
    • Added Chat placement. Choose where the chat button shows: every page, docs pages, support portal pages, the home page, single posts of each type, extra addresses (with * for a whole section), and addresses where it never shows. Docs and support pages are the default.
    • Added Footer credit. Settings → Branding sets the text that replaced "Powered by Core Support" on portal and docs pages, with an optional link, or hides it.
    • Added Portal and docs color mode. Visitors get a light portal, docs and chat widget by default; Dark and Automatic are options. The wp-admin workspace keeps its own color mode.
    • Added Docs at /docs/. Product documentation in collections, sections and pages with branded standalone pages, instant search, "On this page", previous and next, callout and steps block styles, "Was this helpful?" feedback, signed-in-only collections, redirects from old addresses, and a Docs insights screen for empty searches, unhelpful docs and stale pages. See [integrations](docs/integrations.md#docs-product-documentation-at-docs).
    • Added Chat. An AI assistant that answers from your docs, ported from Alpha Chat: OpenAI, Anthropic, xAI or DeepSeek, OpenAI or Voyage embeddings or keyword search with no extra key, streaming replies with source links, and "Talk to a person" handoff into a ticket with the transcript. One script tag embeds it on connected sites, with origins checked and conversations owned by a server-issued token. Encrypted keys or CORE_SUPPORT_CHAT in wp-config.php, a daily token budget, rate limits, message and turn caps, retention, and privacy export and erase. Core Support → Chat has settings, knowledge indexing, conversations and embed code.
    • Added Docs importers (wp core-support docs import): docs sites by sitemap or page, Markdown files and GitHub wikis, and wordpress.org readmes, as drafts. Native blocks that pass editor validation, images copied into the media library, links between pages rewritten, old addresses recorded for redirects, and safe re-runs that never overwrite edited or published docs.
    • Added Telegram team alerts. Alerts can go to a private chat, a group, a forum topic or a channel through your own bot. Settings → Team alerts checks the token with Telegram when you save it, and Find my chat lists the chats the bot has seen so nobody has to look up a chat ID. Customer text is escaped, link previews are off, and the ticket link is a button when the site uses HTTPS.
    • Added Alert settings in wp-config.php. The CORE_SUPPORT_ALERTS constant can hold any team-alert setting, including tokens, for one site or a map of blog IDs. Constant values show read-only and are never copied into the database.
    • Added The core_support_alert_channels filter lets add-ons register their own alert channels.
    • Changed Standalone pages (docs, portal, changelogs) use the system sans-serif when the font is set to "Theme font", since theme CSS is not loaded there.
    • Changed Docs and changelog pages have clear titles ("Documentation", "Product changelog", "Product 1.2.0 release notes") instead of archive titles.
    • Changed Chat settings are grouped into cards, checkboxes are tiles that follow light and dark mode, and selects keep readable text on hover in dark mode.
    • Changed Docs and standalone portal pages load only Core Support's CSS and JavaScript. Theme and plugin styles and scripts are removed, including styles WordPress 6.9+ moves into the head after the page is built; titles, meta tags, canonical links and JSON-LD stay. The core_support_standalone_handles filter keeps chosen handles.
    • Changed Dark workspace screens in wp-admin paint the whole page, not only the Core Support panel.
    • Changed Chat indexes nothing while it is switched off.
    • Changed Each channel is delivered on its own. Every alert becomes one WP-Cron job per channel, so a slow or failing service no longer delays the others. Rate limits, server errors and timeouts retry after 1, 5 and 30 minutes (or later when the service asks), up to three times; other rejections are reported at once. Alerts queued by earlier versions still go out.
    • Changed Team alerts screen: one card per channel, each with its own Save, Send a test alert, last-delivery status (Ready, Working, Retrying, Failed, Paused) and a switch that pauses the channel without forgetting its settings. Problems never show saved credentials.
  42. Beta

    0.5.3-beta.1

    Fixed: Password fields are excluded before form fields can become customer identity, subjects, messages or ticket details.

    Read full notes 8 changes
    • Fixed Password fields are excluded before form fields can become customer identity, subjects, messages or ticket details.
    • Fixed Portal sign-in codes enforce attempt limits and single use across concurrent requests and stale object caches. Failed replacement delivery preserves the previous code. Pending codes issued before this update must be requested again; existing sessions remain valid.
    • Fixed Response-suppression headers no longer discard human mail, and HTML-only replies preserve answers written below quoted questions.
    • Fixed IMAP ingestion continues after mark-read or move failures, with independent mailbox checkpoints and visible cleanup warnings.
    • Fixed Failed attachment association remains retryable, and conversations show all attachments for their visible messages rather than truncating at 500 files.
    • Fixed Storage settings prevent destination changes that would strand files, validate the proposed prefix, and report failed settings persistence. Same-destination credential rotation remains supported.
    • Fixed Connected-site portals ignore obsolete responses after navigation/sign-out, preserve drafts through conflicts and same-account reauthentication, and work with plain WordPress permalinks.
    • Development Added regression coverage for these failure paths and a PHP 8.5/MariaDB packaged-integration CI job. Updated contributor commands and routed historical setup notes to the current integration guide.
  43. Beta

    0.5.2-beta.1

    Changed: Customers see every ticket sent from their account email. Tickets that arrive from email, Core Forms, Contact Form 7, WPForms, Gravity Forms, Fluent Forms or a connected site now belong to the WordPress account with that exact email address as soon as they arrive, so they appear in that customer's portal and reply emails link to it. Older unowned tickets are linked the next time the customer opens the portal. Tickets that already have an owner never move. Because the sender of an email or a signed-out form is not verified, the portal labels these tickets "Sent by email", "Sent from a website form" or "Sent from <site>", so one sent by someone else using the address is easy to spot.

    Read full notes 4 changes
    • Changed Customers see every ticket sent from their account email. Tickets that arrive from email, Core Forms, Contact Form 7, WPForms, Gravity Forms, Fluent Forms or a connected site now belong to the WordPress account with that exact email address as soon as they arrive, so they appear in that customer's portal and reply emails link to it. Older unowned tickets are linked the next time the customer opens the portal. Tickets that already have an owner never move. Because the sender of an email or a signed-out form is not verified, the portal labels these tickets "Sent by email", "Sent from a website form" or "Sent from <site>", so one sent by someone else using the address is easy to spot.
    • Changed Signed-out portal: visitors who are not signed in see only the sign-in prompt. Filters, search, Refresh and New ticket no longer show until they can work, and controls stay hidden rather than greyed out while the page checks who is visiting.
    • Changed Quieter portal: the uppercase tagline, the sidebar's filler note and the generated letter tile in place of a logo are gone; without a logo the brand name stands alone. Labels such as "Ticket #12" use sentence case. An empty inbox no longer repeats a second "Start a conversation" button next to New ticket.
    • Fixed Theme button styles could repaint portal and admin buttons. On gauravtiwari.org the theme's submit-button rule turned Search into a full-width red bar with dark text. Core Support buttons now outrank theme submit-button rules (including ones that force full width) and reset the properties themes usually set, and Refresh is a compact icon button beside Search.
  44. Beta

    0.5.1-beta.1

    Added: Native mail providers: Settings → Notifications → Mail delivery can send through the Emailit, Resend, Brevo or SendGrid API instead of WordPress mail. The API key is saved encrypted, or set CORE_SUPPORT_MAIL_API_KEY in wp-config.php. Rate limits and provider outages go back in the queue for up to five attempts; any other refusal, such as an unverified sender, fails visibly. Diagnostics shows the provider's latest error and warns when a mailbox's header reply tracking cannot work with the chosen provider (only SendGrid keeps Core Support's Message-ID).

    Read full notes 3 changes
    • Added Native mail providers: Settings → Notifications → Mail delivery can send through the Emailit, Resend, Brevo or SendGrid API instead of WordPress mail. The API key is saved encrypted, or set CORE_SUPPORT_MAIL_API_KEY in wp-config.php. Rate limits and provider outages go back in the queue for up to five attempts; any other refusal, such as an unverified sender, fails visibly. Diagnostics shows the provider's latest error and warns when a mailbox's header reply tracking cannot work with the chosen provider (only SendGrid keeps Core Support's Message-ID).
    • Added HTML email: reply notifications and portal sign-in codes now go out as HTML with a plain-text part, in one quiet column: your brand name or logo, the reply as body text, one link to the conversation. The plain-text part is unchanged and is still what replies are read from, so "Please reply above this line." keeps trimming quoted history.
    • Changed Reply notifications name the agent who replied ("Gaurav replied") and put the ticket number and subject in the footer.
  45. Beta

    0.5.0-beta.1

    Added: Connections screen (Core Support → Connections): add and edit mailboxes (relay, automation token, IMAP) and attachment storage from wp-admin instead of wp-config.php. Passwords, secrets, tokens and storage keys are encrypted in the database; wp-config.php entries still win and show read-only. Storage is saved only after a test file round-trips.

    Read full notes 30 changes
    • Added Connections screen (Core Support → Connections): add and edit mailboxes (relay, automation token, IMAP) and attachment storage from wp-admin instead of wp-config.php. Passwords, secrets, tokens and storage keys are encrypted in the database; wp-config.php entries still win and show read-only. Storage is saved only after a test file round-trips.
    • Added Reply tracking without plus addressing: a mailbox can use message headers instead of support+token@. Notifications carry the token in their Message-ID and replies are matched through In-Reply-To/References, with the same sender check.
    • Added Customer portal for connected sites (assets/portal.js): customers sign in on another website with an emailed 6-digit code and see, open, answer, resolve and reopen the tickets they opened there. Reply emails for those tickets use the site's name and link to its portal page.
    • Added Team alerts (Settings → Team alerts): Pushover, Discord, Slack and a signed JSON webhook for new tickets and, optionally, customer replies. Message text is left out unless previews are turned on.
    • Added Email from new senders can open tickets automatically instead of waiting for review.
    • Added Pasted screenshots in email are kept and shown inline in conversations for agents and customers; other files stay downloads. Tracking pixels under 1 KB are skipped.
    • Added Unencrypted object storage: with encryption turned off, R2, S3 and Bunny files keep their real names and content types, so they open from the provider's dashboard.
    • Added Agent alert links open the ticket directly (admin.php?page=core-support&ticket=<id>).
    • Added Plugin integrations (Core Support → Integrations):
    • Added Customer details beside each ticket from WooCommerce, FluentCart (including Pro licenses), Easy Digital Downloads (including Software Licensing) and FluentCRM.
    • Added Tickets from Contact Form 7, WPForms, Gravity Forms and Fluent Forms, chosen per form with optional review, and a "Create Core Support ticket" action for Core Forms.
    • Added A Support tab in WooCommerce My Account and the FluentCart customer dashboard, with "Get help with this order" on WooCommerce orders.
    • Added Optional FluentCRM sync that adds ticket customers as transactional contacts with a tag.
    • Added Admin redesign: Settings, Connections, Integrations, Connected sites, License and Diagnostics now use Tabler cards, switches, choice cards, copy fields, badges and empty states, with the brand's colors and dark mode. The icon set grew to 77 Tabler icons (tools/build/icons.py copies them from the icon library).
    • Fixed The admin menu icon was a 1254px, 923 KB image loaded on every admin page; the plugin now ships 40px and 96px versions, and the package is about 0.9 MB smaller.
    • Fixed Diagnostics used a thick left border on a rounded card.
    • Fixed "Download original email" in the ticket view showed "The link you followed has expired": the URL was HTML-escaped twice.
    • Fixed The License menu item pointed to /wp-admin/core-support-license because its submenu was registered before the Core Support menu. Submenus now also appear in a stable order, with License last.
    • Fixed Message text is stored as written. Earlier versions removed <tags>, turned < into &lt;, dropped %20-style sequences and collapsed indentation in tickets, replies, email and form submissions.
    • Fixed The IMAP poller could stop importing all mail when a listed message was deleted before its turn, or when one message kept failing. Missing messages are now skipped, and a message is retried at most five times.
    • Fixed On multisite, a super admin could save a non-existent user as the default assignee or assign tickets to them. Agent checks now require a real member of the site.
    • Fixed Email-only customers were told to continue in a portal that cannot show their ticket; their emails now ask them to reply instead.
    • Fixed Website-form messages close to the length limit were rejected with a confusing error; the error now says how long the message may be.
    • Fixed Unknown mailbox webhook routes return 404 instead of 503, so relays and automation tools stop retrying them. Ignored wp-config.php mailbox entries are listed with the reason on the Connections screen.
    • Fixed Agent names containing &, < or > displayed as HTML entities.
    • Fixed Sender names containing quotes gained stray backslashes in email.
    • Fixed Incoming mail and the branding media picker lost their assets when the menu title was translated.
    • Fixed The workspace showed raw JSON parse errors when the server answered with an HTML error page.
    • Fixed The attachment count on received email included files that were never stored.
    • Fixed A database setup failure no longer prevents the Support Agent role and administrator capabilities from being installed.
  46. Beta

    0.4.1-beta.1

    The workspace header shows the installed version (for example "v0.4.1 beta 1") instead of a fixed "BETA 01" label, and the footer shows the full version number.

    Read full notes 1 change
    • The workspace header shows the installed version (for example "v0.4.1 beta 1") instead of a fixed "BETA 01" label, and the footer shows the full version number.
  47. Beta

    0.4.0-beta.1

    Rebuilt the agent workspace, Incoming mail, customer portal, blocks, and standalone pages on the Tabler design language used by the Stackless theme: neutral surfaces, hairline cards, list rows, light status badges, and 36px controls.

    Read full notes 4 changes
    • Rebuilt the agent workspace, Incoming mail, customer portal, blocks, and standalone pages on the Tabler design language used by the Stackless theme: neutral surfaces, hairline cards, list rows, light status badges, and 36px controls.
    • Added Settings → Branding: brand name, Media Library logo, accent color, neutral palette (neutral, slate, gray, zinc, stone), corner radius, font (system, theme, serif, monospace), and light, dark, or automatic color mode. Accent text and link colors are derived to meet 4.5:1 contrast in light and dark modes.
    • The default accent is now Tabler blue (#066fd1). Sites that saved a custom accent keep it.
    • Asset URLs now include the file modification time, so page and edge caches never keep a changed stylesheet or script.
  48. Beta

    0.3.0-beta.1

    Added built-in IMAP polling with TLS certificate verification, UID tracking (mail already read in a mail client is still imported), unread-only import on first connection, optional move to a processed folder, and visible skipped-message and error status.

    Read full notes 8 changes
    • Added built-in IMAP polling with TLS certificate verification, UID tracking (mail already read in a mail client is still imported), unread-only import on first connection, optional move to a processed folder, and visible skipped-message and error status.
    • Added a token-authenticated intake endpoint for FlowMattic, Zapier, Make, n8n, and Pipedream. It accepts raw MIME or parsed fields, including attachments by base64 or https URL, and handles idempotent retries.
    • Added Connected sites: an embeddable, origin-restricted, rate-limited form for static and WordPress sites, plus a server API with per-site keys. Submissions are reviewed in Incoming mail or open tickets directly, and each ticket shows "via <site>" to agents.
    • Added attachment storage in Cloudflare R2, Amazon S3 and S3-compatible services, Bunny Storage, or private local files. Files are encrypted before upload. Added wp core-support storage test and storage migrate to move older originals out of the database.
    • Attachments are now extracted from received mail and listed on each message, with authorized download-only links for agents and customers.
    • Raised the configurable message limit to 10 MiB with database storage and 25 MiB with external storage.
    • Added wp core-support mail-poll, plus IMAP and storage checks in Diagnostics.
    • Database schema 4 adds ticket and receipt sources and an attachments table.
  49. Beta

    0.2.0-beta.1

    Core Support 0.2.0-beta.1 is a beta for staging and controlled pilots.

    Read full notes

    This release adds signed inbound email replies, incoming-message review, encrypted originals, delivery recovery, and safer ticket workflows. Stock support pages use their own design, outgoing subjects are shorter, and the plugin includes FluentCart licensing and WordPress updates.

    Requires WordPress 7.0+, PHP 8.2+, and sodium for encrypted email and license storage. Inbound email requires the included customer-owned relay and mailbox configuration. Direct Gmail/Microsoft connections and production validation remain open.

    The lifetime license is available at https://gauravtiwari.org/product/core-support/ for $199 USD once with unlimited sites. Third-party service charges are separate.

    Validation: 96 unit tests, 319 packaged WordPress assertions, 15 relay tests, 11 browser regressions, PHPStan level 8, PHPCS, and JavaScript lint. CI covers PHP 8.2–8.5 and WordPress 7.0/7.1.2.

  50. Alpha

    0.1.0-alpha.4

    Added 25 validated settings for portal copy/colors, intake and ticket defaults, customer permissions, workspace behavior, and reply notifications.

    Read full notes 6 changes
    • Added 25 validated settings for portal copy/colors, intake and ticket defaults, customer permissions, workspace behavior, and reply notifications.
    • Enforced intake, message-length, resolution, and reopening rules in the ticket service; applied configurable pagination and reply status.
    • Added per-message sender/subject/footer configuration, notification disabling and queue pausing, while preserving capture-only demo behavior.
    • Color-coded status, priority, assignment, and delivery activity with visible labels and icons. Priority remains agent-only.
    • Replaced the admin menu symbol with the Core Support plugin icon.
    • Added a dedicated settings integration suite. See [Alpha 04](docs/milestones/alpha-04.md).
  51. Alpha

    0.1.0-alpha.3

    Added automatic support-page setup that preserves existing site content and homepage settings.

    Read full notes 6 changes
    • Added automatic support-page setup that preserves existing site content and homepage settings.
    • Added portal-page and URL settings, plus explicit administrator-only homepage placement with restoration of the prior homepage.
    • Added Customer Portal, New Ticket, and My Tickets dynamic Block Editor blocks with independent form IDs and state.
    • Preserved theme layouts and surrounding content; moved session credentials out of page HTML into a private bootstrap request.
    • Updated navigation and notification links to use the configured portal URL, and corrected the old demo homepage takeover.
    • Added page/block integration checks and syntax checks for the packaged PHP files. See [Alpha 03](docs/milestones/alpha-03.md).
  52. Alpha

    0.1.0-alpha.2

    Upgraded the site-local Support Agent role to cover the full Core Support interface, including Diagnostics and the email triage lab, using dedicated plugin capabilities. It does not grant WordPress administrator permissions.

    Read full notes 4 changes
    • Upgraded the site-local Support Agent role to cover the full Core Support interface, including Diagnostics and the email triage lab, using dedicated plugin capabilities. It does not grant WordPress administrator permissions.
    • Added an idempotent role upgrade, agent login routing, and 22 assertions using a real non-admin WordPress user.
    • Replaced text-symbol icons with a bundled subset of the owner-provided Tabler SVG collection and applied the previously created plugin mark.
    • Added guarded operator provisioning for a demo Support Agent account. Passwords are supplied outside the repository and never bundled.
  53. Alpha

    0.1.0-alpha.1

    Added persistent customer tickets and an agent inbox with replies, private notes, status, priority, assignment, search, and pagination.

    Read full notes 5 changes
    • Added persistent customer tickets and an agent inbox with replies, private notes, status, priority, assignment, search, and pagination.
    • Added transactional request deduplication, version conflicts, per-site capabilities, customer isolation, and private-note filtering.
    • Added a customer portal with isolated 24-hour demo sessions, captured delivery activity, and an optional WordPress mail handoff worker.
    • Prefixed packaged PHP dependencies; added synthetic WordPress integration checks and a backed-up demo deployment workflow.
    • Scope and limitations: [Alpha 01](docs/milestones/alpha-01.md). Inbound email and connected mailboxes are not implemented.