Changelog

Release Notes

Every feature, every improvement, every fix since v1.0.0.

Page 8 of 24 - 710 releases, newest first.

v2.75.8

Homepage, card and sidebar fixes across all themes

  • Post cards lost their title, date and meta as soon as the post had a featured image - the image escaped its frame and pushed the text out of the card. Cards now keep a fixed 16:10 image frame whether or not there is an image.
  • The homepage headline grid always had one empty slot: it reserves five cards but only four were fetched. It now fills all five, falling back to the newest posts when there aren't enough popular ones - so the grid is never patchy on a new site.
  • Homepage category blocks only ever showed the alphabetically first categories, so sites with many categories saw the same two blocks no matter how much they published. Blocks (and the fallback menu on some themes) now pick categories that actually have posts, most recently updated first.
  • Turning every sidebar widget off did nothing: an internal fallback switched them all back on. Your selection is now final - an empty sidebar stays empty. Fixed on six themes.
  • The "How this content was made" box looked like a grey block pasted onto the page: it borrowed the theme's serif heading font and letter-spaced capitals. It now follows the theme palette with an accent bar, an icon and a readable label - on every theme.
  • Share buttons under posts were washed out and hard to read; they now sit on a neutral surface with full-contrast icons and fill with the network's colour on hover.
  • Very tall featured images no longer stretch the post page out of shape, and the editor now suggests the right size (1200 × 675).
  • The old Twitter bird was replaced with the X logo everywhere it still appeared, including the footer builder's icon set.
v2.75.7

Layout saves no longer overwrite each other

  • Saving the customizer stores the layout of every page (homepage, post page, sidebar…) in one go - and those writes were silently overwriting each other, so homepage section changes (turning the hero or category band off) were lost and the switches snapped back on. Each save now builds on the previous one within the same request; section toggles finally stick everywhere.
v2.75.6

Two new layout section types

  • The layout engine's section dictionary gained two generic types that any theme (including customized forks) can adopt: "Dual Spotlight" - two wide image cards side by side - and "All Posts" - a paginated full-archive grid with a posts-per-page setting.
v2.75.5

Section toggles that always work, missing customizer tabs, footer icon outlines

  • Homepage and post-page section toggles (hero, category band, widgets…) are now real form controls: they save correctly even if a browser extension, an old browser or a script error breaks the page's JavaScript. Previously the layout travelled only through a script-filled hidden field, so a broken script made the save silently skip and toggles snapped back on.
  • Themes that support layout sections but don't declare a matching customizer tab now get that tab automatically - for example the Sidebar tab appears on themes that were missing it, so widget stacks can be reordered and toggled everywhere.
  • Footer Builder social icons rendered as solid blobs: a stylesheet rule filled the outline-style icon set. Icons now keep their stroke outlines in both light and dark mode.
v2.75.4

Media uploads with broken ICC profiles, footer social selection

  • PNG images exported from Photoshop or Canva with a broken ICC color profile (the classic "iCCP: known incorrect sRGB profile" warning) failed to upload to the Media Library. These images are perfectly loadable - harmless decoder warnings are now tolerated during image processing and the upload completes normally.
  • In the Footer Builder, toggling social networks on or off did not stick: a script error silently swallowed checkbox changes, so the previous selection came back after saving. Selections now save exactly as chosen.
v2.75.3

Self-healing after updates on shared hosting

  • On some shared hosting stacks (notably LiteSpeed with aggressive OPcache settings) a core update could leave the server serving stale compiled code, breaking the site with a 500 error until PHP was restarted. The updater now invalidates the compiled-code cache file by file right after copying - before migrations run - and a new early watchdog detects this exact failure on any later request, clears the cache itself and auto-refreshes the visitor's page within seconds. No manual PHP restart needed anymore.
v2.75.2

