Dark Mode changelog

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

Latest version 1.8.023 Oct 2026first released 25 Aug 2026

1.8.0

  • New The browser's own bar goes dark with the page. On Android, Chrome and Samsung Internet colour the bar above the page, and so does a site installed as an app on a computer. While a page is dark that bar now takes the page's own dark background, from the first paint for a reader who chose dark, under every method, and your theme's colour comes back when the page goes light. A reader who leaves the page light gets nothing extra.
  • New Your own scripts can follow dark mode. A map, a chart or a chat window can listen for the trasl-dark-mode:change event, fired once when the page loads and each time dark mode comes on or goes off, or ask window.trdm.isDark(). The documentation has an example under For developers.
  • Fixed Colour buttons say their colour on every screen. On the Colours and Toggle Button screens, reached from another screen of the plugin or brought back by a save, every colour button said "Select Color". Each now says the colour it holds, and the new one as soon as you pick it.
  • Fixed The Colours preview follows the colour picker. Picking a colour left the preview as it was when the screen was opened directly, and showed the colour picked one click before when it was reached from another screen. It now shows the colour as soon as it is picked.
  • Fixed No more boxes round the icon and words of share buttons in dark mode. Under the Automatic method, a part kept in its own colours (Excluded Elements, and the brand-coloured buttons of our Social Share Buttons) had a border colour written on everything inside it, and WordPress's own block styles draw a border wherever one is written, so each button's icon and words sat in a box. A border colour is now kept only where there is a border, and a field keeps its own inset edge.

1.7.0

  • New A first install says dark mode is already on. Activation switches dark mode on at once for visitors whose device is set to dark. On a new install a notice now says so, with Preview it and Switch it off until I'm ready, which turns it off until you switch it on again on the General screen. Dismissing it leaves dark mode on. Sites updating from an earlier version never see it.
  • Improved What each method costs, said where you choose it. The Colours screen now says under the method choice that Automatic is the heaviest on phones and Basic the lightest. Measured, Automatic adds about 155 ms of work per dark page on a desktop and 475 ms on a mid-range phone. Nothing about the defaults changed.
  • Improved Lighter admin screens. WordPress's colour picker now loads only on the Colours and Toggle Button screens, and the Media Library only on Images and Elements, where the dark logo is chosen. 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 Printing a page under the Invert method gives a readable sheet. The inversion reached the printer too, so the print rules' white page came out as a solid black sheet. Invert now applies to the screen only, and parts you set to keep their colours are only turned back on screen as well.
  • 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.6.2

  • 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 pages 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 46 versions

1.6.1

  • Fixed Saving a Dark Mode setting your visitors see now asks your page cache to empty (NimbleCache, WP Rocket, LiteSpeed Cache, W3 Total Cache and the other cache plugins it knows). Before, visitors kept the old starting mode, dark hours, screen sizes and button until the cache expired, even after dark mode was switched off. Switching the plugin off or on, saving your styles in the Site Editor and deleting the dark logo image do the same, and the cache is emptied once after this update. A host's own cache or a CDN still needs emptying by hand.
  • Fixed The Dashboard no longer says a page cache it found is unaffected by Dark Mode's settings; it now says that saving a change empties that cache.
  • 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 switched dark mode off on your front page instead, and a section such as /блог/ as //, which switched it off 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 A way back to automatic. Visitor Preference has How long: with Until their device or your schedule next switches, a reader's choice ends at the next switch. On for new sites; existing sites are offered it once.
  • New A Light, Auto and Dark switch for the block, [dark_mode_switch style="choice"] and menus. Auto hands the choice back to your schedule or the reader's device.
  • Changed On a network of sites in subfolders, each site remembers a reader's choice on its own, so readers of every site except the main one choose once more. Sync to user account keeps a signed-in reader's choice per site.

1.5.1

  • Fixed Your theme's dark style is kept when you try another theme. Saving the Colours screen on a theme that has no dark style of its own no longer replaces the style you chose for your other theme, so switching back to that theme uses your style again.

