MetaCraft Changelog
1.3.0 — unreleased
Page content and AI suggestions. MetaCraft can read each entry's rendered page and suggest values for its SEO fields and structured data, from marks in the HTML, from ordinary HTML, and optionally from AI with the site owner's own API key. Nothing is applied without review. With AI off (the default), nothing is sent anywhere and no AI controls appear; the head tag's output is unchanged unless pages carry marks.
Page content
- Page capture: MetaCraft reads an entry's public page with a GET to the site itself (never during page views or saves).
php eecli.php metacraft:capturereads changed entries (or--all,--entry,--channel), suitable for cron; the editor has Re-read. Saving an entry only marks its page as changed. - Page marks:
data-schema-propanddata-schema="faq|hours"attributes give exact structured data values, used directly and shown with a Marked badge (Marking page content). Structured data now resolves entry value → page mark → mapped field → automatic. - Page HTML suggestions: phone and email links,
<address>,<time datetime>and FAQ-style questions on the page are offered for review. - Capture URL and basic auth for sites whose server can't fetch its own public URLs, with Test capture.
AI suggestions (optional)
- Settings › AI: on/off switch, Anthropic API key (encrypted, write-only; or
$config['metacraft_anthropic_key']), Test key, models (Claude Haiku 4.5 by default; Claude Sonnet 5.5 offered) and monthly usage with an estimated cost. - Editor: Suggest per field (SEO title, description, Open Graph title and description) and Suggest N empty fields, with suggestion cards (Use, Edit, Dismiss, Suggest again). Structured data tab: Suggested from the page with Use, Dismiss, Undo, Use all and Suggest with AI.
- Content SEO bulk jobs for Missing description and Schema incomplete (admins): confirm with an estimated cost range, run in batches of 5, pause and resume, review every result (side by side, Use / Edit / Dismiss / Undo / Use all shown), done summary. Overview links to it from Needs attention.
- Unchanged pages are never sent twice; Suggest again asks anew on request. Long pages are trimmed to their main content.
- Errors name the cause and the fix: invalid key, rate limit or quota, provider down, page too long. Other failures are logged to the developer log (status and error type only).
Privacy
- AI requests send only the entry's title, URL and page text (up to 24,000 characters), and only when someone asks. Page captures go only to the site itself. See Privacy.
Documentation
- Documentation in MetaCraft's sidebar: the user guide inside the control panel, with search, for everyone who can open MetaCraft.
- A user guide website in
docs/site/(openindex.html): getting started, every screen with screenshots, template and sitemap reference, troubleshooting, with search. Built from the Markdown docs, which stay alongside it. - New
GETTING-STARTED.md: requirements, install, upgrade and first setup step by step. - Sitemap troubleshooting from a live install: telling the three kinds of
/sitemap.xml404 apart, XML errors caused by an old hand-madesitemap.xmlleft in the web root (and a CDN still caching it), and pages in the sitemap that return 404. The setup steps now say template mode writes no file, and to remove an oldsitemap.xmlfirst.
Licensing
- A licence notice at the top of MetaCraft's screens when ExpressionEngine reports the MetaCraft licence as invalid or expired: a 7-day countdown from when the problem is first seen, then a firmer message. It is informational only; nothing is disabled or gated. The clock is kept in ExpressionEngine's
exp_config(no migration) and resets when the licence is valid again. See Troubleshooting.
Fixes
- Structured data suggestions with a long value (an address) no longer squeeze the value to a few characters beside its buttons.
- Bulk jobs for one entry say "1 entry" instead of "1 entries".
- The Overview's duplicate-tags banner reads "It outputs tags MetaCraft also outputs" (or "They …") instead of "1 outputs tags …", and names templates when it lists both kinds.
Data
- New tables
metacraft_page_content,metacraft_suggestionsandmetacraft_ai_usage;metacraft_entries.schema_propsholds structured data values used on an entry. Page content and suggestions are deleted with their entry.
1.2.0 — unreleased
Structured data beyond WebSite, Organization and WebPage/Article. Sites that don't change the new settings output exactly what 1.1.0 did.
Structured data
- Site entity type: Organization, LocalBusiness or ProfessionalService, or a medical type (MedicalOrganization, MedicalBusiness, MedicalClinic, Physician, Dentist). Local business types add address, telephone, email, geo, price range, area served and opening hours; medical types add specialties, accepting new patients and accepted insurance. Each property is only output on the types schema.org defines it for.
- Channel and entry types: WebPage, MedicalWebPage, FAQPage, Article, BlogPosting, Event, Product, Service, Person, Physician and LocalBusiness (location), with per-property field mappings in each channel's drawer (required / optional / automatic, compatible fields only).
- Grid fields feed opening hours (Day, Opens, Closes columns) and FAQs (Question, Answer). Rows that can't be read are skipped and shown in the editor.
- A missing required property outputs a plain WebPage, never a half-filled type. Required properties follow Google's rich-result requirements: an Event needs its venue address, a Product a price with a currency, and a location's country falls back to the site's.
- Editor: a Structured data preview tab with the page's JSON-LD (as last saved), a Test in Google link, and notes for missing properties and skipped rows.
- Content SEO: a Schema incomplete status filter (informational; not part of Needs attention).
- The duplicate-tag check also flags templates with their own
application/ld+jsonblock. - The channel "Article author" switch is now the Article/BlogPosting Author mapping (Entry author). Existing settings are converted on upgrade.
Control panel
- Settings use the full width of the control panel, like the other MetaCraft screens.
Performance
- Schema mappings share the existing field queries. A mapped Grid adds one query on pages that use it.
1.1.0 — 2026-10-10
A redesigned control panel. Front-end output is unchanged: the head tag, JSON-LD and sitemaps produce the same markup as 1.0.0.
Control panel
- New screens: Overview, Content SEO, Sitemap and Settings (General · Social · Structured data · Channels · Advanced, plus Import from SEO Lite). They replace Dashboard, Entries, Sitemaps and the old settings forms. Old URLs redirect.
- Content SEO: every candidate entry with coverage chips (custom / inherited / missing / noindex), value tooltips, status, channel and search filters, and a quick-edit drawer.
- Full SEO editor for an entry, outside the entry form, with its own save. It saves only the fields you changed, asks before overwriting someone else's newer save, and follows EE's entry edit permissions.
- Publish tab redrawn as the same editor: one view with live search and social previews. It still saves with the entry and never clears data on bulk edits or API saves.
- Overview: totals, what needs attention, sitemap status, and templates that may output duplicate tags.
- Sitemap: sources (Structure pages, channels with URL patterns), rules, serving mode, regenerate, excluded entries with reasons, and a read-only view of the stored XML. Non-admins see it read-only.
- Settings: one sticky save bar per tab with unsaved-change tracking, Discard and ⌘S / Ctrl+S; live title and canonical examples; channel drawers with field mappings and broken-mapping warnings; a one-click fix when the trailing-slash setting doesn't match Structure; admin roles as chips; the SEO Lite import with a dry run, conflict / adjustment / skipped tabs and an inline confirm.
- Light and dark themes follow EE's theme. Icons are inline SVG (Lucide, ISC licence, see
docs/LICENSE-lucide.txt). - Stylesheet and script URLs carry a content version, so upgrades aren't hidden by cached files.
Data
metacraft_entries.updated_byrecords who last saved an entry's SEO (used for overwrite warnings).- Audit records now include Open Graph sources, "canonical points elsewhere" and duplicate groups. The sitemap build records why entries were left out.
Performance
- The head tag no longer reads the Structure tree for entries outside Structure: 2 fewer queries on channel-pattern pages.
1.0.0 — 2026-10-09
First release. Replaces SEO Lite Pro on Bison Digital sites.
Head tag
{exp:metacraft:head}: title, description, canonical, robots, Open Graph, X cards and one JSON-LD@graph(WebSite, Organization, WebPage/Article, BreadcrumbList).- Values resolve from template parameters → entry overrides → mapped channel fields → channel defaults → global defaults → automatic, with the same resolver used everywhere.
- Finds the entry from the URL (Structure pages and listings, then channel URL patterns) or
entry_id. Pagination-aware canonicals. - Canonical URLs from one normalizer: base URL, trailing-slash policy (with a warning when it doesn't match Structure's), no query strings.
- BreadcrumbList for Structure pages with parent pages (entry titles, Structure URLs;
breadcrumbs="no"to omit). - Editor text can't inject template tags (
{/}encoded); output is escaped; failures fall back to a plain title and a developer-log entry. - Query budget: ≤ 5 queries on non-entry pages, ≤ 8 on entry pages.
Control panel
- Settings: General, Social, Structured Data, Channels (enable, defaults, field mapping), Sitemaps.
- MetaCraft SEO publish tab with inherited-value placeholders, source badges, reset, character counts, and live search/social previews. Works with custom publish layouts and "Save as new entry". Never clears data on bulk edit or API saves.
- Dashboard: configuration audit of published entries (indexable, noindex, missing description, duplicate titles and canonicals, missing social image, entries using their entry title), sitemap status, and a scan for templates that would output SEO tags twice.
- Entries report with channel / override / issue filters and links to each entry.
- "Admin roles" setting: who besides Super Admins can change settings.
Sitemaps
{exp:metacraft:sitemap}served from an XML template route. Sitemap index plussitemap-N.xmlchildren over 45,000 URLs.- Structure pages plus channel entries via URL patterns. Excludes noindex, non-public, future, expired, and canonicalized-elsewhere entries.
- Cached; marked stale on entry and settings changes, Structure tree changes and scheduled publish/expiry dates. Rebuilds on the next request under a lock, and keeps serving the last good sitemap on failure.
- Static file mode for hosts that don't pass
.xmlto PHP: atomic writes, never overwrites files it didn't create. php eecli.php metacraft:sitemap [--site] [--force] [--dry-run].
Switching from SEO Lite
- One-time import (CP screen or
metacraft:import-seolite [--apply]): dry run first, never overwrites MetaCraft values, handles titles that already carry the site name, enables receiving channels. SEO Lite data and templates are never modified.