Customizer save reliability fixes

  • Tracking ID fields (GA4, Google Tag Manager, AdSense, Facebook Pixel) now accept a pasted full snippet: the ID is extracted automatically on save, so analytics starts working even if you paste the whole code block.
  • Saving from Appearance → Customize no longer erases your Footer Builder configuration. The two screens stored data under the same key, so every customizer save silently reset the footer to the theme default.
  • Homepage section toggles (hero, category band, etc.) now survive strict hosting firewalls: the layout payload is sent in an envelope some shared-hosting WAFs used to strip, which made the toggle snap back to "on" after saving.
  • Saving the customizer or the Footer Builder now also refreshes the full-page cache, so visual changes appear on the site immediately.
  • Media Library uploads now show the actual reason when a file fails, instead of a bare error mark - including server-side blocks and configuration limits.
v2.75.1

Paid licenses can remove the footer credit

  • "Powered by jekcms" is now optional on paid licenses: a new switch under Settings → General → Branding removes the credit line from your site footer. The copyright line and legal links stay untouched. On the free edition the switch stays locked and the credit remains - removing it is a paid-license benefit.
  • Saving settings now also refreshes the full-page cache, so site-wide changes (branding, footer, reading options) appear immediately instead of waiting for the cache to expire.
v2.75.0

Layout engine phase 4: live preview and per-device sections

  • Live layout preview: a new button next to every section group in the theme customizer opens your real site in a preview window and applies your unsaved changes to it as you work - reorder a section or flip a toggle and the preview refreshes by itself. Desktop, tablet and mobile width buttons are built in. Drafts live only in your admin session: visitors keep seeing the saved layout until you press Save, and the preview never enters the page cache.
  • Per-device section visibility: every layout section can now be shown on all devices, desktop only, or mobile only - a heavy hero for desktop, a compact strip for phones. Hiding is pure CSS media query, so nothing shifts on the devices where the section does show, and the section cards wear a small badge so you always see which ones are device-limited.
v2.74.1

Audit follow-up: social queue repairs its own schema

  • Social auto-posting on installations carrying the old queue layout no longer loses the remote post ID and publish timestamps: when the queue table lacks the newer columns, the publisher now adds them on the spot and retries, instead of logging a database error on every publish. Posts were always delivered - what was lost was the permalink back to them; that record is now kept.
v2.74.0

Editorial approval flow: pending → review → approve

  • Optional editorial approval for multi-author sites: turn on "Author posts require editor approval" in Settings and authors can no longer publish or schedule directly - their save honestly lands as "Pending review", and editors or admins approve it with one click ("Approve & Publish" / "Send back to draft") right from the Posts list. Every approval records who approved and when in the post's audit trail, editing an already-live post never unpublishes it, and automated pipelines keep their own quality gate. Off by default - single-author sites notice nothing.
v2.73.0

Media folders: organize the library without touching URLs

  • Media library folders: create, rename and delete folders from a new folder bar above the grid, filter the library by folder (including an "Unfiled" view with live counts), move files in bulk via the bulk-actions menu or one by one from the file's detail page, and have new uploads land in whichever folder is open. Deleting a folder never deletes its files - they simply return to Unfiled - and moving files never changes their URLs, so nothing published breaks. Existing installations pick up the schema automatically; no migration step needed.
v2.72.3

Documentation: migrating from Ghost, Substack, Medium and Blogger

  • New documentation page "Migrating from Ghost, Substack, Medium & Blogger" (in English and Turkish): which export file each platform gives you, exactly what each importer carries across - publish states, dates, tags, paid/member visibility, image localization - and, just as importantly, what does not come across (comments, authors, subscriber lists) plus how to handle redirects afterwards. The offline documentation bundled with the installation package includes it too.
v2.72.2

Audit follow-up: quieter logs and a cache race fix

  • Error logs got quieter and more trustworthy: the contact-form's schema self-repair no longer probes by triggering database errors (it now checks columns directly), and deleting an already-deleted cache entry no longer logs a warning when two requests race. Version stamps across managed copies are also kept in sync automatically.
