diff --git a/PlotLine/Views/Home/Index.cshtml b/PlotLine/Views/Home/Index.cshtml
index 82b9ca3..161a029 100644
--- a/PlotLine/Views/Home/Index.cshtml
+++ b/PlotLine/Views/Home/Index.cshtml
@@ -1,6 +1,48 @@
@{
ViewData["Title"] = "Finally finish your novel";
ViewData["ShellClass"] = "marketing-shell";
+ ViewData["SeoTitle"] = "PlotWeaver Studio | Novel Planning Software for Authors";
+ ViewData["SeoDescription"] = "PlotWeaver Studio helps authors organise characters, plot threads, timelines, story assets, relationships, and continuity so they can finish complex novels with confidence.";
+ ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible";
+ ViewData["CanonicalUrl"] = "https://plotweaver.studio/";
+ ViewData["StructuredData"] = new[]
+ {
+ """
+ {
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ "name": "PlotWeaver Studio",
+ "url": "https://plotweaver.studio",
+ "description": "Novel planning and story organisation software for authors."
+ }
+ """,
+ """
+ {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ "name": "PlotWeaver Studio",
+ "applicationCategory": "WritingApplication",
+ "operatingSystem": "Web",
+ "description": "Novel planning software for authors to organise characters, plot threads, timelines, story assets, relationships, continuity, and series.",
+ "url": "https://plotweaver.studio",
+ "offers": {
+ "@type": "Offer",
+ "priceCurrency": "GBP",
+ "availability": "https://schema.org/InStock"
+ }
+ }
+ """,
+ """
+ {
+ "@context": "https://schema.org",
+ "@type": "Organization",
+ "name": "PlotWeaver Studio",
+ "url": "https://plotweaver.studio",
+ "logo": "https://plotweaver.studio/android-chrome-512x512.png",
+ "sameAs": []
+ }
+ """
+ };
}
diff --git a/PlotLine/Views/Pricing/Index.cshtml b/PlotLine/Views/Pricing/Index.cshtml
index bba29b5..3b0566a 100644
--- a/PlotLine/Views/Pricing/Index.cshtml
+++ b/PlotLine/Views/Pricing/Index.cshtml
@@ -3,6 +3,29 @@
@{
ViewData["Title"] = "Pricing";
ViewData["ShellClass"] = "marketing-shell";
+ ViewData["SeoTitle"] = "Pricing | PlotWeaver Studio";
+ ViewData["SeoDescription"] = "Compare PlotWeaver Studio plans and choose the right subscription for organising your novel, series, characters, plot threads, timelines, and story details.";
+ ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible";
+ ViewData["CanonicalUrl"] = "https://plotweaver.studio/pricing";
+ ViewData["StructuredData"] = new[]
+ {
+ """
+ {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ "name": "PlotWeaver Studio",
+ "applicationCategory": "WritingApplication",
+ "operatingSystem": "Web",
+ "description": "Novel planning software for authors to organise characters, plot threads, timelines, story assets, relationships, continuity, and series.",
+ "url": "https://plotweaver.studio",
+ "offers": {
+ "@type": "Offer",
+ "priceCurrency": "GBP",
+ "availability": "https://schema.org/InStock"
+ }
+ }
+ """
+ };
var paidPlans = Model.Plans.Where(x => x.RequiresStripeSubscription).ToList();
var suggestedPlanId = paidPlans.Count >= 2 ? paidPlans[paidPlans.Count / 2].SubscriptionLevelID : (int?)null;
}
diff --git a/PlotLine/Views/Public/About.cshtml b/PlotLine/Views/Public/About.cshtml
index 31148e3..a066b83 100644
--- a/PlotLine/Views/Public/About.cshtml
+++ b/PlotLine/Views/Public/About.cshtml
@@ -2,6 +2,10 @@
@{
ViewData["Title"] = "About";
ViewData["ShellClass"] = "marketing-shell";
+ ViewData["SeoTitle"] = "About PlotWeaver Studio | Built for Novelists";
+ ViewData["SeoDescription"] = "Learn why PlotWeaver Studio was created by a novelist to help writers organise complex stories, manage continuity, and finish their books with confidence.";
+ ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible";
+ ViewData["CanonicalUrl"] = "https://plotweaver.studio/about";
}
diff --git a/PlotLine/Views/Public/Contact.cshtml b/PlotLine/Views/Public/Contact.cshtml
index 68e7da8..77f477e 100644
--- a/PlotLine/Views/Public/Contact.cshtml
+++ b/PlotLine/Views/Public/Contact.cshtml
@@ -2,6 +2,10 @@
@{
ViewData["Title"] = "Contact";
ViewData["ShellClass"] = "marketing-shell";
+ ViewData["SeoTitle"] = "Contact PlotWeaver Studio";
+ ViewData["SeoDescription"] = "Contact PlotWeaver Studio for support, questions, feedback, or feature suggestions about our novel planning and story organisation platform.";
+ ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible";
+ ViewData["CanonicalUrl"] = "https://plotweaver.studio/contact";
}
diff --git a/PlotLine/Views/Public/Privacy.cshtml b/PlotLine/Views/Public/Privacy.cshtml
index 28ff477..104b206 100644
--- a/PlotLine/Views/Public/Privacy.cshtml
+++ b/PlotLine/Views/Public/Privacy.cshtml
@@ -2,6 +2,10 @@
@{
ViewData["Title"] = "Privacy Policy";
ViewData["ShellClass"] = "marketing-shell";
+ ViewData["SeoTitle"] = "Privacy Policy | PlotWeaver Studio";
+ ViewData["SeoDescription"] = "Read the PlotWeaver Studio Privacy Policy to learn how we protect your account information, subscription data, and story content.";
+ ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible";
+ ViewData["CanonicalUrl"] = "https://plotweaver.studio/privacy";
}
diff --git a/PlotLine/Views/Public/Terms.cshtml b/PlotLine/Views/Public/Terms.cshtml
index cb21ba1..f96464f 100644
--- a/PlotLine/Views/Public/Terms.cshtml
+++ b/PlotLine/Views/Public/Terms.cshtml
@@ -2,6 +2,10 @@
@{
ViewData["Title"] = "Terms of Service";
ViewData["ShellClass"] = "marketing-shell";
+ ViewData["SeoTitle"] = "Terms of Service | PlotWeaver Studio";
+ ViewData["SeoDescription"] = "Read the PlotWeaver Studio Terms of Service for information about subscriptions, user content, acceptable use, and account responsibilities.";
+ ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible";
+ ViewData["CanonicalUrl"] = "https://plotweaver.studio/terms";
}
diff --git a/PlotLine/Views/Shared/_Layout.cshtml b/PlotLine/Views/Shared/_Layout.cshtml
index 6327993..911c2b0 100644
--- a/PlotLine/Views/Shared/_Layout.cshtml
+++ b/PlotLine/Views/Shared/_Layout.cshtml
@@ -1,9 +1,61 @@
+@{
+ var shellClass = ViewData["ShellClass"] as string ?? string.Empty;
+ var isMarketingPage = shellClass.Contains("marketing-shell", StringComparison.OrdinalIgnoreCase);
+ var defaultTitle = $"{ViewData["Title"]} - PlotWeaver Studio";
+ var seoTitle = isMarketingPage && ViewData["SeoTitle"] is string seoTitleValue ? seoTitleValue : defaultTitle;
+ var seoDescription = isMarketingPage && ViewData["SeoDescription"] is string seoDescriptionValue ? seoDescriptionValue : null;
+ var canonicalUrl = isMarketingPage && ViewData["CanonicalUrl"] is string canonicalUrlValue ? canonicalUrlValue : null;
+ var seoKeywords = isMarketingPage && ViewData["SeoKeywords"] is string seoKeywordsValue ? seoKeywordsValue : null;
+ var structuredData = isMarketingPage && ViewData["StructuredData"] is IEnumerable structuredDataValues ? structuredDataValues : Array.Empty();
+ const string ogImageUrl = "https://plotweaver.studio/og-image.png";
+}
- @ViewData["Title"] - PlotWeaver Studio
+ @seoTitle
+ @if (isMarketingPage)
+ {
+ @if (!string.IsNullOrWhiteSpace(seoDescription))
+ {
+
+ }
+ @if (!string.IsNullOrWhiteSpace(seoKeywords))
+ {
+
+ }
+ @if (!string.IsNullOrWhiteSpace(canonicalUrl))
+ {
+
+ }
+
+
+
+ @if (!string.IsNullOrWhiteSpace(seoDescription))
+ {
+
+ }
+
+ @if (!string.IsNullOrWhiteSpace(canonicalUrl))
+ {
+
+ }
+
+
+
+ @if (!string.IsNullOrWhiteSpace(seoDescription))
+ {
+
+ }
+
+ @foreach (var jsonLd in structuredData)
+ {
+ @Html.Raw("")
+ }
+ }