1.5.0

  • New Use your theme's own dark style. On a block theme with a dark style of its own, such as Twenty Twenty-Five's Evening, dark mode can switch to it with no darkening script to download (Colours → Your theme's own dark style). It uses the colours the style gives the page, its sections and its blocks.
  • Improved The switch and Cookie Consent's button share a corner. The floating switch now stands above Cookie Consent's Cookie choices button when both are in the same bottom corner.

1.4.2

  • 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.1

  • Fixed On servers that write addresses the IPv6 way, each visitor's presses count against their own limit. Some servers write a visitor's IPv4 address as ::ffff:203.0.113.7, and it is now read as 203.0.113.7 however it is written. On such a server behind Cloudflare or a proxy of your own, every visitor was taken for the proxy, so they all shared one limit on counting presses of the switch and, on a busy site, presses past it were left out of your usage statistics; each visitor now has their own.

1.4.0

  • New Fix dark mode on the page itself, with no code to type. Signed in as an administrator, choose Fix dark mode here in your site's toolbar, or Fix dark mode on site on the Colours screen, and click the part that looks wrong. Keep its own colours, invert it, or give a picture or your logo a dark version from your Media Library, as your dark mode method allows; the panel says first how many things on the page that will catch. The page shows the result at once, Undo is right beside it, and every choice goes into the lists on Images and Elements, where you can change it later.
  • Changed A new item in your site's toolbar, for administrators. Fix dark mode here now shows in the black toolbar on every page dark mode applies to, on phones too, whether or not Show in admin toolbar is on under Toggle Button. Visitors and other signed-in users do not see it, and the picker loads only on a page you open with it.

1.3.20

  • 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.19

  • Fixed Choices that were never counted. A visitor's choice is reported to the site with a quiet background message, which some browsers refuse to take, and the plugin then gave up instead of falling back to the ordinary request written underneath it. Those choices never reached Switches to dark or Share choosing dark on the Dashboard. It falls back now.
  • Fixed The light and dark figures on the Dashboard cover thirty calendar days. They were counted back in fixed twenty-four hour lumps, so a clock change could make the window a day longer or a day shorter than it says. The sixty days of history kept behind them are trimmed on the right day too, which on a site west of Greenwich was a day late and left an extra day of rows in the database.
  • Fixed A browser error on your pages when a visitor's choice could not be saved. For a signed-in visitor the choice is also saved to their account, and a request that did not get through, on a dropped connection or behind something blocking the site's API, came out as an uncaught error on the page and in whatever you watch front-end errors with. It is handled quietly now.
  • Fixed The search boxes on Display Rules work when you reach the screen by its tab. Typing under Specific pages or Excluded pages brought up nothing at all until the page was reloaded. The Common exclusions ticks there also grey out again the places you have already chosen under Display on.
  • 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 Display Rules 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.18

  • Fixed Your usage statistics cannot be padded by a stranger. The word a page carries so that a press can be counted is one per site and never changes, so anybody who opened a single page of your site could go on posting presses and leave Switches to dark and Share choosing dark saying whatever they wanted. One address may now count sixty presses a minute, and the rest are refused. Nothing about the visitor is written down: the counter behind that limit is named after a one-way hash of the address, holds a number and nothing else, and is gone a minute later.
  • 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 dark mode belongs on the page being viewed. They are now read in one go.

1.3.17

  • Fixed Saving the Colours screen keeps your colour scheme in charge. The four colour boxes show your scheme's colours when you have not chosen your own, and saving the screen without changing them stored those as your own choices. A colour that matches the scheme is now kept as "follow the scheme".
  • 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.16

  • 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.15

  • Fixed The Dark mode switch block used a block format WordPress has deprecated. Since WordPress 6.9 the block editor warns about blocks built to the older format each time one is used, because the editor now runs inside a frame. The block now uses the current format, which it was already written for, so the warning is gone and nothing about how it looks or saves changes. Checked in the WordPress 7.1 editor: inserted, valid, and no warning.

1.3.14

  • 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.13

  • Improved Fewer database queries on every page not served from a cache. A leftover check of the licence, which did nothing with its answer, read the licence from the database on every page view; it is gone. And the translated default wording, kept so that the language files are not read on every page, was kept in a way WordPress never loads with the settings, so reading it was a query of its own each time; it now loads with them.

1.3.12

  • New Four more colour schemes: Plum, Ocean, Charcoal and Frost. Plum is aubergine-black with lilac links, Ocean teal-black with aqua links, Frost a calm steel blue-grey, and Charcoal a softer dark grey for anybody who finds near-black too stark. Like the eight before them, each was measured before it was listed: text and links clear 8:1 on their page, and the colours the plugin works out from them (the panel a quote sits on, a caption, a form field and its edge, a button) are checked by the same suite. Twelve to choose from now, and the four colour fields still start as whichever you pick.

1.3.11

  • 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.10

  • Fixed The switch and a prize-wheel launcher in the same top corner sat on each other. The bottom corners already stacked the two; the top corners now do too. Measured with both at top-right: one above the other, each pressable.

1.3.9

  • Fixed The switch in a top corner stood under a top banner or bar. It now adds the height of whatever the range has pinned to the top of the window — a shipping bar, a cookie banner, WordPress's admin bar for anyone signed in — to its distance from the edge, as it already did at the bottom.

1.3.8

  • New Anything marked data-trdm-keep keeps its colours. Another plugin, or a theme, can mark an element that way and dark mode leaves it and everything inside it exactly as designed — the same way the Excluded Elements list does, without anybody having to type a selector. Our Social Share Buttons use it for brand-coloured buttons: left to the engine, WhatsApp's green was darkened and the words on it lightened to match, 2.2:1 where the designed pair is 11:1.

1.3.7

  • 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.6

  • Fixed The switch tally was losing more than a quarter of what it counted. Every press read the running total, added one, and wrote it back — so two visitors pressing at the same moment both wrote the same number and one of them vanished. Measured on a test site: forty presses counted as twenty-three. Each day is now kept on its own and the database does the adding, so forty presses count as forty. It is also a much smaller write: the old shape stored sixty days of history again on every single press.

1.3.5

  • Fixed The colour preview no longer jumps the page to the top when you click its sample link. It was a link that went nowhere by a means some sites block for safety; it is now plain sample text, which is all it was ever meant to be, and one less thing announced as a link that leads nowhere.

1.3.4

  • Fixed "1 switches total" on the dashboard now reads "1 switch total". In Spanish and French as well.

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

  • 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

  • Fixed The Audience panel heading had no icon. It asked for a mark the plugin did not carry, so it drew nothing and sat unmarked beside the panels that were.

1.3.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.2.17

  • 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 The shortcode documented values the panel above it does not use. It said style="round" while the Button Style panel calls it Circle, so typing what the screen said did nothing.
  • Fixed A pasted web address saved and then matched nothing. Only the part after your domain name is ever compared. The field says so, and an address pasted out of the browser bar is reduced to the part that is matched, so old entries keep working.
  • Fixed Latitude and Longitude gave no idea what a right answer looks like, and rejected values in silence. They now say what they take and what was not saved.

1.2.16

  • 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.2.15

  • New Two more colour schemes, and they are shapes rather than new tints. Layers is a warm graphite where quotes, tables, pictures and code each sit on a rounded panel a step above the page, with no rules anywhere — a table is read by its header step and its alternating rows rather than by gridlines, and a button sits a step higher again. Bold is pure black with white text and nothing faint anywhere: two-pixel rules through and around tables, a framed code block and a framed picture, a bar down the side of a quote, square corners, outlined buttons and fields, and links in running text underlined so colour is not the only thing marking them. Both are on the Colours screen with a swatch drawn in their own shape. The scheme your site already uses is untouched.
  • Fixed The Basic method no longer leaves your theme's own words unreadable. On a standard WooCommerce shop it was painting the navigation at 1.4:1, the basket total at 1.2:1, a whole table as pale text on a white block at 1.2:1 and the footer credit at 3.5:1, because a theme's own colours and panels survived the darkening. The page is now dark all the way through — including a plain block of text a theme has coloured for a white page, which is most footers and most meta lines. Over eleven hundred pieces of type that could not be read came down to a handful, and those are one faded label the theme fades on its light page too.
  • New A focus ring on every scheme. A field, a button or a link you have reached with the keyboard is now ringed in the scheme's text colour, which is the brightest thing on the page by definition. Bold has had one since it arrived; the other seven relied on whatever the theme drew, and a theme that marks focus by changing a border colour marks nothing once the page is dark.
  • Fixed The preview drew Layers' and Bold's frames wrong. The preview on the Colours screen wears the scheme's shape as well as its colours, and the frame was the one part still painted from the palette: Layers, which has no frame at all, drew one, and Bold, whose frame is a two-pixel rule in the text colour, drew a quiet grey hairline. Both now show what the scheme actually does.
  • Fixed Captions and quotation credits can be read. They kept the grey a theme picked for a white page, which measured 3.1:1 on a dark one. Each scheme now works out its own quiet grey and stops lifting it the moment it clears 4.5:1, so a caption is still quieter than the words above it.
  • Fixed A form field on a dark page has an edge again. The colour was there and many themes drew no line at all to put it on, so the search box and the comment fields had no visible boundary under the Basic method. The colour now holds too: a theme that names its own field colour with a heavier rule than ours was leaving its light-page grey on a dark field, which on Bold meant a search box that was a hole in a black page next to a button with a white rule round it. Bold's fields are drawn with the scheme's own rule, the same one its tables, its code and its buttons use.
  • Fixed Layers and Bold draw the same under both methods. Under Basic, Layers' table steps and its raised buttons and Bold's two-pixel fields and outlined buttons were being overruled by the plugin's own darkening, so both schemes came out flatter than their swatch promised. Under Automatic, Bold's fields were given a two-pixel edge on a theme that had drawn no line for it to sit on, so there was nothing to see. Bold's code in a sentence is framed now as well, rather than being the one thing on that scheme with no rule around it.
  • Improved Buttons under the Basic method belong to the scheme. A light grey "Add to cart" with a blue label on a black page is now a panel in the scheme's own colours, or an outline on Bold, and reads at 12:1 or better on every scheme. A link styled as a button — which is what a shop archive uses — now matches the buttons beside it instead of losing its fill.
  • Improved The Colours preview now changes shape as well as colour when you pick a scheme, so what is on screen is the scheme that is selected.

1.2.14

  • Fixed The switch no longer disappears in a browser that blocks cookies and site data. A visitor whose phone was set to dark got a white page that then turned dark, with no button to turn it back. The page is now dark from the first paint and the switch is always there.
  • Fixed The floating button no longer covers "Proceed to Checkout" on phones. It is left off the cart and the checkout, where it sat over the checkout button and the address fields; dark mode itself still applies there. You can turn this off under Toggle Button → Hide on cart and checkout.
  • Fixed Plugin updates now reach visitors straight away. The darkening engine was loaded without a version number, so browsers and CDNs kept an old copy for years after an update.
  • Fixed On a dark page the button stands out again. A dark button used to all but vanish once the page went dark; the lighter of your two button colours now becomes the button there, with the darker one as the icon.
  • Fixed New sites show the colour scheme exactly as picked. Contrast now starts at 100% and Warmth at 0%, so True black is really black. Sites set up earlier keep their current look, and the Colours preview and its contrast figure now include Fine-Tuning, so they show what visitors actually see.
  • Fixed Display Rules no longer offers a second schedule that looked like the dark-hours setting but hid dark mode instead, and that a page cache could freeze. For dark hours use General → Automatic Switching. A schedule you already saved still works and is shown with a note, so you can clear it.
  • Fixed The default keyboard shortcut is now Shift+Alt+D. Alt+D is the browser's own "go to the address bar" key on Windows and Linux, so it is no longer offered, and a site that used it moves to Shift+Alt+D.
  • Fixed The Dashboard no longer asks for a dark logo on a site that has no logo, and it now leads with Preview on site, so you can see your site dark straight away.
  • Fixed The Links colour picker is greyed under the Automatic method, as Borders already was. There, links keep your theme's own colours, darkened.
  • Fixed On a site translated with WPML or Polylang, a page's Dark Mode box now applies to its translations too, unless a translation has a setting of its own. A page set to never go dark was dark in other languages.
  • Fixed The button shapes look as they should again. Since 1.2.4 a pill or rounded square with a label had its words pressed against both edges, and Minimal, the icon with no background, was drawn as a dark square. On a page darkened by Invert, Minimal's icon now turns light with the page rather than staying dark.
  • Improved Pages are lighter. A visitor who never turns dark mode on now downloads about six kilobytes instead of sixteen, and the script in each page's head is under half its old size.
  • Improved Admin screens are easier to read: faint help text and switched-off toggles now meet WCAG AA contrast.
  • Improved Admin screens work better with screen readers and keyboards: each group of choices is announced with its name, field hints such as a size's allowed range are read out with the field, and every text box and menu shows a clear outline when you tab to it.
  • Improved On a right-to-left site the floating button's corners are mirrored, and the button moves up to clear a bar pinned to the bottom of the screen by another Traslatability plugin instead of hiding behind it.
  • New Position on phones. Move the floating button to a top corner on small screens, or hide it there, without changing where it sits on larger ones.
  • New The Toggle Button screen shows the contrast between the icon and the button, and says when it is too low to see.
  • New Your own button wording can be translated. WPML String Translation and Polylang now list the button's two labels, so each visitor sees them in their own language.
  • 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.2.13

  • Fixed Button text follows each visitor's language, whichever language saved it. A default label stored by an earlier save in one language, "Modo oscuro" say, was still shown as your own text to visitors in other languages, so French visitors saw Spanish. The default "Dark Mode" and "Light mode" are now recognised in every language the plugin comes in, and each visitor sees their own. Anything else you typed is still shown exactly as you typed it.

1.2.12

  • Fixed The button now shows a sun once the page is dark. On the default icon-only button the moon stayed up in both states, so the button looked the same before and after it was pressed.
  • Fixed Excluded Elements keep their colours under the Automatic method. Only colours written into the element itself were kept before; a badge or chart coloured by your theme's stylesheet was darkened with the rest of the page. Now each excluded element, and everything inside it, keeps its light-mode colours.
  • Fixed Button text follows each visitor's language again. Saving any settings screen stored the default "Dark Mode" and "Light mode" in the language of whoever pressed Save, so a Spanish site with an English-speaking administrator showed English to every visitor. Empty fields now always mean the translated default, and a label stored that way by an earlier save is read as the default again.
  • Fixed Importing settings from another site no longer carries its page rules across. Rules naming particular pages or categories pointed at whatever had the same number on the new site, so dark mode could vanish from an unrelated page. They are left out, along with the dark logo, and the message after the import says so. Importing a file this site exported keeps everything.
  • Fixed Usage statistics now count presses on pages served from a page cache however long ago they were cached. They stopped counting a day or two after caching. Pages cached before this update go on counting for two weeks.
  • Fixed "Sunset to sunrise" said it used the visitor's location. It uses the latitude and longitude you enter, and without them follows each visitor's device setting — which the screen now says. Without coordinates, a visitor whose device is dark also no longer sees a white page first.
  • Fixed A page set to open in dark mode now does so while Automatic Switching is on. The schedule used to decide first, so the page was light outside the dark hours. The choice is now called "Open in dark mode".
  • Fixed The Dark Mode box in the editor now works on the WooCommerce Shop page and on the page chosen as your Posts page.
  • Fixed The toolbar switch shows a moon or a sun instead of an empty space, and appears on phones, where WordPress hid it.
  • Fixed The contrast reading under the Colours preview is now in your admin language.
  • Fixed Page rules: an excluded URL such as /contact/ now matches on a site installed in a subfolder or on a subdirectory multisite site; "Shop and product pages" now also covers brand and attribute archives; and a rule about the shop, cart or checkout is no longer turned into "Everywhere" while WooCommerce is switched off.
  • New Preview on site. A button on the Colours screen opens your home page dark with your saved settings, without storing a choice in your browser that would stop your schedule and device setting applying to you.
  • New A style for each placed switch. The block has its own Style and text setting, and the shortcode takes style and label, so a header can show just the mark while the floating button stays a pill. Existing blocks and shortcodes keep following the Toggle Button screen.
  • Fixed Activating the plugin from an older WP-CLI or a site-management tool could stop with a fatal error.

1.2.11

  • 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.2.10

  • Improved Button colour and Icon colour are greyed for the Minimal style, which is transparent and takes its colour from the text around it.
  • 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.2.9

  • 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.2.8

  • New Clear statistics. The Dashboard now offers to empty the dark and light counts once there are any. The Advanced screen has always said that resetting your settings keeps the statistics, and there was no way to clear them by any other route either.
  • Fixed The Page weight card contradicted itself. Under the Invert and Basic methods it printed a size in kilobytes and then said "No additional assets" underneath. Every method loads the switch's own stylesheet and script; what those two skip is the darkening engine, and that is what it says now.
  • Fixed The "No way to switch modes" warning claimed to know something it cannot. A menu item is a link in one of your theme menus, not a setting, so the plugin has no way of seeing it — and a merchant who had added one was told they had not, with no way to stop being told except switching on a button they did not want. It now says what it can actually see, and names the setting that acknowledges a placement you made yourself.

1.2.7

  • Fixed The Colours screen offered every control to every method, and the three do not use the same things. On Invert you could pick a colour scheme, set four colours and watch a preview, and none of it changed anything on your site — Invert turns the page negative rather than recolouring it. On Basic the four Fine-Tuning dials did nothing, because that method writes a small stylesheet instead of filtering the finished page. Whatever the chosen method does not use is now greyed out, with a line saying which panel to use instead. Borders are greyed under Automatic too: the engine works those out for itself.
  • Fixed The Links colour was ignored in the one place it mattered most. If the darkening engine could not be downloaded, the plain fallback painted links a fixed blue: it asked for your colour through a variable that nothing ever set. It now uses the colour you chose.
  • Improved A greyed-out panel now looks greyed out. Labels and boxes were dimmed, and anything drawn as a card — the colour schemes, the preview — sat there at full strength looking perfectly clickable while doing nothing.
  • Improved The block editor's preview data was rebuilt on every single request, including REST calls, admin-ajax and cron, none of which has an editor in it. It is built when the editor loads.
  • Fixed On a WordPress network, a site created after the plugin was installed had settings written into it whether or not the plugin runs on the network at all. A network using this on one site out of fifty was seeding all fifty.

1.2.6

  • Fixed The usage-statistics endpoint accepted a count from anything at all. It has to be open, because a visitor pressing the button may be on a page served from a cache and there is no WordPress nonce to have — but that left an address anyone could point a script at, writing a row to your database on every request. Pages now send back a word the site issued, so a caller that never loaded a page is turned away. It is derived from the date and your site's own salt, it is the same for every visitor, and it records nothing about anybody. Counting itself is unchanged.
  • Improved The browser's settings were built twice on every page view and the second copy thrown away. On a site with a dark logo that meant four attachment lookups where two would do; on a site without one it meant two that were not needed at all, for a list the browser then ignored.

1.2.5

  • Fixed Image dimming only worked under one of the three methods. The Automatic engine took it; Invert ignored it completely, and Basic dimmed every image by a flat six per cent whatever the field said — including when it said none. All three now do what the field says, which for most sites using Basic means images are no longer dimmed unless somebody asked for it.
  • 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.2.4

  • Fixed The toggle button gave no sign of being reached by keyboard on a light page. Its focus ring was drawn in the button's own text colour, which is white, and a focus ring is drawn just outside the button — on the page. White on white. There are now two rings in opposite colours, so whatever is behind the button, one of them shows.
  • Fixed The toolbar and menu switch told screen readers the wrong thing. WordPress puts a menu item's classes on the list item around the link, so "this is a button" and "it is currently on" were being attached to the list item — which has no name and cannot be pressed — while the link itself was announced as an ordinary link that said nothing about being on or off. It also overwrote the role WordPress had given that item. Both now go on the link, where they belong.
  • Fixed Pressing Space on the toolbar or menu switch did nothing. A link answers to Enter and ignores Space; a button answers to both. Having announced it as a button, it now behaves like one.
  • Fixed The floating button announced two contradictory things at once. Its wording is the action — "Dark Mode" on a light page, "Light mode" on a dark one — and it also carried a pressed state, so a screen reader said "Light mode, toggle button, pressed" at the moment dark mode was on. The wording already says which way it will go, and nothing contradicts it now.
  • Fixed With JavaScript switched off, the floating button was drawn anyway and did nothing at all when pressed. It is now hidden, which is what the plugin has always said it did.

1.2.3

  • 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.2.2

  • Fixed "Sunset to sunrise" was wrong for about half the world. The sunrise and sunset times it worked out were pinned to the wrong day for any reader whose local date differs from UTC for part of the day, and the test it then made — "is it before sunrise or after sunset" — was true around the clock for them. A visitor in Sydney, Auckland, Tokyo, Los Angeles, Honolulu or Anchorage got a dark page at two in the afternoon. Readers in Europe, Africa and eastern South America were unaffected, which is why this went unnoticed. It now asks which came last, a sunrise or a sunset, which has the same answer everywhere on Earth — checked against a separately written solar model at 1,152 moments across twelve cities and four seasons.
  • Fixed The Devices rules on Display Rules did nothing. Desktop, Tablet and Mobile saved and came back when you reloaded the screen, and nothing anywhere read them: dark mode applied at every screen size whatever was ticked, and the floating button came with it. The rule is now applied before the page is painted, so a screen size you have excluded gets no dark mode, no button, and does not download the engine at all.
  • Fixed A site using Scheduled hours flashed white on every page load. The script in the page head declined to decide whenever a schedule was set and left it to the main script, which runs after the page has already been painted — the one thing that head script exists to prevent. Set hours are now worked out before the first paint. Sunset to sunrise notes when its answer next changes, so only the very first page a reader opens on such a site can flash, and none after it.
  • Fixed Under the Invert method the sun and moon on the toggle button were invisible. Invert works by turning the whole page negative and turning certain things back; the button was turned back so its dark pill stayed dark, and then the rule that rescues photographs turned its icons back once more. Three reversals leave a white mark painted black on a black pill, and the button looked empty.
  • Fixed Removing the plugin from a WordPress network deleted every site's data on one site's say-so. "Delete everything on removal" is a per-site setting, but it was read once, from whichever site the removal ran on, and applied to all of them. A hundred sites that had deliberately left it unticked lost their settings because the main site had ticked it. Each site is now asked for itself.
  • Fixed One stray apostrophe in Excluded Elements switched off the whole list under the Invert method. A line like .logo' passed every check and then swallowed everything after it, so every exclusion on the screen quietly stopped working. Selectors that were previously rejected for no good reason, such as [title="a)b"], are now accepted.
  • Fixed Image Replacement could swap the wrong picture. Your site logo was matched on the part of its file name before the extension, so a logo saved as logo.png also matched logo-banner.png and logotype.png and replaced those with your dark logo too. Every size of the logo is now named in full instead.
  • Fixed Turning dark mode on and straight back off left the page dark. The engine is only downloaded when it is first needed, and changing your mind while it was on its way meant it arrived and darkened a page that had already gone light.
  • Fixed A schedule, or your device switching itself to dark, could undo a choice you had just made on the site. Pressing the toggle says something more specific than either of those, and it is now treated that way.
  • Fixed When the engine could not be downloaded, the plain fallback colours were applied and never taken off again, so they stayed on in light mode for the rest of the visit.
  • Fixed A picture chosen for Image Replacement and later deleted from the Media Library left its number sitting in the field. The box correctly said "No image selected" while saving the screen wrote the dead number back.
  • Fixed Importing a settings file left an existing dark logo in place instead of replacing it, though the screen says an import replaces all current settings. An imported file now clears the dark logo, because an attachment belongs to one Media Library and the number in the file means nothing here.
  • Improved Default Mode is greyed out while Automatic Switching is on, with a line saying the schedule decides instead. A schedule settles both directions — dark inside the hours and light outside them — so Default Mode was never consulted, while the screen went on offering it.

1.2.1

  • Fixed The 1.2.0 package contained a .playwright-cli folder of scratch files from a browser-testing tool that had been run inside the plugin directory. Nothing in it was sensitive — a handful of localhost 404 lines and a page outline — and nothing in it ran, but it had no business being in a plugin you install. This release is the same code without it.

1.2.0

  • New Dark logo. Pick a light version of your logo from the Media Library on the Exclusions screen and it replaces your site logo whenever dark mode is on. Your theme's own logo is shown beside the picker as the light half, so the whole job is choosing one image rather than pasting two addresses into a box. It is written into the page before the first paint, so a reader who chose dark never sees your usual logo flash there first, and it is found whether your theme uses WordPress's own logo markup, the Site Logo block, or markup of its own.
  • Fixed The Exclusions screen and Custom CSS did nothing at all under the Invert and Basic methods. Image replacement, excluded elements and Custom CSS were only ever handed to the Automatic engine, and those two methods never load it — so the screens accepted settings that could not take effect and said nothing about it. All three now apply under every method. Custom CSS arrives in the first paint rather than a moment after it, which matters most under Invert and Basic, where it is usually the fix for what those methods get wrong. Excluded elements are honoured under Invert too; the Basic method still cannot restore an element's original colours, because it has no engine to know what they were, and the screen now says so.
  • Fixed A comma in an excluded selector (.alpha, .beta on one line) left the second half unscoped, so it was inverted in light mode as well. Every part is now scoped on its own.
  • Fixed Attribute selectors using ^=, $= or |= were silently dropped from the exclusion list, and one malformed line discarded every other line with it. Valid selectors now survive a bad neighbour, and an unbalanced bracket is refused rather than breaking the rule around it.
  • Fixed Printing a page with dark mode on printed a white logo onto white paper. Print gets the original back.
  • Improved Switching back to light no longer restores a stale address on a site with a lazy loader, which could strand an image on its placeholder.
  • Improved Importing settings from another site no longer adopts whatever local image happens to share the exported attachment's number. An attachment belongs to one Media Library, so the dark logo is left unset instead.
August 2026 19 versions

1.1.8

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

1.1.7

  • Improved On Exclusions, three fields used their instructions as the label. They now read "Image pairs" and "CSS selectors", with the format in the help text underneath.

1.1.6

  • Improved Two small wording fixes for consistency with the other plugins: the dashboard action reads "Show the button", and the uninstall help text reads "Deactivating the plugin never deletes anything."

1.1.5

  • 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.1.4

  • 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.1.3

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

1.1.2

  • 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.1.1

  • Fixed The buttons on the Advanced screen were the browser's own grey system buttons. They carried a class that has never existed in this plugin's stylesheet, so nothing styled them at all — they sat unstyled among controls that were not.
  • Fixed The Advanced screen had two identical "Save changes" buttons with nothing to say which was for what. Everything you save is now in one column under one button, and the file and reset actions have the other.
  • Improved Choosing a settings file looks like the rest of the plugin rather than like a browser control, and it is separated from the download button above it instead of reading as a caption for it.
  • Improved On the Toggle Button screen, the floating button and the four other places you can put one sit side by side rather than stacked.

1.1.0

  • New Every screen renamed and rebuilt around what it is for. The menu was Appearance, The switch, Where, Exclusions, When and Settings — accurate names that told you nothing in a sidebar. It is now Dashboard, General, Colours, Toggle Button, Display Rules, Exclusions and Advanced, and every setting on them has been rewritten to say plainly what it does and what happens if you change it.
  • Fixed Dark mode could not be turned off. The master switch was stored and read on every page load, and no screen anywhere drew a control for it. It is the first thing on the new General screen.
  • New A Dark Mode box on every page and post. Use the site setting, always open this page dark, or never offer dark mode here — set on the page it is about, rather than as a rule on another screen.
  • New A switch you can add to a navigation menu, from Appearance → Menus like any other menu item. On a block theme, which has no Menus screen, the Toggle Button screen points at the Site Editor instead.
  • New A switch in the toolbar for signed-in staff, so you can flip a page between light and dark while you work on it. Visitors never see it.
  • New Signed-in visitors can keep their choice across devices. Their setting is saved to their account as well as their browser, so a customer who chooses dark on their phone finds your site dark on their laptop.
  • New Dim bright photographs by anything up to 60%, separately from leaving images alone entirely. Nothing by default.
  • New A smooth fade between light and dark, skipped automatically for anyone whose device asks for reduced motion.
  • New Download your settings as a file and import them on another site. Settings only: no content, no customer data, no licence key. Everything is checked on the way back in exactly as a form would check it.
  • New Reset every setting to its default, without reinstalling.
  • New A setup check on the Dashboard naming only what it can actually establish: a toggle button too small to tap on a phone, a missing dark version of your logo, an unusually long exclusion list, and the page cache it found, if any (until 1.6.1 a settings change waited for that cache to expire).
  • Improved The Colours screen explains the three darkening methods in terms of what they do to your pages rather than how they work, and the Exclusions screen explains what a CSS selector is and how to find one.

1.0.9

  • 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.8

  • Fixed The keyboard shortcut can be changed. Every combination was being refused, including the one already stored, so the setting was stuck on whatever it started as.

1.0.7

  • Fixed The Where screen now saves. None of its fields were being read at all, so "The front page only" came back as "Everywhere on the site" and nothing chosen there ever took effect.
  • Fixed Unticking the last box in a group now clears it, instead of coming back ticked after every save.
  • Improved A page chosen in "Offer dark mode on" can no longer also be chosen in "Exclude": the other list shows it as already spoken for.

1.0.6

  • Removed The dark WordPress admin has been withdrawn. Re-colouring somebody else's interface from a stylesheet we maintain was never going to be as good as the one this plugin does for your own site, and a feature that is only nearly right is worse than one that is not there. Everything it stored is removed when the plugin is uninstalled.
  • Fixed A rounded square carrying a word now has the same padding as the pill. It had none, so the mark sat against one edge and the last letter against the other.
  • Improved "Show the words" is greyed for the circle and the bare mark. Neither has room for a word — the stylesheet has always hidden it for them — so the control could be ticked with nothing to show for it.

1.0.5

  • Fixed Switching "Offer a dark admin" off now takes effect on the screen you switched it on, instead of leaving the admin dark until the next reload.
  • Removed The "A word" switch shape has been withdrawn. A switch with no mark on it does not read as a switch, and it was the one shape that broke if the label was hidden. A site that had chosen it gets the pill, which also shows a word.

1.0.4

  • Fixed The dark admin now changes colour the moment you press the switch, with no page reload. It still works without JavaScript, by reloading, as before.
  • Improved Choosing "A word" for the switch turns the words on for you. That shape is the word, so hiding the label left a button with nothing in it — and the front end now shows the word for that shape whatever the setting says.
  • Fixed The floating Save button comes back after changing tabs. It appeared on a fresh screen and never again once you moved between tabs.

1.0.3

  • Fixed Changing the switch's shape now changes the preview beside it. The setting was always saved correctly; only the picture was wrong, because the preview read the first shape card rather than the chosen one.
  • Fixed The dark-admin switch in the toolbar shows the plugin's own moon and sun, the same marks the switch on your site uses. It asked for a WordPress icon that does not exist, so it was drawing an empty square.

1.0.2

  • 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.1

  • Fixed The WordPress menu now shows a moon rather than a clock. The scaffold ships a placeholder there and it had not been replaced, so a dark-mode plugin sat in the sidebar wearing a clock face.

1.0.0

  • New First release.
  • New Dark mode that reads your theme and re-colours it, so photographs stay photographs and you do not restyle anything.
  • New The engine is only fetched once a visitor actually turns dark mode on: a reader who leaves the page light downloads about seven kilobytes.
  • New No white flash before a dark page — the colours are decided and applied before the first paint, on every page, not just the first.
  • New Six palettes, each checked for contrast, and four colours you can change.
  • New Three ways to darken: read the theme, invert the page, or a plain stylesheet with no JavaScript after load.
  • New A switch in five shapes and five corners — or a block, or a shortcode, to put it wherever you like. All three take their wording and colours from one screen, so none of them can drift.
  • New A keyboard shortcut, and an optional ?dark=1 link that opens any page dark without a flash of white first.
  • New Exceptions for anything that should keep its own colours, an invert list for line art, and a light/dark swap for a logo.
  • New Sunset-to-sunrise and fixed-hours schedules, worked out where the reader is rather than where the server is.
  • New A dark WordPress admin, chosen per person rather than for the whole site.
  • New An optional count of what visitors choose: two numbers a day, nothing else, and nothing leaves your database.

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