FoundWell.Umbraco 1.0.2

dotnet add package FoundWell.Umbraco --version 1.0.2
                    
NuGet\Install-Package FoundWell.Umbraco -Version 1.0.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FoundWell.Umbraco" Version="1.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FoundWell.Umbraco" Version="1.0.2" />
                    
Directory.Packages.props
<PackageReference Include="FoundWell.Umbraco" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FoundWell.Umbraco --version 1.0.2
                    
#r "nuget: FoundWell.Umbraco, 1.0.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FoundWell.Umbraco@1.0.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FoundWell.Umbraco&version=1.0.2
                    
Install as a Cake Addin
#tool nuget:?package=FoundWell.Umbraco&version=1.0.2
                    
Install as a Cake Tool

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.txt and llms-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.txt per site. On a multi-site install, each domain gets the llms.txt of 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.txt from 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.txt and /llms-full.txt are 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.txt and 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.

  1. Install the package on the site and restart it.
  2. In the backoffice, open FoundWell → General Settings and turn on Allow FoundWell.
  3. 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.
  4. 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. The from path 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.txt is 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: false to disable the feature. SchemaSuggest:Enabled: false also 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 in DisablePropertyAliases) 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.cs creates 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.cs creates the API user FoundWell connects with, using the client id and secret under Sample:ApiUser in appsettings.Development.json. Without those values it does nothing.
  • Views/*.cshtml are plain, untyped views (ModelsMode: Nothing) that emit no JSON-LD of their own, so the schema injector has something to do.
  • Document types expose summary and content, the two aliases LlmsTxtOptions probes for by default.

License

MIT. See LICENSE.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.2 5 10/28/2026
1.0.1 49 10/27/2026
1.0.0 51 10/26/2026