Table of Contents changelog

Every version, newest first, with the date it was released. Updates install from your Plugins screen.

Latest version 1.8.123 Oct 2026first released 24 Aug 2026

1.8.1

  • Improved Settings no longer reads every post each day on a site that never had Easy Table of Contents or LuckyWP. Where it finds nothing of either, it looks again once a month, or at once when either plugin's settings come back or posts carrying its per-post box are imported.
  • Fixed Old Easy Table of Contents links to the later pages of a split post land again. Easy Table of Contents numbered a repeated heading across all the pages of a post split with the Page Break block, so a second "Conclusion" on page 2 was #Conclusion-2. Links people shared to those sections now land on the heading. Before, each page was counted on its own, and they landed nowhere.
  • Fixed Entries for headings inside a closed section open it. Choosing an entry for a heading in a closed Details block, a closed panel of WordPress's Accordion block, or a WooCommerce product's Description tab while another tab is showing now opens that section and goes to the heading, and so does a link to it. Before, the heading stayed hidden and the keyboard focus stayed in the list. Another plugin's accordion that hides its panels its own way is scrolled to, where the reader can open it.

1.8.0

  • New Switch from Easy Table of Contents or LuckyWP without editing a post. With the old plugin deactivated, its [ez-toc], [toc] and [lwptoc] shortcodes and LuckyWP's block show this plugin's list in the same place, with their title, heading levels, minimum, numbering and folding where this plugin has the same setting. A post where the old list was switched off gets no automatic list, links to the old sections such as #How_to_pack still land on the heading, and Settings says what was found. Nothing of the old plugin's is changed.
  • Improved Lighter admin screens. WordPress's colour picker now loads only on the Design screen, and the Media Library, which no screen uses, not at all. The other screens no longer carry their scripts, about 55 KB of templates or the query listing the months that have uploads.
  • Improved Faster pages on sites in Spanish or French. The translations now also ship as PHP files, which WordPress 6.5 and later reads from PHP's code cache instead of reading the translation file again on every page. Measured on a French site with all fifteen of our plugins: 6.3 ms and 0.8 MB of memory less on every request. Older WordPress reads the translations as before.
  • Improved Opening the plugin's screens asks less of your server. To make switching tabs instant, the plugin loads its other screens in the background while you read the first one. It now loads at most four, the plugin's own tabs first, and none while the browser tab is in the background; a tab past the fourth loads as your pointer reaches it.
  • Fixed Flat lists left out every heading below the first level. A list set to Flat, indented now shows all its entries in one run, each indented by its depth.
  • Fixed Notes that should be hidden stay hidden. A hint or note a screen had hidden could still show, because the style that lays hints out outranked the browser's own rule for hidden things. Hidden things on the plugin's screens now always stay hidden.

1.7.0

  • New The floating button names the section being read. Settings → Button shows → The section being read turns the floating button into a pill naming the section the reader is in, such as "3 · Choosing a size", in the list's own numbering, with the list's title above the first heading. New sites start with it; existing sites keep the title until you choose it in Settings or from the Dashboard.
  • Improved The floating list opens where you are. Tapping the floating button opens its list at the entry for the section being read, rather than at the top of a long list.
  • Improved A bigger floating button. The floating button is at least 44 pixels each way, and its words no longer lose the tails of letters such as g and y.
  • Fixed Switching the plugin off for a whole network no longer runs out of time. It emptied every site's page cache one after another before WordPress could note it as off, so on a network of a few hundred sites the plugin stayed on. It now takes a few seconds, and each site still empties its cached posts on its first visit after you switch it back on.
  • Fixed LiteSpeed Cache is asked to empty its pages only. With LiteSpeed Cache, saving a change, the first visit after an update and switching the plugin off pressed its Purge All, which also deletes its combined CSS and JS files, empties the object cache and PHP's code cache, clears Cloudflare where LiteSpeed is set to, and leaves "Purged all caches successfully." on your next screen. It now empties LiteSpeed's cached pages only.

Earlier versions

September 2026 37 versions

1.6.1

  • Fixed Saving Table of Contents settings, importing a settings file, or switching the plugin off or on now asks your page cache to empty, so cached posts stop showing an old list until the cache expires. The cache is also emptied once after this update. A host's own cache or a CDN still needs emptying by hand.
  • Fixed Make them headings keeps each bold line's HTML anchor, alignment, CSS class, colours, font size and List View name, so a link to that line's anchor still lands on it.
  • Fixed An address in another alphabet under Excluded addresses now leaves out that page, and nothing else. Pasted from the browser, an address such as /контакты/ was saved as //, which hid the table of contents on your front page instead, and a section such as /блог/ as //, which hid it on every page. Addresses are now kept as pasted and match however the browser writes their letters. A line saved before keeps doing what it did: if Excluded addresses holds /, // or //* that you did not mean, delete it and paste the address again.

1.6.0

  • New The Table of Contents box finds headings the list cannot see. When a post has too few headings for a list, the box names bold paragraphs that look like headings, sections written as H1s and headings that skip a level. In the block editor one press fixes them, and Undo puts them back.

1.5.3

  • Fixed The floating list opens whole on the screen above a Lucky Wheel launcher. With the launcher in the same corner, the list could open with its title and first entries above the top of a phone held sideways. It now allows for the launcher, the WordPress toolbar, and a shipping bar or cookie banner pinned to the top.