v2.72.1

Audit hardening: recipe filters, reaction schema, webhook brakes

  • Membership payment bridge (released earlier today) hardened after an adversarial pass: unverified webhook requests can no longer grow the database or log files (flood brake), the delivery log rotates itself, and Stripe checkouts completed with a free trial or a 100% discount now correctly open Premium.
  • Recipes theme: the archive's time and difficulty filters (and the "quickest" sort) now actually work - they queried post columns that never existed, so every filtered visit logged a database error and returned nothing. Filters now read the Recipe plugin's real data.
  • Post reactions: installations carrying the old reaction table layout repair themselves on first use - previously every post view on such a site logged a database error and reaction counts stayed frozen. Existing reactions are preserved during the repair.
  • Recipes theme: posts without recipe data no longer show invented "15 min prep · 30 min cook · 4 servings · easy" badges - the badges now read the Recipe plugin's real values and simply stay hidden when there are none.
v2.72.0

Membership payment bridge: automatic Premium via Stripe / Lemon Squeezy webhooks

  • Paid memberships no longer need manual bookkeeping: connect your own Stripe or Lemon Squeezy account's webhook to your site and members are marked Premium the moment their payment completes - and downgraded automatically on full refunds and subscription expiry. Matching uses the member's registration e-mail, and the provider's customer reference is remembered so subscription-end events match even when they carry no e-mail.
  • Set-up lives in Settings under the membership section: paste the signing secret, copy the ready-made webhook address, and watch the "last webhook" line confirm deliveries. Secrets are stored encrypted, never echoed back into the form, and every notification is verified against its signature - unsigned or tampered requests are rejected. Money still flows entirely through your own provider account: jekcms never sees card data.
v2.71.0

Migrate from Medium and Blogger + new Security & Trust pages

  • Migrate from Medium: upload the ZIP from Medium's "Download your information" as-is and your stories arrive with their full body, subtitle (kept as the excerpt), publish date and URL slug - drafts stay drafts, and re-running the import safely skips what is already there. With image localization on, Medium-hosted images are pulled into your media library and converted to AVIF/WebP.
  • Migrate from Blogger: upload the XML backup from Blogger's "Back up content" (a Google Takeout ZIP works too) and posts, pages and drafts import with their labels mapped to tags, publish dates and URL slugs preserved. Settings and comment entries in the backup are recognized and left out instead of turning into broken posts.
  • jekcms.com now has a Security page listing the concrete protections in the product - two-factor sign-in, Argon2id password hashing, encrypted stored secrets, signed webhooks, update integrity checks - plus a responsible-disclosure channel, and a Trust Center explaining data ownership, the perpetual license model and our honesty principles. Both pages exist in English and Turkish.
  • The API reference now documents all five outgoing webhook events - new-comment and new-member notifications had shipped earlier but were missing from the docs, so integrations could not discover them.
v2.70.3

SEO core: multilingual sitemap discovery + consistency fixes

  • Multilingual sites are now fully discoverable: the posts sitemap lists published posts in EVERY public language (previously only the site language, which left translated posts - and any post in another language without a pair - invisible to crawlers), and translation pairs are announced with xhtml:link hreflang alternates including x-default, the format Google recommends.
  • Category and tag sitemap entries no longer count future-dated scheduled-style posts: that mismatch could announce an archive in the sitemap while the page itself said noindex (a "submitted but noindex" contradiction in Search Console) and could even emit a future lastmod date.
  • A parent category whose posts all live in child categories is now announced in the sitemap index consistently with the category sitemap itself.
  • Posts embedding YouTube via iframe embed URLs now get VideoObject structured data on the page, matching what the video sitemap already announced.
  • /feed.xml and /rss.xml now 301-redirect to the canonical /feed instead of serving duplicate copies of the feed.
  • The installer's sample welcome post is now marked noindex - identical text across thousands of installs should not enter search indexes, and deleting it leaves no index residue.
