Repository navigation
Changelog
All notable changes to Velox. This file is the single source of truth — it shows
up both on the GitHub release and in the WordPress "View details" → Changelog tab.
Add a new section at the top for each release.
4.19.0 — Velox Builder: every element audited, Oxygen 6 import rebuilt
- Oxygen 6 and Breakdance pages import properly. The importer now reads the real format: classes and their styles from Oxygen's selectors (and Breakdance's classes), per-screen values, hover styles, images from the media library or a URL with the right alt text, links that open in a new tab, components and global blocks (their content is brought in), and the HTML/CSS code blocks. A page that still carries old classic-Oxygen data next to its Oxygen 6 layout now imports the current layout.
- Accordion, FAQ, Tabs and Slider show their text. The text typed into an item's own fields was hidden behind its (empty) drop area, both in the editor and on the page. Text and dropped-in elements now both show. A tab or slide with an empty title no longer shifts the content of the ones after it.
- Popups, offcanvas panels and dropdowns are styled on the panel. Their class and element styles landed on the full-screen container, turning a popup into a white column at the edge of the screen. "When it appears" (delay, scroll, exit intent …) now opens a popup, and "Opened by (CSS selector)" opens an offcanvas panel. Dropdowns close on a click outside, support "Opens on: Hover", and their button no longer stays "expanded" after Escape. Width and size settings are responsive and an emptied field falls back to the default instead of collapsing the panel.
- Your class styling wins over Velox's element defaults for floating buttons, bars and videos — the page now matches the editor.
- Floating buttons and bars: "A visitor clicks" hid them for good and is no longer offered; Back to top really appears after scrolling 25%, its screen-reader text is no longer shown on screen, centred buttons stay centred while animating, and side/vertical offsets work per screen size. Sticky-bar numbers become
tel:links and e-mail addressesmailto:links; anchor-nav section IDs work without a#. - Google Reviews: example reviews are never shown to visitors any more (only to you while designing). Count, minimum rating, shortening, columns, card, star and text styling now apply to the real reviews, not only to the examples.
- Security: slider size fields and several colour fields could inject code into the page stylesheet; they now only accept real sizes and colours.
- What the editor shows is what you get: new elements store the defaults the inspector shows, controls that depend on another setting appear as soon as that setting's default allows it, and settings such as "0" for a gap are respected.
- Smaller fixes: slider "2 of 5" counter counts (and shows without arrows/dots), tabs turn into a real accordion on mobile, nested tabs/sliders/accordions no longer interfere, one bad "element selector" no longer stops every other trigger, breadcrumbs are right on category/tag/search pages, reading time counts the text of Velox pages, the avatar group overlaps correctly, the pull quote's "line above" is above, accordion "Icon turns" works, the navigation's full-screen mobile menu works, a burger menu closes with Escape or a click outside, a second navbar is no longer also called "Main", and a FAQ can add search-engine markup.
- Editor: a non-blocking bar offers unsaved work back after a crash; History can jump back to any step (and undo that); token names are checked like the server does; global JS with a syntax error is not saved; the page switcher searches all pages; "View as" handles slow responses; copying elements between pages works with the system clipboard.
4.18.0 — Velox Builder: second full review, everything it found fixed
- Adding an element can no longer reset a class for the whole site. A new Heading (or any element whose class the page didn't have yet) started from the starter style and, on publish, overwrote the site-wide version of that class — every heading on the site could jump back to 32px. New classes now start from the site's version and only count as changed once you change them. Publish also tells you which classes it updates site-wide and asks first.
- Class edits are no longer dropped or re-applied later. The list of classes waiting to go site-wide is kept on the server; an edit no longer disappears after a second save, and an old edit can't overwrite a newer one from another page.
- Fast typing is safe. Typing in one field and quickly moving to the next (or clicking another element) lost the first edit or wrote it to the wrong element. Every field now commits on its own, before anything else changes.
- Publish keeps track of edits made while it ran, so "Published" and the leave-page warning are always right. Unsaved work is also kept in the browser and offered back after a crash or an expired session.
- Drafts stay private: adding
?preview=trueto a URL showed unpublished drafts to anyone and could overwrite the live CSS file. Only people who can edit see drafts now, and previews never touch the live files. - Updating by deactivate → upload → activate no longer skips the step that keeps templates and reusables on the site.
- Changing a page into a template or reusable unlinks it from its WordPress page and makes it a draft until you publish it (it used to go live everywhere at once). Emptying the trash of that old page no longer deletes the template.
- Security: an element saved with a
<script>tag can no longer run script on the page. - Shops are left alone: the Archives template only applies to blog archives and search, never to WooCommerce or other custom archives; wrapping pages without a Velox layout only applies to pages and posts.
- Editing imported Oxygen elements changes that element (its own styles), not every element sharing its class. A new This element button in the class bar styles just the selected element.
- Lists keep their bullets when edited on the canvas (Enter adds a bullet, Ctrl+Enter finishes). Bold, italic and links work on selected text.
- Undo/Redo keep the screen size and state you're editing. Copy/paste works between pages. The inspector shows the value that really wins on smaller screens.
- Tabs, accordions and sliders can't get their content mixed up through duplicate or drag anymore. Inner Content can't be duplicated or wrapped.
- Global styles never beat your element styles: a link hover colour overrode button colours and the default section padding overrode the padding you set. Global styles are now defaults only.
- The editor shows what the page shows: your fonts, reusables and "View as" pages styled and drawn properly (videos, icons, sliders included), new colour tokens and global styles straight away.
- Images: pick slide images and video covers from the media library, choose the file size to load, load right away (for the first screen) or lazily, add a link and a caption.
- Oxygen 6 import: pages built with the new Oxygen (and Breakdance) can be imported too, next to classic Oxygen.
- Smaller fixes: renaming a class to its own name no longer deletes it; class CSS with two blocks for the same screen size is merged; saving fonts or builder settings clears the cache; linked icons are announced as links; scroll animation now also works on images, videos, icons and reusables; built-in review presets are no longer frozen; Tab inserts a tab in the code boxes; a click on the active option clears it and a click on a blue/pink dot removes that value; the box fields show "mixed" when sides differ; Escape works on the canvas; publishing by keyboard is Ctrl+Shift+P.
- Admin screens: the Templates screen explains exactly which template a page gets; the page editor says which template is used right now and marks drafts; the type-change warning says what really happens.
4.17.0 — Velox Builder: drafts, archive templates, one set of classes
- Save no longer changes the live site. Save keeps your work private; Publish changes puts it live. "View page" shows the saved version to you, visitors keep the published one, and the logo menu has Discard unpublished changes to go back to what visitors see. This applies to pages, templates and reusables alike. Templates and reusables that were already on your site stay published; new ones are used once you publish them.
- 404, Search and Archive templates work. They could be chosen on the Templates screen but were never used. A 404 template shows on missing pages (still answering 404), a Search or Archives template shows search results, categories, tags, dates and the blog with a post list (image, title, date, excerpt, page numbers) in its Inner Content.
- A class looks the same everywhere. When a page and its template both had
.heading, the page's copy won, so a header styled in the template looked different on the site. A class you change now becomes the site-wide version when you publish, in templates, pages and reusables alike. Classes nobody edited keep working exactly as before. - The site default template is respected. It lost to any catch-all template, so the page editor said "Site default (A)" while the page showed B. Templates have a Make default action, show whether they're published, and can be published or unpublished from the Templates screen.
- Element settings show in the editor. Gradient/outline/highlight text, drop caps, eyebrows, the grid layouts, split screen, logo strip and the other preset elements now look in the canvas the way they will on the page.
- Classes screen: editing a class with tablet or phone rules no longer turns them all into phone rules, saving a class updates the cache, and renaming onto an existing class no longer overwrites it.
- Google Reviews: new connections and presets are found again. Their ids were created with capital letters but looked up in lowercase, so a fresh connection showed as "unknown" in the builder, the shortcode and Oxygen. Existing ones are fixed automatically.
- Smaller fixes: "Make re-usable" now turns the element into a link to the new reusable (it used to leave a disconnected copy). Tab/accordion/slider item containers can no longer be moved or deleted on their own, which put content on the wrong panel. Inner Content always stays at page level. Reusables inside reusables get their styles and show in "Used on". Empty breakpoint fields in Global styles no longer switch all responsive rules off. hsl() and named colours are kept. Menu links with commas work. Deleting a document cleans up its template rule, default setting and CSS file. "Edit with Velox" is only offered to users who can open the builder. Global and page scripts require the right to post unfiltered HTML (matters on multisite). A "No template" page no longer gets the old header/footer roles. The pinned Add panel stays open while you add elements.
- Builder screens: see whether a document has unpublished changes, clearer template status and purposes, confirmation before turning a live page into a template, translatable messages, clickable "Used on" lists for reusables, clean new rows on the Fonts screen and honest defaults on the Global styles screen.
4.16.0 — Velox Builder: everything checked, fixed and tidied
- Changing an image works. The builder printed only half of WordPress's media scripts, so clicking a picture in the media window threw an error and "Use image" never switched on. All of them load now, the window opens on the Media Library (not the empty Upload tab), its text is readable, and the image that's already in place is pre-selected when you replace it.
- Nothing you change is lost on save any more. Empty settings came back from the database in a broken shape, so the next change to them (a picked image, an image's size, a style on a fresh class) showed on the canvas but vanished when you saved. Saving and loading keep the shape now, and documents already affected are repaired when they open.
- Two images no longer share one picture. Element ids started from the same number every time the editor opened, so a new element could get the id of an old one: same picture, same selection, same delete. Ids are unique now, and duplicates in existing pages are fixed on open.
- Images on the page are faster and accessible: responsive
srcset, real width and height (no layout jump) and the alt text from the media library. There's an alt-text field under the image button. - "Open frontend" goes to the page you just made, not the homepage. The address bar remembers the new page, so a reload reopens it.
- Oxygen import. Pages built with Oxygen showed up empty in Velox because Oxygen keeps its layouts in its own data. An Oxygen page now offers Import Oxygen layout, and the logo menu has Import from Oxygen… for any Oxygen page or template. Sections, div blocks, columns, headings, text, rich text, links, buttons, images, videos, code blocks, shortcodes, menus, global colours, classes, hover styles and the tablet/phone breakpoints come over. Oxygen's own copy is never changed.
- Four screen sizes instead of six, on Bootstrap's lines: Desktop (1400 px and up), Laptop (992–1399), Tablet (768–991) and Mobile (up to 767). The canvas now renders at the real width and is scaled to fit, so "Desktop" really is desktop. A small line above the canvas says which size you're on and what your changes affect. Styles saved on the old XL/SM sizes keep working.
- Structure panel: Collapse all and Expand all buttons. The selected element is always unfolded and scrolled into view.
- Video and Icon elements work. They were in the Add panel but rendered nothing. Video takes a YouTube, Vimeo or .mp4 link (muted background loop optional); Icon uses the built-in icon set with size and an accessible label.
- Save is always there, shows a dot while there are unsaved changes, and the browser warns before you leave with unsaved work. A save asked for while another is running is queued, a failed save stops a publish, and a failed load never shows an empty page you could save over your design.
- Many smaller fixes. Switched-off toggles stayed on. Typing in Settings, link, alt-text and animation fields lost focus. Duplicate and paste dropped settings, links and images. Cards, popups, split screens and other layout elements couldn't hold children. Ctrl+Z inside a text field undid the page. Delete, Ctrl+C/V/D didn't work after clicking the canvas. Colour pickers closed after one change. Alignment buttons did nothing. Values like
calc()andvar(--space-2)were deleted. "Wrap with div" made a broken class. Opening a template without&kind=turned it into a page on save. Colour tokens could be wiped from Global styles. Trashing a page deleted its layout. - Front end: per-element styles no longer vanish on pages without a menu or slider.
:activeand custom states reach the page. Background images set in the editor are kept. Password-protected pages show the password form. A reusable that contains itself can't crash the page. Saving clears the cache for that page. - Editor UI: the inspector no longer folds away when nothing is selected (it shows a short guide, so the canvas doesn't jump under your mouse). Colour fields offer the site's colour tokens as swatches. The canvas shows token colours, global styles and page CSS. Panels dim the canvas less. Shortcut hints match your system. The editor follows the admin language (German included).
4.15.0 — Security scan: is the site hacked, how, and how to fix it
- Site scan is now a full Security scan (Utilities → Security), built the way Wordfence's scanner works. It answers whether the site is hacked, what was changed, how the hack works and what to do about it.
- WordPress core and every plugin from WordPress.org are checked file by file against the official checksums. A changed file, or a PHP file the release never shipped, is a certain answer with no guessing.
- Everything WordPress.org can't vouch for is read for backdoors: themes, premium plugins like Oxygen, mu-plugins and root files. The check looks for a deliberately tight set of tricks real malware uses: code hidden behind
eval(base64_decode(…)), code run straight from a visitor's request, known web shells, hex-hidden includes, and PHP hidden in.icofiles. In testing it caught every sample and raised zero false alarms across Velox's own 30k lines of code. - The other places hacks live: injected scripts and invisible iframes in pages, a hijacked site address, encoded payloads in settings, administrator accounts created in the last 14 days, and
.htaccesstricks such as Google-only or phone-only redirects to spam sites, images run as PHP, and prepended malware files. - Every finding says what it is, how it works, and shows the suspicious line. Each one comes with a fix. Restore original replaces a changed core or plugin file with the original from WordPress.org, and only writes it if the checksum matches. Quarantine moves a bad file into a sealed folder where it can't run; it's never deleted on a guess, and Put back undoes it. Remove injected code cleans a page and keeps the old version as a revision.
- When the site is hacked, a "What to do now" checklist appears: fix the findings, Sign everyone out (with a button that makes every stolen login worthless), change passwords, update everything, scan again.
- Hardening tips are listed separately, such as pending updates, the theme/plugin file editor being on, or an "admin" account. They're never presented as an infection.
- Automatic scans run every week (or every night), at night site time, and email you only when something new and serious turns up.
- The screen says plainly what no scanner can promise: a clean result is strong evidence, not proof.
4.14.1 — Every image over 1000 px always has an original
- Big images always get a full-size original saved, no matter where they came from. Until now Velox only kept originals of images it converted itself, so a library of WebPs uploaded as WebP (or converted by another tool) showed almost no originals. Now every WebP wider than 1000 px gets a full-size copy in the private originals backup.
- Existing images are backed up automatically in the background, a batch every hour until they're all done. Back up now on Images → Original files does it straight away. These are copies: your site keeps using the live files.
- New uploads: a WebP wider than 1000 px is backed up the moment it's uploaded.
- Nothing big is deleted. Even the old hidden "delete originals after conversion" switch now keeps any original wider than 1000 px (it moves it into the backup). Smaller ones are still deleted under that setting.
- The Original files panel counts all of these and shows how many big images are still waiting for a backup. The ZIP download includes them, and Re-convert builds from them.
4.14.0 — Comment protection
- New: Comment protection (Utilities → Security). It's on by default on every site, because spam comments aren't just noise: their links lead to phishing and malware pages.
- Spam bots are kept out without a CAPTCHA. Every comment form, including Oxygen's and hand-built theme forms, gets a hidden token that only a real browser on your page fills in, plus a trap field only bots fill. Bots that post directly, fill the trap or submit in under 2 seconds are refused before anything is saved. Visitors notice nothing. It keeps working with page caching.
- Link spam goes straight to the spam folder: comments with more links than allowed (1 by default) or forum
[url=]codes. Trackbacks and pingbacks are refused. - Spam links can't be clicked by accident. Links in visitors' comments show as plain text on the site and in the dashboard, the author's "website" link is gone, and the Website field is removed. In WordPress's notification emails, outside links are defanged (
hxxps://bad-site[.]com), while your own Approve / Trash / Spam links stay clickable. Comments by admins keep their links. - Clean up what's already there. Scan comments finds approved and waiting comments that break the rules and moves them to spam, where you can still restore them. Empty spam deletes the spam folder in batches, and spam is deleted automatically after 7 days.
- A stats strip shows how many spam bots were stopped (in total and this week), what's in the spam folder and what's waiting for approval.
- Don't need comments? The same screen can close them site-wide, even when the Performance module is off.
- Images: a WebP wider than 1000 px with no original is now backed up to the originals backup before Re-convert shrinks it, so a later re-convert builds from the big copy. Smaller WebPs aren't backed up, and JPG/PNG originals are always kept as before.
- Panel headers on Login protection, Site scan, Shop, Reviews and SEO now put their switch or button beside the title. It used to drop underneath, because that layout had no styling.
4.13.0 — A private backup for your original images
- New: Original files on the Images page. When an image becomes WebP, Velox keeps the original JPG/PNG, and now you choose where it goes. Next to the WebP is the default, the same as before. Private backup moves originals into a hidden folder in uploads that visitors can't open: it has a random name and is blocked from the web. Your site only uses the converted images.
- Download all (ZIP) gives you every original in one file, in the same year/month folders as your uploads.
- Move existing originals to the backup handles images that were converted before you switched. It runs in small batches, so big libraries don't time out.
- Old links keep working. A link to a
.jpg/.pngthat's no longer there gets sent to its WebP. That covers links hard-coded in Oxygen CSS or content, and other sites linking to your images. It also fixes old JPG thumbnail links, which have been broken since conversion started rebuilding thumbnails as WebP. - Re-convert uses the backup. Large images → Re-convert rebuilds from the original even when it lives in the backup, so images are never compressed twice. Deleting an image from the media library deletes its backed-up originals too.
- WordPress's full-size original behind a "-scaled" copy is now treated as an original as well, so it's backed up instead of left behind.
4.12.0 — .htaccess editor, and a Large images finder with re-convert
- New: .htaccess editor under Performance → .htaccess. It only appears with Risky mode on, and it starts locked: you see the file read-only until you click Unlock for 10 minutes. A countdown shows the time left, and then it locks itself again. The lock is enforced on the server, so an old open tab can't save after the time is up.
- The .htaccess editor protects your site. Every save keeps the previous version (the last 5). Velox then loads your homepage, and if the change broke it (a 500 error, or a 403/404 where it worked before), the old version goes straight back. Restore previous version is always one click away. The editor respects
DISALLOW_FILE_EDIT, and on multisite only network admins can use it. - New: Large images. Click Find large images → on the Images page to list every image above a limit, largest first. It checks width, height or file size, and anything over the limit counts (1001 shows when the limit is 1000).
- Re-convert them with their own settings: max width, quality, WebP or WebP + AVIF, lossless, keep EXIF, and replace in media library. Your saved Images settings don't change. Do one image, a selection or all of them, with a progress bar and Stop. Failed images keep a Retry button that shows the reason.
- No double compression. When Velox kept the original JPG/PNG, the new version is built from that original, not from the old WebP. WebPs with no original left are resized and re-encoded in place. In testing, a 3000 px WebP went from 524 KB to 45 KB at 1000 px wide.
4.11.0 — Lazy background images, CSS minify, and settings that apply straight away
- Background images now lazy-load. Oxygen puts every section and div background into its stylesheets, so the browser downloaded all of them up front, even ones far down the page. With Lazy-load background images (on by default), Velox finds those rules, keeps only the ones used on the current page, and holds each background back until its section is about to scroll into view. The header and first section always load straight away. Anything with the class
skip-lazyis left alone, and without JavaScript every background loads as normal. - New: Minify CSS files. Every local stylesheet that isn't already minified gets served as a minified copy, Oxygen's generated CSS included. That's typically 13–36% smaller. Relative image and font paths are fixed up automatically, and copies rebuild when a file changes. We checked it against real WordPress stylesheets: all 2,116 rules came out identical in the browser. JavaScript isn't minified on purpose. Nearly all of it already ships minified, and regex JS minifiers are a common way to break sites.
- Changing a setting now shows straight away. Saving the Performance tab (or any setting that changes your pages) now clears the page cache. Before, with a long cache lifetime, a new setting could take weeks to appear.
- Editing an Oxygen template now updates every page. Saving a header, footer or other template, a reusable part, or Oxygen's global styles, classes or colours now clears the whole page cache instead of just one URL.
- Updating Velox clears the cache once, so improvements like these reach visitors right away instead of after the cache expires.
4.10.0 — The Images switches now work on Oxygen pages
- Oxygen images finally get lazy-loaded. WordPress only lazy-loads images it renders itself, so on Oxygen pages every image loaded straight away, even far below the fold. The new Lazy-load images switch (on by default) covers every image on the page. The first few stay eager, controlled by "Eager images above the fold".
- Width/height, hero priority, iframe lazy-loading, the YouTube facade and the CDN now reach Oxygen markup. These used to hook into places Oxygen never uses, so on most Oxygen pages the switches looked on but did nothing. Velox now applies them to the finished page HTML, the same way WebP already worked.
- The hero image is found automatically: it's the first reasonably large image near the top. A small header logo is skipped, any
loading="lazy"on the hero is removed, and it getsfetchpriority="high". If you set "Preload LCP image", that image wins. - Image sizes are read from your uploads, so Oxygen images get real width/height and stop the page jumping while it loads (CLS). A tiny CSS guard keeps images that only have a CSS width from stretching. Any height your own CSS sets still wins.
- YouTube in Oxygen's Video element now becomes a click-to-play thumbnail that fills the video box exactly, instead of loading about 1 MB of YouTube player up front.
- It never touches scripts, JSON,
<noscript>fallbacks, comments, images that use a JS lazy-loader, or anything with askip-lazy/no-lazyclass. It stays off inside the Oxygen editor and respects the per-page "Don't lazy-load" box. If anything goes wrong, it returns the page unchanged.
4.9.1 — Faster pages, and Velox stays out of the Oxygen editor
- Velox no longer runs its speed tricks inside the Oxygen editor. Deferring and delaying JavaScript, the WebP image rewriter, the Script Manager, the cookie banner and the visitor counter all ran inside the builder canvas too. That could break or slow down the editor, and the image rewriter could swap URLs inside Oxygen's own data, which could then get saved into the page as .webp. All of them now stand down in Oxygen, plus Bricks, Elementor, Divi, Breakdance and the Customizer.
- "Delay JavaScript" no longer breaks Oxygen sites. jQuery is never delayed now, because Oxygen and most themes print
jQuery(...)calls straight into the page. Delayed scripts also run strictly in page order, so a slider's setup code can no longer run before the slider library has loaded. Before, they could run in any order. - "Defer JavaScript" respects dependencies. On WordPress 6.3 and newer, Velox hands deferring to WordPress itself. WordPress only defers a script when nothing that runs straight away needs it, so inline setup code can't break any more.
- Speculative loading is safe for admins. On WordPress 6.8+ Velox upgrades WordPress's own preloading to prerender instead of adding a second set of rules. On older versions, Velox never preloads logout, login, wp-admin, links with a query string or nofollow links, and never preloads for logged-in users. Before, hovering over "Log out" could actually log you out.
- The aggressive preset now turns on what it says. It was saving two setting names that don't exist, so "JS delay" and the WooCommerce cart-fragments switch silently stayed off.
- Lighter visitor counter. It no longer fires for logged-in users, who are never counted anyway, and it waits until the page has finished loading, so it never competes with your images and fonts.
- One fewer database query per page when you have redirects. The redirect list now loads with the rest of WordPress's settings. This kicks in the next time you save a redirect.
4.9.0 — Every tool you switched on is actually in the menu
- Four working tools were missing from the sidebar. Google Reviews, Login protection, Site scan and Shop were switched on and running, but never appeared under any menu group — the only way to reach them was the Utilities page. The dashboard grid was missing the same four.
- The cause, rather than the symptom, is fixed. The sidebar and the dashboard each kept their own hand-written list of tools alongside the real one, so adding a tool meant remembering three places, and forgetting was silent. Both now read the one list, so a tool that exists is a tool you can find.
- Security has its own group — Login URL, Login protection and Site scan sit together instead of being scattered through the menu.
- A check now refuses to build Velox at all if a tool would be invisible, because this went unnoticed across four releases.
4.8.1 — The site scan stops crying wolf
- Every folder guard file was reported as malware. Plugins drop an inert
index.phpinto their own upload folders so the folder cannot be listed — WP All Import, WooCommerce and most others do it, several folders deep. The scan reported each one as runnable code, so a perfectly healthy site opened the screen to a wall of serious findings. A file that does nothing is no longer reported, decided by whether it actually runs anything rather than by what it is named. One namedindex.phpthat does contain code is still reported. - A folder protecting itself was reported too. Most
.htaccessfiles in uploads deny access, which is the opposite of a problem. Only one that switches a handler on is now reported — and it is reported as serious, because that is how an uploaded image gets run as code. - The Shop card in Utilities showed a stray
\u2014instead of a dash.
4.8.0 — Site scan
Checks that your WordPress files are the ones WordPress shipped, and that nothing runnable is hiding in your media folder.
- Core files are verified against the checksums WordPress.org publishes for your exact version and site language. Anything altered, missing, or sitting in wp-admin or wp-includes without belonging there is listed with the reason it was flagged.
- The uploads folder is checked for runnable code. That folder is for media; a .php file in it is one of the few signals that is both cheap to check and almost never a false alarm. Files with a hidden second extension, and .htaccess files that change how the folder is served, are listed separately as worth a look rather than as an alarm.
- It does not pattern-match for malware, and the screen says so. Scanning file contents for "known bad" code fails in both directions — ordinary minified code sets it off constantly, and any infection not already on the list walks straight past, which is worse than no scan at all because it reads as an all-clear. A clean result here means your core files match and uploads holds no code, nothing more.
- Plugins, themes and the rest of wp-content are not checked, because there is no published list of what those files should contain. Said plainly on the screen rather than left to be assumed.
- If the checksums cannot be fetched, or the uploads folder is too large to walk to the end, the report says which part was skipped instead of quietly reporting less.
Also fixed
- An expired unlock link from login protection still worked. The email promises the link stops working after 24 hours; it was honoured whatever its age, so an old message in an inbox stayed live. It is now refused once it expires.
4.7.0 — Login protection
Blocks an address after repeated failed sign-ins and keeps it blocked until you let it back in.
- Blocks by address, not by account. Locking an account after failed attempts would let anyone lock you out of your own site simply by typing your username wrong a few times.
- A blocked address is refused before the password is even checked, so the guessing stops rather than merely being recorded.
- You can never be shut out by this. Every block emails you a one-click unlock link, valid once and for 24 hours, alongside the unlock buttons in the admin.
- Blocked addresses are listed with the attempt count and the username that was tried, and can be released one at a time or all at once.
- A successful sign-in clears the counter for that address.
- If the site sits behind a proxy or CDN, say so and the forwarded address is used. It is off by default, because trusting that header on a site without a proxy would let anyone forge it and walk past every block.
4.6.8 — Checking out places the order
- Pressing the order button removed an item from the cart instead. The cart summary on the checkout page carried its own remove buttons, each in a form nested inside the checkout form. Nested forms are invalid HTML and the browser attributed the submission to the wrong one. That summary is now read-only.
4.6.6 — Cart pages are no longer served from cache by the drop-in
- The built-in cookie exclusions never reached the cache drop-in. Because the drop-in serves a page before WordPress loads, it only knew about cookies added by hand in the settings — so a visitor with a WooCommerce, Easy Digital Downloads or Velox cart could still be served someone else'''s cached page. The built-in list is now written into the drop-in'''s own configuration, and both sides read the same source.
4.6.5 — Placing an order shows the confirmation
- After placing an order you were sent to the home page instead of the confirmation with your reference number. The checkout now returns to wherever it was placed, so it works on any page the shortcode is used.
4.6.4 — The cart is never served from the page cache
- A visitor with something in their cart was being shown a cached page, so the cart looked empty however much they added. The cart cookie now excludes a request from the page cache, exactly as the WooCommerce and Easy Digital Downloads cookies already did.
- Cart, checkout and account pages opt out of caching on their own, so one visitor'''s view can never be served to the next.
- Modules can now veto caching for a request they know is personal.
4.6.3 — Product details are readable and writable through the API
- A work'''s price, dimensions and availability were invisible to the REST API, so importing a catalogue programmatically appeared to succeed while saving nothing. The product type now declares the support WordPress requires for that.
4.6.2 — Adding to the cart returns you to where you were
- After adding a work you landed on the home page instead of staying on the catalogue. The form now carries where it came from, and only ever returns to a URL on this site.
4.6.1 — Adding to the cart works on builder-built pages
- Add to cart did nothing on a page built with Velox Builder. The builder renders its own document and stops there, so the shop's form handler — which ran at the same point — never got a turn. It now runs earlier, which is also the last safe moment to set the cart cookie.
4.6.0 — Shop
A small commerce layer for sites that sell individual pieces rather than stock.
- Works get their own area in the admin, each with a price, dimensions, medium, year and an availability state — available, sold, or on commission.
- A cart and checkout that work without JavaScript. Ordering records the order, emails the customer and you, and marks the piece as sold so a one-off cannot be bought twice.
- Orders are listed with customer, total and state, and are never public.
- A customer area showing order history, using ordinary WordPress accounts.
- Four shortcodes place it anywhere: the catalogue, the cart, the checkout and the account area.
Two things it deliberately does not do. No card details are handled or stored — an order is recorded and payment agreed separately, so a payment provider can be added behind a redirect later. And sign-in, registration and password resets are WordPress's own, so there is no second set of credentials to protect.
4.5.0 — A template can carry its own styles, and three dead controls now work
- A template's own CSS and JavaScript are now used. Only the page being rendered was consulted, so anything written against a template was silently discarded and every shell style had to be duplicated into each page. Template assets are emitted first, so a page can still override them.
- Saved reply templates can be removed. Creating them worked; there was no way to delete one.
- The llms.txt editor can preview what auto-generation would produce, without overwriting whatever you have typed.
4.4.1 — Font family is no longer discarded
- Setting a font on an element did nothing: font-family was missing from the properties the builder knows how to write out, so the rule was dropped and the element kept the theme's font. Font-style and white-space were missing for the same reason.
4.4.0 — Shortcodes typed into the builder now run
- A shortcode placed in builder text was printed on the page as literal text. Putting a Velox form, or anything else that uses a shortcode, into a page built with the builder simply did not work. Shortcodes are now run after the text is sanitised, so the content is still filtered but registered shortcodes render as intended.
4.3.2 — Builder images can carry alt text
- Images placed with the builder always output an empty alt attribute, whatever was set, so they were invisible to search engines and unusable for anyone on a screen reader. The element's alt text now reaches the page.
4.3.1 — Element styling was being thrown away on pages without a navigation element
- Per-element styling only reached the page when the page happened to contain a navigation element. The text effects, the utility presets, the grid layouts, the aspect-ratio box and the Google Reviews styling all write their CSS into the same place, and that place was only ever printed as part of the navigation block. A page without navigation lost every one of them.
- Align-self, justify-self, grid-column, grid-row and text-wrap are now understood, so rules using them are no longer discarded.
4.3.0 — Google Reviews ships with designs, and says how to preview them
The reviews element asked you to pick a design, but no designs existed until you built one yourself — and the only way to see anything at all was to connect Google first.
- Five designs are included: Cards, Slider, Minimal, Compact list and Single spotlight. They are always available, including on a site that has never opened the Reviews screen, and any of them can be duplicated and changed.
- The element now says how to see example reviews instead of only pointing at a connection you may not have yet, and says so on the canvas once they are switched on.
- Your own saved designs always take precedence over an included one of the same name.
4.2.0 — After purging, Velox offers to measure
Clearing the cache used to be a dead end. It now offers the obvious next step: run the built-in PageSpeed check, or test on Google's PageSpeed Insights.
- The offer appears wherever you purge from. It was already written, but the markup it needed only existed on the Performance screen, so purging anywhere else showed nothing.
- Purging from the front-end bar tests the page you are actually on, rather than the home page — that is the one place the exact page is known. Only URLs on this site are ever accepted.
4.1.2 — The character count on the Pages list updates as you edit
Editing an SEO title or description straight from the Pages list saved the new text but left the little character count beside it showing the old number — and a field that started out empty never got a count at all until the page was reloaded. The count is now rebuilt, added or removed the moment the edit is saved, and still colours itself against the same length guidance.
4.1.1 — The last of the preset elements get their settings
Small on purpose: each of these only gained the one or two things the ordinary style controls cannot express.
- Aspect-ratio box: pick a shape from a list — widescreen, square, portrait and so on — or give your own, and choose whether the contents fill and crop or fit inside. The shape can differ per screen size.
- Trust badges and payment icons: force every badge to a common height so logos supplied at different sizes stop appearing at wildly different scales. Height and spacing are per screen size, with optional grey-until-hovered.
- Pull quote: an optional quotation mark above or beside the text, and an accent line down the left or underneath.
- Eyebrow: an optional short rule before or after the text, with adjustable length and colour.
4.1.0 — Column counts you can set per screen size
The bento grid, stats row, feature grid, split screen, content-and-sidebar and logo strip could only be changed by typing a raw CSS value, which meant no per-screen control: a four-column stats row stayed four columns on a phone.
- Bento, stats row and feature grid: set the number of columns, the spacing, and how items line up — each per screen size. Optionally give a minimum column width and the grid wraps by itself.
- Split screen: choose an even or weighted split, the spacing, and which screen size it stacks below.
- Content and sidebar: set the sidebar's width and which side it sits on, and where it stacks. Putting the sidebar on the left reorders it visually without changing the markup, so reading order stays sensible.
- Logo strip: set a uniform logo height and spacing per screen size, with an optional grey-until-hovered treatment.
4.0.2 — Reading time and Last updated now show something
Both elements produced an empty space on the page: neither had any code behind it. They now read from the post itself.
- Reading time counts the words in the post and divides by a reading speed you set, ignoring markup and shortcodes so the count is honest. The wording either side of the number is yours, and you can set a floor so a very short page does not say "0".
- Last updated shows when the post was last edited, in the site's date format or one you give it, or as "3 days ago". It can fall back to the published date for a post that has never been edited, and it outputs a real time element so search engines can read the date.
4.0.1 — Five more elements that did not do what they promised
- Screen-reader text is now actually hidden. It only moved itself off to one side, which leaves the text selectable and can add stray scrollbars. It can optionally appear when tabbed to.
- The skip link now appears when focused, which is the entire point of one. Its colours and position are adjustable.
- The anchor target no longer scrolls under a sticky header — set how far below the top it should stop, per screen size.
- Avatars in an avatar group overlap, with adjustable size, overlap, ring colour and thickness, and a choice of which face sits in front.
- The loading skeleton shimmers, with adjustable speed and colour. It holds still for visitors who have asked for reduced motion.
4.0.0 — The five text-effect elements now produce their effect
Gradient text, Outlined text, Drop cap, Vertical text and Highlighted text were named after effects none of them implemented — inserting "Gradient text" gave you plain bold text. Each now renders properly and comes with the handful of settings that actually control it.
- Gradient text: start colour, end colour and angle.
- Outlined text: outline thickness (per screen size), outline colour, and an optional fill instead of the hollow look.
- Drop cap: how many lines tall (per screen size), letter colour and weight.
- Highlighted text: colour, and whether it fills the whole block, sits under the words, or sweeps like a marker pen.
- Vertical text: reads top-to-bottom or bottom-to-top.
3.99.4 — Twenty-three elements were losing their styling on the live page
- Cards, callouts, badges, notices, CTA bands, empty states, popups, offcanvas panels and dropdowns had no padding on the front end. They set it as a shorthand, and the shorthand was not among the properties the page builder knew how to write out, so it was discarded every time. Thirteen elements were affected.
- The bento grid, feature grid, split screen, stats row and sidebar layout had no grid. They were setting a property name the builder does not recognise; they now set the one it does, and lay out as intended.
- The aspect-ratio box now keeps its ratio, and the overlap wrapper overlaps. Both relied on properties that were being dropped for the same reason.
- Padding, margin, position, z-index, overflow, aspect-ratio and object-fit are now understood everywhere, so a rule using one is no longer silently lost.
3.99.3 — Completes the block-editor script fix
- The remaining script error when opening a post from the SEO health list is gone. 3.99.2 fixed one of the blocks in this file; the resize handle sits in a different one and still could not reach the translation helper. There is now a single helper shared by the whole file rather than a copy per block, so no part of it can be missed again.
3.99.2 — Fixes a script error on every block-editor page load
- The SEO sidebar threw a ReferenceError twice on every editor load. The code that adds the drag-to-resize handle sits in its own block and was calling the translation helper defined in a different one. The handle lost its tooltip and two errors were logged each time a post was opened.
3.99.1 — Ten more slider settings
- Card sizing: set a card width outright, or a minimum and maximum width, or force a height — each per screen size. Cards can be made the same height as each other, or left to their own.
- Show a sliver of the next card so it is obvious the row scrolls.
- Snapping can be always, only when a card is already close, or off entirely for free scrolling. Movement can glide or jump.
- Arrows can sit below as before, over the slides, or outside the edges.
3.99.0 — Element settings marked responsive finally are
- Settings marked "can differ per screen size" now actually do. That badge has been shown on slides-shown, spacing, review columns, floating-button offsets and popup width for some time, but the value underneath was stored once and used everywhere — the badge was the only part that was responsive. Element settings now carry a breakpoint the same way styles always have, set at whichever viewport you are editing.
- A slider's slides-shown and spacing now change per breakpoint on the live page. They were previously written into each slide as an inline style, which cannot carry a media query and outranks every stylesheet, so the widest value won everywhere and nothing could override it. They are emitted as ordinary rules now.
- Nothing is migrated. A setting with no per-screen values behaves exactly as before and is still stored the same way.
3.98.1 — Reverts a no-op change from 3.97.2
- Reverts the four inspector controls added in 3.97.2. They were added to a list the Spacing and Size panels never read, so they never appeared and changed nothing. Those panels already offer all four padding and margin sides and both width and height with min and max. A comment now records this so the same mistake isn't repeated.
3.98.0 — Builder breakpoints now match Bootstrap 5
- Six viewports instead of three. The builder had Desktop, Tablet and Mobile; it now has Desktop plus xxl, xl, lg, md and sm, on Bootstrap 5's own boundaries (1400 / 1200 / 992 / 768 / 576, using the same .98 down-mixin edges Bootstrap uses). A Velox layout and a Bootstrap utility on the same page no longer disagree about where a viewport ends.
- Existing pages are not migrated and cannot lose styling. Rules saved under the old Tablet and Mobile keys are read as lg and md and still render at the same widths. They are emitted just before the matching new breakpoint, so if both exist the newer value wins. Nothing is rewritten on disk.
- The small breakpoint is a real breakpoint now. The 'portrait' global width was stored but never actually produced a media query.
3.97.2 — Four builder controls that existed but were never shown
- Margin left and margin right are now editable. Both were already supported everywhere — the model, the editor's CSS generator and the front-end renderer all handled them — but the inspector only ever offered top and bottom, so there was no way to set them.
- Min width and max height are now editable, for the same reason.
3.97.1 — Attribute and translation fixes in the admin
- Fixed: 54 broken
aria-labelandtitleattributes across the admin. An earlier translation pass wrapped these values invxT( … )without escaping out of the surrounding string, so the browser received the literal function call as attribute text instead of a label. Screen readers got nonsense on the media library checkboxes, the mail folder and connection controls, the field-type picker, the image lightbox and the builder size steppers, among others. - The maintenance indexing prompt is now translatable. Its heading, the three choices, the select-all label and the footer note were hardcoded English while the rest of the screen switched to German. Item counts now use proper singular and plural forms rather than being assembled from fragments.
3.97.0 — Reviews gets its own home, and three fixes
- Fixed: the indexing prompt after maintenance mode never appeared. Since maintenance can be switched from the admin bar on any screen, but the prompt lived in a script that only loaded on Velox pages, it was invisible everywhere else. It now loads wherever there is something to decide.
- Fixed: the snippet code box was completely unlabelled. The language badge and placeholder are now written into the page itself instead of being added by a script, so an empty editor always says what it expects.
- Google Reviews is now its own section in the sidebar and has a card on the dashboard, instead of being buried three levels down in Utilities.
- Example reviews in the Reviews tool: switch them on to see how reviews look before connecting Google. Clearly fake, and nothing leaves the screen.
3.96.0 — Accordion, tab and slide items in the outline
- The Structure panel now lists the items inside an accordion, tabs or a slider, each with the container that holds its content. A slider with six slides was previously a single line, so its slides could not be found or selected from the outline.
- Reorder items straight from the outline with the arrows that appear on hover. The content container moves with its item, so nothing ends up on the wrong panel.
- Clicking an item selects its element and opens the Settings tab where that item is edited.
3.95.0 — Icons you can actually pick
- New icon picker. Anywhere an element asks for an icon you now get a searchable, grouped picker with a live preview, instead of typing a name from memory and hoping.
- 70 icons covering contact, interface, trust and commerce, people and places, trades and services, and media and data — chosen for the work rather than shipping a library of thousands.
- Icons are drawn into the page directly. Nothing is fetched from an icon CDN, so no visitor IP addresses are shared with a third party and no icon font is downloaded for the sake of a few symbols.
- Floating buttons and the sticky contact bar now use the icon you choose, with a sensible fallback when you have not chosen one.
3.94.0 — Fixes and clearer settings across the admin
Fixes
- Fixed: saving a mail template made a copy instead of updating it. Saving the same template repeatedly piled up duplicates; it now updates in place.
- Fixed: the setup wizard started again after a reload. It only counted as finished if you explicitly dismissed it. Re-run it any time with ?velox_wizard=1.
- Fixed: SEO title and description counters only updated after a reload. They now count as you type.
- Fixed: risky settings sat flush against the amber line and some fields ran past the edge. The spacing rule was competing with another of equal weight, so whether it applied was down to chance.
Clearer
- Cache lifetime now has one-click presets (1 hour, 6 hours, 12 hours, 1 day, 1 week, 30 days, or until purged) and tells you in plain words what any number means — 36000 seconds reads as "= 10 hours".
- After purging the cache Velox no longer reports "WP Fastest Cache not active" as something skipped; not having it is normal. Instead you get links to check the result, both in Velox and on Google PageSpeed Insights.
- The snippet editor shows which language you are writing, with the wrapper Velox adds for you, so a PHP snippet is not mistaken for plain output.
- Maintenance mode now confirms itself wherever you are in the admin, instead of only inside Velox.
- SEO: import and export moved to the bottom of the page, out of the way of everyday settings.
Google Reviews
- Full styling controls: layout as a grid, list or slider, columns, spacing, card background, rounding, padding, border and shadow, star colour and size, name and text colours and sizes, and switches for the profile picture, date and Google logo.
- Example reviews for designing. Turn them on to style the block before the Google connection exists; they are clearly labelled and never appear once real reviews are in place.
- Filter by minimum rating and shorten long reviews.
3.93.0 — Real content inside accordions, tabs and slides
- Accordion panels, tab panels and slides can now hold anything — buttons, images, grids, any element — instead of plain text only. Each item gets its own container you can drop elements into, and the text fields stay as a shortcut for simple content.
- Adding or removing an item adds or removes its container to match.
- Fixed: the Navigation element ignored the "A WordPress menu" setting entirely. Choosing it produced no links at all; it now reads the menu, including submenus.
- A navigation with no menu found falls back to its typed links rather than rendering nothing.
3.92.0 — Navigation and floating elements
New elements
- Navigation — links from a WordPress menu or typed by hand, submenus, a burger menu with a breakpoint you choose, submenus on hover or click, and optional sticky behaviour that can shrink or hide as you scroll.
- Breadcrumbs — with optional search-engine markup.
- Anchor navigation — jump links that highlight the section currently on screen.
- Floating button — nine placements, offsets, and actions for links, phone calls, WhatsApp, email, scroll-to-top or opening a popup. Optional attention animation.
- Back to top, Announcement bar (dismissible, remembers the dismissal), Sticky contact bar (phone-friendly button row) and Reading progress.
How they behave
- Floating elements share one system for when they appear (page load, delay, scroll depth, an element coming into view, inactivity, or leaving the page) and how often (every time, once a visit, once a day, once ever).
- Placement and per-device hiding are written as real CSS, so nothing flashes in the wrong place while the page loads and hidden elements are genuinely hidden.
- On phones, where there is no cursor to detect, the leaving-the-page trigger becomes a scroll trigger instead of never running.
- Navigation uses one set of links for desktop and mobile, so search engines and screen readers see them once.
Fixes
- Fixed: hover never worked on submenus or tabs. The events used for hover do not travel up the page the way the code assumed, so hover mode did nothing at all.
- Fixed: clicking a hover submenu closed it. Hovering opened the menu and the click immediately shut it again, making it impossible to click through.
- Fixed: elements shown by a trigger stayed marked as hidden, so assistive technology was told the opposite of what was on screen.
- Fixed: closing an announcement bar did not stick when it was set to show every time. Closing something is deliberate and now lasts the visit.
3.91.0 — Interactive elements, and the foundation under them
New elements
- Accordion and FAQ — add sections, choose one-at-a-time or several open at once, set the icon side and heading level. Optional FAQ structured data, off by default.
- Tabs — above or beside, click or hover, and an option to become an accordion on mobile using the same content rather than a duplicate copy.
- Slider — slides shown, spacing, looping, autoplay with a play/pause control, arrows, dots and a position counter.
- Offcanvas panel, Popup / modal and Dropdown — edge, size, whether the page is pushed or stays put, backdrop, and how it can be closed.
- 36 layout, typography, content and utility elements: split screen, full-height section, aspect-ratio box, bento grid, auto stack, cluster, content + sidebar, gradient/outlined/highlighted text, drop cap, eyebrow, pull quote, vertical text, icon box, card, stats row, team member, logo strip, callout, badge, avatar group, trust badges, payment icons, case study card, CTA band, notice box, feature grid, skip link, screen-reader text, reading time, last updated, loading skeleton, empty state and anchor target.
Under the hood
- Elements now carry their own settings, so every element gets a properly organised Settings tab with sections, plain-language labels and controls that appear only when they are relevant.
- Interactive elements are keyboard-accessible and screen-reader-correct by default, following the W3C accessibility patterns for accordions, tabs, dialogs and carousels.
- The slider uses no carousel library. Slides are ordinary content in the page, so they are visible to search engines without JavaScript, nothing jumps while the page loads, and the first slide is prioritised for speed.
- Element code is only sent to a page that actually uses it — a page with an accordion does not carry the code for sliders.
- Anything that animates respects the visitor's reduced-motion setting.
Fixes
- Fixed: a setting switched off came back on. Turning any toggle off removed the setting entirely, so it fell back to its default — meaning "off" was impossible to save.
- Fixed: an empty popup could not be closed, because it collapsed to nothing and hid its own close button.
3.90.1 — Nothing shows through a floating panel
- Fixed: the style panel stayed visible behind an unpinned Add panel. The Add panel is narrower than the style panel, so its right edge stuck out and remained readable through the dimming. Dimming is not hiding — the column is now removed while a panel floats over it, and comes back the moment the panel is pinned or closed.
3.90.0 — Panels and shortcuts behave
- Fixed: the Add panel's pin did nothing. It was pinning the right-hand side instead of its own, so clicking it appeared to have no effect at all.
- Fixed: opening a panel closed the one on the other side. Structure and Add can now be open together, as can Settings and Add. Panels on the same side still replace each other, since they share the space. Pinning decides whether a panel pushes or overlays the canvas — nothing more.
- Fixed: Ctrl/Cmd + S sometimes opened the browser's own save dialog. Two causes: the shortcut only matched a lowercase "s", so Shift or Caps Lock missed it; and it listened after other handlers, any of which could stop it. It now matches regardless of case and runs before anything can swallow it.
- Fixed: canvas event listeners stacked up on every render. A click, double-click or shortcut on the page ran its handler once for every time the canvas had been redrawn since opening the editor — so a single Ctrl+S could fire several saves.
3.89.0 — Colours are editable again
- Fixed a regression: there was no way to edit your colours. Rebuilding the Global styles screen in 3.82.0 dropped the colour and spacing editors, and nothing replaced them — the in-editor Colors page only listed them. Both are now editable in Settings → Global styles, with add, rename, recolour and remove.
- Spacing scale is editable there too, available as var(--space-0), var(--space-1) and so on.
- Unpublish is now reachable. A published page could only be taken off the site by deleting it, even though the ability to unpublish already existed with no button attached. It also clears the cache, which it previously did not — the page would have stayed visible to logged-out visitors.
- Removed the leftover header/footer role endpoint; its interface was retired in 3.80.0.
3.88.0 — The Settings screen now does something
- Fixed: every setting on the Builder Settings screen was ignored. CSS output, Minify CSS and Default container width were all saved to the database and read by nothing — changing them had no effect whatsoever.
- CSS output now works: "Inline" puts the page CSS in the head instead of writing a static file.
- Minify CSS now works: comments and whitespace are stripped from the generated stylesheet.
- Default container width is gone, because page width already lives in Global styles and two controls for one value is worse than one. The Settings screen shows the current value and links to it, and any width previously saved here is carried over.
- Saving these settings clears the page cache, so a change to CSS output takes effect immediately.
3.87.0 — Reusables show where they are used
- Each reusable now says how many pages it appears on, and hovering lists them. Templates count too.
- Deleting a reusable that is in use warns you first and says how many pages will lose the block, instead of asking a blank "are you sure".
- Reusables get the same row actions as pages and templates: Edit, Rename, Duplicate, Delete.
- A clearer empty state pointing at "Make re-usable" in the builder's right-click menu, which is how most reusables actually get created.
3.86.0 — Page settings gains real depth
- Page background colour, per page.
- Animate On Scroll per page: override the site-wide animation, its duration and delay — or switch animation off for this page alone. Precedence runs element, then page, then site.
- Scripts per page: CSS and JavaScript that apply to this page only. The CSS is written after everything Velox generates, so it wins; the JavaScript runs in the footer of the published page.
- Both sit behind their own entries under Page settings, matching the rest of the settings navigation.
3.85.0 — Global styles in the editor, and pinning per side
- Global styles now live inside the builder, not on a separate admin screen. Settings → Global styles opens Colors, Fonts, Headings, Body Text, Links, Width & Breakpoints, Sections & Columns and Animate On Scroll, each on its own page. Changes save as you type, through the same store the admin screen uses, so the two can never disagree.
- The pin button is now per side. One pin for both stacks meant you could never dock the inspector while leaving a panel floating. Left and right are remembered separately.
- An unpinned panel now properly hides what is behind it. The dimming was too light, so the inspector stayed legible through it and the two panels read as one.
- Settings navigation rows are all the same width; the longest label used to stretch its own row.
- Clearer icons in the settings navigation.
3.84.0 — Settings inside the builder
- A Settings button in the top bar opens a panel with three areas: Page settings, Editor settings, and a link to Global styles.
- Page settings — page width and overlay header — apply to the document you are editing and are saved with it. Overlay lets the header sit on top of the first section instead of pushing it down, always or only from tablet or desktop up.
- Editor settings — indicate parent elements on hover, and the class suggestions limit. These are your own preferences, stored in your browser, and never change the site.
- Global styles stay on their own screen rather than being squeezed into a narrow panel; the entry links straight there.
- The panel pins and collapses like every other panel in the editor.
3.83.0 — Animate on scroll
- Elements can now animate as they scroll into view: fade, fade up/down/left/right, zoom in and zoom out.
- Set a site-wide default in Global styles — animation, duration, easing, trigger offset, delay, play once or every time, and turn it off on mobile or tablet.
- Every element can override it or opt out from the Settings tab in the builder, including its own duration and delay.
- Visitors who ask their system for reduced motion never see animations, whatever is configured.
- The animation code only ships on pages that actually animate something, and browsers without IntersectionObserver simply show everything rather than leaving the page blank.
- Animations do not play inside the editor, so they never fight the builder while you work.
3.82.0 — Global styles
- Body text: font family, size, weight, line height and colour, applied to every built page.
- Headings: a shared heading font plus size, weight, line height and colour for H1 through H6 individually.
- Links: colour, hover colour, underline and weight.
- Width & breakpoints: page width, and the tablet, landscape and portrait breakpoints are now editable.
- Sections & columns: default padding on all four sides.
- Breakpoints were hardcoded in four separate places — the editor, the front-end renderer, and both halves of the class CSS editor. Editing a class could silently drop its responsive rules because the parser matched the old fixed numbers. They now come from one setting everywhere, including the editor's tablet and mobile preview widths.
- Leaving a field empty means inherit: Velox writes no rule at all rather than forcing a default over your own styling.
3.81.0 — Self-hosted fonts and per-weight preloading
- Preload is now per weight, not per family. Preloading a whole family pulls files the page may never use, which is worse than not preloading at all. Pick the one or two weights your first screen actually needs.
- "While fonts load" is a single site-wide choice instead of being set separately on every family.
- New Local files source. Point Velox at .woff2 files in your media library, one per weight, and it writes the @font-face rules for you. Self-hosted fonts preload the actual font file rather than a stylesheet, which is what preload is for.
- Each family is now a titled card and the weight sections name the font they belong to, so it is always clear which family you are editing.
- Weights you are not loading are dimmed out of the preload and file lists rather than offering choices that do nothing.
3.80.0 — Templates know what they are for
- Every template now has a purpose: Front page, 404, Search, Archives, Posts, Pages, or Catch-all. Set it from a dropdown on the row. When more than one template could apply, the most specific wins — a Front page template beats a Pages template, which beats Catch-all.
- Creating a template asks for a name and a purpose first, instead of dropping you into an untitled document.
- New templates start with an Inner Content element already in place, so a template can show page content from the moment it is created. Not having one was the single most confusing thing about building a template from scratch.
- Templates now have the same row actions as pages: Edit, Rename, Duplicate and Delete.
- The old unexplained "Header" and "Footer" buttons are gone; a template is a whole page frame, and its purpose says where it applies.
3.79.0 — The Velox Builder screens are readable again
- Fixed: headings, numbers and labels were nearly invisible. These screens are dark, but WordPress colours admin text for a light background and nothing overrode it — so section titles, the counters on the overview and most secondary text were dark grey on near-black.
- Fixed: every text field, dropdown and textarea was unstyled — WordPress painted them white with its own borders. All form controls on these screens now share one dark style with proper focus rings.
- The search field is shorter and wider, the type dropdowns read as small chips rather than full-size form controls, and rows no longer run into the edge of the card.
- "Not live" and "No Velox layout" now say something you can act on: "Build this page →", "Draft — publish it →", or "On your site". The first two are links straight to the fix.
3.78.0 — Text you type on the canvas is no longer lost
- Fixed: text typed directly on the page could vanish when you saved. The canvas is an iframe, and clicking a button in the top bar does not reliably tell the browser you have finished editing — so the text was still only on screen and never reached the saved document. It looked especially bad on templates: the heading saved empty, so the whole template appeared to render nothing on the front end.
- Text is now committed before every save and publish, and whenever you click anywhere outside the canvas.
- Fixed: keyboard shortcuts did nothing while the cursor was on the page. Ctrl/Cmd + S, P, Z, D and \ now work whether you are typing on the canvas or not.
- A document saved without a content, tree or class map no longer breaks editing.
3.77.1 — Cache purging, and a status that cannot lie
- Fixed: publishing never cleared the page cache. Logged-in users bypass the cache, so changes looked fine to you while logged-out visitors kept being served the old page indefinitely. Publishing a page, publishing a template, changing global CSS or JavaScript, and switching the catch-all option now all clear the cache.
- Fixed: the page editor could show two contradictory statuses at once — "No Velox layout is attached" alongside a message saying the template wraps the page. The status now runs the same code the front end runs, so the two cannot disagree.
3.77.0 — Templates can now wrap pages you never built in Velox
- New catch-all option. Turn it on and your default template also wraps pages that have no Velox layout — their normal WordPress content is placed in the template's Inner Content slot. That is how you get one shared navbar and footer across an existing site without rebuilding every page.
- Off by default, deliberately. Switching it on makes Velox render every page on the site, which is not something to do silently — WooCommerce checkout and cart pages included. The switch lives in the Velox Builder box on any page editor.
- Refuses to apply when the template has no Inner Content element, because the page content would have nowhere to go and would vanish. It says so instead.
- Any page can still opt out individually with "No template — this page only".
- Fixed: the page editor contradicted itself, showing "Not live with Velox" and a template selection at the same time with no explanation of why the template was doing nothing.
3.76.1 — Dropdowns on the dark screens
- Fixed: the document-type and font dropdowns rendered as white boxes. WordPress styles every select in the admin with its own light theme, which overrode the dark styling on the Velox Builder screens and stretched the rows.
- Rows on the Pages overview are now a consistent height.
3.76.0 — View as, and a Live column on the overview
- "View as" now lists every page and post on the site, grouped into Velox pages, WordPress pages and Posts — not just Velox-built pages. A plain WordPress page previews with its own content.
- A preview bar now says what you are looking at: "Previewing as [page]", a reminder that the content is not part of the template and is not saved, and a Stop preview button. The dropdown alone was too quiet a signal.
- The View as control is styled properly and grouped, rather than a bare dropdown.
- Every row on the Pages overview now shows Live or Not live, and hovering explains why — no layout attached, still a draft, or saved as a Template/Reusable rather than a Page.
- Fixed: the top bar controls could overlap. The centre cluster was positioned independently of the rest of the bar, so the right-hand buttons slid underneath it as the bar filled up.
3.75.0 — Font loading you control
- Pick exactly which weights load for each font family. Velox previously requested 400, 600, 700 and 800 for every Google font whether you used them or not — four files per family, on every page.
- Italics are now opt-in per family rather than never available.
- font-display is now a choice (swap, optional, fallback, block, auto) instead of always swap, with each option explained in plain language.
- Preload any family to fetch its stylesheet at high priority, with a no-JavaScript fallback.
- Pages using Google Fonts now preconnect to both Google hosts, saving a round trip before text can paint.
- Fonts saved before this release keep working and default to 400 and 700.
3.74.0 — Global JavaScript
- New Global JavaScript manager, alongside the existing Global CSS files. The code button in the builder now has CSS and JavaScript tabs.
- Each script can be named, switched on or off without deleting it, and set to load in the head or the footer, either immediately, after the page loads, or without blocking.
- Scripts run on every Velox-rendered page. They deliberately do not run inside the editor — a global script that rewrites the page would fight the builder — so test them on the published page.
- Only users who are allowed to post unfiltered HTML can save scripts.
3.73.0 — Three long-standing annoyances
- Fixed: style sections closed themselves while you were typing. The style panel rebuilds on every keystroke, and each rebuild reset which sections were open — so a section could collapse under your cursor mid-edit. Your open and closed sections are now remembered.
- Fixed: two navbars when a template and a header/footer template were both set. The older header/footer roles and the newer template system were both wrapping the page. A template now takes precedence; header/footer roles still work on their own when no template applies.
- Fixed: the Insert Data panel opened in the wrong place, offset to a position left over from the old sidebar that was removed in 3.67.0.
3.72.1 — View page opens the homepage for templates
- A template has no URL of its own, so "View page" now opens the site homepage while you are editing one, instead of doing nothing. The same applies to the View and Open frontend entries in the exit menu.
3.72.0 — Template previews, Inner Content rules, and a front-end diagnosis
- The page editor now tells you whether Velox is actually serving the page, and if not, exactly why: no layout attached, still a draft, or the document is saved as a Template/Reusable rather than a Page.
- Front-end lookup made more forgiving: it now also finds the layout through the binding stored on the page itself, resolves revision IDs when previewing, and lets logged-in editors preview an unpublished layout.
- "View as" for templates: pick any built page from the top bar and its content appears inside the template's Inner Content slot, so you can see how a real page sits in the frame. Preview only — nothing is saved.
- Inner Content is now template-only — it no longer appears in the element list for pages or reusables, it can only sit at the top level (never inside a section or div, including by dragging), and a template can only have one.
- Open panels now dim the editor behind them instead of letting it show through. Pinned panels do not dim, since they own their own space. Clicking the dimmed area closes the panel.
- "Go to backend" returns where you came from: the WordPress editor if you opened the page there, the Templates or Reusables list for those, and the Velox overview otherwise.
3.71.0 — Three fixes, including a white-screen crash
- Fixed: a page could return a 500 error. If a document was used as its own template, the Inner Content slot kept inserting the page into itself until PHP ran out of memory. The slot is now filled once and nested repeats are ignored.
- Fixed: typing a unit into a number field produced values like "24%px". Half-typed units are ignored until they are complete, so typing "px" over an existing "%" now lands on 24px instead of garbage.
- Fixed: Backspace sometimes deleted the element you were styling. Every keystroke rebuilt the style panel, which threw away the field you were typing in — the next Backspace then hit the delete-element shortcut. The panel now keeps your field and cursor position, and Backspace no longer deletes elements at all (Delete still does).
- Change a document between Page, Template and Reusable straight from the overview, without opening the editor.
- When no templates exist, the page editor now links straight to creating one and explains that an existing page can simply be converted.
3.70.0 — Inspector rework, drag-to-move, and a real page & class manager
Editor
- Padding and margin now sit side by side in a box layout, each with an All / Individual switch — one field for all four sides, or one per side. Your choice is remembered.
- Width, min-width and max-width share a row; height does the same. The style panel is wider.
- The class area was rebuilt. The active class used to be printed twice — once in a card, once as a chip — and nothing told you that editing a class changes every element using it. Now it says so, and the state picker is its own panel.
- Drag elements anywhere in the page structure: drop above, below, inside a container, or into empty space to pull something back out to page level.
- Elements can no longer be dropped into their own children.
- The "Add element" button is now flat text-and-icon rather than a filled block.
Fixes
- Fixed: dragging in the page structure did nothing. It was still wired to the old sidebar that was removed in 3.67.0.
- Fixed: min-width and max-height were silently thrown away — neither was registered in the style engine, so any value you typed vanished.
- Fixed: choosing a unit before typing a number snapped back to px.
- Fixed: opening the Add panel closed a pinned Structure panel even though they sit on opposite sides.
Pages overview
- Shows every page on the site, including ones never touched by Velox, with a Build button to start one.
- Filter by All / Velox pages / Templates / Reusables / Without Velox, plus search.
- Rename, Duplicate, View, Delete and open in WordPress straight from each row.
- Fixed: the counters at the top always read zero. They were hardcoded.
Classes
- Filter between your own classes and the ones Velox creates for new elements.
- Edit opens the class's full CSS — including :hover states and media queries — as editable text, and you can rename it in the same window.
- Anything unsafe or unrecognised in the CSS is dropped on save rather than stored.
3.69.0 — Units you can pick, and two template/reusable fixes
- Units are now a dropdown. Click the "px" next to any size field and switch to %, em, rem, vh, vw or auto. Typing a unit straight into the number field works too — enter "100%" and the % moves onto the chip by itself.
- Ctrl/Cmd + D duplicates the selected element.
- Fixed: reusables lost their text. Saved reusables only stored the structure and styling, so pasting one gave you correctly-styled empty boxes. They now carry their content, and a reusable you just created is insertable immediately instead of after a reload.
- Fixed: a document could not be turned into a template. The type was only ever set from the URL, so anything started via "New page" was stuck as a page. There is now a Page / Template / Reusable picker beside the title in the builder.
- Publishing a template or reusable no longer creates a stray WordPress page for it.
- Switching a document to "Template" makes it the site default if no default is set yet.
3.68.0 — Templates that actually wrap your pages
- New "Inner Content" element. Drop it into a template to mark where each page's own layout belongs. A template can now be a real navbar + content + footer instead of just a header and footer with a gap between them.
- "Render page using template" now appears on every page and post editor, under the Velox Builder box. Pick a specific template, opt this page out entirely, or leave it following the site default.
- The first template you create becomes the site default automatically — and because the default lives in one setting rather than being copied onto each page, pages you built before that template existed pick it up too.
- If a template has no Inner Content element, the page content is appended after the template rather than disappearing.
- The builder's "Add element" button is now a flat icon-and-text button in the top bar instead of a filled blue block.
3.67.0 — Builder: one left column, richer right-click menu
- The left sidebar is gone. "Add element" is now a button in the top bar, Reusables moved in with the other tool icons, and the duplicate Settings shortcut was dropped (it was already in the logo menu). The editor went from three stacked left columns down to one.
- The style panel only appears when you select something. With nothing selected the canvas gets the full width instead of showing an empty column. Add an element and the panel slides straight in for it.
- Right-click menu rebuilt: Copy, Paste, Duplicate, Delete, Rename, Export, Wrap with div, Hide, Make re-usable — with keyboard shortcuts shown next to each.
- Rename gives an element a friendly name in the page structure without touching its markup or classes.
- Export copies an element and all its styles as JSON to your clipboard.
- Wrap with div puts a container around an element in place.
- Hide keeps an element in the builder — ghosted, still editable — but leaves it off the published page entirely.
- Conditions is listed in the menu but not built yet; it is greyed out and marked SOON rather than quietly missing.
3.66.0 — Pin and collapse the builder panels
- Panels can now be pinned: a pinned Structure, History, Global CSS or Add-element panel pushes the canvas across instead of covering it, so you can style and see your page at the same time. The pin is shared — set it once and every panel opens the same way.
- New Hide left panels and Hide right panel buttons in the top bar slide the side panels off screen to give the canvas the full width. Shortcuts: Ctrl/Cmd + \ for the left stack, Ctrl/Cmd + Shift + \ for the right one.
- The right-hand toggle remembers which panel you last had open and brings that one back.
- Your pin and collapse choices are remembered between sessions.
- Fixed the missing WordPress icon, which showed as a blank square in the Add-element list, the page structure and on WordPress data elements in the canvas.
3.65.0 — Velox Builder: states, spine cleanup, styled inputs (wave F)
- State selector now includes :active out of the box plus a + button to add any custom pseudo-class (:visited, :nth-child(2), etc.); the generated CSS renders whatever states you use.
- Removed the separate Layers list from the left spine — element editing lives in the inspector and the full tree is in the Structure panel (reachable from the spine or the top bar).
- Styled the settings/inputs properly: focus ring, hover states, custom dropdown chevron, and clearer read-only fields. Inspector is wider for more room.
3.64.0 — Velox Builder: exit fix, contrast, duplicate, shortcuts + right-click (wave E)
- Fixed the Exit menu: Open frontend / Go to backend / View page now resolve to real URLs even when you opened the builder by document (they were dead when no post was bound).
- Right-click any element (in the canvas, layer tree or structure) for a context menu: Copy, Paste, Duplicate, Make reusable, Remove.
- Keyboard shortcuts: Ctrl/Cmd+S saves, Ctrl/Cmd+P publishes, Ctrl/Cmd+C copies the selected element, Ctrl/Cmd+V pastes it into the element you right-clicked/selected (inside it if it is a container).
- "Make reusable" saves the selected element (with its classes) as a reusable block.
- Raised the contrast of icons, labels and muted text so they are no longer hard to see against the dark panels.
3.63.0 — Velox Builder: rich text toolbar + Insert Dynamic Data (wave D, #1)
- Text elements now get a formatting toolbar in the left panel: bold, italic, underline, strikethrough, align left/center/right and link. Formatting is kept when you save.
- New "Insert Data" picker with the full dynamic-data list (Post, Featured Image, Author, Current User, Blog Info, Archive, Advanced). Inserting a field drops a token into the text that renders the real WordPress value on the front end (post title/content/excerpt/date, author, site info, custom fields, etc.).
- For safety, the "PHP Function Return value" token is inserted as a placeholder and is not executed on the front end.
3.62.0 — Velox Builder: real element settings (wave D, #5)
- Elements with their own settings now surface them properly. Selecting a Google Reviews element jumps straight to its Settings, showing a prominent Connection + Design preset picker (with a hint to set up a source under Velox → Utilities → Google Reviews if none exist).
- WordPress-data elements get a "Show which field" picker (post title / content / featured image / menu). Links/buttons get a URL field plus an Open-in-same/new-tab choice that is honoured on the front end.
- Element settings are grouped into clear sections instead of being mixed in with style controls.
3.61.0 — Velox Builder: element-specific inspector (wave C)
- The inspector now adapts to the selected element: each element type shows its style groups in an order that fits it, and picks sensible Essentials.
- Text and headings lead with Typography; sections/divs/columns lead with Layout; buttons foreground Typography + Background; images and video lead with Size. No more Display-first on a text element.
3.60.0 — Velox Builder: layout + chrome rework (wave B)
- Moved all working panels to the left: the Add element / Layers spine and the element inspector now sit side by side on the left, with the canvas filling the rest.
- The Structure panel now opens on the right.
- Brightened the whole editor a step and unified every button to one consistent style (no more mixed colours/gradients).
- Reworked the top-bar right side: tool icons, then Publish and View page, then an Exit icon on the far right. The Exit icon opens a menu: Open frontend, Go to backend (WordPress editor), or View page in a new tab.
3.59.0 — Velox Builder: undo/redo + revert fixes, structure panel, delete sync (wave A)
- Fixed the top-bar undo/redo arrows — they now step one change at a time instead of jumping two or doing nothing. Selecting elements no longer pollutes the history.
- Fixed session-history revert: reverting to a point now restores exactly that state instead of wiping the page.
- Added a Structure button in the top bar that opens a collapsible outline of the whole page; click a node to select it, click the caret to collapse/expand.
- Only one panel (add element, CSS, history, structure, page switcher) can be open at a time now — opening one closes the others.
- Overview no longer shows pages whose WordPress post was deleted, and delete now syncs both ways: deleting a page in the Velox overview trashes the bound WordPress page, and trashing/deleting a WordPress page removes its Velox document.
3.58.0 — Velox Builder: session history
- The history (clock) button opens a session history panel: it starts empty when you open a page, lists each edit you make (add, delete, style, class, text…) newest-first, and lets you click any point to revert to it.
- History is in-memory only — it clears when you close the editor, so nothing is stored on the server.
3.57.0 — Velox Builder: global CSS files editor
- The code (</>) button now opens a right-side Global CSS panel where you create named CSS files and write CSS that applies to every Velox page.
- Changes apply live in the editor canvas and save automatically; the concatenated global CSS is output on every built page. Basic sanitising strips any </style> or <script> breakout attempts.
3.56.0 — Velox Builder: entry/exit fixes + Edit-with-Velox meta box
- Opening a page with Velox now inherits that page’s title instead of resetting to “Untitled”, and Exit returns you to that page’s WordPress editor (not the builder home).
- Added an “Edit with Velox” meta box on the page/post editor (like Oxygen’s), showing Build or Edit depending on whether the page already has a Velox layout.
- The page switcher loads the chosen document into the editor and updates the current title.
3.55.0 — Velox Builder: topbar full-width + missing icons
- Fixed the top bar collapsing to a centred cluster — it now spans the full width, with the three zones (logo/title, breakpoints/undo-redo, actions) pushed to left/centre/right as designed.
- Added the search, code (page CSS/JS) and history icons to the top bar right zone (they were in the design but missing from the build). Code toggles the live-CSS panel; search opens the page switcher.
3.54.0 — Velox Builder: Google Reviews + WordPress elements render live (waves 3–4)
- The Google Reviews element now renders your real reviews on published pages, using the connection and preset you pick in the element Settings (via the [velox_reviews] shortcode). In the editor it shows a labelled placeholder.
- WordPress-data elements now pull live data: Post title, Post content, Featured image and Menu/Nav render from the current post on the front end, with labelled placeholders in the editor.
3.53.0 — Velox Builder: inspector tabs (wave)
- The inspector now has Essentials / All styles / Settings tabs: Essentials shows the common controls, All styles shows everything, Settings holds element-level options.
- Class chips can be removed with an × and new classes added with “+ class”.
- Settings tab: pick the heading level (H1–H6), set a link URL for buttons/links, and (for the Google Reviews element) choose a reviews connection and design preset from your Velox Reviews setup.
3.52.0 — Velox Builder: page switcher (wave 2)
- Click the caret next to the page title to open a switcher: search across pages, posts and reusables, filter by All / Pages / Posts / Templates / Reusables, and see your Velox documents with status badges.
- The switcher also lists WordPress pages and posts that aren’t built with Velox yet, each with a "Build →" action to open them in the builder.
3.51.0 — Velox Builder: new add-element panel (wave 1)
- Replaced the old flat add-element list with a searchable, categorized accordion panel that opens on the left: Containers, Text, Links, Media, WordPress and Velox categories, each collapsible with icon element cards.
- Many more elements: Grid, Spacer, Divider, List, Quote, Text link, Video, Icon, plus WordPress-data placeholders (post title/content/featured image/menu) and a Velox “Google Reviews” element.
- Type-to-filter search across all elements. (Note: Video, Icon, WordPress-data and Google Reviews elements insert now; their live rendering lands in the next waves.)
3.50.0 — Velox Builder: editor chrome overhaul (wave 1)
- Rebuilt the editor top bar into three zones: left = Velox logo (with a menu: Builder settings / Back to WordPress) + editable page title; center = breakpoints + undo/redo; right = Exit, View page, and the save/publish actions.
- Save/Publish behaviour: a brand-new page shows a single Publish button; once a page has been published it shows both Save (admin-only draft) and Publish (live for everyone).
- Left panel now has Add element, Reusables and Settings buttons plus a "Find layer" search that filters the layer tree.
- Bigger editor canvas (up to 1200px) with tighter padding.
3.49.1 — Velox Builder: editor full-width fix
- Fixed the editor not filling the screen — the canvas column was collapsing to content width, leaving a large empty area on the right. The three panes (layers, canvas, inspector) now span the full viewport.
3.49.0 — Velox Builder: name your pages
- Added an editable title field in the editor top bar. Pages, templates and reusables can now be named (and renamed) instead of all saving as "Untitled" — the name is stored with the document and shows in every list.
3.48.0 — Velox Builder: reusables & template apply-rules, working
- Reusables now insert into pages. The editor Add menu lists your reusable blocks; pick one and it drops in as a live reference — it renders inline (styled) in the canvas and on the front end. Editing the reusable updates every page that uses it.
- Templates now apply as headers/footers. On the Templates screen, set any template as the site header or footer. Built pages are wrapped with them automatically, and all their CSS is merged into the page's single stylesheet.
- The renderer compiles one only-used stylesheet covering the page, every reusable it references, and the active header/footer templates — so nothing is missing and nothing is duplicated.
3.47.0 — Velox Builder: all admin sections, working
- Restored the full Velox Builder menu — Overview, Templates, Reusables, Classes, Global styles, Fonts & icons, Settings — and built each one for real (no placeholders).
- Classes: a real manager listing every class used across your pages with usage counts; rename or delete a class site-wide (rewrites every page that uses it and regenerates their CSS).
- Templates / Reusables: create, list, open and delete template and reusable documents (stored by kind); the editor now tracks which kind it is building.
- Global styles: define colour tokens and a spacing scale that output as CSS custom properties (:root variables) on every built page.
- Fonts & icons: register font families (Google Fonts by name or a self-hosted CSS URL) that load on every built page.
- Settings: choose static-file vs inline CSS output, toggle minification, set the default container width — all persisted.
3.46.0 — Velox Builder: full-bleed admin, blank canvas, honest menu
- The Velox Builder admin section is now full-bleed: WordPress update nags, other plugins' notices, Velox's own notices and the footer are all hidden on Builder screens, and the panel fills the whole content area.
- New pages open on a blank canvas (no demo content). Empty pages show a clear "Add element" prompt instead of a white void.
- Removed the placeholder Templates / Reusables / Classes / Global styles / Fonts / Settings menu items — these were non-functional stubs and should not have been shown. The menu now surfaces only what works: the Overview (which lists your real built pages) and the editor.
- Overview lists your actual Velox Builder pages with their draft/published status; "New page" and "Edit with Velox" are the ways in.
3.45.1 — Velox Builder: admin layout fix + edit entry points
- Fixed the Velox Builder admin section rendering as a blank white area — the panel was absolutely positioned and collapsed out of the wp-admin layout; it now sits correctly in the content area.
- Added "Edit with Velox" entry points: a row action in the Pages and Posts list tables, and an admin-bar link when viewing or editing a page. Opening one binds (or creates) a builder document for that page so publishing updates the real page.
3.45.0 — Velox Builder: image element
- The Image element is now real. Double-click it on the canvas (or use "Choose image" in the inspector) to open the WordPress media library, pick an image, and it renders in place — stored as its URL and shipped as a plain, lazy-friendly
on the front end.
- The standalone editor now loads the WordPress media library (wp.media) into its own document so the picker works inside the full-screen builder.
- Empty images show a clear placeholder in the editor and simply output nothing on the live page until set.
3.44.0 — Velox Builder: hover & focus states
- Every element can now be styled per interaction state. A Normal / :hover / :focus switcher sits under the class chips; pick a state and any property you set applies only in that state, falling back to Normal otherwise — exactly like a hand-written stylesheet.
- States compose with the class cascade and breakpoints, so you can have (for example) a different button hover colour on mobile. The front-end renderer emits the matching :hover / :focus selectors, so states work identically on the live page — verified byte-for-byte against the editor output.
- Backward compatible: existing documents (which only had normal-state rules) load and render unchanged.
3.43.0 — Velox Builder: full style controls
- The inspector now covers a real styling surface — six sections: Layout (flex/grid, wrap, justify, align, gap, grid columns), Size (width/height, max-width, min-height), Spacing (all paddings & margins), Typography (size, weight, line-height, letter-spacing, align, transform, decoration, colour), Background & effects (background, opacity, box-shadow), and Border (width, style, colour, radius).
- Sections collapse to keep the panel calm; the first three stay open by default.
- Every property runs through the same cascade resolver (blue/orange/pink source dots) and the same static-CSS output, so all of it is class-first, responsive, and ships only-used CSS. The renderer whitelist and value sanitiser were extended to match — only known properties reach the page and values still cannot break out of a rule.
3.42.0 — Velox Builder: canvas text editing & drag-reorder
- Edit text on the canvas: double-click any text element (heading, text, button) to edit it inline, right where it sits. Enter commits, Escape cancels — and it flows straight into the document like any other change (undoable, saved, published).
- Drag to reorder & renest: drag any layer in the Layers panel to move it — drop above/below a sibling to reorder, or onto a container to nest inside it. Drop indicators show exactly where it will land, and a node moves with its whole subtree.
3.41.0 — Velox Builder: publish flow
- Publish now takes a page live end to end. Hitting Publish saves the latest edits, binds the document to a WordPress page (creating one on first publish), flips it to published, and writes the static CSS — so the front-end renderer immediately serves it.
- The editor reflects live state: a green "Published" button and a View page link straight to the live URL. Reopening a published document restores that state.
- Unpublish reverts the page to draft; visitors fall back to the normal theme. The bound page is tagged so Velox-built pages stay identifiable.
3.40.0 — Velox Builder: front-end rendering
- Saved Velox Builder pages now render on the live site. When a page is bound to a published builder document, Velox outputs its own standalone document — clean semantic HTML, no theme wrapper — via template_include.
- Only-used CSS, as a static file: the page CSS is compiled from the document and written to uploads/velox/builder/doc-{id}.css, content-hashed for cache-busting, and rewritten on every save. If the uploads dir is not writable it falls back to a single inline style block. Either way, only the CSS the page actually uses ships — keeping Core Web Vitals green.
- The PHP renderer produces byte-for-byte the same HTML and CSS (including responsive media queries) that the editor shows, so what you build is exactly what visitors get. Only known CSS properties reach the output and all values are sanitised, so the document model can never inject arbitrary CSS.
3.39.0 — Velox Builder: insert & save
- Add elements: the Add button (top bar and layers panel) now opens a picker — Section, Div, Heading, Text, Button, Image, Columns — and inserts into the current container or after the selection. New elements render on the canvas immediately and seed a starter class.
- Duplicate & delete: every selected element has duplicate and delete actions in the inspector header (Delete/Backspace works too); both are fully undoable.
- Save & load: documents persist to the database. Save (button or ⌘S) writes the full document — tree, classes and content — and the editor reopens it on the same route. Save state is shown live in the top bar.
3.38.0 — Velox Builder: the editing engine
- The Velox Builder editor is now live and functional. Opening the editor mounts a real three-pane workspace — layers spine, live canvas, and a class-first inspector — driven by a central store.
- Live styling: changing a value in the inspector regenerates and injects CSS into the canvas instantly (no reload), the way a modern builder should feel.
- Class-first cascade: the inspector computes where each style comes from — set on the active class (blue), inherited from a base/combo/wider breakpoint (orange), or an element-only override (pink) — matching Webflow-style resolution. Switching the active class re-points every indicator live.
- Responsive: per-breakpoint editing (Desktop / Tablet ≤991 / Mobile ≤767) writes real media queries, desktop-first.
- Undo/redo across the whole document. Element insertion, persistence (save/load) and front-end rendering are the next passes.
3.37.0 — Velox Builder (foundation)
- New opt-in module: Velox Builder, a clean class-first visual page builder. This release lays the foundation — enable it under Utilities and a dedicated "Velox Builder" section appears in the menu (Overview, Templates, Reusables, Classes, Global styles, Fonts & icons, Settings), and the full-screen editor opens on its own route with no WordPress chrome.
- The builder renders its own standalone document and is being built to ship only the CSS each page actually uses, keeping Core Web Vitals green. The editing engine and front-end rendering land in the next releases.
3.36.0 — Media Editor: choose how many images to show
- The Media Editor (Alt text & titles) now has a "Show" control: pick 20, 50, 100, or All, or type a custom number. "All" loads every image in the library on one page instead of the old fixed 40-per-page cap.
- Fixed: search on the Media Editor page was sending the wrong parameter name and being ignored — it now filters correctly.
3.35.0 — Google Reviews: Oxygen builder element
- Added a "Velox Reviews" element to the Oxygen builder. Drop it on a page, pick a Connection and a Preset from two dropdowns, and it renders your reviews live in the builder — the same output as the shortcode, so styling stays driven by the preset (one source of truth).
- The integration is defensive: it only loads inside Oxygen, and if the Oxygen element API differs on your version it degrades gracefully rather than breaking the builder — the [velox_reviews] shortcode always remains as a fallback.
3.34.0 — Google Reviews utility
- New utility: Google Reviews. Show your Google reviews on the front end as a styleable slider or static grid.
- Connect via Featurable (free, caches many reviews) or the Google Places API (official, max 5). Every connection must be named before it can be saved.
- Build reusable design presets (slider or static grid) with full control: number of reviews, minimum rating, columns, slides per breakpoint, autoplay + speed, card background/radius/padding/gap/shadow, text/meta/star colours, name/text/avatar sizes, and toggles for avatar, date and stars.
- Embed anywhere with a shortcode: [velox_reviews connection="…" preset="…"]. Reviews are cached for 6 hours so page loads never hit the API.
- Note: an Oxygen editor tab for placing reviews visually is coming in a follow-up; for now use the shortcode.
3.33.0 — Bulk SEO actions in the Posts/Pages lists
- Select any number of posts or pages and apply a Velox SEO change to all of them at once from the native Bulk Actions dropdown: set Noindex / Index, set Nofollow / Follow, and exclude from / include in the sitemap. A confirmation notice reports how many items changed, and the sitemap is rebuilt automatically after a bulk sitemap change.
3.32.0 — Webmaster verification + settings import/export
- New SEO panel: Webmaster verification. Add site-verification tags for Google Search Console, Bing, Baidu, Yandex, Pinterest and Norton Safe Web. Paste either the bare token or the full tag the provider gives you — Velox extracts the token and outputs a clean tag in your on every page.
- New SEO panel: Import / Export settings. Export all your Velox settings to a JSON file and import it on another site to replicate a setup in one go. Imports are whitelisted against known settings and type-checked, so a stale or hand-edited file can’t inject junk.
3.31.0 — Resize fix, risky-row spacing, builder-aware frontend bar, sitemap toggle, full dashboard catalog
- Resizable SEO sidebar: the content inside now stretches to fill the new width instead of staying pinned at ~280px (no more empty gap).
- Performance risky mode: fields and toggles no longer sit flush on the yellow warning line — added proper padding so nothing overlaps it.
- Frontend admin tools now hide while you are editing a page in ANY builder (Oxygen, Bricks, Elementor, Divi, Beaver, Brizy, WPBakery, Cornerstone/Pro, Fusion/Avada, Thrive, Zion, Breakdance) and in the customizer preview.
- Posts/Pages list: the Index column is now "Index, Links & Sitemap" with a third toggle to include/exclude a page from the sitemap right from the list (blue "Included" / red "Excluded"), saved instantly and the sitemap rebuilt on the spot. The separate Sitemap column was merged into this.
- Dashboard "Everything in Velox" catalog now shows every utility — including Error Logger, Frontend Tools and PageSpeed — and displays switched-off utilities dimmed with an "Off" tag instead of hiding them.
3.30.0 — Editable Index & Links column, resizable SEO sidebar, sitemap independent of noindex
- The "Index" column in the Posts/Pages list is now "Index & Links" and is clickable: toggle Index/Noindex and Follow/Nofollow straight from the list, saved instantly, badges update live.
- The Velox SEO panel in the page editor is now horizontally resizable — drag its left edge to make it wider or narrower; the width is remembered per browser.
- Sitemap inclusion is now controlled ONLY by the "Exclude from sitemap" toggle. noindex / nofollow no longer affect whether a page is in the sitemap — a noindex page stays in the sitemap unless explicitly excluded. The sitemap column reflects this (a noindex page shows "In sitemap").
3.29.0 — More SEO columns in the Posts/Pages lists
- Added three columns and a length indicator to the Posts/Pages list (all shown only when the SEO module is on, toggled from Screen Options like the others):
- Focus keyword — shows each page’s focus keyword (or "— none —").
- Index — an Index / Noindex badge so you can spot pages accidentally hidden from search at a glance.
- Sitemap — In sitemap / Excluded / Not listed (honest: a noindex page shows "Not listed" since it never reaches the sitemap).
- Length badges on the SEO Title and Description columns: a colour-coded character count (green = good length, orange = short/long, red = way off) so bad-length meta stands out. Titles target 30–60 chars, descriptions 120–160.
- The three new columns are display-only; the SEO Title and Description remain click-to-edit inline.
3.28.1 — Sitemap updates instantly when you exclude/include a page
- Ticking "Exclude from sitemap" on a page now removes it from the sitemap immediately on save, and unticking adds it back — no manual Regenerate click needed. The bug: the sitemap was being rebuilt at the same moment the exclude value was written (same save_post priority), so it used the old value and lagged one save behind. The rebuild now runs late (priority 99), after every panel has saved its meta, so it always reflects the final state.
- Removed a now-redundant early sitemap rebuild that regenerated with stale values.
3.28.0 — "Force-include all pages" sitemap repair
- New button in SEO → XML sitemap: "Force-include all pages". If your sitemap only shows the homepage, this clears any leftover sitemap_exclude / noindex flags from every published page and post (including stuck maintenance-mode markers), switches the sitemap post types on, and regenerates. It reports how many hidden flags it cleared and how many URLs ended up in the sitemap.
- Hardened the sitemap query with suppress_filters + ignore_sticky_posts so another plugin's query filters can no longer accidentally empty it.
3.27.0 — "Exclude from sitemap" moved to the Velox page panel + maintenance safety
- The "Exclude this page from the sitemap" checkbox now lives in the Velox panel in the page editor (with the per-page optimization overrides), and has been removed from the SEO panel so there is only one control writing the flag — no more conflicting saves. The SEO panel still shows an "In sitemap / Not in sitemap" status indicator.
- Fixed the root cause of "sitemap only contains the homepage": Velox maintenance mode noindexes all pages while the site is under construction, and toggling maintenance off from the frontend quick-panel did not release them, leaving pages stuck noindexed and out of the sitemap. Turning maintenance off from the quick-panel now automatically releases every page it had hidden. (The Maintenance page still offers the deliberate keep/release choice.)
3.26.0 — SEO title & description columns in Posts/Pages lists
- The Posts and Pages list tables now show "SEO Title" and "SEO Description" columns (only when the SEO module is on). Toggle them from Screen Options ("Ansicht anpassen") like any column. Empty values show a clear "— add —" placeholder so you can see at a glance what still needs writing.
- Edit them two ways without opening each page: WordPress Quick Edit (the SEO fields are added there and pre-filled), or click a cell to edit it inline and save instantly (Enter to save, Esc to cancel; Ctrl/Cmd+Enter for the description).
- Also folds in the frontend admin bar fixes: the panel now renders reliably regardless of script load order, and the admin-bar toggle reloads so the page correctly reclaims/re-adds the reserved space and re-activates cleanly.
3.25.0 — Frontend admin tools (quick panel)
- New utility: a small arrow pinned to the bottom-left of the FRONT END, visible to admins only. Click it to open a quick-action panel and click again (or Esc / click away) to hide it.
- Panel actions: toggle the WP admin bar on/off (remembered per admin), purge the Velox cache, toggle maintenance mode, edit this page, open the Oxygen editor and Oxygen settings (shown only when Oxygen is active), open WordPress settings, and "View as visitor" which opens the current page rendered as a logged-out guest in a new tab (a signed guest render — it never touches your real login session).
- It is its own on/off utility (Utilities → Frontend admin tools), off by default.
3.24.4 — Fix "meta value could not be updated" when saving an unchanged SEO flag
- Publishing a page (typically a freshly-duplicated noindex/nofollow one) failed with the _velox_seo_noindex database error on the FIRST save when the flag was left as-is. Cause: when the value the editor sends already equals what is stored, WordPress's update_metadata() returns false (nothing changed), and the REST layer reports that as a database error. Toggling the flag made it a real change, which is why switching to index/follow and back "fixed" it. Two fixes: (1) duplicated pages now store the SEO flags in canonical boolean form, and (2) an update_post_metadata guard treats an unchanged flag save as success so the publish always goes through.
3.24.3 — Fix Duplicate not copying page-builder content
- Duplicating a page built with Elementor, Oxygen, Bricks, WPBakery or similar produced a blank copy. The meta-copy step ran maybe_unserialize() on each value before add_post_meta(), which stripped the escaped slashes out of builder JSON blobs (e.g. Elementor's _elementor_data) and corrupted them. Meta values are now copied raw with correct slashing, so PHP-serialized arrays AND builder JSON round-trip byte-for-byte. Gutenberg/classic pages were unaffected (their content lives in post_content, which was always copied correctly).
3.24.2 — Properly fix SEO flag save error (boolean meta)
- The 3.24.1 string-coercion approach did not fully fix the "Der Metawert von _velox_seo_noindex konnte in der Datenbank nicht aktualisiert werden" publish error. Root cause: the noindex / nofollow / sitemap-exclude toggles were registered as string meta, but the block editor and duplicate plugins send real booleans, and WordPress's REST round-trip comparison mismatched string vs boolean. These three flags are now registered as proper boolean meta (the standard Gutenberg toggle pattern) and the editor sends/reads real booleans. Existing '1'/'0' values still read correctly, so no data migration is needed.
3.24.1 — Fix "meta value could not be updated" on SEO flags
- Publishing a page (often a duplicated one) could fail with "Der Metawert von _velox_seo_noindex konnte in der Datenbank nicht aktualisiert werden." The noindex / nofollow / sitemap-exclude flags are registered as string meta, but a duplicate plugin or REST client can send a real boolean, which the strict schema rejected. Their sanitize now coerces any value (boolean, int, '1'/'0', 'true'/'false', 'on'/'yes') to a clean '1'/'0', so the save always succeeds. No data migration needed — existing values keep working.
3.24.0 — Import All-in-One WP Migration (.wpress) backups
- Backup & Restore now accepts All-in-One WP Migration .wpress files alongside Velox’s own .sql/.zip. Velox unpacks the .wpress container, extracts the database and wp-content files, and — the important part — rewrites the old site’s URL to this domain in a serialization-safe way (PHP-serialized option/widget values keep their correct byte lengths, so nothing corrupts). The result registers as a normal Velox backup and restores through the same path, with a safety backup taken first.
- Large files are streamed in chunks during unpack, so memory stays flat.
3.23.0 — AI crawler control & llms.txt (SEO)
- New AI crawlers panel in SEO: allow or block AI bots by what they do — training crawlers (GPTBot, ClaudeBot, CCBot, Google-Extended…), AI-search crawlers (OAI-SearchBot, PerplexityBot…) and on-demand fetchers (ChatGPT-User, Perplexity-User…). Your choices are added to robots.txt automatically, per group, with no hand-editing. Nothing is added when everything is allowed, so robots.txt stays clean.
- New llms.txt: an optional virtual /llms.txt, auto-generated from your pages (title, tagline, key pages and posts as Markdown links) and fully editable. It is served like the virtual robots.txt. Note: Google has said it ignores llms.txt, so this is for the AI systems that do read it, not a Google-ranking boost.
3.22.0 — Email log now captures every email, plus failure alerts
- The Mail & forms send log now records EVERY email your site sends — password resets, new-user notices, WooCommerce receipts and anything other plugins send — not just Velox contact-form and test emails. If an email goes missing, you can finally see whether it was even attempted and whether it failed.
- New "Alert me when a send fails" switch: emails the site admin when an outgoing email fails (rate-limited to once per hour so a burst can’t flood your inbox). The alert itself is never logged or looped.
3.21.1 — Error Logger in the sidebar & off-canvas
- The Error Logger now shows in the Velox sidebar and off-canvas menu under System once switched on, matching every other utility — it was reachable only from the Utilities hub before.
3.21.0 — Error Logger, and SEO moves into Utilities
- New Error Logger utility: catches every PHP error, fatal and failed API/HTTP request as it happens, grouped into clean accordions by type (fatal / PHP warnings / API & HTTP). Each error shows where it happened, how often, and — in plain English — what it means and how to fix it, from a built-in knowledge base of common WordPress issues. Switch it on under Utilities; clear all or dismiss errors one at a time. Appears in the Velox sidebar and off-canvas menu under System when switched on.
- PageSpeed is now a switch under Utilities like every other tool — turn it on or off whenever you want, and it appears in the sidebar under Essentials only when enabled. Its page is unchanged.
3.20.0 — Full German coverage across the entire plugin (PHP + JavaScript)
- Completed German translation of everything the user sees. Every PHP admin string (1035) and every JavaScript-rendered string (723) now has a German entry — 1727 total.
- Wrapped all the JavaScript UI that a PHP filter can never reach: toasts, the Custom Fields editor and field types, the Mail/SMTP setup, the block-editor SEO panel, the media picker, the snippets manager, and the dashboard. Each admin script now shares one translation dictionary through a small helper.
- Added bin/check-i18n.php, a regression guard that scans all PHP and JS for any translatable string missing a German entry, so future features can be checked before shipping.
- Fixed two translation-wrapping bugs found during the sweep: a local variable that shadowed the translate helper, and a value used in a comparison that must not be translated.
3.19.4 — Translate the "Everything in Velox" cards
- The catalog grid tiles on the dashboard (Custom Fields / Field groups, Media Editor / Alt text & files, etc.) were rendered from a hardcoded array with plain escaping, so both the names and descriptions stayed English. Both are now wrapped and translated.
3.19.3 — Translate the sidebar, dashboard stats and action messages
- The sidebar navigation labels and section headings (Utilities, Media Editor, Essentials, etc.) were rendered from hardcoded arrays and never translated — now wrapped and translated.
- Dashboard stat lines (grade, "N views", "vs last week", "updated X ago", "N of M optimizations on", "/ N pages", the intro subtitle) were bare English literals — now wrapped and translated.
- Added a JavaScript translation bridge (VELOX.i18n + a t() helper) and routed the action/confirmation toast messages through it, so those now appear in German too.
3.19.2 — Language actually applies everywhere + clearer switcher
- Fixed the translation only partially applying (most of the UI stayed English). The gettext filter was caching an early "no translation" decision made before the admin language setting was readable, which locked the whole page into English. It now resolves the chosen language only once it is actually available, so the entire admin UI switches to German.
- Removed the confusing "Follow WordPress" option — the switcher is now simply English / Deutsch.
3.19.1 — Restore clean pill look on the switcher
- Removed the visible chevron from the language switcher button so it keeps the clean globe + label pill look. The menu still opens on click, with the checkmark on the active language.
3.19.0 — Working English/German switcher, full German translation
- Rebuilt language switching from scratch. Instead of WordPress .mo files + locale (which never reliably applied because of just-in-time loading and caching), Velox now swaps strings directly through the gettext filter using a shipped PHP dictionary. This actually works, is scoped to Velox only (never touches the rest of wp-admin), and applies instantly on reload.
- Added German back with a complete dictionary covering every translatable string in the plugin admin UI — 1031 entries, nothing left out.
- New custom dropdown switcher (globe + current language + chevron, with a checkmark menu) that replaces the native select, so WordPress admin styling can no longer break its appearance.
3.18.3 — Language indicator is now a clean static pill
- Removed the dropdown entirely (it only had English anyway, and WordPress kept rendering its own select box + arrow inside the pill). The top-right indicator is now a simple static pill: globe icon + "English". The picker returns properly when more languages are re-added.
3.18.2 — Fix double-chevron on language switcher
- The switcher was showing two dropdown arrows (the custom chevron plus WordPress’s native select arrow) and splitting into two chunks. Forced appearance:none and removed the native background arrow so it renders as one clean pill.
3.18.1 — Reset to English + modern language switcher
- Removed all translation files and trimmed the switcher to English only, as a clean baseline while the language-switching mechanism is reworked.
- Redesigned the language switcher as a modern pill button that matches the Velox theme: white surface, hairline border, accent globe icon, custom chevron, and a subtle hover lift.
3.18.0 — Fixed 100+ untranslated strings across the whole admin
- The original translation pass missed ~103 hardcoded English strings (buttons, card titles, panel headings, tooltips, the cookie-banner builder, PageSpeed labels) — so things like "Purge caches", "Edit", "Recommendations", "Mobile/Desktop" stayed English in every language. Every one of those is now wrapped and translated.
- Regenerated the translation template with xgettext (canonical extraction) and rebuilt all 8 completed languages (German, Spanish, French, Italian, Portuguese, Dutch, Polish, Japanese) to 100% coverage of the human-readable admin UI.
- Turkish remains an English-fallback scaffold and will be completed next.
3.17.3 — Language switcher actually applies now
- Fixed the chosen language never taking effect (UI stayed English). WordPress 6.5+ loads translations just-in-time using the site locale, which bypassed the plugin_locale filter. Velox now explicitly unloads and force-loads the selected .mo up front in wp-admin, so the picked language is what renders.
3.17.2 — Language switcher background fix
- Removed the full-width white bar behind the language switcher. It was caused by reusing an existing .velox-topbar class that had its own background; renamed to .velox-langbar so the switcher now sits transparently in the top-right with no bar behind it.
3.17.1 — Language switcher scope + style fix
- Fixed the switcher changing ALL of WordPress admin instead of just Velox. Removed the determine_locale filter (which has no text domain and affected the whole admin); the language is now applied only through the domain-scoped plugin_locale filter, so it changes Velox screens and nothing else.
- Made the top-bar language switcher smaller and removed its background and bord