1.5.2

  • Fixed A list a membership preview keeps no longer names the headings it hides. On a split post, a contents list placed above the More tag of a preview, and its sidebar copy, are drawn from the headings the preview shows, or left out.
  • Fixed A content block on another page no longer takes over the list. It no longer replaces the sidebar list or drops the page's own entries from a list placed after the article, and a content block or reusable text inserted with a shortcode no longer stops the list naming the post's other pages.
  • Changed Split posts read their other pages without running their shortcodes. A shortcode form, view counter or player on another page no longer runs when a page is opened. Blocks on other pages are still drawn to find their headings. A heading a shortcode prints on another page is no longer listed, nor a section a shortcode is wrapped round, unless it is a layout shortcode such as a Shortcodes Ultimate box or tabs or a WPBakery row. Signed-in readers get the visitors' list while one is kept, so a section a block shows only to members may be missing from theirs.
  • Improved A list inside a split post follows its own page straight away. A heading a block on that page changes is listed at once, rather than within the hour.

1.5.1

  • Fixed Split posts read each page as the reader is shown it. So a section a block or membership shortcode keeps back from visitors is not listed for them in the automatic list, the sidebar copy or a list after the article, and a heading a shortcode prints on another page is listed (not from 1.5.2, which no longer runs shortcodes on other pages).
  • Fixed Split-post lists follow a changed synced pattern. Renaming a heading inside a synced pattern updates the list once the pattern is saved.

1.5.0

  • New One list across a split post. On a post split into pages, each page can list the headings of the whole post and link to the others. It is on for new sites and offered to existing ones on the Dashboard.
  • Fixed Lists on split posts link to the right page. A list placed with [toc] or the block, and the sidebar copy of it, now link each heading to the page it is on, and the editor box counts page by page and says which pages get a list. A password-protected post lists none of its headings until the password is given.

1.4.1

  • Fixed Delete all data also removes the sidebar list's own widget. A Contents (sidebar) or Table of Contents block alone in a widget under Appearance > Widgets is removed with the plugin's data, where on themes that frame each widget it left an empty box in every page's sidebar. A widget with your own blocks beside ours is kept.
  • Fixed A widget holding the sidebar list and your own blocks stays visible. It is no longer hidden on pages without a list when the block was added by hand or imported with a setting.
  • Fixed French counts zero in the singular. French writes "0 message", not "0 messages", and the plugin's French now counts the way WordPress's own French does.

1.4.0

  • New The contents list in your sidebar. Add the new Contents (sidebar) block in the Site Editor or under Appearance > Widgets, or the Table of Contents (sidebar) widget in a classic theme, and the list of the post being read shows in the sidebar as well, while pages without a list show nothing there. Placed last in the sidebar it stays in view as people read, where the theme's sidebar allows it, and marks the section they are on. A new switch on the Settings screen, off to begin with, leaves the list out of the post on wide screens while the sidebar shows it.

1.3.15

  • Fixed The reading progress bar is no longer hidden behind a bar at the top of the window. With our Free Shipping Bar pinned to the top, or our cookie banner open there, the progress bar now shows just below them instead of behind them.
  • Fixed "Back to the top" takes the keyboard back up as well. Pressed from the keyboard, it now moves focus to the post's title, or to the contents list when the post shows no title of its own, so the next Tab carries on from the top instead of from the footer.
  • Fixed With several of our plugins on one site, licensing and updates run on the newest licence code among them. That no longer depends on the order WordPress loads them in, with one exception: while the first of our plugins that WordPress loads (usually the alphabetically first) is on a release from before this one, its older code still serves all of them until that plugin is updated. An older plugin of ours on the same site can also no longer stop this plugin's admin screens loading.

1.3.14

  • Fixed A failed activation no longer clears the licence key you typed. When the licence server could not be reached while you were activating, the Licence screen threw away the key and the list of sites using it, and asked you to go and find the key again. Only an answer from the server about the key itself changes what is stored now.
  • Fixed A key the licence server does not recognise can be replaced on the spot. When a key is reissued, or a licence is deleted, the notice on every admin page asks you to enter it again, but the Licence screen had locked the box and offered only "Deactivate this site". The box now stays open with the Activate button beside it, and the site count left over from the old key is no longer printed next to it.
  • New A "Check again" button on the Licence screen. Renew your licence, or have it put right by support, and one press picks that up instead of waiting for the next automatic check. If the check cannot be made, the screen says why and nothing is changed.
  • Fixed "Deactivate this site" and "Free" work with the key box empty. Neither of them reads that box, but pressing one was answered with "Enter your licence key first." and nothing happened. It caught the Free button beside each site on your licence every time, and "Deactivate this site" whenever the browser had not left the focus on it.
  • Fixed The Placement screen no longer fights your scrolling. With a list of suggestions open under Specific pages or Excluded pages, pressing the browser's Back button left the page jumping to the top every time you tried to scroll. Screens you have moved away from now let go properly, so their search boxes and tick lists stop running in the background.
  • Improved A search you have just done is answered from the screen. On a site with more content than the plugin keeps in the browser, going back to a search you ran a moment ago under Specific pages or Excluded pages asked the server for it again. The answer is kept now while you stay on that screen.

