![]() |
VOOZH | about |
dotnet add package Umbraco.Community.SchemeWeaver.uSync --version 1.0.0-beta.10
NuGet\Install-Package Umbraco.Community.SchemeWeaver.uSync -Version 1.0.0-beta.10
<PackageReference Include="Umbraco.Community.SchemeWeaver.uSync" Version="1.0.0-beta.10" />
<PackageVersion Include="Umbraco.Community.SchemeWeaver.uSync" Version="1.0.0-beta.10" />Directory.Packages.props
<PackageReference Include="Umbraco.Community.SchemeWeaver.uSync" />Project file
paket add Umbraco.Community.SchemeWeaver.uSync --version 1.0.0-beta.10
#r "nuget: Umbraco.Community.SchemeWeaver.uSync, 1.0.0-beta.10"
#:package Umbraco.Community.SchemeWeaver.uSync@1.0.0-beta.10
#addin nuget:?package=Umbraco.Community.SchemeWeaver.uSync&version=1.0.0-beta.10&prereleaseInstall as a Cake Addin
#tool nuget:?package=Umbraco.Community.SchemeWeaver.uSync&version=1.0.0-beta.10&prereleaseInstall as a Cake Tool
<p align="center"> <img src="icon.png" alt="SchemeWeaver" width="128" /> </p>
<h1 align="center">Umbraco.Community.SchemeWeaver</h1>
<p align="center"> Map Umbraco Content Types to <a href="https://schema.org">Schema.org</a> types and automatically generate <a href="https://json-ld.org/">JSON-LD</a> structured data for your pages. </p>
<p align="center"> <a href="https://www.nuget.org/packages/Umbraco.Community.SchemeWeaver"><img src="https://img.shields.io/nuget/vpre/Umbraco.Community.SchemeWeaver" alt="NuGet" /></a> <a href="https://github.com/EnjoyDigital/Umbraco.Community.Schemeweaver/blob/main/LICENSE"><img src="https://img.shields.io/github/license/EnjoyDigital/Umbraco.Community.Schemeweaver" alt="License" /></a> </p>
SchemeWeaver provides a document type editor UI for configuring mappings, an auto-mapper that suggests property assignments, and runtime JSON-LD generation that works with both server-rendered templates and the headless Delivery API.
Search engines use JSON-LD to understand page content. A blog post tagged as BlogPosting with a headline, author, and datePublished can appear as a rich result in Google, Bing, and other search engines. Manually maintaining JSON-LD scripts is tedious and error-prone -- SchemeWeaver automates it from your existing content.
RealEstateListinginLanguage with the BCP 47 culture code. Works across server-rendered templates, the Delivery API, and the backoffice previewschemaOrg field<scheme-weaver content="@Model" /> into any Razor template; the tag helper reads the current culture from Umbraco's IVariationContextAccessor automaticallydotnet add package Umbraco.Community.SchemeWeaver
No additional configuration needed. The package registers all services, creates its database tables on first run, and adds the backoffice UI automatically.
⚠️ Experimental. The AI companion hasn't been smoke-tested end-to-end against the current main-package contracts yet. It is shipped for early feedback only — expect rough edges and don't rely on it in production.
For AI-assisted schema type suggestions and property mapping, install the companion package:
dotnet add package Umbraco.Community.SchemeWeaver.AI --prerelease
Requires Umbraco.AI.Core 1.7.0 or later and a configured chat provider (e.g. Azure OpenAI, Anthropic). See for details.
To sync schema mappings between environments via uSync:
dotnet add package Umbraco.Community.SchemeWeaver.uSync --prerelease
See for details.
In your master layout (e.g. _Layout.cshtml):
@addTagHelper *, Umbraco.Community.SchemeWeaver
<head>
...
<scheme-weaver content="@Model" />
</head>
JSON-LD is automatically indexed when content is published:
const response = await fetch('/umbraco/delivery/api/v2/content/item/my-blog-post');
const data = await response.json();
const jsonLd = data.properties.schemaOrg;
No extra configuration needed. If your content type varies by culture, SchemeWeaver automatically:
VariationContext; the Delivery API handler is called once per culture)inLanguage with the BCP 47 culture code (e.g. "de-DE") unless you've explicitly mapped inLanguage yourself@id and breadcrumb linksMappings stay invariant -- the same mapping applies to all cultures. You don't need per-language mappings; SchemeWeaver resolves the right value at generation time.
The backoffice JSON-LD preview tab automatically follows the workspace variant selector, so switching to German in the editor shows the German JSON-LD output.
Each mapping connects one Umbraco Content Type to one Schema.org type. Within that mapping, individual property mappings define where each schema property gets its value:
| Schema Property | Source | Value | Description |
|---|---|---|---|
headline |
property | title |
Read from the current node |
author |
static | Jane Smith |
Hardcoded string value |
datePublished |
property | publishDate |
Formatted as ISO date |
publisher |
parent | organisationName |
Read from the parent node |
mainEntity |
blockContent | faqItems |
Built from BlockList items |
inLanguage |
(auto) | Auto-populated from the current culture on variant content |
The auto-mapper suggests assignments using three confidence tiers:
title to name, bodyText to articleBody)The generated output:
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "10 Tips for Better SEO",
"author": {
"@type": "Person",
"name": "Jane Smith"
},
"datePublished": "2024-01-15",
"inLanguage": "en-US"
}
acceptedAnswer, reviewRating) require a wrapper type. The auto-mapper pre-configures this for common patterns (FAQ, Product, Recipe). For custom types, see the .Umbraco.Community.SchemeWeaver.AI companion is experimental and not yet smoke-tested end-to-end. It requires a configured Umbraco.AI chat provider. Without it, the heuristic auto-mapper handles all suggestions.Maintainer notes — shipping a new version to NuGet and the Umbraco Marketplace:
NUGET_API_KEY is set in Settings → Secrets and variables → Actions (a single API key with "Push new packages and package versions" scope on Umbraco.Community.SchemeWeaver*).git tag v1.0.0-beta.4 && git push origin v1.0.0-beta.4.Release to NuGet workflow builds, tests, packs and pushes the package to nuget.org, and opens a matching GitHub release.umbraco-marketplace tag (already set in the csproj) and usually updates within 24 hours.To publish an out-of-band build without tagging, use the workflow's "Run workflow" button on the Actions tab and type the version explicitly.
Contributions are very welcome — bug reports, fixes, docs, new property resolvers, extra auto-mapper synonyms, whole new features. Small PRs are fine.
# C#
dotnet build
dotnet test
# Frontend
cd src/Umbraco.Community.SchemeWeaver/App_Plugins/SchemeWeaver
npm install
npm run build
npm test
npm run test:msw # component tests with MSW handlers
npm run test:mocked-backoffice # Playwright drives the real backoffice UI with MSW — needs Umbraco-CMS clone
npm run test:e2e # Playwright against a running Umbraco + .env
npm run test:screenshots # regenerate the docs screenshots (opt-in)
# Test host with 100+ sample content types
dotnet run --project src/Umbraco.Community.SchemeWeaver.TestHost
Note: The TestHost is purely for testing schema mappings and structured data generation. It is not intended as a base site or starter kit.
The companion Umbraco.Community.SchemeWeaver.AI package is referenced by the TestHost and its Anthropic provider is wired up so you can exercise the AI schema-mapping flows end-to-end. The API key lives in user-secrets so it stays off disk and out of git:
Grab an Anthropic API key.
Set it locally (the TestHost has a UserSecretsId, so this stores it in your per-user secret store, never in the repo):
cd src/Umbraco.Community.SchemeWeaver.TestHost
dotnet user-secrets set "Anthropic:ApiKey" "sk-ant-..."
Start the TestHost:
dotnet run --project src/Umbraco.Community.SchemeWeaver.TestHost
In the backoffice, open the AI section, create an Anthropic connection, and enter $Anthropic:ApiKey as the API key — Umbraco.AI resolves $-prefixed values from configuration at runtime. Create a chat profile against that connection (e.g. claude-sonnet-4-5) and set it as the default chat profile. SchemeWeaver's AI entity actions will then appear on document types; GET /umbraco/management/api/v1/schemeweaver/ai/status returns 200.
Without a configured connection, the AI endpoints fall back to the heuristic auto-mapper; the rest of SchemeWeaver works unchanged.
Read for architecture, DI wiring, and naming conventions.
Please add tests for behavioural changes, and a regression test for bug fixes. CI runs the full suite on every push.
| Layer | Framework | Location |
|---|---|---|
| C# Unit | xUnit + NSubstitute + FluentAssertions | tests/Umbraco.Community.SchemeWeaver.Tests/Unit/ |
| C# Integration | xUnit + WebApplicationFactory<Program> against the SchemeWeaver TestHost, shared via an xUnit collection fixture so every test class reuses a single host (temp SQLite, one file per suite) |
tests/Umbraco.Community.SchemeWeaver.Tests/Integration/ |
| TS Unit / Component | @open-wc/testing + MSW |
App_Plugins/SchemeWeaver/src/**/*.test.ts |
| Mocked Backoffice | Playwright drives the real Umbraco backoffice UI via VITE_EXAMPLE_PATH, with SchemeWeaver's MSW handlers serving all HTTP traffic — no .NET required. Requires a local umbraco/Umbraco-CMS clone plus a small addMockHandlers patch; see |
App_Plugins/SchemeWeaver/tests/mocked-backoffice/ |
| E2E | Playwright + @umbraco/playwright-testhelpers against a running Umbraco |
App_Plugins/SchemeWeaver/tests/e2e/ |
For backoffice UI changes, npm run test:mocked-backoffice verifies manifest wiring, workspace-view conditions, and modal plumbing without a running Umbraco; npm run test:e2e against a real instance is still the only thing that catches issues across the full .NET + backoffice stack.
AI tools (Claude, Codex, Copilot, Cursor, etc.) are welcome to help. The rules are short:
You review it. Read every line before committing. You're accountable for the PR, not the assistant.
MIT-compatible only. Don't submit code copied from incompatible sources.
Add tests, same as any other contribution.
For UI work, install the Umbraco Backoffice Skills and add umbraco/Umbraco-CMS (src/Umbraco.Web.UI.Client) and umbraco/Umbraco.UI (packages/uui) as working directories so the skills can grep the canonical backoffice source — see the skills repo for setup. Also run the umbraco-extension-reviewer agent on UI changes.
Tag the commit. When an assistant materially helped, add a git trailer at the bottom of the commit message so we can see which model was used:
Assisted-by: Claude:claude-opus-4-6
Format is Assisted-by: <agent>:<model> [optional tools], e.g. Assisted-by: Copilot:gpt-5 playwright. Just leave a blank line before it, or use git commit --trailer "Assisted-by=...". Basic tools (git, dotnet, npm, editors) don't need listing. If your tool already adds a Co-authored-by: trailer for the assistant automatically, that's fine too — just don't bother adding both.
Don't add Signed-off-by on a human's behalf. Only the human submitter can sign off their own contribution.
MIT — see . By submitting a pull request you agree to license your contribution under the same terms.
Oliver Picton / Enjoy Digital
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 18.3.0 | 0 | 6/28/2026 |
| 18.2.0 | 12 | 6/28/2026 |
| 18.1.0 | 38 | 6/27/2026 |
| 18.0.2 | 69 | 6/26/2026 |
| 18.0.1 | 75 | 6/26/2026 |
| 18.0.0 | 50 | 6/25/2026 |
| 17.8.0 | 0 | 6/28/2026 |
| 17.7.0 | 5 | 6/28/2026 |
| 17.6.0 | 54 | 6/27/2026 |
| 17.5.3 | 91 | 6/26/2026 |
| 17.5.2 | 85 | 6/26/2026 |
| 17.5.1 | 46 | 6/26/2026 |
| 17.5.0 | 64 | 6/25/2026 |
| 1.4.4 | 328 | 6/10/2026 |
| 1.4.4-umbraco18 | 96 | 6/10/2026 |
| 1.4.3 | 395 | 4/22/2026 |
| 1.4.1 | 103 | 4/21/2026 |
| 1.4.0 | 99 | 4/21/2026 |
| 1.3.0 | 110 | 4/18/2026 |
| 1.0.0-beta.10 | 63 | 4/16/2026 |