Skip to content

BizzCMS 0.2.8

Choose a tag to compare

@idubravac idubravac released this 10 Oct 16:58
· 82 commits to main since this release

Added

  • Directory plugin in the admin menu: directoryPlugin() adds Directory (companies), booking requests and listing claims to the plugin menu.
  • Directory plugin: share buttons on company profiles through the new share setting (e.g. the Social Share plugin in the page language); wrapper .dir-share.
  • Languages plugin (src/plugins/languages.ts, docs/languages.md): a site in several languages, each on its own addresses (/, /en/, /de/…). Translations are pages with a Translation of field. Every public page gets <html lang>, hreflang + x-default, og:locale and a language switcher in [data-bizz-languages].
  • SEO › General › Site language: RSS <language> and feed texts in the site language (English, Croatian, German), inLanguage on WebSite and WebPage; seoHead takes an optional page language.
  • Cookie bar: a link with data-cookie-policy on the page (e.g. the footer link in the page language) is used as the policy link. Cookie bar texts in German. Share buttons in English, Croatian and German (shareBar(…, lang)). setSponsoredLabels() for the "Sponsored" labels.

Fixed

  • Sign-in: one message at a time in one style. A failed sign-in showed upstream's old red box under the page alert; it now looks like the alert (icon, colours) and replaces it. The "Create one here" link is gone (registration is closed).
  • RSS feeds always said <language>en</language> and "The post … appeared first on …", also on Croatian sites.

Changed

  • Cookie bar in the Cookiebot style (Google Analytics plugin): full-width bar with Necessary / Preferences / Statistics / Marketing switches, details, and Allow all · Allow selection · Use necessary cookies only; English and Croatian built in (page language). Google Consent Mode advanced: gtag.js is on every page, cookies and identifiers only after Statistics is allowed (the current page is counted then, once). New settings: Banner title, Button colour, Button text colour.

Fixed

  • Page titles no longer end in the host name ("… | localhost") when SEO › General › Site name is empty: the company name is used, else no suffix.

Fixed

  • Google Analytics (consent): Accept after Reject on the same page now grants analytics again (it was ignored once gtag.js had loaded). The snippet guards against running twice, so GA4 is configured once per page and sends one page_view. Any other gtag.js tag on a public page (a template or pasted HTML) is removed while the plugin is active, so the plugin is the only GA4 integration and nothing loads before consent.

Fixed

  • /sitemap_index.xml, /sitemap-index.xml, /wp-sitemap.xml, /sitemap1.xml and /sitemap.xml.gz (names from WordPress/Yoast that crawlers and checkers try) 301 to /sitemap.xml instead of 404.

Added

  • Directory plugin: Keywords field per company (search matches it) and Online check fields (result, date, notes) for staff.
  • Directory plugin (src/plugins/directory/, docs/directory.md): a company directory with filters, category and city pages, company profiles with a gallery, date requests for Premium companies, and a company portal (sign up, add, edit and claim a profile, photos, requests). Addresses, query words, categories, regions, wording and layout are set per site with setDirectory(); English by default. Visitor accounts for public areas (sign in, register, photo galleries) are shared in src/site-accounts.ts.

Fixed

  • Saving a published post no longer changes its dates. The engine wrote each save as a new version with created_at = now and then set published_at = now, so edited posts jumped to the top of the blog, the RSS feed and the Content list, and got a new datePublished. The new version now keeps created_at and published_at; only the first publish sets the date (src/publish-date.ts).

Changed

  • Content lists sort by Created (newest first) instead of last update, so saving an item no longer moves it to the top. New Created column next to Updated; both headers sort the whole list (?sort=created|updated&dir=desc|asc). Created is the earlier of created and published date, so imported posts show their original date (src/content-dates.ts).

Fixed

  • Lookup indexes (src/db-indexes.ts, created once per isolate from safeHandle): published lists, slug and page-path lookups, updated_at, error log and not-found log. The engine's indexes start with tenant_id, which the sites' queries don't use, so busy sites could read whole tables and hit D1's CPU limit.

Added

  • Article schema: keywords from the post's visible tags (tags), never the focus keyphrase. AI Discovery page check warns when an article has no category or no tags.
  • SEO › AI Discovery tab: site checks (indexing, AI search / assistants / training policy, organisation, logo and profiles, default image and description, IndexNow, llms.txt) and a page check that reads the sitemap and opens each page like an AI crawler (no cookies, no JavaScript, served from the edge cache): reachable, indexable, canonical, title, description, share image, one h1, valid JSON-LD with article fields, enough text in the HTML.
  • SEO › Indexing › AI crawlers: three choices, AI search (on), AI assistants (on), AI training (off by default), written into robots.txt as a marked block plus a Content-Signal line. The bot list (src/plugins/ai-crawlers.ts, versioned) follows each operator's own docs: OpenAI, Anthropic, Google-Extended, Perplexity, Apple, Meta, Amazon, Common Crawl, ByteDance.
  • SEO structured data: posts can be BlogPosting or NewsArticle (articleType) and list their categories (articleSection via sections). Leave author out when the organisation wrote the post: the schema then names the organisation instead of a made-up person.
  • Settings › Cache: Keep sitemaps and feeds until content changes (on by default). Sitemaps, feeds, robots.txt and llms.txt stay at the edge until the next admin save instead of 60 minutes; clients still revalidate with the ETag.
  • SEO › Check: Calculate missing scores / Recalculate all. Imported or old items get their SEO and readability scores (the dots in the Content list) without opening each one: the browser runs the same analysis as the editor in batches of 40, updates go by id and keep updated_at (no IndexNow, no cache flush). The analysis now lives in one shared script (SEO_ANALYSE_CORE).

Fixed

  • IndexNow after a save read the whole documents table (no index on updated_at); it now creates idx_documents_updated_at once and reads only the last minute's changes.