{"id":393307,"date":"2026-11-12T04:12:55","date_gmt":"2026-11-12T04:12:55","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/leitvia-studio\/"},"modified":"2026-11-12T06:19:29","modified_gmt":"2026-11-12T06:19:29","slug":"leitvia-studio","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/leitvia-studio\/","author":14042358,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.46","stable_tag":"1.3.46","tested":"7.1.4","requires":"7.1","requires_php":"8.2","requires_plugins":null,"header_name":"Leitvia Studio: AI Agents, MCP and Design Tokens for Block Themes","header_author":"CMS ADMINS","header_description":"Pattern lab, design tokens and a content model for block themes, stored in WordPress core structures.","last_updated":"2026-11-12 06:19:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/leitvia.com\/features\/","header_author_uri":"https:\/\/cms-admins.de","rating":0,"author_block_rating":0,"active_installs":0,"downloads":61,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.45":{"tag":"1.3.45","author":"contexlabs","date":"2026-11-12 04:12:42","revision":3797468},"1.3.46":{"tag":"1.3.46","author":"contexlabs","date":"2026-11-12 06:19:29","revision":3797598}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3797468,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3797468,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3797468,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3797468,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3797468,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3797598,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Leitvia Studio live preview\",\"description\":\"The theme Leitvia and Leitvia Studio with the recipe company applied, its pages published and its change package taken over by the admin.\",\"author\":\"contexlabs\"},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=leitvia-studio\",\"login\":true,\"preferredVersions\":{\"php\":\"8.4\",\"wp\":\"latest\"},\"steps\":[{\"step\":\"installTheme\",\"themeData\":{\"resource\":\"wordpress.org\\\/themes\",\"slug\":\"leitvia\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"leitvia-studio\"},\"options\":{\"activate\":true}},{\"step\":\"wp-cli\",\"command\":\"wp option update leitvia_studio_gateway '{\\\"profile\\\":\\\"full\\\"}' --format=json\"},{\"step\":\"wp-cli\",\"command\":\"wp leitvia recipe apply leitvia\\\/company --user=admin\"},{\"step\":\"wp-cli\",\"command\":\"wp eval 'foreach ( WP_CLI::runcommand( \\\"leitvia package list --state=open --format=json\\\", array( \\\"launch\\\" => false, \\\"return\\\" => true, \\\"parse\\\" => \\\"json\\\" ) ) as $package ) { WP_CLI::runcommand( \\\"leitvia package apply \\\" . (int) $package[\\\"id\\\"], array( \\\"launch\\\" => false ) ); }' --user=admin\"},{\"step\":\"wp-cli\",\"command\":\"wp leitvia recipe apply leitvia\\\/company --user=admin\"},{\"step\":\"wp-cli\",\"command\":\"wp eval 'foreach ( WP_CLI::runcommand( \\\"leitvia package list --state=open --format=json\\\", array( \\\"launch\\\" => false, \\\"return\\\" => true, \\\"parse\\\" => \\\"json\\\" ) ) as $package ) { WP_CLI::runcommand( \\\"leitvia package apply \\\" . (int) $package[\\\"id\\\"], array( \\\"launch\\\" => false ) ); }' --user=admin\"},{\"step\":\"wp-cli\",\"command\":\"wp option delete leitvia_studio_gateway\"}]}"}},"all_blocks":{"leitvia\/rating":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/rating","version":"0.1.0","title":"Rating","category":"leitvia","icon":"star-half","description":"A star rating with its value as text, optionally a review with structured data for search engines.","keywords":["stars","review","score"],"textdomain":"leitvia-studio","attributes":{"rating":{"type":"number","default":0},"max":{"type":"integer","default":5},"label":{"type":"string","default":""},"reviewBody":{"type":"string","default":""},"reviewAuthor":{"type":"string","default":""},"itemName":{"type":"string","default":""},"itemType":{"type":"string","enum":["","Product","Book","Course","Recipe","SoftwareApplication","LocalBusiness","Movie","Event","CreativeWorkSeason"],"default":""}},"supports":{"anchor":true,"html":false,"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true,"link":false},"typography":{"fontSize":true}},"example":{"attributes":{"rating":4.5,"label":"Customer service","reviewBody":"Quick answers and a fix on the same day.","reviewAuthor":"Alex Example"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/query-filter":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/query-filter","version":"0.1.0","title":"Query filter","category":"leitvia","icon":"filter","description":"Lets visitors filter the posts of the surrounding Query Loop by terms and custom fields. The filters live in the URL and work without JavaScript.","keywords":["facets","filter","search"],"textdomain":"leitvia-studio","ancestor":["core\/query"],"usesContext":["queryId","query"],"attributes":{"label":{"type":"string","default":""},"applyLabel":{"type":"string","default":""},"resetLabel":{"type":"string","default":""},"facets":{"type":"array","default":[{"key":"category","control":"checkbox"}],"items":{"type":"object","properties":{"key":{"type":"string"},"control":{"type":"string","enum":["checkbox","select"]}}}}},"supports":{"html":false,"reusable":false,"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"label":"Filter posts"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/icon":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/icon","version":"0.1.0","title":"Icon","category":"leitvia","icon":"star-filled","description":"An icon from the bundled set or an icon set of the site, in the text color. Decorative without a label; with a label it is an image or a link.","keywords":["symbol","pictogram","svg"],"textdomain":"leitvia-studio","attributes":{"icon":{"type":"string","default":"star"},"label":{"type":"string","default":""},"url":{"type":"string","default":""}},"supports":{"anchor":true,"html":false,"color":{"text":true,"background":false,"link":false},"typography":{"fontSize":true,"textAlign":true},"spacing":{"margin":true}},"example":{"attributes":{"icon":"star","fontSize":"heading-l"}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css"},"leitvia\/feature-group":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/feature-group","version":"0.1.0","title":"Feature group","category":"leitvia","icon":"list-view","description":"A list of features with their count in the heading and an optional filter by plan that works without JavaScript.","keywords":["features","plans","filter"],"textdomain":"leitvia-studio","allowedBlocks":["leitvia\/feature-item"],"attributes":{"heading":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-feature-group__title"},"countLabel":{"type":"string","source":"text","selector":".wp-block-leitvia-feature-group__count","default":""},"filter":{"type":"boolean","default":false},"plans":{"type":"array","items":{"type":"string"},"default":[]},"labels":{"type":"object"}},"supports":{"anchor":true,"align":["wide"],"html":false,"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"heading":"Features"},"innerBlocks":[{"name":"leitvia\/feature-item","attributes":{"title":"Unlimited pages","text":"Add as many pages as you need."}},{"name":"leitvia\/feature-item","attributes":{"title":"Backups","text":"Daily backups for thirty days."}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/wizard":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/wizard","version":"0.1.0","title":"Wizard","category":"leitvia","icon":"editor-ol","description":"A form in steps that sends its answers as URL parameters, for example to a page with a query filter. Without JavaScript all steps show at once.","keywords":["steps","form","assistant"],"textdomain":"leitvia-studio","allowedBlocks":["leitvia\/wizard-step"],"attributes":{"action":{"type":"string","source":"attribute","selector":"form","attribute":"action","default":""},"submit":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-wizard__submit button","default":"Show results"}},"supports":{"anchor":true,"align":["wide"],"html":false,"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true,"link":false}},"example":{"attributes":{"submit":"Show results"},"innerBlocks":[{"name":"leitvia\/wizard-step","attributes":{"legend":"What do you need?","name":"need","options":[{"label":"Website","value":"website"},{"label":"Shop","value":"shop"}]}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/comparison-table":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/comparison-table","version":"0.1.0","title":"Comparison table","category":"leitvia","icon":"editor-table","description":"A table with caption, row and column headers, an optional computed column and its source. Shown as cards on small screens.","keywords":["table","compare","matrix"],"textdomain":"leitvia-studio","attributes":{"caption":{"type":"string","default":""},"columns":{"type":"array","items":{"type":"string"},"default":["","",""]},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}},"default":[["","",""],["","",""]]},"highlightRow":{"type":"number","default":-1},"computed":{"type":"object","default":{}},"source":{"type":"string","default":""},"sourceDate":{"type":"string","default":""},"labels":{"type":"object"}},"supports":{"anchor":true,"align":["wide"],"html":false},"example":{"attributes":{"caption":"Plans compared","columns":["Feature","Basic","Pro"],"rows":[["Users","1","10"],["Support","Email","Phone"]]}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/reveal":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/reveal","version":"0.1.0","title":"Reveal","category":"leitvia","icon":"visibility","description":"Fades or lifts its content in once as it scrolls into view. Without JavaScript or with reduced motion the content simply shows.","keywords":["animation","scroll","fade"],"textdomain":"leitvia-studio","attributes":{"effect":{"type":"string","enum":["fade","rise","stagger"],"default":"rise"}},"supports":{"anchor":true,"align":["wide","full"],"html":false,"spacing":{"margin":true,"padding":true,"blockGap":true},"layout":{"default":{"type":"constrained"}}},"example":{"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"This text appears while it scrolls into view."}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/map":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/map","version":"0.1.0","title":"Map","category":"leitvia","icon":"location-alt","description":"A list of places with links to OpenStreetMap, plus an interactive map that loads only after the visitor agrees.","keywords":["openstreetmap","location","address"],"textdomain":"leitvia-studio","attributes":{"heading":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-map__heading"},"lat":{"type":"number","default":52.52},"lng":{"type":"number","default":13.405},"zoom":{"type":"integer","default":13},"markers":{"type":"array","default":[],"items":{"type":"object","properties":{"title":{"type":"string"},"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}}}},"linkText":{"type":"string","default":"View on OpenStreetMap"},"height":{"type":"string","enum":["small","medium","large"],"default":"medium"}},"supports":{"anchor":true,"align":["wide","full"],"html":false,"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"heading":"Our office","markers":[{"title":"Office","address":"Alexanderplatz 1, Berlin","lat":52.5219,"lng":13.4132}]}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewStyle":"file:.\/leaflet.css","viewScriptModule":"file:.\/view.js"},"leitvia\/marquee":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/marquee","version":"0.1.0","title":"Marquee","category":"leitvia","icon":"leftright","description":"A list of logos or short statements that scrolls sideways, with a Pause button. Without JavaScript or with reduced motion it stays a still list.","keywords":["ticker","logos","carousel"],"textdomain":"leitvia-studio","allowedBlocks":["core\/list"],"supports":{"anchor":true,"align":["wide","full"],"html":false,"interactivity":true,"spacing":{"margin":true,"padding":true}},"example":{"innerBlocks":[{"name":"core\/list","innerBlocks":[{"name":"core\/list-item","attributes":{"content":"Fast setup"}},{"name":"core\/list-item","attributes":{"content":"Accessible"}},{"name":"core\/list-item","attributes":{"content":"Private"}}]}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/counter":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/counter","version":"0.1.0","title":"Counter","category":"leitvia","icon":"chart-bar","description":"A key figure with prefix, suffix and label that counts up once it comes into view.","keywords":["number","statistic","key figure"],"textdomain":"leitvia-studio","attributes":{"prefix":{"type":"string","source":"text","selector":".wp-block-leitvia-counter__prefix","default":""},"value":{"type":"string","source":"text","selector":".wp-block-leitvia-counter__value","default":""},"suffix":{"type":"string","source":"text","selector":".wp-block-leitvia-counter__suffix","default":""},"label":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-counter__label"}},"supports":{"anchor":true,"html":false,"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true,"link":false},"typography":{"textAlign":true}},"example":{"attributes":{"value":"1250","suffix":"+","label":"Projects delivered"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/a11y-bar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/a11y-bar","version":"0.1.0","title":"Accessibility bar","category":"leitvia","icon":"universal-access","description":"Links to the easy language version, the accessibility statement and sign language for the header. With JavaScript it adds text size, high contrast and read aloud with a voice on the device.","keywords":["accessibility","easy language","BITV","contrast","text size"],"textdomain":"leitvia-studio","attributes":{"label":{"type":"string","source":"attribute","selector":"nav","attribute":"aria-label"},"statementUrl":{"type":"string","source":"attribute","selector":".wp-block-leitvia-a11y-bar__statement","attribute":"href"},"statementText":{"type":"string","source":"html","selector":".wp-block-leitvia-a11y-bar__statement"},"signLanguageUrl":{"type":"string","source":"attribute","selector":".wp-block-leitvia-a11y-bar__sign-language","attribute":"href"},"signLanguageText":{"type":"string","source":"html","selector":".wp-block-leitvia-a11y-bar__sign-language"}},"supports":{"anchor":true,"align":["full","wide"],"html":false,"multiple":false,"color":{"background":true,"text":true,"link":true},"typography":{"fontSize":true},"spacing":{"padding":true}},"example":{"attributes":{"label":"Accessibility","statementUrl":"#","statementText":"Accessibility statement","signLanguageUrl":"#","signLanguageText":"Sign language"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/language-switch":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/language-switch","version":"0.1.0","title":"Easy language switch","category":"leitvia","icon":"book","description":"Links a page to its version in easy language and back. Shows nothing while the page has no published counterpart.","keywords":["easy language","plain language","accessibility","BITV"],"textdomain":"leitvia-studio","usesContext":["postId"],"supports":{"html":false,"color":{"text":true,"link":true},"typography":{"fontSize":true},"spacing":{"margin":true}},"example":{},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/timeline":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/timeline","version":"0.1.0","title":"Timeline","category":"leitvia","icon":"backup","description":"Dated entries in order, such as milestones or the history of a company.","keywords":["history","milestones","chronology"],"textdomain":"leitvia-studio","allowedBlocks":["leitvia\/timeline-item"],"supports":{"anchor":true,"align":["wide"],"html":false,"spacing":{"margin":true,"padding":true},"color":{"background":true,"text":true,"link":false}},"example":{"innerBlocks":[{"name":"leitvia\/timeline-item","attributes":{"date":"2019","dateLabel":"2019","heading":"Founded"},"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"Two designers start the studio."}}]},{"name":"leitvia\/timeline-item","attributes":{"date":"2024","dateLabel":"2024","heading":"Twenty people"},"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"The team moves into its own office."}}]}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/contact-form":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/contact-form","version":"0.1.0","title":"Contact form","category":"leitvia","icon":"email-alt","description":"Name, email and message, sent by email from this site. Works without JavaScript and stores nothing on the site.","keywords":["contact","form","email","message","enquiry"],"textdomain":"leitvia-studio","attributes":{"nameLabel":{"type":"string","default":""},"emailLabel":{"type":"string","default":""},"messageLabel":{"type":"string","default":""},"requiredNote":{"type":"string","default":""},"buttonText":{"type":"string","default":""},"successMessage":{"type":"string","default":""},"recipient":{"type":"string","default":""},"subject":{"type":"string","default":""},"privacyNote":{"type":"boolean","default":true},"privacyText":{"type":"string","default":""}},"supports":{"html":false,"align":["wide"],"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"buttonText":"Send message"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/icon-list":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/icon-list","version":"0.1.0","title":"Icon list","category":"leitvia","icon":"editor-ul","description":"A list whose items start with an icon instead of a bullet. One icon for the list, each item can choose its own.","keywords":["checklist","list","benefits","features"],"textdomain":"leitvia-studio","allowedBlocks":["leitvia\/icon-list-item"],"attributes":{"icon":{"type":"string","default":"check"}},"providesContext":{"leitvia\/iconListIcon":"icon"},"supports":{"anchor":true,"html":false,"color":{"text":true,"background":true,"link":true},"typography":{"fontSize":true},"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"icon":"check"},"innerBlocks":[{"name":"leitvia\/icon-list-item","attributes":{"text":"Free delivery from 50 euros"}},{"name":"leitvia\/icon-list-item","attributes":{"text":"Returns within 30 days"}},{"name":"leitvia\/icon-list-item","attributes":{"icon":"phone","text":"Advice by phone"}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/bento":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/bento","version":"0.1.0","title":"Bento grid","category":"leitvia","icon":"grid-view","description":"Tiles in fixed sizes on a grid. The order of the tiles is the reading order on every screen.","keywords":["grid","tiles","cards"],"textdomain":"leitvia-studio","allowedBlocks":["leitvia\/bento-item"],"supports":{"anchor":true,"align":["wide","full"],"html":false,"spacing":{"margin":true,"padding":true,"blockGap":true}},"example":{"innerBlocks":[{"name":"leitvia\/bento-item","attributes":{"size":"2x1"},"innerBlocks":[{"name":"core\/heading","attributes":{"content":"Fast setup","level":3}}]},{"name":"leitvia\/bento-item","innerBlocks":[{"name":"core\/heading","attributes":{"content":"Accessible","level":3}}]},{"name":"leitvia\/bento-item","innerBlocks":[{"name":"core\/heading","attributes":{"content":"Private","level":3}}]}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/consent-settings":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/consent-settings","version":"0.1.0","title":"Consent Settings","category":"leitvia","icon":"privacy","description":"Lists the providers a visitor always allows, such as YouTube, and lets them revoke each one. Place it on the privacy policy page.","keywords":["privacy","cookies","embed","gdpr"],"textdomain":"leitvia-studio","attributes":{"text":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-consent-settings__text"}},"supports":{"anchor":true,"html":false,"interactivity":true,"multiple":false,"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"text":"Providers you always allow:"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"@leitvia\/consent"},"leitvia\/faq":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/faq","version":"0.1.0","title":"FAQ","category":"leitvia","icon":"editor-help","description":"Questions with answers that open on click, as details blocks. Adds FAQ structured data for search engines.","keywords":["faq","questions","answers","accordion","details"],"textdomain":"leitvia-studio","allowedBlocks":["core\/details"],"attributes":{"schema":{"type":"boolean","default":true},"exclusive":{"type":"boolean","default":false}},"supports":{"anchor":true,"align":["wide"],"html":false,"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true}},"example":{"innerBlocks":[{"name":"core\/details","attributes":{"summary":"How long does a project take?","showContent":true},"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"Most projects take four to six weeks."}}]},{"name":"core\/details","attributes":{"summary":"Can we keep our content?"},"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"Yes, posts, pages and media move over."}}]}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/announcement-bar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/announcement-bar","version":"0.2.0","title":"Announcement bar","category":"leitvia","icon":"megaphone","description":"A one-line announcement with an optional link, as a full-width band at the top of the header. Visitors can dismiss it; it returns when its text changes.","keywords":["notice","banner","news"],"textdomain":"leitvia-studio","attributes":{"text":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-announcement-bar__text"},"label":{"type":"string","source":"attribute","selector":"section","attribute":"aria-label"},"align":{"type":"string","default":"full"}},"supports":{"anchor":true,"align":["full","wide"],"html":false,"multiple":false,"color":{"background":true,"text":true,"link":true},"spacing":{"padding":true},"typography":{"fontSize":true}},"styles":[{"name":"default","label":"Quiet","isDefault":true},{"name":"inverse","label":"Inverse"}],"example":{"attributes":{"text":"Open day on 14 November.","label":"Announcement"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/spotlight":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/spotlight","version":"0.1.0","title":"Spotlight","category":"leitvia","icon":"location","description":"An image with numbered points that open a short text each. On narrow screens the points follow the image as a list.","keywords":["hotspot","image map","callout"],"textdomain":"leitvia-studio","allowedBlocks":["core\/image","leitvia\/spotlight-hotspot"],"supports":{"anchor":true,"align":["wide","full"],"html":false,"interactivity":true,"spacing":{"margin":true}},"example":{"innerBlocks":[{"name":"leitvia\/spotlight-hotspot","attributes":{"x":30,"y":40,"label":"Charging port"}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/share":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/share","version":"0.1.0","title":"Share","category":"leitvia","icon":"share","description":"Plain links to share this post on social networks, by email or by copying the link. Nothing loads from the networks before a click.","keywords":["social","share buttons","linkedin","whatsapp","copy link"],"textdomain":"leitvia-studio","attributes":{"services":{"type":"array","items":{"type":"string","enum":["linkedin","bluesky","facebook","whatsapp","threads","xing","email","copy"]},"default":["linkedin","bluesky","whatsapp","email","copy"]},"display":{"type":"string","enum":["text","icon-text","icon"],"default":"icon-text"}},"usesContext":["postId"],"supports":{"anchor":true,"html":false,"color":{"background":true,"text":true},"spacing":{"margin":true,"padding":true},"typography":{"fontSize":true}},"example":{"attributes":{"services":["linkedin","bluesky","email","copy"],"display":"icon-text"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/product-compare":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/product-compare","version":"0.1.0","title":"Product comparison","category":"leitvia","icon":"columns","description":"Compares two to four WooCommerce products in a table with live prices, rating, chosen attributes, availability and an add to cart link. Shown as cards on small screens.","keywords":["compare","products","shop","woocommerce"],"textdomain":"leitvia-studio","attributes":{"caption":{"type":"string","default":""},"products":{"type":"array","items":{"type":"integer"},"default":[]},"features":{"type":"array","items":{"type":"string"},"default":[]},"highlight":{"type":"integer","default":0}},"supports":{"align":["wide"],"html":false},"example":{"attributes":{"caption":"Vases compared"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/form-errors":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/form-errors","version":"0.1.0","title":"Form error summary","category":"leitvia","icon":"warning","description":"Wraps any form and lists its errors above it with links to the fields. Without JavaScript the browser and the form plugin validate as before.","keywords":["form","validation","accessibility","errors"],"textdomain":"leitvia-studio","supports":{"anchor":true,"html":false,"spacing":{"margin":true,"padding":true,"blockGap":true},"layout":{"default":{"type":"constrained"}}},"example":{"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"Place a form here."}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/load-more":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/load-more","version":"0.1.0","title":"Load more","category":"leitvia","icon":"plus-alt","description":"A link to the next page of the surrounding Query Loop. With JavaScript the next posts are added below the list instead.","keywords":["pagination","infinite","more"],"textdomain":"leitvia-studio","ancestor":["core\/query"],"usesContext":["queryId","query"],"attributes":{"text":{"type":"string","default":""}},"supports":{"html":false,"reusable":false,"interactivity":{"clientNavigation":true},"spacing":{"margin":true}},"example":{"attributes":{"text":"Load more"}},"editorScript":"file:.\/index.js","viewScriptModule":"file:.\/view.js"},"leitvia\/table-of-contents":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/table-of-contents","version":"0.1.0","title":"Table of Contents","category":"leitvia","icon":"list-view","description":"Lists the headings of this page as links, built when the page renders. Marks the section being read; as a companion it stays at hand as a chapter button. In a post split into parts it groups the headings by part and links each to its part.","keywords":["toc","headings","outline","jump links"],"textdomain":"leitvia-studio","attributes":{"levels":{"type":"array","items":{"type":"integer"},"default":[2,3]},"display":{"type":"string","enum":["inline","companion"],"default":"inline"},"scope":{"type":"string","enum":["all","part"],"default":"all"}},"usesContext":["postId"],"supports":{"anchor":true,"html":false,"multiple":false,"color":{"background":true,"text":true,"link":true},"spacing":{"margin":true,"padding":true}},"example":{},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/pricing":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/pricing","version":"0.1.0","title":"Pricing","category":"leitvia","icon":"money-alt","description":"Plans with monthly and yearly prices, a period switch that works without JavaScript and notes on tax and guarantee.","keywords":["plans","prices","tariffs"],"textdomain":"leitvia-studio","allowedBlocks":["leitvia\/pricing-plan","core\/details"],"attributes":{"groupId":{"type":"string","default":""},"legend":{"type":"rich-text","source":"rich-text","selector":"legend"},"monthlyLabel":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-pricing__monthly"},"yearlyLabel":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-pricing__yearly"},"taxNote":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-pricing__tax"},"guarantee":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-pricing__guarantee"}},"supports":{"anchor":true,"align":["wide"],"html":false,"spacing":{"margin":true,"padding":true}},"example":{"attributes":{"legend":"Billing period","monthlyLabel":"Monthly","yearlyLabel":"Yearly"},"innerBlocks":[{"name":"leitvia\/pricing-plan","attributes":{"name":"Basic","monthly":9,"yearly":90}},{"name":"leitvia\/pricing-plan","attributes":{"name":"Pro","monthly":19,"yearly":190,"recommended":true,"badge":"Recommended"}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/feature-item":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/feature-item","version":"0.1.0","title":"Feature","category":"leitvia","icon":"yes","description":"One feature with title, text and the plan that includes it.","keywords":["feature","benefit"],"textdomain":"leitvia-studio","parent":["leitvia\/feature-group"],"attributes":{"title":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-feature-item__title"},"text":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-feature-item__text"},"plan":{"type":"string","source":"text","selector":".wp-block-leitvia-feature-item__badge","default":""},"planIndex":{"type":"number","default":0}},"supports":{"html":false,"reusable":false},"example":{"attributes":{"title":"Unlimited pages","text":"Add as many pages as you need."}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/pricing-plan":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/pricing-plan","version":"0.1.0","title":"Pricing plan","category":"leitvia","icon":"tag","description":"One plan with its monthly and yearly price, the saving of the yearly price and its features.","keywords":["plan","price","tier"],"textdomain":"leitvia-studio","parent":["leitvia\/pricing"],"attributes":{"name":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-pricing-plan__name"},"monthly":{"type":"number","default":0},"yearly":{"type":"number","default":0},"currency":{"type":"string","default":"EUR"},"monthlyText":{"type":"string","source":"text","selector":".wp-block-leitvia-pricing-plan__price--monthly","default":""},"yearlyText":{"type":"string","source":"text","selector":".wp-block-leitvia-pricing-plan__price--yearly","default":""},"recommended":{"type":"boolean","default":false},"badge":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-pricing-plan__badge"}},"supports":{"anchor":true,"html":false,"reusable":false},"example":{"attributes":{"name":"Basic","monthly":9,"yearly":90}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/spotlight-hotspot":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/spotlight-hotspot","version":"0.1.0","title":"Spotlight point","category":"leitvia","icon":"marker","description":"A point on the spotlight image with a name and a short text. The name is what screen readers announce.","keywords":["hotspot","point","marker"],"textdomain":"leitvia-studio","parent":["leitvia\/spotlight"],"attributes":{"x":{"type":"number","default":50},"y":{"type":"number","default":50},"label":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-spotlight-hotspot__label"}},"supports":{"html":false,"reusable":false},"example":{"attributes":{"x":30,"y":40,"label":"Charging port"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/bento-item":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/bento-item","version":"0.1.0","title":"Bento tile","category":"leitvia","icon":"screenoptions","description":"One tile of a bento grid in a fixed size.","keywords":["tile","grid","card"],"textdomain":"leitvia-studio","parent":["leitvia\/bento"],"attributes":{"size":{"type":"string","enum":["1x1","2x1","1x2","2x2"],"default":"1x1"},"mobilePriority":{"type":"boolean","default":false}},"supports":{"anchor":true,"html":false,"reusable":false,"color":{"background":true,"text":true},"spacing":{"padding":true},"__experimentalBorder":{"radius":true,"width":true,"color":true,"style":true},"shadow":true},"example":{"attributes":{"size":"2x1"},"innerBlocks":[{"name":"core\/heading","attributes":{"content":"Fast setup","level":3}},{"name":"core\/paragraph","attributes":{"content":"Ready in one afternoon."}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/timeline-item":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/timeline-item","version":"0.1.0","title":"Timeline entry","category":"leitvia","icon":"marker","description":"One entry of a timeline with a date or a label, a heading and text.","keywords":["milestone","date","event","stage"],"textdomain":"leitvia-studio","parent":["leitvia\/timeline"],"attributes":{"date":{"type":"string","source":"attribute","selector":"time","attribute":"datetime","default":""},"dateLabel":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-timeline-item__date"},"heading":{"type":"rich-text","source":"rich-text","selector":".wp-block-leitvia-timeline-item__heading"},"level":{"type":"number","default":3}},"supports":{"anchor":true,"html":false,"reusable":false},"example":{"attributes":{"date":"2019","dateLabel":"2019","heading":"Founded"},"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"Two designers start the studio."}}]},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css"},"leitvia\/mega-menu":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/mega-menu","version":"0.1.0","title":"Mega menu","category":"leitvia","parent":["core\/navigation"],"icon":"layout","description":"A menu item that opens a large panel. The panel is a template part in the area Mega menu, designed in the Site Editor. Without JavaScript the item is a plain link.","keywords":["menu","navigation","panel","dropdown"],"textdomain":"leitvia-studio","attributes":{"label":{"type":"string","default":""},"url":{"type":"string","default":""},"slug":{"type":"string","default":""},"description":{"type":"string","default":""}},"supports":{"html":false,"reusable":false},"example":{"attributes":{"label":"Services","url":"#"}},"editorScript":"file:.\/index.js","style":"file:.\/style-index.css","viewScriptModule":"file:.\/view.js"},"leitvia\/wizard-step":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"leitvia\/wizard-step","version":"0.1.0","title":"Wizard step","category":"leitvia","icon":"editor-ol","description":"One step of a wizard: a group of fields with a legend, any blocks and an optional list of choices.","keywords":["step","question","fieldset"],"textdomain":"leitvia-studio","parent":["leitvia\/wizard"],"attributes":{"legend":{"type":"rich-text","source":"rich-text","selector":"legend"},"name":{"type":"string","default":""},"type":{"type":"string","enum":["radio","checkbox"],"default":"radio"},"required":{"type":"boolean","default":false},"options":{"type":"array","default":[],"items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}}}}},"supports":{"html":false,"reusable":false},"example":{"attributes":{"legend":"What do you need?","name":"need","options":[{"label":"Website","value":"website"},{"label":"Shop","value":"shop"}]}},"editorScript":"file:.\/index.js"}},"tagged_versions":["1.3.45","1.3.46"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3797468,"resolution":"1","location":"assets","locale":"","width":1280,"height":954},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3797468,"resolution":"2","location":"assets","locale":"","width":1280,"height":1241},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3797468,"resolution":"3","location":"assets","locale":"","width":1280,"height":1743},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3797468,"resolution":"4","location":"assets","locale":"","width":1280,"height":927},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3797468,"resolution":"5","location":"assets","locale":"","width":1280,"height":671},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3797468,"resolution":"6","location":"assets","locale":"","width":1280,"height":947}},"screenshots":{"1":"Agents: connection status, application passwords, checks and the MCP Adapter at a glance, plus the AI agents with access to the site.","2":"Pattern Lab: a block pattern in the preview at three viewport widths, with variants, checks and usage.","3":"Token set editor: WCAG contrast check for every color pair, scheduling as an overlay and a live preview of theme patterns.","4":"Change package of an AI agent: check result and the block diff per operation, ready to apply or reject.","5":"Applied change package with Roll back.","6":"Checks before and after every write: the list of checks, the results of the last 30 days and verify after writing."}},"plugin_section":[],"plugin_tags":[256265,232494,211323,254228,242115],"plugin_category":[],"plugin_contributors":[279254],"plugin_business_model":[],"class_list":["post-393307","plugin","type-plugin","status-publish","hentry","plugin_tags-abilities-api","plugin_tags-ai-agent","plugin_tags-block-theme","plugin_tags-design-tokens","plugin_tags-mcp","plugin_contributors-contexlabs","plugin_committers-contexlabs"],"banners":{"banner":"https:\/\/ps.w.org\/leitvia-studio\/assets\/banner-772x250.png?rev=3797468","banner_2x":"https:\/\/ps.w.org\/leitvia-studio\/assets\/banner-1544x500.png?rev=3797468","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/leitvia-studio\/assets\/icon.svg?rev=3797468","icon":"https:\/\/ps.w.org\/leitvia-studio\/assets\/icon.svg?rev=3797468","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/leitvia-studio\/assets\/screenshot-1.png?rev=3797468","caption":"Agents: connection status, application passwords, checks and the MCP Adapter at a glance, plus the AI agents with access to the site."},{"src":"https:\/\/ps.w.org\/leitvia-studio\/assets\/screenshot-2.png?rev=3797468","caption":"Pattern Lab: a block pattern in the preview at three viewport widths, with variants, checks and usage."},{"src":"https:\/\/ps.w.org\/leitvia-studio\/assets\/screenshot-3.png?rev=3797468","caption":"Token set editor: WCAG contrast check for every color pair, scheduling as an overlay and a live preview of theme patterns."},{"src":"https:\/\/ps.w.org\/leitvia-studio\/assets\/screenshot-4.png?rev=3797468","caption":"Change package of an AI agent: check result and the block diff per operation, ready to apply or reject."},{"src":"https:\/\/ps.w.org\/leitvia-studio\/assets\/screenshot-5.png?rev=3797468","caption":"Applied change package with Roll back."},{"src":"https:\/\/ps.w.org\/leitvia-studio\/assets\/screenshot-6.png?rev=3797468","caption":"Checks before and after every write: the list of checks, the results of the last 30 days and verify after writing."}],"raw_content":"<!--section=description-->\n<p>Leitvia Studio lets AI agents such as Claude Code, Codex or Cursor build and maintain WordPress sites with block themes through 59 abilities, and every change passes checks for design, accessibility and content before it goes live. It is free and made for developers, agencies and site owners who want an AI agent to do the work without administrator rights.<\/p>\n\n<p>The abilities belong to the WordPress <a href=\"https:\/\/developer.wordpress.org\/apis\/abilities-api\/\">Abilities API<\/a> and run over MCP or the REST API. Everything Studio creates is stored in WordPress core structures (patterns, global styles, post types, block bindings), so the site keeps working when you deactivate the plugin. It works with any block theme and fits best with the free theme <a href=\"https:\/\/github.com\/cmsadmins\/leitvia\">Leitvia<\/a>.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>AI agent gateway with review and rollback.<\/strong> Agents read the design contract, tokens, patterns and page outlines, then build pages from patterns, change single blocks, fix links and alt text or set up navigation. Every write runs through one pipeline: identity, scope, a hash check against stale reads, content checks (headings, alt text, link text, contrast, landmarks), a snapshot and an audit entry. An autonomy level per area decides whether a change goes live, lands as a draft or waits in the inbox as a change package with a block diff, which a person applies, rejects or rolls back.<\/li>\n<li><strong>MCP server for WordPress.<\/strong> With the plugin <a href=\"https:\/\/wordpress.org\/plugins\/mcp-adapter\/\">MCP Adapter<\/a> active, Studio adds its own MCP server \"leitvia\" with one tool per ability; the default server of the adapter offers the same abilities. Without the adapter, every ability runs over the REST API, and <code>wp leitvia<\/code> runs them from WP-CLI.<\/li>\n<li><strong>Limited rights for agents.<\/strong> An agent signs in as a \"Leitvia Agent\" user with an application password that an administrator creates and revokes on the Agents screen. It never installs or changes plugins, themes, users or code. Site settings, the content model and global styles always wait for a person.<\/li>\n<li><strong>Design tokens.<\/strong> Token sets in the <a href=\"https:\/\/www.designtokens.org\/\">W3C Design Tokens format (DTCG)<\/a> are imported, exported, kept with revisions and compiled into the global styles. A set whose text or control colors miss WCAG 2.2 AA contrast cannot be saved, and overlays change tokens for a scheduled period.<\/li>\n<li><strong>Pattern Lab.<\/strong> All patterns with live previews in every style variation at 390, 782 and 1440 px, state variants, an axe accessibility check per preview, status, version and a usage index.<\/li>\n<li><strong>Content model and block bindings.<\/strong> Post types, taxonomies, fields, relations and site settings declared as JSON, registered through core APIs and shown in paragraphs, headings, buttons and images through block bindings.<\/li>\n<li><strong>Site recipes.<\/strong> One command or one agent call sets up a site from style variation, header, footer, pages from patterns, navigation and settings that send less data: Blog, Company, Publication, Documentation and, with WooCommerce, Shop. A second run adds nothing.<\/li>\n<li><strong>Privacy by default.<\/strong> Embeds from YouTube, Vimeo, X and other sites wait behind a consent placeholder, the Map block loads OpenStreetMap tiles only after consent, Gravatar and the emoji script of WordPress stay off, and fonts are served from your own site.<\/li>\n<li><strong>Accessibility blocks.<\/strong> An accessibility bar, an easy language switch for pages in easy language (Leichte Sprache), a form error summary, a table of contents and tabs that stay readable without JavaScript.<\/li>\n<li><strong>Structured data.<\/strong> NewsArticle or BlogPosting, CollectionPage and ProfilePage as JSON-LD and a news sitemap, switched off while an SEO plugin such as Yoast SEO or Rank Math is active.<\/li>\n<li><strong>WooCommerce.<\/strong> A product comparison block, 10 abilities for products and categories and the recipe Shop, all registered only while WooCommerce is active.<\/li>\n<\/ul>\n\n<h4>Leitvia Pro<\/h4>\n\n<p>Everything above is free and stays free, and no feature is locked. The separate paid add-on Leitvia Pro adds the blocks Slider, Scroll story, Before and after and Entry list, and eight industry kits with their own brand, pages and patterns. See <a href=\"https:\/\/leitvia.com\/pricing\/\">Leitvia plans and prices<\/a>.<\/p>\n\n<h3>Works with the official WordPress agent skills<\/h3>\n\n<p>Leitvia Studio follows the standards WordPress sets for AI agents and will keep following them:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/WordPress\/agent-skills\">WordPress agent skills<\/a>: an AI agent with only the official skills finds the Leitvia abilities with <code>GET \/wp-json\/wp-abilities\/v1\/abilities?category=leitvia<\/code>.<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/apis\/abilities-api\/\">Abilities API<\/a>: every ability has described input fields, an output schema and annotations (readonly, destructive, idempotent), and runs under <code>\/wp-json\/wp-abilities\/v1<\/code>.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/mcp-adapter\/\">MCP Adapter<\/a> 0.7: its default server lists the Leitvia abilities through discover-abilities and execute-ability, with the same checks.<\/li>\n<\/ul>\n\n<p>The <a href=\"https:\/\/github.com\/cmsadmins\/leitvia-skills\">Leitvia agent skills on GitHub<\/a> add eleven skills for setup, design, pages, patterns, maintenance, accessibility, migration, shop catalog, news, SEO and reports, and three workflows. They work side by side with the WordPress skills. The <a href=\"https:\/\/leitvia.com\/docs\/developers\/\">Leitvia developer guide<\/a> shows the calls with real answers.<\/p>\n\n<p>Core preset slugs such as base, contrast or spacing 50 map to the roles of the design contract, so content written by AI agents trained on default themes still fits. Theme files of your own go into the child theme <a href=\"https:\/\/github.com\/cmsadmins\/leitvia-child\">Leitvia Child<\/a>, blocks of your own into a plugin built from <a href=\"https:\/\/github.com\/cmsadmins\/leitvia-block-starter\">Leitvia Block Starter<\/a>. No agent writes files into the theme.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>Leitvia Studio sends no visitor data anywhere and sets no cookies. Embeds from other sites (the Embed block and its variations such as YouTube, and iframes from other sites in classic content and in Custom HTML blocks) show a placeholder until the visitor clicks \"Load content from\" followed by the name of the provider (for example \"Load content from YouTube\"); only then does the visitor's browser contact the provider. When a visitor ticks \"Always allow YouTube on this site\" (with the name of the provider), the list of allowed providers is stored in the visitor's browser (localStorage, key <code>leitvia-consent<\/code>), never on the server; the Consent Settings block lists and revokes these entries. Without JavaScript the placeholder only links to the content on the provider's site. The setting \"Ask visitors before loading embedded content from other sites\" turns the placeholder off; deactivating Leitvia Studio also brings back the embeds as WordPress renders them. When you save a post, WordPress itself asks the provider for the embed code (oEmbed), as without the plugin; that request comes from your server and carries no visitor data.<\/p>\n\n<p>The list carries the path of the site in its key (<code>leitvia-consent:\/<\/code> for a site at the root, <code>leitvia-consent:\/club\/<\/code> for a site below <code>\/club\/<\/code>), because sites of a subdirectory network or installations in folders of one domain share the local storage of the browser. Consent given on one of them never applies to another. A list stored by an older version under <code>leitvia-consent<\/code> carries over on a site at the root path only.<\/p>\n\n<p>The Accessibility bar stores text size and high contrast in the visitor's browser (localStorage, key <code>leitvia-a11y<\/code>), only after the visitor changes one of them. Read aloud uses the speech synthesis of the browser with a voice installed on the device; the button only appears when such a voice exists for the language of the page, and voices from online services are never used.<\/p>\n\n<p>The Contact form block sends the name, email address and message a visitor enters by email to the address set in the block, or to the administration address of the site, and stores none of it on the site. To limit the messages per connection it keeps a counter for one hour under a salted hash of the IP address; the address itself is not stored. It sets no cookies and contacts no other service. Name the form in your privacy policy.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external service by default. The check after an AI agent changed a page live loads that page from your own site (a loopback request, see the question on requests from your server); it contacts no other host.<\/p>\n\n<p>AI provider of the site owner: only when an agent or a user calls the ability \"Plan page\" (leitvia\/plan-page) with ai set to true, Leitvia Studio sends one request through the AI client of WordPress to the AI connector an administrator set up under Settings, Connectors (for example OpenAI, Anthropic or Google). Leitvia Studio has no provider of its own and stores no keys. The request holds the goal and the content points given in that call, the page frame and composition rules of the contract, and the names and metadata of the patterns; no posts, no user data and no other content of the database. Without that call, nothing is sent. The terms and privacy policy of the provider the administrator chose apply.<\/p>\n\n<p>Embedded content: when a visitor clicks \"Load content from\" with the name of the provider in the placeholder of an embed, or has chosen to always allow that provider, the visitor's browser loads the embedded content from the provider. The provider receives the visitor's IP address, browser details and the page address, and may set cookies. Nothing is loaded before that action. The providers Leitvia Studio names, with their privacy policies (other embed providers are named after their host):<\/p>\n\n<ul>\n<li>YouTube (Google): <a href=\"https:\/\/policies.google.com\/privacy\">privacy policy<\/a>, <a href=\"https:\/\/www.youtube.com\/t\/terms\">terms<\/a><\/li>\n<li>Vimeo: <a href=\"https:\/\/vimeo.com\/privacy\">privacy policy<\/a>, <a href=\"https:\/\/vimeo.com\/terms\">terms<\/a><\/li>\n<li>X: <a href=\"https:\/\/x.com\/en\/privacy\">privacy policy<\/a>, <a href=\"https:\/\/x.com\/en\/tos\">terms<\/a><\/li>\n<li>Spotify: <a href=\"https:\/\/www.spotify.com\/legal\/privacy-policy\/\">privacy policy<\/a>, <a href=\"https:\/\/www.spotify.com\/legal\/end-user-agreement\/\">terms<\/a><\/li>\n<li>SoundCloud: <a href=\"https:\/\/soundcloud.com\/pages\/privacy\">privacy policy<\/a>, <a href=\"https:\/\/soundcloud.com\/terms-of-use\">terms<\/a><\/li>\n<li>TikTok: <a href=\"https:\/\/www.tiktok.com\/legal\/privacy-policy\">privacy policy<\/a>, <a href=\"https:\/\/www.tiktok.com\/legal\/terms-of-service\">terms<\/a><\/li>\n<\/ul>\n\n<p>Map tiles: the Map block shows a list of places with links to openstreetmap.org and a placeholder for the interactive map. Only when a visitor clicks \"Load content from OpenStreetMap\", or has chosen to always allow it, does the visitor's browser load map images (tiles) from the tile server. The tile server receives the visitor's IP address, browser details and the page address. Nothing is loaded before that action, and the block editor shows no map. The default tile server is the one of the OpenStreetMap Foundation; administrators can enter another one under Leitvia Studio, Settings, \"Map tile server\" (https only), in which case the placeholder names that server. Check the terms of use and the privacy policy of the server you use.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/operations.osmfoundation.org\/policies\/tiles\/\">OpenStreetMap tile usage policy<\/a><\/li>\n<li><a href=\"https:\/\/osmfoundation.org\/wiki\/Privacy_Policy\">OpenStreetMap Foundation privacy policy<\/a><\/li>\n<\/ul>\n\n<p>Emoji images: the emoji script of WordPress is off while Leitvia Studio is active. Only if an administrator switches on \"Load the emoji script of WordPress\" in the Leitvia Studio settings, browsers without their own emoji fonts load emoji images from s.w.org, a server of WordPress.org (Automattic Inc. on its behalf), which receives the visitor's IP address, browser details and the page address; feeds and emails then link these images as well.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/about\/privacy\/\">WordPress.org privacy policy<\/a><\/li>\n<\/ul>\n\n<p>The other exception is Gravatar, a service of Automattic Inc., and only if an administrator switches on \"Allow Gravatar for users and commenters without a local picture\" in the Leitvia Studio settings. Then, on every page view that shows a profile picture of someone without a picture from the media library, the visitor's browser requests that picture from Gravatar. Gravatar receives the visitor's IP address and a hash of the email address of the user or commenter.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/automattic.com\/tos\/\">Gravatar terms of service<\/a><\/li>\n<li><a href=\"https:\/\/automattic.com\/privacy\/\">Automattic privacy policy<\/a><\/li>\n<\/ul>\n\n<h3>Third-party libraries<\/h3>\n\n<p>The accessibility check bundles <a href=\"https:\/\/github.com\/dequelabs\/axe-core\">axe-core<\/a> 4.13.0 by Deque Systems, Inc. into <code>build\/axe-runner.js<\/code>. axe-core is licensed under the Mozilla Public License 2.0 (MPL-2.0); the license text is in <code>licenses\/AXE-CORE.txt<\/code> and the notices of the libraries it includes are in <code>licenses\/AXE-CORE-THIRD-PARTY.txt<\/code>. MPL-2.0 is compatible with the GPL: its section 3.3 allows combining the covered code with GPL-licensed code, and axe-core does not use the \"Incompatible With Secondary Licenses\" notice. The unmodified source code is available from the axe-core repository and the npm package <code>axe-core<\/code>. The file is served from your own site and makes no external requests.<\/p>\n\n<p>The headings of the Studio admin screens use <a href=\"https:\/\/github.com\/googlefonts\/opensans\">Open Sans<\/a> by The Open Sans Project Authors, weights 600 and 700, reduced to the Latin characters and stored as WOFF2 in <code>assets\/fonts\/open-sans\/<\/code>. Open Sans is licensed under the SIL Open Font License 1.1; the license text is in <code>licenses\/OPEN-SANS.txt<\/code>.<\/p>\n\n<p>Token sets can name <a href=\"https:\/\/github.com\/googlefonts\/Libre-Franklin\">Libre Franklin<\/a> by The Libre Franklin Project Authors (one variable file each for upright and italic, weights 100 to 900, in <code>assets\/fonts\/libre-franklin\/<\/code>, license <code>licenses\/LIBRE-FRANKLIN.txt<\/code>) and <a href=\"https:\/\/github.com\/noirblancrouge\/YoungSerif\">Young Serif<\/a> by The Young Serif Project Authors (regular weight without an italic cut, in <code>assets\/fonts\/young-serif\/<\/code>, license <code>licenses\/YOUNG-SERIF.txt<\/code>). Both are reduced to the Latin characters, stored as WOFF2, licensed under the SIL Open Font License 1.1, served from your own site and loaded only on sites whose active token set uses them.<\/p>\n\n<p>The Map block bundles <a href=\"https:\/\/leafletjs.com\/\">Leaflet<\/a> 1.9.4 by Volodymyr Agafonkin and contributors into <code>build\/blocks\/map\/leaflet.js<\/code>, loaded only after the visitor agrees to load the map, and ships its stylesheet as <code>build\/blocks\/map\/leaflet.css<\/code>. Leaflet is licensed under the BSD 2-Clause License, which is compatible with the GPL; the license text is in <code>licenses\/LEAFLET.txt<\/code>.<\/p>\n\n<p>Icons: 116 icons of <a href=\"https:\/\/lucide.dev\/\">Lucide<\/a> 1.60.0, ISC License (some from Feather, MIT), in <code>assets\/icons\/lucide.json<\/code>, license in <code>licenses\/LUCIDE.txt<\/code>.<\/p>\n\n<p>The pattern illustration <code>assets\/images\/landscape.webp<\/code> was drawn for Leitvia by CMS ADMINS and is licensed under the GPL, version 2 or later, like the plugin.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>The <code>src\/<\/code> folder contains the source code of the files in <code>build\/<\/code>, and <code>webpack.config.js<\/code> and <code>bin\/guard-blocks-manifest.mjs<\/code> are the build configuration. To create <code>build\/<\/code> yourself, run <code>npm ci<\/code> and then <code>npm run build<\/code> in the plugin folder with Node.js 24 (or 22.22.2 and later). <code>package-lock.json<\/code> holds the exact versions of all build tools and libraries, so the result matches the files in <code>build\/<\/code> of this release. The same source is in the <a href=\"https:\/\/github.com\/cmsadmins\/leitvia-studio\">Leitvia Studio repository on GitHub<\/a>.<\/p>\n\n<h3>Support<\/h3>\n\n<p>Leitvia Studio is developed and maintained by <a href=\"https:\/\/www.cms-admins.de\/\">CMS ADMINS<\/a>. Ask questions in the support forum of the plugin on WordPress.org or write to support@cms-admins.de. Report security issues and accessibility barriers to the same address; we answer within five working days.<\/p>\n\n<h3>Legal<\/h3>\n\n<p>Leitvia Studio is a product of CMS ADMINS, a brand of Patrick Schlesinger, Parkstra\u00dfe 19, 80339 M\u00fcnchen, Germany. Contact: support@cms-admins.de.<\/p>\n\n<p>Disclaimer: Leitvia Studio is free software under the GNU GPL, version 2 or later. It is provided as is, without any warranty, to the extent permitted by applicable law; see sections 11 and 12 of the GPL. You are responsible for checking that your site meets the legal requirements that apply to it, such as accessibility, privacy and imprint duties; Leitvia Studio helps with these but does not replace that check.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/leitvia.com\/legal-notice\/\">Imprint<\/a> (<a href=\"https:\/\/leitvia.com\/de\/impressum\/\">German original<\/a>)<\/li>\n<li><a href=\"https:\/\/leitvia.com\/privacy-policy\/\">Privacy policy of leitvia.com<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin on the Plugins screen (search for Leitvia Studio), or upload the <code>leitvia-studio<\/code> folder to <code>\/wp-content\/plugins\/<\/code>. With WP-CLI: <code>wp plugin install leitvia-studio --activate<\/code>.<\/li>\n<li>Activate the plugin. The menu Leitvia Studio appears with Pattern Lab, Tokens, Content Model, Recipes, Agents and Settings.<\/li>\n<li>Optional, to connect an AI agent over MCP: install and activate <a href=\"https:\/\/wordpress.org\/plugins\/mcp-adapter\/\">MCP Adapter<\/a>. Without it, agents use the REST API.<\/li>\n<li>Under Leitvia Studio, Agents, create an agent user, copy its application password (it is shown once) and set the autonomy level per area.<\/li>\n<li>Point the agent at <code>https:\/\/your-site.example\/wp-json\/leitvia-studio\/v1\/mcp<\/code> with that password. The <a href=\"https:\/\/leitvia.com\/docs\/getting-started\/\">getting started guide<\/a> has the configuration for Claude Code, Codex CLI, Gemini CLI and Cursor.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20leitvia%20studio%3F\"><h3>What is Leitvia Studio?<\/h3><\/dt>\n<dd><p>Leitvia Studio is a free WordPress plugin that lets AI agents build and maintain sites with block themes through 59 abilities of the WordPress Abilities API, with checks, an autonomy level per area, a review inbox and rollback. It also adds a Pattern Lab, design tokens in the DTCG format, a content model with block bindings, site recipes and blocks for privacy, accessibility and offers. It needs WordPress 7.1 and PHP 8.2 or later.<\/p><\/dd>\n<dt id=\"does%20leitvia%20studio%20work%20with%20claude%2C%20chatgpt%20or%20cursor%3F\"><h3>Does Leitvia Studio work with Claude, ChatGPT or Cursor?<\/h3><\/dt>\n<dd><p>Leitvia Studio works with any MCP client that connects over HTTP and can send an Authorization header. The AI agent signs in with the application password of a Leitvia Agent user. Studio offers no OAuth sign-in, so a client that connects to MCP servers only through OAuth cannot reach the server \"leitvia\" directly. Any tool that can call a REST API with Basic auth can use the same abilities under <code>\/wp-json\/wp-abilities\/v1<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20ai%20agents%20use%20leitvia%3F\"><h3>How do AI agents use Leitvia?<\/h3><\/dt>\n<dd><p>An AI agent such as Claude Code, Codex or Cursor connects to your site over MCP or the REST API with the application password of an agent user from Leitvia Studio, Agents. It reads the design contract and the outline of a page first, then calls the Leitvia abilities, and every change runs through the gateway checks and your autonomy levels. No service of ours sits in between: the agent signs in as a user of your site that an administrator created, with the role Leitvia Agent and without administrator rights. It works on content, media, navigation, template parts and token set drafts. It cannot install, activate, update or remove plugins or themes, manage users, log in to wp-admin or edit code. The role itself stores no capability: Studio gives an agent the rights for content, media and theme options only while it runs. Deactivate Studio or remove its folder and the agent has the rights of a user without a role: it can sign in and change its own profile, as any WordPress user can, and nothing on the site. Its application password stays and works again when you activate Studio. Deleting Studio in the admin removes the application passwords of agents and the role; the users and their content stay. Application passwords come into being only when an administrator creates an agent or a new password on the Agents screen, and the password is shown there once. Changes to site settings (such as the front page or the comment defaults), the content model, the active token set or the global styles only ever reach the inbox as a suggestion that a person applies or rejects, whatever the autonomy profile. Ready-made agent skills for setup, design, pages, patterns, maintenance, accessibility and migration, with the full reference of all abilities, are described in the <a href=\"https:\/\/leitvia.com\/docs\/\">Leitvia documentation<\/a>.<\/p><\/dd>\n<dt id=\"does%20leitvia%20studio%20need%20an%20api%20key%20or%20an%20account%3F\"><h3>Does Leitvia Studio need an API key or an account?<\/h3><\/dt>\n<dd><p>No. Leitvia Studio needs no API key, no account and no service of ours. The AI agent is a program you choose, and it signs in to your site with an application password that an administrator creates. Only the ability \"Plan page\" with ai set to true uses an AI provider, and only the one an administrator set up under Settings, Connectors (see External services).<\/p><\/dd>\n<dt id=\"is%20leitvia%20studio%20free%3F\"><h3>Is Leitvia Studio free?<\/h3><\/dt>\n<dd><p>Yes. Leitvia Studio is free under the GPL, version 2 or later, with no locked features and no upsell notices. Leitvia Pro is a separate paid plugin with extra blocks and industry kits.<\/p><\/dd>\n<dt id=\"is%20leitvia%20studio%20gdpr%20compliant%3F\"><h3>Is Leitvia Studio GDPR compliant?<\/h3><\/dt>\n<dd><p>Leitvia Studio sends no visitor data to other hosts and sets no cookies, which makes a GDPR compliant site easier to run; compliance itself depends on your whole site and how you run it. Embeds and map tiles load only after the visitor agrees, Gravatar and the emoji images of WordPress stay off unless an administrator switches them on, and fonts come from your own site. Apart from the optional AI planning call described under External services, its only server side request goes to your own site. Every exception is listed under Privacy and External services.<\/p><\/dd>\n<dt id=\"does%20leitvia%20studio%20make%20my%20site%20accessible%20under%20wcag%202.2%2C%20the%20eaa%20or%20the%20bfsg%3F\"><h3>Does Leitvia Studio make my site accessible under WCAG 2.2, the EAA or the BFSG?<\/h3><\/dt>\n<dd><p>No plugin can make a site accessible on its own, and Leitvia Studio does not claim to. Its admin screens and blocks are built to meet WCAG 2.2 level AA and BITV 2.0, and before an AI agent change goes live the gateway checks headings, alt text, link text, contrast and landmarks and refuses changes that bring new findings. Whether your site meets WCAG, the European Accessibility Act or the German BFSG also depends on the theme, the content and other plugins, and needs a test by people.<\/p><\/dd>\n<dt id=\"how%20accessible%20are%20the%20admin%20screens%20and%20blocks%3F\"><h3>How accessible are the admin screens and blocks?<\/h3><\/dt>\n<dd><p>Leitvia Studio is built to meet WCAG 2.2 level AA and BITV 2.0 in its admin screens and in the blocks it adds to the front end:<\/p>\n\n<ul>\n<li>The admin screens Pattern Lab, Tokens, Content Model, Recipes, Agents with its Inbox tab and Settings work with the keyboard, keep a visible focus, label every field and announce results in a status message. Wide tables scroll in their own box at 320 px instead of the page.<\/li>\n<li>The inbox shows each change of an agent as a block diff in plain text with the text before and after, never by color alone. Revoking an agent and the profile \"Fully autonomous\" ask for a confirmation.<\/li>\n<li>Blocks keep their content readable without JavaScript: tabs, table of contents, mega menu links, pricing period switch, comparison tables and the form error summary. Moving blocks (marquee, counter, reveal) stand still when the operating system asks for reduced motion, and the marquee has a Pause button.<\/li>\n<li>Before an agent change goes live, the gateway checks heading structure, alt text, link text, color pairs of the active palette and the landmarks of the rendered page, and refuses changes that bring new findings.<\/li>\n<\/ul>\n\n<p>Automated tests run axe in three widths and keyboard tests on the admin screens, and axe on every block. They do not replace a test by people, and the accessibility of a site also depends on its theme, content and other plugins. Report accessibility problems on the <a href=\"https:\/\/leitvia.com\/accessibility\/\">Leitvia accessibility page<\/a>.<\/p><\/dd>\n<dt id=\"what%20are%20pages%20in%20easy%20language%3F\"><h3>What are pages in easy language?<\/h3><\/dt>\n<dd><p>Pages in easy language (Leichte Sprache), which public bodies in Germany offer under BITV 2.0, are normal pages: the page sidebar marks one as the easy language version of another, and the block \"Easy language switch\" links both. The block \"Accessibility bar\" for the header collects the links to easy language, the accessibility statement and sign language and, with JavaScript, adds text size, high contrast and read aloud. It is an extra, not a fix: pages must be accessible without it.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20without%20the%20leitvia%20theme%3F\"><h3>Does the plugin work without the Leitvia theme?<\/h3><\/dt>\n<dd><p>Yes. It works with any block theme. The theme Leitvia adds a design contract with fixed roles for colors, spacing and font sizes, 70 patterns and shop templates, which AI agents and the Pattern Lab read.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20deactivate%20leitvia%20studio%3F\"><h3>What happens when I deactivate Leitvia Studio?<\/h3><\/dt>\n<dd><p>Your posts, pages, patterns, global styles and images stay, because Studio stores them in WordPress core structures. Blocks connected to content model fields show the content saved in the block, embeds render as WordPress renders them, and AI agent users lose every right on the site until you activate Studio again. If Gravatar was off, Studio switches \"Show Avatars\" off so that avatars do not start loading from Gravatar; the questions below explain both steps in detail.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20change%20my%20front%20end%3F\"><h3>Does the plugin change my front end?<\/h3><\/dt>\n<dd><p>Only where you use its features. It loads scripts and styles for visitors only on pages with its blocks or an embed placeholder. It does change front end output in eight places: structured data in the head of posts, archives and author pages with the news sitemap and its line in robots.txt, while no SEO plugin is active the canonical link of archives and a stored SEO title, description and robots, profile pictures and the placeholder replace Gravatar images wherever WordPress shows avatars, embeds from other sites wait behind a consent placeholder, a scheduled token overlay changes the styles while it runs, the \"Child entries\" query lists the rows of a content model entry, code blocks get a \"Copy code\" button that shows once JavaScript runs, and the emoji script of WordPress is left out (see below). The Lab preview, which logged-in editors open from the admin, loads its own scripts, and axe-core only while an accessibility check runs.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20blocks%20connected%20to%20content%20model%20fields%20when%20i%20deactivate%20the%20plugin%3F\"><h3>What happens to blocks connected to content model fields when I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Paragraphs, headings, buttons and images can show content model fields, site settings and related entries through block bindings. A site setting is only available to blocks when its declaration sets \"bindable\" to true, because its value is then shown to every visitor. Without Leitvia Studio, WordPress shows the content saved in the block instead. When you connect an empty block, the editor saves the field name as that content, so the block is never left empty.<\/p><\/dd>\n<dt id=\"what%20are%20building%20blocks%3F\"><h3>What are building blocks?<\/h3><\/dt>\n<dd><p>A building block is one content feature of an add-on, such as events or a team: content types, the sections that show them and sample drafts. Adding one leaves design and pages alone. A section whose building block is missing says so in the editor and sets it up in one click; visitors never see it empty. Developers use the registry building_blocks, AI agents the ability leitvia\/add-building-block.<\/p><\/dd>\n<dt id=\"how%20do%20i%20mark%20posts%20as%20news%20articles%3F\"><h3>How do I mark posts as news articles?<\/h3><\/dt>\n<dd><p>Every post is a news article until you choose categories under Studio, Settings, Design and search, \"Posts that are news\"; posts outside them get the type BlogPosting and stay out of the news sitemap. The filter <code>leitvia_studio_news_categories<\/code> receives that list and can return other slugs or IDs. The setting \"Add structured data to posts and author pages\" switches the structured data off, \"Publish a news sitemap for Google News\" the sitemap; the sitemap also stays off while the site discourages search engines or another plugin makes a news sitemap (filter <code>leitvia_studio_news_sitemap_enabled<\/code>). The filter <code>leitvia_studio_seo_plugin_active<\/code> tells Leitvia Studio about an SEO plugin it does not detect.<\/p>\n\n<p>Posts, archives and author pages get structured data for search engines (JSON-LD): NewsArticle or BlogPosting, CollectionPage and ProfilePage, with three image sizes of 1200 px made on upload. The news sitemap for Google News lists the last 48 hours at \/news.xml. While an SEO plugin such as Yoast SEO or Rank Math is active, Leitvia Studio prints none, so that plugin stays the only source.<\/p><\/dd>\n<dt id=\"which%20forms%20does%20the%20%22form%20error%20summary%22%20block%20work%20with%3F\"><h3>Which forms does the \"Form error summary\" block work with?<\/h3><\/dt>\n<dd><p>With every form inside it: forms of core such as the Search block and the comment form, forms of plugins such as Gravity Forms, and your own HTML form in a Custom HTML block. When a visitor submits a form with errors, the block lists them above the form with links to the fields, describes each error at its field and moves the focus to the list. Errors a plugin reports after sending the form (fields marked with aria-invalid=\"true\", Gravity Forms field errors) show in the list right on load, also without JavaScript. Without JavaScript the browser and the form plugin validate as before. The error page of core for comments is a page of its own and stays as it is.<\/p><\/dd>\n<dt id=\"why%20does%20the%20emoji%20script%20of%20wordpress%20no%20longer%20load%3F\"><h3>Why does the emoji script of WordPress no longer load?<\/h3><\/dt>\n<dd><p>WordPress prints a small script into every page that checks whether the browser can show emoji. Browsers without emoji fonts then load every emoji as an image from s.w.org, a server of WordPress.org, and feeds and emails link emoji images from there as well. That is a request to another host without the visitor's consent. Leitvia Studio leaves the script, its styles and the emoji images in feeds and emails out. Current browsers show emoji with their own fonts, so nothing changes for most visitors. Under Leitvia Studio, Settings, \"Load the emoji script of WordPress\" brings it back.<\/p><\/dd>\n<dt id=\"what%20does%20leitvia%20studio%20add%20for%20woocommerce%3F\"><h3>What does Leitvia Studio add for WooCommerce?<\/h3><\/dt>\n<dd><p>Three things, registered only while WooCommerce is active:<\/p>\n\n<ul>\n<li>The block \"Product comparison\" shows two to four products in a table with caption, column and row headers: live prices with the tax note, rating, the attributes you choose, availability and an \"Add to cart\" link that names its product. On small screens each product becomes a card, and the table is readable without JavaScript. Prices come from your own shop, never from another host.<\/li>\n<li>Gateway abilities let AI agents list and read products, update products, categories and tags, and set featured products, upsells, cross-sells and the sort order. They work in the area \"Products\", which starts at the level \"draft\", with snapshot and rollback like every other change. Prices, taxes and shipping reach the shop at most as a suggestion a person has to apply. Orders, refunds, coupons and customer data stay out of reach of agents, and reading a product never returns sales figures.<\/li>\n<li>The recipe \"Shop\" sets up a shop with the Leitvia theme: shop header with product search, account and mini cart, a home page from the shop patterns, about and contact pages, and the legal pages imprint, privacy policy, terms, right of withdrawal and shipping and payment with placeholder text you replace. It switches off order attribution, usage tracking, marketplace suggestions and remote logging of WooCommerce. Apply it with <code>wp leitvia recipe apply leitvia\/shop --user=&lt;admin&gt;<\/code> or through an agent.<\/li>\n<\/ul>\n\n<p>The shop templates, patterns and styles themselves come with the Leitvia theme.<\/p><\/dd>\n<dt id=\"does%20leitvia%20studio%20use%20gravatar%3F\"><h3>Does Leitvia Studio use Gravatar?<\/h3><\/dt>\n<dd><p>No, not unless an administrator switches it on. Users pick their profile picture from the media library on their profile screen. Everyone without a local picture, including people who leave comments, gets a neutral placeholder that ships with the plugin. Under Leitvia Studio, Settings, \"Allow Gravatar for users and commenters without a local picture\" turns Gravatar on for them; local pictures are always used first.<\/p>\n\n<p>When you deactivate Leitvia Studio while Gravatar is off and \"Show Avatars\" under Settings, Discussion is on, it switches \"Show Avatars\" off, so saved avatar blocks and comment avatars do not start loading Gravatar. Activating Leitvia Studio again switches it back on, but only if Leitvia Studio was the one that switched it off; a setting you changed yourself stays as it is. If the plugin folder is deleted without deactivating the plugin first (for example over FTP), this step cannot run; switch off \"Show Avatars\" yourself in that case.<\/p><\/dd>\n<dt id=\"does%20leitvia%20studio%20send%20requests%20from%20my%20server%3F\"><h3>Does Leitvia Studio send requests from my server?<\/h3><\/dt>\n<dd><p>Only to your own site. After an AI agent changed something live, a WordPress cron event loads the changed page once, as a visitor would see it (a loopback request to the address of your site, nowhere else). It checks the HTTP status, PHP warnings and errors of themes and plugins, one h1, the header, main and footer landmarks, block markup or JSON showing on the page, and the color pairs of the active palette. If the check fails, a change the agent made at the level \"autonomous\" is rolled back, unless someone changed the page in the meantime; otherwise the change package in the inbox shows the result. Some hosts and firewalls block loopback requests; the check then counts as \"unverifiable\", never rolls anything back and shows a note in the inbox. The setting \"Verify after writing\" of the gateway turns the check off.<\/p><\/dd>\n<dt id=\"can%20i%20run%20leitvia%20studio%20from%20the%20command%20line%3F\"><h3>Can I run Leitvia Studio from the command line?<\/h3><\/dt>\n<dd><p>Yes. With WP-CLI, <code>wp leitvia tokens|patterns|model|audit|package|recipe<\/code> lists, exports and imports token sets, patterns and the content model, runs the site audit, works with change packages and applies recipes. Commands that write need <code>--user<\/code> and go through the same checks as AI agents; <code>wp help leitvia<\/code> lists them all.<\/p><\/dd>\n<dt id=\"can%20ai%20agents%20connect%20over%20mcp%3F\"><h3>Can AI agents connect over MCP?<\/h3><\/dt>\n<dd><p>Yes, when the plugin MCP Adapter (version 0.7.x) is installed and active; Leitvia Studio neither bundles nor requires it. Studio then adds its own MCP server \"leitvia\" at <code>\/wp-json\/leitvia-studio\/v1\/mcp<\/code> (HTTP) that offers exactly the Leitvia abilities as tools, with read only, destructive and idempotent hints. The default server of the adapter (<code>\/wp-json\/mcp\/mcp-adapter-default-server<\/code>) offers the same abilities through its tools discover-abilities and execute-ability, for AI agents that only know the WordPress agent skills. Agents sign in with an application password of a user with the role \"Leitvia Agent\"; the adapter checks the capability and every write still runs through the gateway pipeline. Rejections carry their code and data as JSON in the error text, on both servers. Over WP-CLI the same server runs as <code>wp mcp-adapter serve --server=leitvia --user=&lt;agent&gt;<\/code>. Without the adapter all abilities stay available over the REST API.<\/p>\n\n<p>Users with the role \"Leitvia Agent\" read through any REST route, but they change the site only through the Leitvia abilities and the MCP server; other REST routes refuse their writes and XML-RPC refuses them completely.<\/p><\/dd>\n<dt id=\"how%20are%20images%20protected%20that%20wait%20in%20a%20change%20package%3F\"><h3>How are images protected that wait in a change package?<\/h3><\/dt>\n<dd><p>An image an AI agent adds while a change package waits for a decision lies in a folder with a random name below <code>wp-content\/uploads\/leitvia-studio\/private\/<\/code> until a person applies the package; rejecting the package deletes it. Apache reads the <code>.htaccess<\/code> file there and denies access. nginx ignores it, so add this rule to the server block of the site (adjust the path if your uploads folder lives elsewhere):<\/p>\n\n<pre><code>location ^~ \/wp-content\/uploads\/leitvia-studio\/private\/ { deny all; }\n<\/code><\/pre>\n\n<p>Versions before 1.3.10 used <code>wp-content\/uploads\/leitvia-private\/<\/code>. The first page load after the update moves the waiting images to the new folder and removes the old one, and waiting packages keep working; an nginx rule for the old folder can go after that.<\/p><\/dd>\n<dt id=\"which%20html%20may%20users%20without%20unfiltered_html%20save%3F\"><h3>Which HTML may users without unfiltered_html save?<\/h3><\/dt>\n<dd><p>WordPress filters the posts of users without the capability unfiltered_html (authors, editors on a network, AI agents) through its list of allowed HTML. The pricing switch, the feature filter and the wizard steps of Leitvia Studio are radio buttons and checkboxes, which that list does not contain, so Leitvia Studio adds the element <code>input<\/code> for post content, with the attributes type, name, value, checked and required only. The type must be radio or checkbox; an input of any other type is removed, so these users cannot build text or password fields, and event handlers, style, formaction and src stay out. Nothing else changes, and users with unfiltered_html are not affected.<\/p><\/dd>\n<dt id=\"does%20leitvia%20studio%20work%20in%20a%20multisite%20network%3F\"><h3>Does Leitvia Studio work in a multisite network?<\/h3><\/dt>\n<dd><p>Yes. Every site keeps its own settings, token sets, content model, audit log, snapshots and change packages; Studio installs a new site of the network by itself and removes its tables and data when the site is deleted. Activate Studio for the whole network: only then is Gravatar also blocked in the network admin and on every site.<\/p>\n\n<ul>\n<li>AI agents: users belong to the network. A new agent needs the capability to create users (for site administrators the network setting \"Add New Users\"). A site administrator manages only agents that work on no other site; agents on several sites are managed by a network administrator. An application password created on the Agents screen works on its own site only.<\/li>\n<li>Agents address a site by its address, in a subdirectory network with its path (<code>https:\/\/example.org\/club\/wp-json\/...<\/code>). The ability \"Get contract\" names the address and REST base of the site.<\/li>\n<li>Site administrators have no <code>unfiltered_html<\/code>: imported patterns are filtered like any post, and CSS in global styles needs <code>edit_css<\/code>. Profile pictures belong to the media library of their site.<\/li>\n<li>With <code>DISABLE_WP_CRON<\/code> every site needs its own cron run, for example <code>wp site list --field=url | xargs -I{} wp cron event run --due-now --url={}<\/code>.<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20stays%20after%20deleting%20studio%3F\"><h3>What stays after deleting Studio?<\/h3><\/dt>\n<dd><p>Deleting the plugin always removes its settings, change packages, audit log, snapshots, the agent role and the application passwords of agents. Your posts, pages, patterns, global styles, images and agent users stay. Token sets, the content model declaration, Lab metadata, profile picture assignments and the marks that agents leave on posts (AI generated, sources, recipe hash) go only when \"Delete all Studio data when the plugin is deleted\" is on under Leitvia Studio, Settings.<\/p>\n\n<p>\"Show Avatars\" under Settings, Discussion stays off if Studio switched it off: without Studio, WordPress loads avatars from Gravatar, which sends the IP address of every visitor to Automattic. Switch it on only if you want that or use another avatar plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.46<\/h4>\n\n<ul>\n<li>The readme spells out the labels of the consent placeholder (\"Load content from YouTube\") instead of a placeholder in angle brackets, which the readme parser of WordPress.org removed.<\/li>\n<li>German: the AI connector is called Konnektor and its screen Einstellungen, Konnektoren, as in WordPress itself; the approvals of the AI plugin are Konnektor-Freigaben.<\/li>\n<\/ul>\n\n<h4>1.3.45<\/h4>\n\n<ul>\n<li>The plugin is listed as Leitvia Studio: AI Agents, MCP and Design Tokens for Block Themes; the slug stays leitvia-studio, and the screens keep the name Leitvia Studio. The readme answers the common questions on AI agents, MCP clients, privacy and accessibility, and keeps the last five versions, older ones are in changelog.txt.<\/li>\n<li>Fields, site values, Lab notes and token documents clean their text for its type on every write, not only over REST: tags and scripts are never stored, line breaks stay only in text areas, and a URL, email address, number, date or option keeps only a value of its type.<\/li>\n<li>Dates bound to the post date block give WordPress a value it can read, so the date shows on sites in every language; an image field gives the caption and title of the media library, never its address.<\/li>\n<li>core\/post-meta shows the fields of the content model like leitvia\/meta (option labels, dates in the site format, types without single pages); in the editor such a binding becomes leitvia\/meta, so typed text is stored the way the field type needs.<\/li>\n<li>The check leitvia\/bindings refuses bindings that would render nothing (a source that is not registered, an attribute WordPress does not bind, a field that is not declared), and a text edit of a bound attribute is refused with the way to change the value.<\/li>\n<li>leitvia\/get-content-model lists the binding sources, the attributes WordPress binds per block and the values of bindable site settings with their hash. The new ability leitvia\/update-site-values sets those values, such as opening hours, in a change package, and create-content and update-content write repeater rows through rows.<\/li>\n<\/ul>\n\n<h4>1.3.44<\/h4>\n\n<ul>\n<li>Every REST route of Studio describes its answer in a schema, and OPTIONS shows it; a test keeps it that way for new routes.<\/li>\n<li>Child themes of Leitvia: a child theme contract with \"extends\": \"leitvia\" adds its patterns to the contract of the parent. Switching between Leitvia and its child theme copies global styles, the active token set and edited templates and template parts to the new theme, without overwriting anything there.<\/li>\n<\/ul>\n\n<h4>1.3.43<\/h4>\n\n<ul>\n<li>The abilities pass the checks of the WordPress agent skills: every required input has a description, the output of every write says what mode, level, hash, package and snapshot mean, and the annotations match what the abilities do (apply-package, apply-recipe, define-content-type, repair-links and set-alt-text are destructive, plan-page with AI reaches an outside service).<\/li>\n<li>The default server of the MCP Adapter lists the Leitvia abilities as well (discover-abilities, execute-ability), with the same checks, autonomy levels and change packages, and returns a rejection in full with code, message and data.<\/li>\n<li>get-tokens, get-content-model and get-contract return the hashes the write abilities need; a stale hash is named in the message of the rejection. get-contract also returns the core preset aliases of the theme.<\/li>\n<li>Content written with core preset names (base, contrast, primary, spacing 50 and the like) is saved with the roles of the theme. The token check rejects a preset the theme does not have (rule no-unknown-preset) and names the roles to use instead.<\/li>\n<li>REST routes check their input against a schema before they run, and OPTIONS shows it. A rate limit answer carries the header Retry-After.<\/li>\n<li>The token of the contact form expires after 7 days (filter leitvia_studio_contact_form_max_age). Deleting Studio with its data also removes the meta fields of AI generated posts and their sources.<\/li>\n<li>Fixes: the consent settings block stays valid when the editor runs in another language than the one it was saved in; list-product-reviews with unrated false over GET no longer filters; icons whose SVG contains a dollar sign render whole; the rating block in the editor formats numbers in the language of the site.<\/li>\n<\/ul>\n\n<h4>1.3.42<\/h4>\n\n<ul>\n<li>Icons train front and bike (116 Lucide icons), for the stops of the route in Leitvia Pro.<\/li>\n<\/ul>\n\n<p>Older versions, 1.0.0 to 1.3.41: <a href=\"https:\/\/github.com\/cmsadmins\/leitvia-studio\/blob\/main\/changelog.txt\">changelog.txt<\/a>.<\/p>","raw_excerpt":"AI agents such as Claude Code build and maintain block theme sites over MCP or REST. Every change is checked, reviewable and can be rolled back.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=393307"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/contexlabs"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393307"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393307"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393307"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393307"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393307"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}