v2.70.2

First-install experience polish + plugin management fix

  • New sites start friendlier: the installer now localizes the default category to your site language (Genel/General instead of "Uncategorized") and seeds an editable welcome post with first-step tips - so the homepage is alive from minute one instead of empty. WordPress migrations remove the sample post automatically once real content arrives.
  • /rss now 301-redirects to the canonical /feed, so readers and tools typing the WordPress-style address no longer hit a 404.
  • Activating or deactivating a plugin from the admin panel works again: a token-name mismatch introduced by an earlier security hardening made every plugin toggle fail with "Invalid security token" on fresh installs. The page now validates the token explicitly, and the shared helper accepts both token field names so the same class of mismatch cannot recur.
v2.70.1

Ad A/B, RUM and Critical CSS: measurement accuracy and hardening

  • Ad A/B click counting is now much more accurate: starting a scroll gesture on an ad box no longer registers as a click on touch devices, switching tabs while hovering an ad is no longer mistaken for an ad click, and an empty ad container (ad blocker or unfilled ad) no longer counts as an impression - so CTR comparisons between variants reflect real behavior.
  • The Ad A/B panel no longer shows "Test ACTIVE" when the ad slot itself is disabled (which silently produced zero data); it now shows a clear "slot disabled" warning. Variant changes also flush the full-page cache immediately, so old variants stop being served the moment you edit the test.
  • RUM now records a perfect CLS score of 0 correctly. Previously only visits with some layout shift were counted, which made the CLS p75 look worse than reality; browsers without layout-shift support are recorded as "no data" instead of a fake perfect score.
  • Posts whose slug merely starts with "ara", "api" or "admin" (e.g. /araba-bakimi, /api-design) are no longer misclassified in RUM page types or silently excluded from analytics collection.
  • Critical CSS extraction keeps more valid selectors: :is()/:not() lists with commas, escaped class names and non-ASCII class names are no longer dropped (which could cause a brief unstyled flash), a stylesheet link inside an HTML comment can no longer confuse the transform, and a single unusually small page can no longer permanently disable critical CSS for the whole site.
v2.70.0

Critical CSS: inline above-the-fold styles with async theme stylesheets

  • Pages now render faster: the CSS needed for the visible part of the page is inlined into the document head, and the theme's full stylesheets load asynchronously in the background (with a no-JavaScript fallback). This removes render-blocking CSS from the critical path and improves LCP and FCP.
  • The critical subset is generated automatically per theme from your site's real pages - no configuration, no theme edits, and it refreshes itself whenever the theme's CSS changes. Works on every theme.
  • Built-in safety rails: if the generated subset looks too small or too large, the page is served exactly as before; original stylesheet links are kept in a noscript fallback; and the feature can be switched off from the Performance panel (the RUM p75 numbers there will show you the effect).
v2.69.0

Performance (RUM): real-visitor Core Web Vitals panel

  • A new Performance panel shows how fast your site really is for visitors: LCP, CLS, INP, FCP and TTFB are collected from real page views and reported as 75th-percentile values - the same method Google uses for Core Web Vitals - overall, by device, by page type, and as a "slowest pages" list that tells you exactly where optimization pays off.
  • The collector is a tiny inline script (no external CDN, no cookies) that sends a single measurement as the visitor leaves the page. It respects Do Not Track, skips logged-in users and bots, and works on every theme.
  • Privacy-first by design: only the page path, the metric values and a coarse device class are stored - no IP address, no session, no fingerprint. Collection can be switched off in the panel, and the switch is enforced on the server, not just in the page.
  • Data is kept for 90 days and old rows are cleaned up automatically.
v2.68.0

