FoundWell.Umbraco
1.0.2
dotnet add package FoundWell.Umbraco --version 1.0.2
NuGet\Install-Package FoundWell.Umbraco -Version 1.0.2
<PackageReference Include="FoundWell.Umbraco" Version="1.0.2" />
<PackageVersion Include="FoundWell.Umbraco" Version="1.0.2" />
<PackageReference Include="FoundWell.Umbraco" />
paket add FoundWell.Umbraco --version 1.0.2
#r "nuget: FoundWell.Umbraco, 1.0.2"
#:package FoundWell.Umbraco@1.0.2
#addin nuget:?package=FoundWell.Umbraco&version=1.0.2
#tool nuget:?package=FoundWell.Umbraco&version=1.0.2
FoundWell for Umbraco
Get your Umbraco site ready for AI answers. Free, no account.
When people ask ChatGPT, Perplexity, Claude or Google's AI answers for a recommendation, those assistants can only
name the sites they can read and quote. This package shows you how quotable each page is, adds schema.org markup to
every page and publishes an llms.txt, all inside the Umbraco backoffice.
Umbraco 17 LTS on .NET 10 · MIT license
Free, without an account
Everything here works the moment the package is installed. Nothing is sent to FoundWell: the audit only requests your own pages, to see them as visitors do.
- AEO audit of every page. A score for how likely an AI engine is to quote the page, what holds it back and how to fix it. Each page keeps its score history, so you see it improve.
- Quotable passages. The passages an AI engine can lift as a citation, and what weakens the others.
- Bulk audit. Score all your published pages at once, lowest first, so you know where to start.
- Schema suggestions. Schema.org markup suggested from each page's content, ready to apply.
- Automatic schema. JSON-LD in every page's head without touching a template. Pick the schema.org type per document type and which properties fill it, then override or switch it off per page.
llms.txtandllms-full.txt. Generated from your published content, so AI assistants get a clean map of your site. Leave out the pages you want to keep out, or list only certain document types.- One
llms.txtper site. On a multi-site install, each domain gets thellms.txtof its own root, with its own title, summary and excluded pages.
With a FoundWell subscription
FoundWell is SEO, AEO and GEO on autopilot. Connect your site and the package becomes the way in: FoundWell uses it for what Umbraco has no API for. Through the package, FoundWell:
- sets schema per page,
- adds 301 redirects for moved and broken URLs on your site,
- writes your
llms.txtfrom your business facts, and corrects it when an AI assistant gets a fact wrong.
Around that, FoundWell publishes up to 12 in-depth articles a month, fixes your existing pages every day, checks that Google indexes them and tracks what ChatGPT, Perplexity, Claude and Google's AI answers say about you, with a weekly report on what moved. Run it on autopilot, or approve each change yourself.
The connection stays off until an administrator turns on Allow FoundWell in the package's settings. FoundWell
can't turn it on itself. If you cancel, the package keeps doing everything it does for free, and the redirects,
schema and llms.txt FoundWell set stay on your site until you change them.
$1,000 a month per site, cancel any time. Set up your site at foundwell.net.
Install
dotnet add package FoundWell.Umbraco
Build and restart the site, then open the FoundWell section in the backoffice, or the GEO view on a page. Administrators get the section on first start; see Section access for other user groups.
How it works
/llms.txtand/llms-full.txtare generated from the published content tree and grouped by top-level section (llmstxt.org). A request on a domain bound to an Umbraco root gets that root's subtree. Each root can override the title, summary and excluded pages.- The AEO audit scores a page with rules for title, summary, body, H1, JSON-LD and quotable paragraphs, and keeps a score history per page.
- Schema.org structured data: suggestions per page, per-document-type mappings, and optional automatic JSON-LD
in
<head>. See Automatic schema.org structured data. - The FoundWell connector is a set of Management API endpoints FoundWell calls to add redirects, replace
/llms.txtand set a page's JSON-LD. See Connecting FoundWell. - The FoundWell backoffice section has the Overview, llms.txt Settings, General Settings, Bulk Audit and Schema Mapping dashboards, and there is a GEO workspace view on documents.
The package stores its settings in JSON files and has no database tables of its own. See Database support.
Connecting FoundWell
FoundWell publishes articles to Umbraco without this package, through the Management API. The package adds what
Umbraco has no API for: redirects, a managed /llms.txt and per-page JSON-LD. FoundWell's connection test warns when
it is missing.
- Install the package on the site and restart it.
- In the backoffice, open FoundWell → General Settings and turn on Allow FoundWell.
- Go to Users → Create → API user. Add it to a group with access to the Content section (Administrators works), then add a client id and secret under Client credentials.
- In FoundWell onboarding, choose Umbraco and enter the site address, the client id and secret, the document type for articles and its property aliases.
FoundWell gets a token from /umbraco/management/api/v1/security/back-office/token (client credentials) and calls
these endpoints with it, all under /umbraco/management/api/v1/foundwell/:
| Method and path | Body | Effect |
|---|---|---|
GET status |
{ version, redirects, llmsTxt, schema }. FoundWell's connection test uses it to check the plugin. |
|
POST redirects |
{ from, to, code? } |
Adds a redirect, or replaces the one with the same from. code is 301 (default), 302, 307 or 308. to must be a path or a URL on one of the site's own hosts. |
PUT llms |
{ content } |
Serves content as /llms.txt instead of the generated file. Empty content goes back to the generated one. |
PUT schema/{contentKey} |
{ jsonLd } |
Renders this JSON-LD (an object or array) in the page's <head>. Empty removes it. |
The writes return 204, or 400 with a reason (404 when setting JSON-LD on an unknown content key). A request without a token is redirected to the login page (302).
Allow FoundWell is off by default. While it is off, every FoundWell endpoint answers API users with 403 and
"title": "The FoundWell connection is off"; backoffice users and the dashboards are not affected. Only a backoffice
user can turn it on or off: PUT general-settings answers API users with 403 whatever the setting. Redirects, the
managed llms.txt and schema FoundWell already set keep being served while it is off. FoundWell creates and publishes
articles through Umbraco's own Management API, which this setting does not cover; to stop that, remove the API
user's client credentials.
What FoundWell writes is kept in umbraco/Data/FoundWell.Umbraco/managed-content.json:
- Redirects are answered by a middleware before Umbraco routes the request, for GET and HEAD outside
/umbraco. Thefrompath matches exactly, ignoring case and a trailing slash. - llms.txt: while FoundWell manages it, the llms.txt Settings dashboard says so and has a button to go back
to the generated file.
/llms-full.txtis always generated. - Schema: a page with managed JSON-LD gets it even when automatic schema is off. A page that already renders its
own
<script type="application/ld+json">is left alone.
Database support
The package only talks to Umbraco's services and its own JSON files, so anything Umbraco supports works:
- SQLite, which the sample uses by default.
- SQL Server / Azure SQL. The sample references both providers, so switching takes only a connection string:
{
"ConnectionStrings": {
"umbracoDbDSN": "Server=(localdb)\\MSSQLLocalDB;Database=FoundWell.Umbraco.Sample;Trusted_Connection=True;Encrypt=False;",
"umbracoDbDSN_ProviderName": "Microsoft.Data.SqlClient"
}
}
The plugin's own files live in umbraco/Data/FoundWell.Umbraco/. On a load-balanced site, put that folder on shared
storage.
Section access
On first startup the package grants the FoundWell section to the Administrators group. It does this once, so an admin who later removes it is not overruled. To give another group access, open Users → Groups → <group>, tick FoundWell under Sections, save and hard-refresh the backoffice.
Configuration
All keys are optional:
{
"FoundWell": {
"LlmsTxt": {
"Enabled": true,
"Title": null,
"Summary": null,
"RootContentId": null,
"IncludedContentTypes": [],
"ExcludedContentIds": []
},
"SchemaSuggest": {
"Enabled": true,
"AutoRender": false,
"ExcludedContentTypes": [],
"DisablePropertyAliases": [ "geoSchemaDisabled", "disableSchema" ]
}
}
}
Title defaults to the root's name and Summary to its first non-empty summary property; overrides set under
llms.txt Settings win over both. RootContentId is used only when the request host matches no domain binding;
left unset, every root is listed. An empty IncludedContentTypes means all types.
Automatic schema.org structured data
The package can add JSON-LD to the <head> of every published page with no template change. It is generated from
the page's current content (Article, BlogPosting, NewsArticle, FAQPage when Q&A is detected, or WebSite on
the root) and follows the document-type mappings set in Schema Mapping.
It is off by default. Turn it on with the toggle on the General Settings dashboard. The choice is saved in
umbraco/Data/FoundWell.Umbraco/general-settings.json; SchemaSuggest:AutoRender is only the default until an admin
sets it. Once on, narrow it down:
- Whole site: the toggle, or
SchemaSuggest:Enabled: falseto disable the feature.SchemaSuggest:Enabled: falsealso stops JSON-LD set by FoundWell. - By document type: add the alias to
SchemaSuggest:ExcludedContentTypes. - By page: add a True/False property with alias
geoSchemaDisabled(or any alias inDisablePropertyAliases) and tick it.
Developing the package
src/FoundWell.Umbraco/ # the package (Razor Class Library)
samples/FoundWell.Umbraco.Sample/ # a minimal Umbraco site that consumes it
tests/FoundWell.Umbraco.Tests/ # xUnit tests
dotnet build
dotnet test
dotnet pack src/FoundWell.Umbraco -c Release -o ./artifacts
Sample site
Requires the .NET 10 SDK. The sample site installs itself unattended into a local SQLite file on first run.
dotnet restore
dotnet run --project samples/FoundWell.Umbraco.Sample
Then visit https://localhost:44339:
| Path | What's there |
|---|---|
/ |
seeded sample site: a home page with two sections |
/llms.txt |
generated index |
/llms-full.txt |
same, with page bodies inlined |
/umbraco |
backoffice, with the FoundWell section in the left rail |
Backoffice login: admin@example.com / Sample123!
The sample seeds a small tree (Home → Guides / About, with pages beneath each) and switches automatic schema on,
so every feature has something to work against. To start over, stop the site and delete
samples/FoundWell.Umbraco.Sample/umbraco/Data. The seeders do nothing when the site already has content.
Seeding/SampleContentSeeder.cscreates the templates, document types and content on first boot, through Umbraco's services (never SQL), so it behaves the same on SQLite and SQL Server.Seeding/SampleApiUserSeeder.cscreates the API user FoundWell connects with, using the client id and secret underSample:ApiUserinappsettings.Development.json. Without those values it does nothing.Views/*.cshtmlare plain, untyped views (ModelsMode: Nothing) that emit no JSON-LD of their own, so the schema injector has something to do.- Document types expose
summaryandcontent, the two aliasesLlmsTxtOptionsprobes for by default.
License
MIT. See LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Umbraco.Cms.Api.Management (>= 17.4.2)
- Umbraco.Cms.Web.Common (>= 17.4.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.