diff --git a/PlotLine/Controllers/HelpController.cs b/PlotLine/Controllers/HelpController.cs index a376ae4..2b4d3ef 100644 --- a/PlotLine/Controllers/HelpController.cs +++ b/PlotLine/Controllers/HelpController.cs @@ -3,12 +3,13 @@ using Microsoft.AspNetCore.Authorization; using PlotLine.Services; using PlotLine.ViewModels; using System.Net; +using System.Text.Json; namespace PlotLine.Controllers; [Route("help")] [AllowAnonymous] -public sealed class HelpController(IHelpService help, IHelpMarkdownRenderer markdown) : Controller +public sealed class HelpController(IHelpService help, IHelpMarkdownRenderer markdown, IConfiguration configuration) : Controller { [HttpGet("")] public IActionResult Index(string? q) @@ -18,7 +19,21 @@ public sealed class HelpController(IHelpService help, IHelpMarkdownRenderer mark return RedirectPermanent(PreserveQuery("/help")); } - ViewData["CanonicalUrl"] = "https://plotdirector.com/help"; + var canonicalUrl = BuildAbsoluteUrl("/help"); + ViewData["CanonicalUrl"] = canonicalUrl; + ViewData["StructuredData"] = new[] + { + JsonLd(new Dictionary + { + ["@context"] = "https://schema.org", + ["@type"] = "CollectionPage", + ["name"] = "Help Centre", + ["url"] = canonicalUrl, + ["description"] = "Find practical guidance for planning, tracking, and shaping your story in PlotDirector." + }), + BuildBreadcrumbJsonLd( + ("Help", canonicalUrl)) + }; var articles = help.GetAllArticles(); return View(new HelpCentreIndexViewModel { @@ -53,7 +68,22 @@ public sealed class HelpController(IHelpService help, IHelpMarkdownRenderer mark } var articles = help.GetByCategorySlug(categorySlug); - ViewData["CanonicalUrl"] = $"https://plotdirector.com{canonicalPath}"; + var canonicalUrl = BuildAbsoluteUrl(canonicalPath); + ViewData["CanonicalUrl"] = canonicalUrl; + ViewData["StructuredData"] = new[] + { + JsonLd(new Dictionary + { + ["@context"] = "https://schema.org", + ["@type"] = "CollectionPage", + ["name"] = $"{category} Help", + ["url"] = canonicalUrl, + ["description"] = $"Help articles about {category} in PlotDirector." + }), + BuildBreadcrumbJsonLd( + ("Help", BuildAbsoluteUrl("/help")), + (category, canonicalUrl)) + }; return View(new HelpCategoryArticlesViewModel { CategoryName = category, @@ -76,7 +106,25 @@ public sealed class HelpController(IHelpService help, IHelpMarkdownRenderer mark return RedirectPermanent(article.Url); } - ViewData["CanonicalUrl"] = $"https://plotdirector.com{article.Url}"; + var canonicalUrl = BuildAbsoluteUrl(article.Url); + ViewData["CanonicalUrl"] = canonicalUrl; + ViewData["StructuredData"] = new[] + { + JsonLd(new Dictionary + { + ["@context"] = "https://schema.org", + ["@type"] = "TechArticle", + ["headline"] = article.Title, + ["name"] = article.Title, + ["url"] = canonicalUrl, + ["description"] = string.IsNullOrWhiteSpace(article.QuickSummary) ? null : article.QuickSummary, + ["dateModified"] = article.LastModifiedUtc == default ? null : article.LastModifiedUtc.ToString("O") + }), + BuildBreadcrumbJsonLd( + ("Help", BuildAbsoluteUrl("/help")), + (article.Category, BuildAbsoluteUrl(article.CategoryUrl)), + (article.Title, canonicalUrl)) + }; return View(new HelpCentreArticleViewModel { Article = article, @@ -111,4 +159,35 @@ public sealed class HelpController(IHelpService help, IHelpMarkdownRenderer mark string.IsNullOrWhiteSpace(HttpContext.Request.QueryString.Value) ? path : $"{path}{HttpContext.Request.QueryString.Value}"; + + private string BuildAbsoluteUrl(string path) + { + var baseUrl = configuration["Site:PublicBaseUrl"]?.TrimEnd('/'); + if (string.IsNullOrWhiteSpace(baseUrl)) + { + baseUrl = "https://plotdirector.com"; + } + + return $"{baseUrl}{path}"; + } + + private static string BuildBreadcrumbJsonLd(params (string Name, string Url)[] items) => + JsonLd(new Dictionary + { + ["@context"] = "https://schema.org", + ["@type"] = "BreadcrumbList", + ["itemListElement"] = items.Select((item, index) => new Dictionary + { + ["@type"] = "ListItem", + ["position"] = index + 1, + ["name"] = item.Name, + ["item"] = item.Url + }) + }); + + private static string JsonLd(object value) => + JsonSerializer.Serialize(value, new JsonSerializerOptions + { + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull + }); } diff --git a/PlotLine/Controllers/SitemapController.cs b/PlotLine/Controllers/SitemapController.cs new file mode 100644 index 0000000..b2fed91 --- /dev/null +++ b/PlotLine/Controllers/SitemapController.cs @@ -0,0 +1,101 @@ +using System.Text; +using System.Xml; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PlotLine.Models; +using PlotLine.Services; + +namespace PlotLine.Controllers; + +[AllowAnonymous] +public sealed class SitemapController(IHelpService help, IConfiguration configuration) : Controller +{ + [HttpGet("/sitemap.xml")] + public IActionResult Index() + { + var urls = new List + { + new("/", "weekly", "1.0"), + new("/pricing", "weekly", "0.8"), + new("/help", "weekly", "0.7"), + new("/about", "monthly", "0.6"), + new("/contact", "monthly", "0.5"), + new("/privacy", "yearly", "0.3"), + new("/terms", "yearly", "0.3") + }; + + var articles = help.GetAllArticles(); + urls.AddRange(articles + .Where(article => !string.IsNullOrWhiteSpace(article.CategorySlug)) + .GroupBy(article => article.CategorySlug, StringComparer.OrdinalIgnoreCase) + .OrderBy(group => group.Key, StringComparer.OrdinalIgnoreCase) + .Select(group => new SitemapUrl( + $"/help/{group.Key}", + "monthly", + "0.6", + group.Max(article => article.LastModifiedUtc)))); + + urls.AddRange(articles + .Where(article => !string.IsNullOrWhiteSpace(article.CategorySlug) && !string.IsNullOrWhiteSpace(article.Slug)) + .OrderBy(article => article.CategorySlug, StringComparer.OrdinalIgnoreCase) + .ThenBy(article => article.Slug, StringComparer.OrdinalIgnoreCase) + .Select(article => new SitemapUrl( + article.Url, + "monthly", + "0.5", + article.LastModifiedUtc))); + + return Content(BuildXml(urls), "application/xml", Encoding.UTF8); + } + + private string BuildXml(IEnumerable urls) + { + var settings = new XmlWriterSettings + { + Encoding = new UTF8Encoding(false), + Indent = true, + OmitXmlDeclaration = false + }; + using var writer = new Utf8StringWriter(); + using var xml = XmlWriter.Create(writer, settings); + xml.WriteStartDocument(); + xml.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); + + foreach (var url in urls) + { + xml.WriteStartElement("url"); + xml.WriteElementString("loc", BuildAbsoluteUrl(url.Path)); + if (url.LastModifiedUtc is DateTime lastModifiedUtc && lastModifiedUtc != default) + { + xml.WriteElementString("lastmod", lastModifiedUtc.ToString("yyyy-MM-dd")); + } + + xml.WriteElementString("changefreq", url.ChangeFrequency); + xml.WriteElementString("priority", url.Priority); + xml.WriteEndElement(); + } + + xml.WriteEndElement(); + xml.WriteEndDocument(); + xml.Flush(); + return writer.ToString(); + } + + private string BuildAbsoluteUrl(string path) + { + var baseUrl = configuration["Site:PublicBaseUrl"]?.TrimEnd('/'); + if (string.IsNullOrWhiteSpace(baseUrl)) + { + baseUrl = "https://plotdirector.com"; + } + + return $"{baseUrl}{path}"; + } + + private sealed record SitemapUrl(string Path, string ChangeFrequency, string Priority, DateTime? LastModifiedUtc = null); + + private sealed class Utf8StringWriter : StringWriter + { + public override Encoding Encoding => Encoding.UTF8; + } +} diff --git a/PlotLine/Models/HelpModels.cs b/PlotLine/Models/HelpModels.cs index c102cd7..b0fbe42 100644 --- a/PlotLine/Models/HelpModels.cs +++ b/PlotLine/Models/HelpModels.cs @@ -14,6 +14,7 @@ public sealed class HelpArticle public string Screenshot { get; set; } = string.Empty; public string MarkdownContent { get; set; } = string.Empty; public string RelativePath { get; set; } = string.Empty; + public DateTime LastModifiedUtc { get; set; } public IReadOnlyList ValidationIssues { get; set; } = []; public string CategoryUrl => $"/help/{CategorySlug}"; public string Url => $"/help/{CategorySlug}/{Slug}"; diff --git a/PlotLine/Services/HelpService.cs b/PlotLine/Services/HelpService.cs index e738f74..755ce8a 100644 --- a/PlotLine/Services/HelpService.cs +++ b/PlotLine/Services/HelpService.cs @@ -239,7 +239,8 @@ public sealed class HelpService(IWebHostEnvironment environment) : IHelpService QuickSummary = GetValue(metadata, "quickSummary"), Screenshot = GetValue(metadata, "screenshot"), MarkdownContent = markdownContent, - RelativePath = relativePath + RelativePath = relativePath, + LastModifiedUtc = File.GetLastWriteTimeUtc(filePath) }; issues.AddRange(Validate(article)); diff --git a/PlotLine/Views/Shared/_Layout.cshtml b/PlotLine/Views/Shared/_Layout.cshtml index f770354..1ab0e77 100644 --- a/PlotLine/Views/Shared/_Layout.cshtml +++ b/PlotLine/Views/Shared/_Layout.cshtml @@ -19,7 +19,7 @@ var seoDescription = isMarketingPage && ViewData["SeoDescription"] is string seoDescriptionValue ? seoDescriptionValue : null; var canonicalUrl = ViewData["CanonicalUrl"] as string; var seoKeywords = isMarketingPage && ViewData["SeoKeywords"] is string seoKeywordsValue ? seoKeywordsValue : null; - var structuredData = isMarketingPage && ViewData["StructuredData"] is IEnumerable structuredDataValues ? structuredDataValues : Array.Empty(); + var structuredData = ViewData["StructuredData"] is IEnumerable structuredDataValues ? structuredDataValues : Array.Empty(); const string ogImageUrl = "https://plotdirector.com/og-image.png"; } @@ -56,12 +56,12 @@ } - @foreach (var jsonLd in structuredData) - { - @Html.Raw("") - } + } + @foreach (var jsonLd in structuredData) + { + @Html.Raw("") } @if (!string.IsNullOrWhiteSpace(canonicalUrl)) { @@ -112,25 +112,19 @@ diff --git a/PlotLine/wwwroot/sitemap.xml b/PlotLine/wwwroot/sitemap.xml deleted file mode 100644 index b66934b..0000000 --- a/PlotLine/wwwroot/sitemap.xml +++ /dev/null @@ -1,1483 +0,0 @@ - - - - https://plotdirector.com/ - weekly - 1.0 - - - https://plotdirector.com/pricing - weekly - 0.8 - - - https://plotdirector.com/about - monthly - 0.6 - - - https://plotdirector.com/contact - monthly - 0.5 - - - https://plotdirector.com/privacy - yearly - 0.3 - - - https://plotdirector.com/terms - yearly - 0.3 - - - https://plotdirector.com/help - weekly - 0.7 - - - https://plotdirector.com/help/archive - monthly - 0.6 - - - https://plotdirector.com/help/books - monthly - 0.6 - - - https://plotdirector.com/help/chapters - monthly - 0.6 - - - https://plotdirector.com/help/characters - monthly - 0.6 - - - https://plotdirector.com/help/floor-plans - monthly - 0.6 - - - https://plotdirector.com/help/help-centre - monthly - 0.6 - - - https://plotdirector.com/help/imports - monthly - 0.6 - - - https://plotdirector.com/help/locations - monthly - 0.6 - - - https://plotdirector.com/help/plot-lines - monthly - 0.6 - - - https://plotdirector.com/help/projects - monthly - 0.6 - - - https://plotdirector.com/help/relationship-map - monthly - 0.6 - - - https://plotdirector.com/help/restore-points - monthly - 0.6 - - - https://plotdirector.com/help/scenarios - monthly - 0.6 - - - https://plotdirector.com/help/scene-inspector - monthly - 0.6 - - - https://plotdirector.com/help/scene-metrics - monthly - 0.6 - - - https://plotdirector.com/help/scenes - monthly - 0.6 - - - https://plotdirector.com/help/story-assets - monthly - 0.6 - - - https://plotdirector.com/help/story-bible - monthly - 0.6 - - - https://plotdirector.com/help/story-dynamics - monthly - 0.6 - - - https://plotdirector.com/help/story-health - monthly - 0.6 - - - https://plotdirector.com/help/timeline - monthly - 0.6 - - - https://plotdirector.com/help/warnings - monthly - 0.6 - - - https://plotdirector.com/help/workspace - monthly - 0.6 - - - https://plotdirector.com/help/archive/archived-items - monthly - 0.5 - - - https://plotdirector.com/help/archive/archived-records - monthly - 0.5 - - - https://plotdirector.com/help/books/book-chapters - monthly - 0.5 - - - https://plotdirector.com/help/books/book-number - monthly - 0.5 - - - https://plotdirector.com/help/books/books - monthly - 0.5 - - - https://plotdirector.com/help/books/create-or-edit-a-book - monthly - 0.5 - - - https://plotdirector.com/help/chapters/chapter-number - monthly - 0.5 - - - https://plotdirector.com/help/chapters/chapter-revision-status - monthly - 0.5 - - - https://plotdirector.com/help/chapters/chapters - monthly - 0.5 - - - https://plotdirector.com/help/chapters/chapter-scenes - monthly - 0.5 - - - https://plotdirector.com/help/chapters/create-or-edit-a-chapter - monthly - 0.5 - - - https://plotdirector.com/help/characters/attribute-history - monthly - 0.5 - - - https://plotdirector.com/help/characters/character-details - monthly - 0.5 - - - https://plotdirector.com/help/characters/character-knowledge - monthly - 0.5 - - - https://plotdirector.com/help/characters/characters - monthly - 0.5 - - - https://plotdirector.com/help/characters/confidence-intensity - monthly - 0.5 - - - https://plotdirector.com/help/characters/create-or-edit-a-character - monthly - 0.5 - - - https://plotdirector.com/help/characters/current-relationships - monthly - 0.5 - - - https://plotdirector.com/help/characters/initial-book - monthly - 0.5 - - - https://plotdirector.com/help/characters/initial-relationships - monthly - 0.5 - - - https://plotdirector.com/help/characters/reader-initially-knows - monthly - 0.5 - - - https://plotdirector.com/help/characters/reciprocal-relationship - monthly - 0.5 - - - https://plotdirector.com/help/characters/related-character - monthly - 0.5 - - - https://plotdirector.com/help/characters/relationship-awareness - monthly - 0.5 - - - https://plotdirector.com/help/characters/relationship-events - monthly - 0.5 - - - https://plotdirector.com/help/characters/relationship-notes - monthly - 0.5 - - - https://plotdirector.com/help/characters/relationship-type - monthly - 0.5 - - - https://plotdirector.com/help/characters/scene-appearances - monthly - 0.5 - - - https://plotdirector.com/help/characters/story-importance - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/add-block - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/add-floor - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/background-controls - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/background-image - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/block-location - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/block-type - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/block-width-and-height - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/create-transition - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/creating-floors-and-rooms - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/delete-block - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/existing-or-new-location - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/existing-transitions - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/floor-level - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/floor-name - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/floor-plan-best-practices - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/floor-plan-notes - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/floor-plans-overview - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/from-location - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/grid-coordinates - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/grid-height - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/grid-width - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/hidden-door - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/label-override - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/ladder - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/occupancy-mode - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/occupancy-scene-selector - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/occupancy-tokens - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/occupancy-warnings - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/occupants-on-other-floors - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/position-within-location - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/previous-and-next-scene - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/reference-floor - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/reference-floors-backgrounds-and-grid-guides - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/root-location - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/secret-passage - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/size-preset - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/stairs-ladders-and-floor-levels - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/stairs-up-and-down - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/structure-mode - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/to-location - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/transitions-doors-and-entrances - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/transitions-toolbox - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/transition-type - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/x-coordinate - monthly - 0.5 - - - https://plotdirector.com/help/floor-plans/y-coordinate - monthly - 0.5 - - - https://plotdirector.com/help/help-centre/help-centre - monthly - 0.5 - - - https://plotdirector.com/help/imports/imports - monthly - 0.5 - - - https://plotdirector.com/help/locations/child-locations - monthly - 0.5 - - - https://plotdirector.com/help/locations/create-or-edit-location - monthly - 0.5 - - - https://plotdirector.com/help/locations/location-details - monthly - 0.5 - - - https://plotdirector.com/help/locations/location-quick-add - monthly - 0.5 - - - https://plotdirector.com/help/locations/location-relationships - monthly - 0.5 - - - https://plotdirector.com/help/locations/locations - monthly - 0.5 - - - https://plotdirector.com/help/locations/location-type - monthly - 0.5 - - - https://plotdirector.com/help/locations/parent-location - monthly - 0.5 - - - https://plotdirector.com/help/locations/used-here - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/create-or-edit-a-plot-line - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/create-or-edit-a-plot-thread - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/introduced-scene - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/main-plot - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/parent-plot-line - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-line-book-scope - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-lines - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-line-type - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-line-visibility - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-thread-events - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-thread-importance - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-threads - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-threads-plotthreads-index - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-thread-status - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/plot-thread-type - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/thread-plot-line - monthly - 0.5 - - - https://plotdirector.com/help/plot-lines/thread-resolution - monthly - 0.5 - - - https://plotdirector.com/help/projects/genre-metric-preset - monthly - 0.5 - - - https://plotdirector.com/help/projects/project-books - monthly - 0.5 - - - https://plotdirector.com/help/projects/project-dashboard - monthly - 0.5 - - - https://plotdirector.com/help/projects/projects - monthly - 0.5 - - - https://plotdirector.com/help/projects/project-settings - monthly - 0.5 - - - https://plotdirector.com/help/relationship-map/relationship-map - monthly - 0.5 - - - https://plotdirector.com/help/restore-points/restore-points - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/apply-scenario-to-main - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/compare-scenario - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/confirmation-text - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/create-scenario - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/main-vs-scenario - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/scenarios - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/scenario-scope - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/scenario-timeline - monthly - 0.5 - - - https://plotdirector.com/help/scenarios/scenario-validation-notes - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/asset-event-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/asset-kind - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/asset-location - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/asset-locations - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/assets - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/asset-selector - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/asset-state - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/attachments-and-research - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/attachment-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-attributes - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-attribute-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-attribute-value - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-location-fields - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-presence - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-role - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/characters - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/character-selector - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/checklist-completion - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/continuity-warnings - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/custodians - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/custody - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/custody-event-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/custody-role - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/duration-unit - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/knowledge - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/knowledge-state - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/knowledge-subject - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/move-and-reorder - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/move-controls - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/other-character-knows - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/plot-thread-selector - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/primary-location - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/purpose-and-outcome - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/relationship-characters - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/relationship-intensity - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/relationships - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/relationship-selector - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/relationship-state - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/relationship-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-checklist - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-dependencies - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-dependency-controls - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-inspector - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-notes - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-note-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/scene-revision-status - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/story-state - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/thread-event-targets - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/thread-event-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/thread-marker-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/threads - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/thread-type - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/time - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/time-confidence - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/time-mode - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/update-current-location - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/warning-actions - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/writer-blocked - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/writer-priority - monthly - 0.5 - - - https://plotdirector.com/help/scene-inspector/writer-workspace - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/active-metric - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/add-scene-metric - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/default-scene-metrics - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/default-value - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/edit-scene-metric - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/maximum-value - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/minimum-value - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/project-scene-metrics - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/scene-metrics - monthly - 0.5 - - - https://plotdirector.com/help/scene-metrics/sort-order - monthly - 0.5 - - - https://plotdirector.com/help/scenes/create-or-edit-a-scene - monthly - 0.5 - - - https://plotdirector.com/help/scenes/scenes - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/asset-current-location-field - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/asset-current-state-field - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/dependency-description - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/dependency-source-asset - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/dependency-target-asset - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/dependency-type - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/edit-story-asset - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/events-across-scenes - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/show-in-quick-add-bar - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/source-required-state - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-current-state - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-custody - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-dependencies - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-details - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-importance - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-kind - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-asset-resolved - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/story-assets - monthly - 0.5 - - - https://plotdirector.com/help/story-assets/target-blocked-state - monthly - 0.5 - - - https://plotdirector.com/help/story-bible/story-bible - monthly - 0.5 - - - https://plotdirector.com/help/story-bible/story-bible-attention-items - monthly - 0.5 - - - https://plotdirector.com/help/story-bible/story-bible-revision-status - monthly - 0.5 - - - https://plotdirector.com/help/story-bible/story-bible-timeline-summary - monthly - 0.5 - - - https://plotdirector.com/help/story-dynamics/story-dynamics - monthly - 0.5 - - - https://plotdirector.com/help/story-health/pacing-review - monthly - 0.5 - - - https://plotdirector.com/help/story-health/plot-thread-health - monthly - 0.5 - - - https://plotdirector.com/help/story-health/revision-summary - monthly - 0.5 - - - https://plotdirector.com/help/story-health/scene-metric-shape - monthly - 0.5 - - - https://plotdirector.com/help/story-health/scene-purpose-balance - monthly - 0.5 - - - https://plotdirector.com/help/story-health/story-asset-health - monthly - 0.5 - - - https://plotdirector.com/help/story-health/story-health - monthly - 0.5 - - - https://plotdirector.com/help/story-health/warning-hotspots - monthly - 0.5 - - - https://plotdirector.com/help/timeline/asset-events - monthly - 0.5 - - - https://plotdirector.com/help/timeline/character-appearances - monthly - 0.5 - - - https://plotdirector.com/help/timeline/filters-and-focus - monthly - 0.5 - - - https://plotdirector.com/help/timeline/metrics - monthly - 0.5 - - - https://plotdirector.com/help/timeline/plot-lines - monthly - 0.5 - - - https://plotdirector.com/help/timeline/plot-thread-lanes - monthly - 0.5 - - - https://plotdirector.com/help/timeline/saved-view-name - monthly - 0.5 - - - https://plotdirector.com/help/timeline/saved-views - monthly - 0.5 - - - https://plotdirector.com/help/timeline/scene-cards - monthly - 0.5 - - - https://plotdirector.com/help/timeline/thread-health - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-asset-dependency-drop - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-asset-drop-event - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-book-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-chapter-range - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-character-drop-role - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-density - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-focus-id - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-focus-type - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-jump-controls - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-location-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-location-relationship-drop - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-metric-editing - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-pov-character-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-revision-status-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-scene-purpose-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-scene-range - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-warning-options - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-warning-severity-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-warning-type-filter - monthly - 0.5 - - - https://plotdirector.com/help/timeline/timeline-zoom - monthly - 0.5 - - - https://plotdirector.com/help/warnings/continuity-warnings - monthly - 0.5 - - - https://plotdirector.com/help/warnings/warning-list - monthly - 0.5 - - - https://plotdirector.com/help/warnings/warning-severity-summary - monthly - 0.5 - - - https://plotdirector.com/help/warnings/warning-type-summary - monthly - 0.5 - - - https://plotdirector.com/help/workspace/chapter-goals - monthly - 0.5 - - - https://plotdirector.com/help/workspace/chapter-workflow - monthly - 0.5 - - - https://plotdirector.com/help/workspace/continue-writing - monthly - 0.5 - - - https://plotdirector.com/help/workspace/polishing-queue - monthly - 0.5 - - - https://plotdirector.com/help/workspace/practical-blockers - monthly - 0.5 - - - https://plotdirector.com/help/workspace/revision-queue - monthly - 0.5 - - - https://plotdirector.com/help/workspace/workflow-summary - monthly - 0.5 - - - https://plotdirector.com/help/workspace/workspace-reminders - monthly - 0.5 - - - https://plotdirector.com/help/workspace/writer-workspace - monthly - 0.5 - -