Ad A/B testing: placement and size variants with impression/click measurement

  • Ad slots can now run A/B tests: define two or more code variants (different sizes, formats or layouts) for any slot under Ads → Ad A/B Testing, with per-variant traffic weights. Each visitor gets a sticky, cookieless variant assignment, so the same person always sees the same variant.
  • Impressions (counted when the ad is at least half visible) and clicks are now measured per variant, with bots filtered out. The panel shows 30-day impressions, clicks and CTR per variant, plus an estimated revenue column driven by a manually entered RPM.
  • The variant is chosen in the browser, so full-page caching keeps working at full speed - the cached HTML is identical for every visitor and no cache page needs to be bypassed for the test.
  • A lightweight standalone beacon endpoint records the events: it accepts only same-site requests, validates that the reported variant belongs to the reported slot, rate-limits per visitor, and stores only a salted daily hash - never the raw IP address.
v2.67.1

Link health checker: SSRF hardening

  • The outbound link-health checker (used by SEO and affiliate link monitoring) now validates the FINAL connection address, not just the originally saved URL: if a link redirects or its DNS resolves to an internal or cloud-metadata address (localhost, 127.x, 169.254.169.254, private ranges, IPv6 loopback/ULA), the probe reports it as unverifiable instead of revealing the internal service's status. This closes a server-side request forgery (SSRF) avenue where a crafted redirect could have been used to probe internal infrastructure.
  • Literal IPv6 URLs (e.g. http://[::1]/) are now correctly recognized and blocked by the safety gate.
v2.67.0

Affiliate + Search Console Insights: reliability hardening

  • Hardened the affiliate link-health monitor against SSRF: a target pointing at an internal or cloud-metadata address (localhost, 169.254.169.254, private ranges) is no longer added to server-side health probing.
  • Search Console Insights no longer shows misleading trends when Google's API partially fails: if any part of a scheduled fetch errors out, the previous snapshot is kept and a retry is scheduled, instead of rebuilding the panel from incomplete data (which could have made every page look like it was rising or falling).
  • Insights comparison windows are now exact 28-day / previous-28-day ranges (ending yesterday, since today's data is always incomplete), so the totals and the per-page changes always agree.
  • Scheduled Search Console fetches now backfill any gap since the last successful run and are protected against overlapping runs, so a slow day or a missed cron no longer leaves holes in the daily trend.
  • Affiliate links keep working when a link is paused: a paused link's existing in-content links and /go/ clicks still resolve (pausing only removes it from new auto-cloaking) - previously a paused link 404'd and its [aff] shortcode vanished from the post.
  • An [aff] shortcode with a slug that no longer exists now preserves your custom anchor text as plain words instead of deleting it from the sentence.
  • Affiliate targets are validated harder on save: over-length URLs (which MySQL would silently truncate) and links that point back at your own /go/ cloak (a redirect loop) are now rejected with a clear error.
v2.66.99

Affiliate + Search Console Insights: polish and fixes

  • Small polish: the Search Console Insights "new" badge is now localized for English sites, the affiliate panel and schema check are lighter (one fewer query per request), and a couple of dead code paths were removed.
  • Affiliate cloak links now use only temporary redirects (302/307): a permanent 301 could be cached indefinitely by browsers and CDNs, which would stop counting clicks and prevent you from repointing a link - the two things the feature is for. Any existing 301 link is served as 302 from now on.
  • Affiliate targets containing control characters (a pasted URL with hidden line breaks) are now rejected on save instead of producing a broken, destination-less redirect.
  • Auto-cloak matching now lowercases only the host, not the path - case-sensitive affiliate paths (e.g. Amazon product IDs) can no longer collide and cloak a link to the wrong destination.
v2.66.98

Affiliate Links: a new revenue channel

  • New "Affiliate Links" plugin to manage affiliate and outbound links in one place - a new revenue channel alongside ads. Each link gets a clean cloaked URL (yoursite.com/go/slug) that records the click server-side (bot-filtered, privacy-safe: no raw IP stored) and redirects to the target, so you can rename, disable or repoint a link without touching any post.
  • Automatic SEO safety: a content filter adds rel="sponsored nofollow noopener" to affiliate links (Google requires "sponsored" for paid links, and the wrong markup can cost you rankings) and can auto-nofollow all other outbound links. It can also auto-cloak any raw link in your content whose destination you've registered - existing posts are covered without editing them.
  • Drop a tracked link anywhere with [aff slug] (uses the link's name as anchor) or [aff slug]custom text[/aff]. Code blocks are left untouched.
  • A dashboard shows clicks per link (human vs bot separated), a 30-day click trend, and link status. Dead affiliate targets surface in the existing SEO → Broken Links checker, so you catch expired offers before they cost you.
v2.66.97

Search Console Insights: data-driven SEO

  • New "Insights" tab in Google Console that turns your real Search Console history into an action list - no more guessing which post to update. It keeps a daily history (previously the panel only showed a live snapshot) and every day highlights: Declining pages (clicks dropped ≥30% - top refresh priority), Striking-distance keywords (ranking 8–20 with high impressions - a small push lands them on page one), Keyword cannibalization (multiple pages competing for the same query), and Rising pages (what's working - make more like them).
  • Each page row links straight to the post editor, so you go from "this is declining" to editing it in one click.
  • The history is fetched automatically once a day in the background; a "Fetch now" button pulls it on demand. Insights keep showing even if the Google connection later expires (your history stays valuable), with a clear "reconnect to keep updating" notice.
  • Built entirely on the existing Google connection - no new setup, no extra permissions. Reuses the same one-click OAuth and encrypted token storage.
v2.66.96

Advanced SEO: second deep pass (contracts + content-torture)

  • On installs without the Advanced SEO plugin (or with it disabled), the SEO Overview page now shows a "More SEO tools" strip linking Heading Fixer, Auto Internal Links, Featured Images, Orphan Content, Year Updater, Slug Repair and the redirect manager - previously those shipped but were unreachable.
  • The auto-linker progress log is now fully bilingual for English admins.
  • The two SEO score engines (editor dial vs SEO panel) now use the same title/description length thresholds, so a post no longer shows two different scores in the two places.
  • Meta text truncation is multibyte-safe (an em-dash at the cut boundary can no longer produce a broken character), and the AI image generator now stores featured images as an uploads-relative path so size variants and AVIF/WebP negotiation work and no dev URL leaks into social cards or the sitemap.
  • The auto-link ledger is no longer age-pruned, so posts linked months ago don't revert to "orphan" and get a duplicate link.
  • The editor's "Canonical URL", "OG Title/Description" and "Twitter Title/Description" fields now actually take effect on the live page - they were saved and shown in the admin preview but no theme ever emitted them, so republished/syndicated posts could not point search engines at the original source and social cards ignored your custom titles.
  • Auto-generated focus keywords are Turkish-correct: a title containing İ (İstanbul, İş…) no longer produces a keyword with an invisible combining character that failed the analyzer's own "keyword in title" check and silently cost score points.
  • The image alt-text fixer no longer corrupts alt values containing a dollar sign (deal/price titles) and no longer stamps the wrong description onto a different image whose filename ends with the same name ("a.jpg" vs "data-a.jpg"); it also stops mistaking a "data-alt" attribute for a real alt.
  • Heading Fixer and Content Optimizer now leave headings inside HTML comments and code samples untouched, so a commented-out heading can no longer skew the fix and code examples are never rewritten.
  • Renaming a post's slug and then renaming it back no longer creates an infinite redirect loop that made the post unreachable (the same loop-hygiene the year tool already had is now in the core rename path and slug-repair tool).
  • SEO CSV import now maps columns by their header names instead of fixed positions, so a file built from the on-screen help no longer writes values into the wrong fields; it enforces the character limits, only touches non-empty cells (an empty cell no longer erases an existing value), validates robots/schema values, recomputes the score, and reports per-row errors.
  • SEO Health Check no longer hides real "missing core file" errors as "could not be measured" when the site can't reach itself, and it no longer pulls the entire post corpus into memory when scanning for numbered lists.
  • Redirect targets keep their query string, and a legacy protocol-relative redirect can no longer become an open redirect on the marketing site.
  • SERP Identity Check reads values containing an apostrophe correctly ("Maggie's Kitchen" no longer reports a false mismatch).
v2.66.95

Advanced SEO panel: deep audit of all 16 tools

  • SEO Health Check is faster and more honest: on hosts where the site cannot reach itself it stops after one connection attempt instead of blocking for a minute, marks the affected checks as "could not be measured" instead of inventing phantom schema errors, and category/author/content-quality counts now use the same visibility rules as the real sitemap.
  • SERP Identity Check never certifies "clean" when the live chain could not be measured, failing checks now show the expected-vs-actual values, and its HTML parsing tolerates attribute order and single quotes (fewer false alarms with custom themes).
  • Generated image alt text is Turkish-aware (İstanbul stays İstanbul), media-library fallbacks no longer keep the file extension, and the alt fixer no longer produces a duplicate alt attribute when the image tag lists alt before src.
  • The SEO tools' heavy statistics scans now run only on the tabs that display them, making the other tabs noticeably faster on large sites.
  • Heading Fixer no longer flattens sub-headings: content starting at H3 keeps its H4/H5 structure when shifted up (previously every heading could end up as H2, which also broke theme-generated tables of contents).
  • "Send All Posts to IndexNow" now submits only publicly visible, indexable posts - member-only, private and noindex posts are excluded from the batch and from the counter.
  • The single-post "Fix" button on the Content SEO tab now fills only the missing meta fields, matching "Fix All" - a hand-written meta title is no longer replaced when only the description was missing.
  • The inline meta editor caps titles and descriptions at the real database budget (70/160 characters), so very long entries save cleanly instead of failing with a generic error.
  • "Ping Sitemap" reports the real result: the retired Google/Bing ping endpoints no longer produce a false green success - the button now submits the sitemap via IndexNow and shows what actually happened.
  • Slug Repair keeps its promise: repaired slugs now create automatic 301 redirects, only genuinely broken slugs are touched by default (hand-tuned slugs stay), and a new opt-in mode regenerates everything from titles when you really want that.
  • Year Updater now also updates the SEO title used in Google results (previously only the on-page heading changed while the search snippet kept the old year), and running it back and forth can no longer create redirect loops.
  • Redirect manager refuses rules that would loop (A→B while B→A exists, or a redirect pointing at itself via the full site URL) - these previously took the page down with an endless redirect.
  • The "fix old URLs" scanner and fixer now share one pattern list built from your own site address, so the banner count and the actual fix always agree (the fixer previously used a stale fixed list and fixed nothing on most sites).
  • Batch scans (strip links, fix URLs) use cursor paging so a row the transform cannot change no longer makes the progress loop run forever.
  • Auto-linker and Orphan Content now handle Turkish İ/ı correctly - titles containing İ (İstanbul, İş...) can finally receive automatic internal links - and only publicly visible posts are suggested or linked.
  • Content Optimizer preserves code blocks: cleanup no longer collapses indentation inside pre/code samples, keeps intentionally empty anchor/placeholder elements, and "reset" no longer deletes the content backups that make revert possible.
  • Several admin listing screens in the SEO tools now escape post titles and scan results before rendering, and a few tool endpoints that write content are now administrator-only.

Get your site live

The setup wizard gets a site live in about 30 minutes. See the prices and the free edition.

View Pricing
  • Setup and live in 30 minutes
  • 15 ready-made themes
  • AVIF/WebP image optimization
  • Automatic SEO - Sitemap, Schema.org
  • Cookieless built-in analytics (ZeroTrack)

Be the first to know

New features, release notes and CMS guides. We send a couple of emails a month.