Added SEO

This commit is contained in:
Nick Beckley 2026-06-07 22:04:02 +01:00
parent 88386d6d7e
commit a5f1e1ac1c
9 changed files with 189 additions and 5 deletions

View File

@ -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": []
}
"""
};
}
<article class="marketing-home">

View File

@ -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;
}

View File

@ -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";
}
<article class="marketing-home public-info-page">

View File

@ -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";
}
<article class="marketing-home public-info-page">

View File

@ -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";
}
<article class="marketing-home public-info-page">

View File

@ -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";
}
<article class="marketing-home public-info-page">

View File

@ -1,9 +1,61 @@
<!DOCTYPE html>
<html lang="en" data-theme="light" data-bs-theme="light">
@{
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<string> structuredDataValues ? structuredDataValues : Array.Empty<string>();
const string ogImageUrl = "https://plotweaver.studio/og-image.png";
}
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - PlotWeaver Studio</title>
<title>@seoTitle</title>
@if (isMarketingPage)
{
@if (!string.IsNullOrWhiteSpace(seoDescription))
{
<meta name="description" content="@seoDescription" />
}
@if (!string.IsNullOrWhiteSpace(seoKeywords))
{
<meta name="keywords" content="@seoKeywords" />
}
@if (!string.IsNullOrWhiteSpace(canonicalUrl))
{
<link rel="canonical" href="@canonicalUrl" />
}
<meta name="robots" content="index, follow" />
<meta property="og:site_name" content="PlotWeaver Studio" />
<meta property="og:title" content="@seoTitle" />
@if (!string.IsNullOrWhiteSpace(seoDescription))
{
<meta property="og:description" content="@seoDescription" />
}
<meta property="og:type" content="website" />
@if (!string.IsNullOrWhiteSpace(canonicalUrl))
{
<meta property="og:url" content="@canonicalUrl" />
}
<meta property="og:image" content="@ogImageUrl" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="@seoTitle" />
@if (!string.IsNullOrWhiteSpace(seoDescription))
{
<meta name="twitter:description" content="@seoDescription" />
}
<meta name="twitter:image" content="@ogImageUrl" />
@foreach (var jsonLd in structuredData)
{
@Html.Raw("<script type=\"application/ld+json\">")
@Html.Raw(jsonLd)
@Html.Raw("</script>")
}
}
<script>
(() => {
let savedTheme = null;
@ -31,10 +83,6 @@
<meta name="msapplication-config" content="/browserconfig.xml" />
<meta name="msapplication-TileColor" content="#1F2A44" />
<meta name="theme-color" content="#1F2A44" />
<meta property="og:site_name" content="PlotWeaver Studio" />
<meta property="og:title" content="PlotWeaver Studio" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/og-image.png" />
</head>
<body>
<header>
@ -139,6 +187,7 @@
<div class="marketing-container public-footer__inner">
<a class="public-footer__brand" asp-controller="Home" asp-action="Index">PlotWeaver Studio</a>
<nav class="public-footer__nav" aria-label="Footer navigation">
<a asp-controller="Home" asp-action="Index">Home</a>
<a asp-controller="Public" asp-action="About">About</a>
<a asp-controller="Pricing" asp-action="Index">Pricing</a>
<a asp-controller="Public" asp-action="Contact">Contact</a>

View File

@ -0,0 +1,21 @@
User-agent: *
Allow: /
Disallow: /Account/
Disallow: /ManageAccount/
Disallow: /Projects/
Disallow: /Books/
Disallow: /Chapters/
Disallow: /Scenes/
Disallow: /Characters/
Disallow: /PlotLines/
Disallow: /PlotThreads/
Disallow: /StoryAssets/
Disallow: /Timeline/
Disallow: /Analytics/
Disallow: /Writer/
Disallow: /Imports/
Disallow: /Archives/
Disallow: /HelpDrawer/
Disallow: /HelpDiagnostics/
Sitemap: https://plotweaver.studio/sitemap.xml

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://plotweaver.studio/</loc>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://plotweaver.studio/pricing</loc>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://plotweaver.studio/about</loc>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://plotweaver.studio/contact</loc>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://plotweaver.studio/privacy</loc>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://plotweaver.studio/terms</loc>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
</urlset>