1.3.13

  • Fixed Network activation sets up only the sites of the network you activated it on. On an installation running more than one network, switching the plugin on for one network also wrote its settings onto the other network's sites.
  • Fixed Pressing "Check again" looks for a new version straight away. When the site could not reach our server, every one of our plugins stood down for fifteen minutes, and "Check again" on the Updates screen could not get past that wait. It now clears it, so the check happens when you ask for it.
  • Improved A long Excluded pages list no longer costs a query for each page on every view. On sites running WPML, every page named under Excluded pages was read separately each time the plugin worked out whether a contents list belongs on the page being viewed. They are now read in one go.

1.3.12

  • Fixed A schedule that runs past midnight keeps to its days. In the Schedule panel, a Friday window from 22:00 to 02:00 now stays on until 02:00 on Saturday. It used to stop at midnight, and to come on between midnight and 02:00 early on Friday instead.

1.3.11

  • Improved Fewer database queries on every admin page. Each of our plugins checks its licence on every admin screen, to know whether to show the licence notice, and read its saved licence and its "Remind me later" flag with a query each. With the whole range installed that was thirty separate lookups on every admin page, most of them for rows that do not exist yet. They are now read together in one query (on WordPress 6.4 or later). Measured on a test site with all fifteen plugins: the WordPress Dashboard went from 41 queries of ours to 12.

1.3.10

  • Improved A download is made once, not twice. Pressing Export settings built the file twice: the admin's no-reload navigation fetched it first, found a file rather than a screen it could show, and then asked for it again the ordinary way. On a long list that was twice the wait, and twice the work for the server. Each download is now a single request. Measured in a browser: two requests per click before, one after.

1.3.9

  • Fixed A jump from the list landed the heading under a bar pinned to the top. With our Free Shipping Bar pinned to the top of the window, clicking an entry put the heading underneath the bar: 44px under it on a desktop and 60px on a phone, measured. A jump now also allows for whatever the page has told the browser is fixed at the top (a theme's sticky header often says so the same way), and for our cookie banner while it is open at the top. Measured again: the heading lands just below the bar, and below the banner too while it is showing.

1.3.8

  • Fixed A contents card inside the first topic of a help centre. The front page of our Help Centre plugin has a heading per topic and per section, which is enough for a card, and the card was drawn inside the first topic card. That page, the contact form and a support request are now left alone the way the cart and the checkout are: no automatic list unless the page's own box says "Always show it" or it is picked under Specific pages. A help article still gets its list.

1.3.7

  • Improved One update check for all of our plugins on a site, instead of one each. Every plugin of ours used to ask our server about updates separately — fifteen requests in a row on a site with the whole range, twice a day and every time you press "Check again". The first plugin asked now asks for all of them at once, and the rest read the answer. Measured on a site with all fifteen: fifteen requests became one, and the whole check took a third of a second. If our server refuses or cannot be reached, every plugin waits the same fifteen minutes before trying again, rather than each trying in turn.

1.3.6

  • Fixed The contents box stayed white in dark mode. With our Dark Mode plugin on — or a reader's own dark-mode browser extension, which is the same engine — the words in the list turned pale as the page went dark, but the box behind them stayed white. Measured on the page: 1.6:1, where 4.5:1 is the least that can be read. The box's colour was written in a way the dark engine could not follow; it is written differently now, and the box darkens with the page. Found by a new check that reads every widget we put on a page the way a screen reader and a keyboard do, at a desktop and a phone width.

1.3.5

  • Fixed A wp-admin that would not load when our licence server could not be reached. Each of our plugins checked for its own updates, and if the server was unreachable each one waited out its own fifteen-second timeout — so a site with several of them could spend minutes on a single admin page, twice a day, for something entirely outside its control. The first one to find the server unreachable now says so for the whole site, and the others stand down until it is worth trying again. Measured on a site with fifteen installed: fifteen waits became one.

1.3.4

  • Fixed "Delete everything on removal" was leaving the anchors on every post. The removal named the per-post override and stopped there — and the line that looked like it would sweep everything starting with the plugin's mark actually matches one exact name. So each post kept its list of heading anchors and their older aliases, on a removal the owner had asked for. Found by removing the plugin on a test site and counting what was still in the database.

1.3.3

  • Fixed A setting that is waiting on another one is readable again. A field held back until you switch something else on is dimmed, so it does not look identical to one you simply have not used — but it was dimmed so far that its label and explanation fell below the contrast a person with ordinary eyesight needs. Measured on the rendered screen at 2.55:1 against the 4.5:1 minimum, and now 4.75:1 and 5.02:1. The greying, the sunken background and the blocked cursor carry the rest of the signal.

1.3.2

  • Fixed A link could put words of its own into an admin notice. The bar that appears at the top of a screen after an action took its wording from the address, so a link crafted by somebody else could show an administrator a sentence this plugin never wrote. Only the sentences the plugin itself registers are shown now.
  • Improved The help text under each setting can be read at a glance. A settings screen is scanned, not read, and several notes here had grown into paragraphs. They say the same thing in a line or two, in Spanish and French as well as English.

1.3.1

  • Improved The Import / Export panel says plainly what the file carries. It is settings only: nothing you have written or collected, and never a password, an API key or your licence key.

1.3.0

  • New Move your settings to another site. Settings → Import / Export writes a small .json file with the designs, the colours, the heading levels, the folding, the extras and the placement rules, and reads one back on your next site — so a contents list set up the way you like it does not have to be set up again from a screenshot. Settings only: no posts, no remembered anchors, no licence key. Placement rules that name a particular page, post or category are left as they were, because those are numbers and the page that is number 412 on one site is something else on the other; the message after the import says so. A file re-imported into the site that made it keeps everything.
  • Improved Settings are checked wherever they come from, not just on the form. What counts as a valid value used to live on the settings screen, which made that screen the only safe way to write one. It now lives with the settings themselves, so anything that writes them — the screens, an import, a future feature — is held to the same rules.
  • Fixed Two panel headings on the Placement screen had no icon. Audience and Schedule asked for a mark the plugin did not carry, so they drew nothing at all and the two panels sat unmarked beside the ones that were.

1.2.0

  • New The Licence screen now shows which sites are using your key. "You have used all your activations" used to leave you to work out which sites those were, in your account, on another tab. Every site on the licence is listed now — the date it was added, when it last checked in, and a Free button beside it — so you can let go of a site you no longer run and put this one on without leaving the page. "Last seen" is the column that decides it: a copy that stopped checking in months ago is the one to free. The list appears on a refused activation too, directly under the key you just typed, with the same buttons. Local and staging copies are listed as well, marked free, so the count adds up.
  • Improved Updates follow the activation, not just the key. Freeing a site now really does free it: that site is still told when a new version exists, but it is not handed the download, and its own Licence screen says plainly that it is no longer on the licence and offers to activate again.
  • Fixed Two things on the Licence screen were never translated — the screen's own heading, and the "2 of 3" activation count. Both read in your language now.

1.1.0

  • New Renaming a heading no longer breaks the links to it. An anchor is made from a heading's words, so editing the words changed the anchor and every link anybody had shared to it stopped arriving anywhere. Each save now writes the post's anchors down; a heading that comes back under a new name keeps its old anchor working beside it. It does not guess — a heading replaced outright, or one of two that could each be the rename, is left alone, because sending a reader to the wrong section is worse than the broken link they have now. Rename a heading twice and both old names follow it. Settings → Keep old heading links working, on by default.

1.0.35

  • Improved Plainer words on every screen, after somebody who runs a shop and has never written code read the whole plugin and said what they could not follow.
  • Fixed Three screens named things that are not there. The rules told you to select archives from a group that does not exist, an option called "Shop and product pages" was described as "Product pages", and the post editor pointed at a "display rules" screen by a name nothing uses.
  • Fixed The block said the heading comes from Settings. It comes from Design.
  • Fixed "Anchor prefix" and "Sticky header selector" asked for things without saying what they are. Both now explain themselves, with an example.

1.0.34

  • Fixed Tabbing onto a "Remove" or "Undo" link showed the wrong ring, or none. Those quiet link-shaped buttons in a table row are WordPress's own kind, and WordPress rings them in its blue with a rule stronger than the one this plugin writes — strong enough that it also cancelled the ring the plugin draws. Somebody working down a screen with the keyboard either saw a colour that belongs to no part of this plugin, or lost sight of where they were altogether. They now wear the same ring as every other control here.

1.0.33

  • New Four more designs, twenty in all. Banner is a filled band across the top with the title reversed out of it and the list in a panel below. Chips draws every entry as an outlined chip, short entries sharing a row and a long one taking a row of its own. Aside stands the heading in its own column beside the list with a rule between them, and moves it back above the list on a phone. Dotted runs dotted leaders from each entry out to a figure at the end of the row, the way a printed contents page sets its page numbers — it numbers every entry, like Numerals and Steps.
  • Improved Two design notes said "left" on a design that mirrors. Rail and Bracket describe themselves by the side the reading starts on now, which is the left on this page and the right in Arabic or Hebrew — where those designs have always drawn themselves the other way round.
  • Fixed A theme that colours its list items no longer recolours your contents list. Themes commonly style li inside post content, and the entries inherited that instead of the design's own colour. On a dark theme that was the theme's near-white type on our white panel, at 1.22:1 — a list you could not read on Card, Tinted, Pill, Rail, Numerals, Notebook and Compact. The same went for the list's own heading, the fold arrows, the copy buttons and “No results found.”.
  • Improved The designs that draw no box now use your theme's own text colour, so they read on a dark theme instead of vanishing into it. Rules, Minimal, Bracket, Ladder, Steps, Magazine and Underline used to write a dark ink of their own onto whatever page was behind them, which measured 1.2:1 on a dark site. Plain always worked this way. On a light theme they look as they did; the Text colour field is switched off for them, because there is no panel of ours for the type to sit on.
  • Improved The lines that a design is actually made of can now be seen. Card's panel edge was 1.16:1 against the panel it drew, Minimal's two hairlines 1.18:1, Ladder's dots 1.24:1, Steps' ring round every numeral 1.26:1, and Notebook's ruling 1.2:1 — borders and marks nobody could see, in designs that are nothing but those borders and marks. Each is now a mid tone measured at 3:1 or better, on a white page and on a dark one. Pill, Rail, Numerals, Compact and Midnight got the same treatment.
  • Improved The reading progress bar is a proper meter. Its track was 1.26:1 against every panel, so the filled part appeared to float on nothing and there was no sign of how much reading was left. It is now a capsule with a ring round it at 3:1, and the filled part reaches at least 3.8:1 against the track it sits in.
  • Fixed A heading with no spaces in it is no longer cut off. A long German compound, a chemical name or a bare URL as a heading ran past the edge of the list and was chopped mid-word. It wraps now, at every width down to 320px, and so does a heading of your own.
  • Fixed Steps now joins its circles with a line, which is what its description and the picture in the design picker have always promised. The page drew the numbered circles and nothing between them.
  • Fixed Right-to-left sites get every design mirrored, not broken. In Arabic or Hebrew the nested indent disappeared completely, so the hierarchy of the list went with it, and Rail's bar, Notebook's margin, Bracket's bracket and Ladder's dots all stayed on the left with the words on the right.
  • Fixed The floating button, the reading bar and the back-to-top button now wear the design you chose. All three are drawn outside the list, so they were always painted in the default design's colours: a white button under a Midnight panel, and an orange reading bar on a shop whose own accent was something else entirely.
  • Fixed Rules now marks the section being read. Its accent was the same value as its text, so hovering an entry changed it to the colour it already was. It uses the range's accent now, and draws its two heavy rules in the reading colour so they stay heavy on a dark page.
  • Improved The entry you are reading is drawn in your accent mixed with the list's own type colour, so it is darker on a light page and lighter on a dark one and readable on both. Written straight, a dark accent measured 1.2:1 on a dark theme and a pale one was worse on a white page. The colour it is mixed with is the list's own and never the theme's, so a theme that colours its list items cannot wash that entry out on a panel it does not paint. In a shop's own brand colours — a teal, a blue, a pink — every one of the twenty designs now clears 4.5:1 for that entry, on a light page and a dark one, and the figure beside it is drawn in the same colour rather than the mix applied twice.
  • Improved Banner's band and the circle round the step you are reading carry their type whatever colour you choose. Both reverse type out of your accent, and a mid-tone brand colour carries neither white nor dark type: a teal measured 3.94:1 for the heading on the band and 2.98:1 for the section count beside it. The colour moves instead of the type now — a shade darker or lighter until it reads — so the band is still plainly your colour. The two designs' own accents are already there and are drawn exactly as before.
  • Improved Dotted's figures line up in one column. An entry that folds carries a fold control, and that made its row narrower, so the figure beside it stopped short of the column — in the one design whose whole point is a column of figures.
  • Improved The floating button and the back-to-top button have an edge you can see, at 3:1 against the button they draw, instead of the near-white hairline they fell back to on the ten designs that draw no panel of their own.
  • Fixed Magazine's top-level entries no longer read smaller than the entries nested under them. Small caps are drawn at about x-height, so at the same size the hierarchy came out upside down. Its heavy masthead rule is now drawn in the reading colour, which is what the design picker has always shown, and its accent is one step lighter — as the entry being read it was 3.93:1 on a dark theme.
  • Improved On a phone, Show and Hide now sits at the end of the heading row instead of dropping to the start of the next line as a stray word under the title.
  • Improved Spacing and corners put on one rhythm: the panel's padding is 20px and 24px rather than 18.4 and 20.8, everything under the heading starts at the same distance from it, the small controls share one corner radius rather than three, and the focus rings share one offset.

1.0.32

  • Fixed On phones the contents list no longer jumps shut after the page has loaded. With "Start folded on small screens" on, which it is by default, a phone drew the whole list open and then snapped it shut a moment later, moving the article up under the reader's thumb and costing the page a "poor" layout-shift score in Google's Core Web Vitals. It is now folded from the very first paint. Without JavaScript the list is simply shown open.
  • Fixed The blog page, archives, search results and your RSS feed no longer show "The contents list appears here when the page is viewed." for a post containing the Table of Contents block. The block now shows nothing outside the post itself, like the [toc] shortcode always has.
  • Fixed A list placed with folding switched off no longer disappears on phones. A [toc collapsible="no"] or a block set not to fold was still folded on small screens, with no button to open it.
  • Fixed Choosing an entry in the floating panel now closes the panel, so the section you asked for is not hidden behind it on a phone. The panel no longer shows an empty grey progress bar under its title either.
  • Fixed The back-to-top button can no longer be reached while it is hidden. At the top of the page it was invisible but still took taps meant for whatever was under that corner, and keyboard focus could land on it without anything showing.
  • New Settings → Distance from the bottom (px) raises the floating button and the back-to-top button, for a corner another button already holds, such as a chat bubble or the Dark Mode switch. Both buttons also move up out of the way of a bar pinned to the bottom of the screen by our other plugins, and follow the reading direction on right-to-left sites.
  • Fixed A heading called "Email", "Comments" or "Reviews" no longer breaks the comment form or the product reviews link. Its anchor took an ID that WordPress or WooCommerce already uses on the page, so the comment form's email field lost its label and the "customer reviews" link jumped into the description. Such a heading now gets an anchor like #email-2. An ID you set on a heading yourself is still kept.
  • Improved The stylesheet and script now load only on pages that show a list, and are sent minified. They used to load on every product, the cart, the account page and every other single page, holding up the first paint of each.
  • Fixed With automatic placement off, or on a post set to "Only where I place it", a post with no list no longer shows the back-to-top button or the reading progress bar. Both belong to a list, and appeared without one.
  • Improved Section numbers, the section count, the reading time and the fold arrows are easier to read. Each was faded below the WCAG AA contrast minimum in most of the sixteen designs, and the large figures in Numerals were almost invisible. They are still quieter than the entries, and now meet WCAG AA in every design.
  • Improved Copying a section link now says so, on screen and to screen readers. If the browser refuses to copy, the link is offered ready to copy by hand. The filter box also tells screen reader users how many sections match, or that none do. On a phone the copy button is now always shown, since there is no pointer to reveal it.
  • Fixed The floating button answers to the words on it. It is now named by the list's title, so voice control works in any language and with a title of your own. Before, a Spanish shop's button read "Contenidos" but only answered to a different phrase.
  • New Each post's Table of Contents box now says whether that post will get a list, and if not, why: how many headings it has and how many a list needs, whether the display rules or the post's own setting leave it out, or that a list you placed will show. Each reason links to the setting that changes it.
  • New Works with WPML and Polylang. The title from Design → Title can be translated with either, and a translated post with no Table of Contents setting of its own follows its original's, so a post set to "Never show it" stays that way in every language.
  • Improved Admin screens are easier to read: faint help text and switched-off toggles now meet WCAG AA contrast.
  • Improved Checkboxes show a clear focus ring when you reach them with the keyboard, and the tick in a ticked box draws correctly on phones.
  • Improved A page rule that names a particular page or category now also applies to its translations under WPML or Polylang, and each group of ticks in the page rules is announced by name to screen readers.
  • Improved With several Traslatability plugins on one site, their bars and buttons no longer land on top of each other. A shipping bar and a share bar at the foot of the screen stack one above the other, and a prize-wheel launcher, a contents button and a dark mode button in the same corner stand one above the next.

1.0.31

  • Fixed A post with the Table of Contents block in it no longer shows visitors an error. The block built its list by rendering the post it sits in, which asked for the block again, over and over, until the server gave up. It now builds its list once, including when it sits inside a synced pattern.
  • Fixed A [toc] or the block no longer gets a second list drawn inside it. With automatic placement on, a post with a list placed by hand now has just that one, and a list's own "Contents" title is never read as a heading of the post.
  • New "Only where I place it" in each post's Table of Contents box: no automatic list, while one placed with the block or [toc] still appears. "Never show it", which the help pages used to suggest for this, hid both.
  • Fixed The links in a [toc] or block on a page outside your display rules now go somewhere. The headings on that page were given no anchors, so clicking an entry did nothing.
  • Fixed The cart, checkout and account pages no longer get a contents list. The classic checkout has enough headings of its own to put one inside the checkout form, and the order-received page did too. To have one on such a page anyway, set its Table of Contents box to "Always show it", or tick it under Placement → Places. A rule that already named one of these pages keeps working.
  • Fixed A design chosen in the block, in [toc design="…"] or for one post now wears its own colours. Once the Design screen had been saved, every list took the main design's colours whichever design it asked for. A colour you changed yourself still applies to every list.
  • Fixed With "Keep existing heading IDs" off, a heading that already had an ID now gets the new one instead of carrying both, which left its entry in the list pointing nowhere. A heading with a data-id attribute is no longer mistaken for one that has an ID, and an ID written without quotes is kept like any other.
  • Fixed Placement → Devices now works. A list limited to certain screen sizes is hidden on the others, and so are its floating button, reading progress bar and back-to-top button. Before, the ticks did nothing.
  • Improved Placement → Places now offers only the places a contents list can go — the front page and, on a shop, the cart, checkout and account pages — and the screen says plainly that archives, the blog index and search results never get one.
  • Fixed A folded list is now hidden from the keyboard and from screen readers as well as from sight, so nobody tabs into links they cannot see.
  • Fixed Scroll offset and Sticky header selector now apply with smooth scrolling switched off, so the heading no longer lands under a fixed header.
  • Fixed The reading time is right in French, Spanish and every other language with accented letters. Every accented letter split a word in two, so the time came out too long.
  • Fixed The block's placeholder in the editor is now translated on Spanish and French sites.
  • New "Leave out of the table of contents" on the Heading block: switch it on and that heading is left out of the list, and stays out when you rename it.
  • New The block's sidebar now has Heading levels, Minimum headings, folding and Width, the same overrides the shortcode has. A heading level a list asks for is given anchors even when Settings leaves that level out.
  • Fixed Page rules: an excluded URL such as /contact/ now matches on a site installed in a subfolder or on a subdirectory multisite site, and a rule about the shop, cart or checkout is no longer turned into "Everywhere" while WooCommerce is switched off.
  • Fixed Activating the plugin from an older WP-CLI or a site-management tool could stop with a fatal error.
  • Improved Placement no longer offers Archives ticks, which could never put a list on a category or tag page, and its presets now say what they do here: "Every post, page and product." and "Product pages."

1.0.30

  • Improved When more than one Traslatability plugin is waiting for its licence key, the admin shows one notice naming them all, each name linking to its own licence screen, instead of a separate notice per plugin at the top of every admin page. "Remind me later" quietens all of them for a week. An expired or revoked licence still gets a notice of its own.
  • Fixed "Delete all data on uninstall" now also removes the licence key and the update records, which were left behind in the database.
  • Fixed In the search-as-you-type picker, screen readers now hear "1 result" rather than "1 results".

1.0.29

  • Improved A setting can now depend on another field simply being filled in — a date typed, a picture chosen — rather than only on it holding one particular value. Several screens in the range needed exactly that and had no way to say it.

1.0.28

  • Improved Values arriving from the browser are now unslashed before use, the way WordPress expects. WordPress adds a backslash in front of every quote and apostrophe in a submitted value, and it is up to each plugin to take them off again. In most places here that changed nothing you could see, because the value was being cleaned in a way that discarded them anyway — but it is what WordPress's own plugin checker looks for, and it removes a whole class of quoting bug before it has a chance to appear.

1.0.27

  • Fixed A user-role rule went on filtering after the screen stopped showing it. The role ticks on Display Rules appear only once "Signed in" is ticked, and whatever had been chosen before that carried on being applied from a panel nobody could see. A site that had once picked a role and then switched to "Signed out only" ended up with two rules cancelling each other out, one of them invisible, and nothing on the screen to explain why nobody was seeing anything. The rule now applies exactly when it is on show.

1.0.26

  • Fixed A display rule about something the site no longer has was quietly destroyed. Post types, taxonomies and roles arrive with other plugins and leave with them, and the display rules were checked against whatever happened to be registered at that moment — on every save of every screen. Switch WooCommerce off, change a colour on an unrelated screen, save, and the rule about products was gone. Turning WooCommerce back on did not bring it back, and nothing had said a word. Such a rule is now kept, and shown on the Display Rules screen marked "(not available)" so it can be seen and unticked rather than sitting in the database where nobody can reach it.

1.0.25

  • Fixed An image chosen for a setting and then deleted from the Media Library left its number sitting in the field. The picker correctly said "No image selected" while saving the screen wrote the dead number straight back, so the setting could never be cleared by saving.
  • Improved Settings that depend on two answers at once now stay greyed out until both are met. Where one greyed group sits inside another, the inner one used to switch its own fields back on whenever its own condition was satisfied, whatever the group around it had decided. No screen in this plugin is arranged that way today; the safeguard is in place before one is.
August 2026 25 versions

1.0.24

  • Improved The WooCommerce page in the display rules is called "Cart", matching WooCommerce itself. It read "Basket" before.

1.0.23

  • Improved On Placement, the first card was also titled "Placement", repeating the page heading directly above it. It now reads "Automatic Placement", pairing with "Manual Placement" on the Dashboard.

1.0.22

  • Fixed The Anchor prefix help text said "id" where the toggle beside it said "IDs". Both now read "ID".

1.0.21

  • Improved Every screen has been reworded to WordPress conventions. Toggles say what turning them on does — "Enable smooth scrolling", "Highlight the current section", "Let readers fold the whole list" — and the sticky button's "Start time" field, which was measured in pixels, now reads "Show after (px)". Nothing about how the contents list works has changed.
  • Improved Spanish and French translations updated to match.

1.0.20

  • Fixed In the section bar's two-row layout, the first section now lines up with the plugin icon above it, and the sections fill the height of their row instead of sitting against the top edge.

1.0.19

  • Fixed The section bar no longer breaks onto a second line when a plugin has several sections. It is two tiers by default — the plugin name and the Documentation button on top, the sections on a full-width row beneath — and collapses to one row where everything fits.

1.0.18

  • Improved Field labels are shorter and every save button reads "Save changes", matching WordPress itself.

1.0.17

  • Improved Every screen has been reworded to WordPress conventions. Section names, field labels and help text are shorter and say plainly what they do, and a save now answers "Settings saved." rather than describing what was saved. Nothing about how the plugin works has changed.

1.0.16

  • Fixed The changelog inside the plugin listed only a handful of the releases there have been. It is generated from the same source as the one on the website now, so "View details" on the Plugins screen shows every release rather than stopping months ago.
  • Improved Every changelog entry says what kind of change it is: new, improved, fixed or removed.

1.0.15

  • Improved A page chosen in one list can no longer also be chosen in the other.

1.0.14

  • Fixed A stylesheet a screen sends deliberately switched off is no longer switched on when you move between tabs.

1.0.13

  • Fixed The floating Save button comes back after changing tabs. It appeared on a freshly opened screen and never again once you moved between tabs.

1.0.12

  • Fixed A site that cannot reach the update server now waits a few minutes before asking again, instead of asking on every admin page load. Nothing changes when the server is reachable; pressing "Check again" still asks at once.

1.0.11

  • Fixed The Hide toggle in the heading was a fraction too faint to read — on all sixteen designs.
  • Fixed Numerals drew its large figures in a colour that was too pale on white, and Steps put its numeral in a circle neither white nor dark type could be read on. Both corrected.
  • Fixed The colour used for a button label is now measured against the fill rather than guessed from it.
  • Improved Saving now says what was saved. Every screen answered with the same word — “Saved.” — which tells you the one thing you already knew, that you pressed the button. Each screen names what it kept.
  • Improved The confirmation message has no close button and more room at both ends: it leaves on its own after four seconds, and clicking anywhere on it dismisses it.

1.0.10

  • Improved A design that draws no box, no border, or takes its type from your theme now switches those colour fields off with a line saying why, instead of leaving them empty with no explanation.
  • Improved Confirmation and error messages are easier to see: rounder, and coloured by what they are saying — green for saved, red for something rejected, amber for something to look at — each with a mark of its own.
  • Improved A licence message now looks like one. Activating a key answered in an unmarked grey box, whatever it said; it carries the right colour and a mark like every other message on the screen.
  • Improved A licence key that could not be a key is refused on the spot, without a request to the licence server and without reloading the screen. An empty box used to mean a wait, and on an offline site it meant being told the licence server could not be reached.
  • Improved A key pasted out of an email in lower case, or with the dashes lost, is put right rather than reported as wrong.

1.0.9

  • Fixed Confirmation messages line up properly and sit on rounder corners: they were top-aligned with the text nudged down two pixels to meet the icon, which on a one-line message read as a misalignment because it was one.

1.0.8

  • Improved Confirmations are easier to see. The message after a save is bordered in the colour of what it is telling you, sized to the words rather than stretched to a fixed card, and it now says what was saved rather than just "Saved".
  • Improved It stays for four seconds instead of three — long enough to read a sentence — and hovering it holds it open.

1.0.7

  • Improved Tab changes are instant. The plugin's other screens are fetched quietly in the background while you read the first one, so by the time you click a tab there is nothing left to wait for — tens of milliseconds instead of a second and a half.
  • Improved One at a time, never in parallel, started only once the screen you are on is ready and the browser says it is idle, stopped the moment you navigate, and skipped entirely on a metered connection.

1.0.6

  • New An admin that never reloads. Every screen arrives without a page load and every save happens where you are standing — and the screen you are heading for is usually already fetched, because moving a pointer to a menu item takes long enough to fetch it.
  • New Saved, and told so where you are looking. A save answers in a small message in the top-right corner that clears itself after a few seconds, instead of reloading the page and putting a notice above the header.
  • Improved It is an enhancement, not a dependency: if a fetch fails or scripting is off, links navigate and forms submit exactly as they always did, and the server side is unchanged.

1.0.5

  • Improved Notices redesigned: a quiet bordered card at 14px with the tone carried by a tinted icon, rather than a block of colour in coloured type.
  • Fixed The colour pickers start as the design you picked and follow it when you choose another, instead of four empty boxes.
  • Fixed On the dashboard, a feature you have switched off now shows as off rather than as an empty checkbox waiting to be ticked.
  • Fixed Three custom properties that were misspelt in the stylesheet, so some boxes had square corners where every other control is rounded.
  • Fixed The page picker's search now works: its handler was never registered, so typing in it failed.

1.0.4

  • Fixed On themes that underline links in post content — Storefront and Astra among them — every entry in the contents list was underlined, and on Twenty Sixteen it carried the theme's box-shadow underline instead. The list keeps its own look now.

1.0.3

  • Fixed The contents list ran the full width of the page instead of sitting in the post's own column. It set a width and horizontal margins of its own, which overrode the ones your theme gives every paragraph — it now takes exactly the measure the post is set to.
  • Fixed The Half and Narrow widths now narrow from that measure and centre on the text column, rather than being measured against the whole window.
  • Removed The alignment setting. A block theme centres post content with margin-left: auto !important, which nothing we write can override, so the control did nothing on most themes — and a setting that only works on some is worse than none.

1.0.2

  • Fixed The Placement screen's page rules could not be saved. The controls posted their values under one set of names and the plugin read another, so choosing anything but “Everywhere on the site” appeared to work and silently kept the old setting.

1.0.1

  • Fixed The fold and copy controls sat at the far right edge of the box instead of beside the entry they belong to — on a wide screen the better part of a metre away from it.
  • Fixed The Ladder design drew its rail down the outside of the list rather than through its dots, so the top level had a stray line and no visible thread. The dots were also being shaved in half by the edge of the box.
  • Fixed The Steps design put a full stop inside each numbered circle, and built its numbered entries into an unordered list — which read wrongly to a screen reader.

1.0.0

  • New First release. A contents list built from a post's own headings, in sixteen designs, with the section being read marked as the reader scrolls.
  • New Every heading gets a clean permanent anchor — and one it already had is never rewritten, because that is somebody's shared link.
  • New Automatic placement on posts long enough to need it, plus a [toc] shortcode and a block for the ones that want it somewhere specific.
  • New Folds away whole or branch by branch, comes back from a corner button once it has scrolled off, and stops in the right place under a sticky header.
  • New Reading time, section count, a progress bar, a filter for long lists and a copyable link per section — all off by default.
  • New Works without JavaScript, prints as a proper contents page, makes no third-party request and records nothing about the reader.
  • New Spanish and French included. Works on a single site or across a multisite network.

Pricing

Every plan includes every feature. Choose how many domains, and whether to pay yearly or once.

Pay yearly renews until you cancel

1 domain One year of updates and support
$19a year
5 domains One year of updates and support
$29a year
Unlimited domains One year of updates and support
$39a year

Pay once (lifetime) no renewals

5 domains Updates and support for as long as we publish it
$49once
Unlimited domains Updates and support for as long as we publish it
$69once
  • Every plan includes every feature. You choose only the number of domains.
  • 30-day refund, no reason needed. Refund policy
  • Licence key and download straight after payment, by Stripe.
  • A lapsed licence stops updates and support. It never switches a feature off.
  • Local, development and staging copies are free and do not count against your domains.
  • Yearly plans renew at the then-current price until you cancel. Cancel any time from your account.
  • Where tax applies it is calculated at checkout and shown before you pay.

Licence questions