Rename Phase 1B: Public rebrand from PlotWeaver to PlotDirector.

This commit is contained in:
Nick Beckley 2026-06-08 15:19:52 +01:00
parent 813dacdea9
commit 3f912d63e2
53 changed files with 166 additions and 166 deletions

View File

@ -8,7 +8,7 @@ namespace PlotLine.Controllers;
[Route("")]
public sealed class PublicController : Controller
{
private const string SupportEmail = "hello@plotweaver.studio";
private const string SupportEmail = "hello@plotdirector.com";
private const string PolicyDate = "June 7, 2026";
[HttpGet("About")]

View File

@ -1,4 +1,4 @@
# PlotWeaver Studio
# PlotDirector
# Phase 5 -- Multi-User, Collaboration & Subscription Architecture
@ -10,15 +10,15 @@ Date: June 2026
Phase 5 introduces multi-user support, subscriptions, collaboration
capabilities, storage management, auditing, and monetisation foundations
to PlotWeaver Studio.
to PlotDirector.
The goal is to transform PlotWeaver Studio from a single-user authoring
The goal is to transform PlotDirector from a single-user authoring
platform into a secure SaaS application while preserving its core
philosophy as a planning and writing workspace for authors.
## Core Principles
- PlotWeaver Studio is an active workspace, not a permanent archive.
- PlotDirector is an active workspace, not a permanent archive.
- Security takes precedence over convenience.
- Collaboration supports planning, not real-time writing.
- Subscription limits should be generous but prevent abuse.
@ -27,7 +27,7 @@ philosophy as a planning and writing workspace for authors.
### User
Authenticated account holder within PlotWeaver Studio.
Authenticated account holder within PlotDirector.
### Project

View File

@ -11,7 +11,7 @@ screenshot:
# Overview
Books are the major containers inside a PlotWeaver Studio project. A project may be a single novel, but it can also be a series, trilogy, collection of novellas, or long-running world with several planned instalments. Books give that larger structure somewhere practical to live.
Books are the major containers inside a PlotDirector project. A project may be a single novel, but it can also be a series, trilogy, collection of novellas, or long-running world with several planned instalments. Books give that larger structure somewhere practical to live.
Each book contains chapters, and each chapter contains scenes. This hierarchy keeps the writing plan readable while still allowing story details to connect across the whole project. A clue introduced in book one, a relationship shift in book two, or an asset that returns in book three can remain part of the same continuity system.

View File

@ -11,9 +11,9 @@ screenshot:
# Overview
Chapters are the reader-facing containers that turn a sequence of scenes into a shaped reading experience. In PlotWeaver Studio, a chapter belongs to a book and contains one or more scenes. The chapter does not need to carry every detail of the action. Its job is to help you organise the narrative, decide where a reader enters and leaves a movement, and keep the rhythm of the book visible.
Chapters are the reader-facing containers that turn a sequence of scenes into a shaped reading experience. In PlotDirector, a chapter belongs to a book and contains one or more scenes. The chapter does not need to carry every detail of the action. Its job is to help you organise the narrative, decide where a reader enters and leaves a movement, and keep the rhythm of the book visible.
Think of a chapter as a purposeful stretch of story. It may cover one continuous sequence, a set of related beats, a shift in point of view, or a deliberate contrast between scenes. Some writers plan chapters before drafting. Others draft scenes first and only later decide where chapter breaks should fall. PlotWeaver Studio supports both approaches because the scenes remain the core building blocks.
Think of a chapter as a purposeful stretch of story. It may cover one continuous sequence, a set of related beats, a shift in point of view, or a deliberate contrast between scenes. Some writers plan chapters before drafting. Others draft scenes first and only later decide where chapter breaks should fall. PlotDirector supports both approaches because the scenes remain the core building blocks.
# When Should I Use This?

View File

@ -3,7 +3,7 @@ title: Reciprocal Relationship
category: Characters
tags: characters, relationships, fields
contextKey: characters.relationships.reciprocal
micro: Decide whether PlotWeaver should create the reverse relationship too.
micro: Decide whether PlotDirector should create the reverse relationship too.
quickTitle: Reciprocal
quickSummary: Turn this on when the reverse connection should also exist, such as parent and child, siblings or friends.
screenshot:
@ -11,6 +11,6 @@ screenshot:
# Reciprocal
Reciprocal tells PlotWeaver to create the reverse relationship too. If Annie is Beth's parent, Beth is Annie's child.
Reciprocal tells PlotDirector to create the reverse relationship too. If Annie is Beth's parent, Beth is Annie's child.
Use this for relationships where both directions should be tracked. Turn it off when the connection is one-sided, secret, unequal or should be handled separately.

View File

@ -30,7 +30,7 @@ Initial Relationships can also separate story truth from reader knowledge. The w
| Awareness | Who knows about the relationship or understands its true nature. | The writer knows Beth and Maggie are sisters before the reader does. |
| Initial book | Where this relationship baseline begins. | Book 1 if the bond exists from the start; Book 2 if the character enters the series later. |
| Confidence / intensity | How strong, certain or emotionally charged the relationship is. | 10 for devoted family or intense hatred; 2 for a weak acquaintance. |
| Reciprocal | Whether PlotWeaver should also create the reverse connection. | If Annie is Beth's parent, Beth is Annie's child. |
| Reciprocal | Whether PlotDirector should also create the reverse connection. | If Annie is Beth's parent, Beth is Annie's child. |
| Reader initially knows | Whether the reader knows this relationship at the starting point. | Untick for hidden family ties, secret affairs or delayed reveals. |
| Notes | Extra context, hidden history or author-only explanation. | "The reader thinks they are strangers, but Annie is Beth's mother." |

View File

@ -11,7 +11,7 @@ screenshot:
# Overview
Characters are the people, beings or important figures who move through your story. PlotWeaver Studio treats characters as more than a name in a list. A character can appear in scenes, carry knowledge, form relationships, connect to story assets, move between locations and develop an arc across the book or series.
Characters are the people, beings or important figures who move through your story. PlotDirector treats characters as more than a name in a list. A character can appear in scenes, carry knowledge, form relationships, connect to story assets, move between locations and develop an arc across the book or series.
You can use character records lightly at first. A name and a short description are enough to begin. As the story becomes more complex, the same record can grow into a continuity anchor: where the character appears, what they know, how they feel, what relationships have changed, and which scenes matter most to their journey.
@ -27,7 +27,7 @@ You do not need to create a full record for every unnamed passer-by. If someone
Start with the character's display name and a short description. Add details that help you identify them quickly while planning. Then assign the character to scenes where they appear. Scene appearances are important because they allow the rest of the system to answer questions such as: when did this character last appear, where were they, and what did they know at that point?
Use relationship tools to record initial relationships and later changes. A character may begin as a stranger, become a friend, and later be revealed as family. PlotWeaver Studio keeps that evolution visible without erasing the past.
Use relationship tools to record initial relationships and later changes. A character may begin as a stranger, become a friend, and later be revealed as family. PlotDirector keeps that evolution visible without erasing the past.
For revision, use character pages to look for long absences, uneven appearances and key scenes that define an arc.

View File

@ -3,15 +3,15 @@ title: Help Centre
category: Help Centre
tags: help, guidance, articles, search, learning
contextKey: helpCentre.overview
micro: Browse practical guidance for using PlotWeaver Studio.
micro: Browse practical guidance for using PlotDirector.
quickTitle: What is the Help Centre?
quickSummary: The Help Centre collects full guides for PlotWeaver Studio so you can search, browse by category and open deeper explanations from contextual help.
quickSummary: The Help Centre collects full guides for PlotDirector so you can search, browse by category and open deeper explanations from contextual help.
screenshot:
---
# Overview
The Help Centre is the longer-form guide library for PlotWeaver Studio. Contextual help icons give quick explanations while you work; the Help Centre gives fuller guidance when you want to understand a page or workflow in more detail.
The Help Centre is the longer-form guide library for PlotDirector. Contextual help icons give quick explanations while you work; the Help Centre gives fuller guidance when you want to understand a page or workflow in more detail.
The articles are written for writing practice rather than technical administration. They explain how tools fit into planning, drafting, revision, continuity and series management.

View File

@ -3,15 +3,15 @@ title: Imports
category: Imports
tags: imports, json, structure, setup, migration
contextKey: imports.overview
micro: Bring prepared project structure into PlotWeaver Studio.
micro: Bring prepared project structure into PlotDirector.
quickTitle: What are Imports?
quickSummary: Imports let you bring prepared story structure into PlotWeaver Studio so books, chapters, scenes and related items can be created together.
quickSummary: Imports let you bring prepared story structure into PlotDirector so books, chapters, scenes and related items can be created together.
screenshot:
---
# Overview
Imports allow you to bring prepared story structure into PlotWeaver Studio instead of entering every project, book, chapter and scene by hand. This is useful when you have planned elsewhere, generated a structured outline, or need to move a project from another format into the app.
Imports allow you to bring prepared story structure into PlotDirector instead of entering every project, book, chapter and scene by hand. This is useful when you have planned elsewhere, generated a structured outline, or need to move a project from another format into the app.
The import page is intentionally practical. You can upload or paste a JSON package, preview the result, run checks, and then create a new project when the package looks safe. The goal is to reduce setup friction while still protecting your data from accidental messy imports.
@ -35,7 +35,7 @@ After a successful import, open the created project and review the books, chapte
# Example
You may have an outline with three books, thirty chapters and two hundred scenes. Entering that manually would be slow. An import package can create the structure, then you can use PlotWeaver Studio to refine scene summaries, metrics, relationships, locations and continuity.
You may have an outline with three books, thirty chapters and two hundred scenes. Entering that manually would be slow. An import package can create the structure, then you can use PlotDirector to refine scene summaries, metrics, relationships, locations and continuity.
# Writer Tip

View File

@ -11,7 +11,7 @@ screenshot:
# Overview
Locations are the places where your story happens. They can be broad settings, such as a city or estate, or specific places, such as a bedroom, kitchen, railway platform, office, cellar or garden path. PlotWeaver Studio uses locations to support both atmosphere and continuity.
Locations are the places where your story happens. They can be broad settings, such as a city or estate, or specific places, such as a bedroom, kitchen, railway platform, office, cellar or garden path. PlotDirector uses locations to support both atmosphere and continuity.
A location is not only scenery. It affects what characters can see, hear, hide, discover and misunderstand. In a tightly plotted story, the distance between rooms may matter. In a mystery, who could hear a conversation may matter. In a romance, returning to the same place after an emotional change may matter. Locations give those details a stable home.

View File

@ -11,7 +11,7 @@ screenshot:
# Overview
Project Settings define the working container for your story. In PlotWeaver Studio, a project can be a single novel, a planned series, a shared story world, or a large writing idea that will eventually split into several books.
Project Settings define the working container for your story. In PlotDirector, a project can be a single novel, a planned series, a shared story world, or a large writing idea that will eventually split into several books.
The project is where the major pieces connect: books, chapters, scenes, characters, locations, assets, plot threads, relationship history and workspace queues. The settings page keeps the practical identity of that container simple and editable.

View File

@ -15,7 +15,7 @@ Restore Points are safety snapshots for a project. They save the current project
They are designed for moments when you are about to make changes that might be hard to undo: importing a large backup, restructuring chapters, testing a big revision plan, or cleaning up archived material.
Restore Points are different from ordinary exports. A downloaded project backup is a file you keep locally. A restore point stays inside PlotWeaver Studio and is ready to use from this page.
Restore Points are different from ordinary exports. A downloaded project backup is a file you keep locally. A restore point stays inside PlotDirector and is ready to use from this page.
# When Should I Use This?
@ -27,7 +27,7 @@ You do not need a restore point before every small scene edit. Use them when the
Give the restore point a short name or leave the default name. Add notes if you want to remember why it was created. Download older restore points before deleting them if you want an extra local copy.
When you restore, PlotWeaver creates a safety backup first so the current state can still be recovered.
When you restore, PlotDirector creates a safety backup first so the current state can still be recovered.
# Example

View File

@ -11,7 +11,7 @@ screenshot:
# Overview
Default scene metrics are the core sliders PlotWeaver Studio expects many projects to use. They may include qualities such as overall intensity, emotional weight, tension, romance, mystery, darkness, hope, comedy or action.
Default scene metrics are the core sliders PlotDirector expects many projects to use. They may include qualities such as overall intensity, emotional weight, tension, romance, mystery, darkness, hope, comedy or action.
# When Should I Use This?

View File

@ -5,15 +5,15 @@ tags: scenes, structure, pacing, metrics, purpose
contextKey: scenes.overview
micro: Plan each story beat with purpose, time, consequences and emotional shape.
quickTitle: What are Scenes?
quickSummary: Scenes are the core building blocks of PlotWeaver Studio, where story action, character change and continuity details come together.
quickSummary: Scenes are the core building blocks of PlotDirector, where story action, character change and continuity details come together.
screenshot:
---
# Overview
Scenes are the heart of PlotWeaver Studio. A scene is a single unit of story action: something happens, someone wants something, pressure changes, and the reader leaves with a different understanding than they had before. Books and chapters provide structure, but scenes are where the story actually moves.
Scenes are the heart of PlotDirector. A scene is a single unit of story action: something happens, someone wants something, pressure changes, and the reader leaves with a different understanding than they had before. Books and chapters provide structure, but scenes are where the story actually moves.
In PlotWeaver Studio, a scene can hold its title, summary, time information, revision status, purpose, outcome, character appearances, assets, locations, attachments and metrics. You do not need to fill every field immediately. The point is to give you a practical place to capture the details that matter when you are planning, drafting or revising.
In PlotDirector, a scene can hold its title, summary, time information, revision status, purpose, outcome, character appearances, assets, locations, attachments and metrics. You do not need to fill every field immediately. The point is to give you a practical place to capture the details that matter when you are planning, drafting or revising.
The scene editor is also designed to support continuity. If a character enters from one location and exits to another, if an object changes hands, or if the emotional weight spikes sharply, the scene is the place where that evidence belongs.

View File

@ -11,7 +11,7 @@ screenshot:
# Overview
Story Assets are important things that move through the story or matter to the plot. They might be physical objects, clues, documents, weapons, letters, heirlooms, passwords, secrets, debts, promises or pieces of evidence. If something has continuity weight, PlotWeaver Studio can treat it as an asset.
Story Assets are important things that move through the story or matter to the plot. They might be physical objects, clues, documents, weapons, letters, heirlooms, passwords, secrets, debts, promises or pieces of evidence. If something has continuity weight, PlotDirector can treat it as an asset.
An asset does not have to be glamorous. A hotel key, a torn photograph, a train ticket or a missing notebook can be more important than a dramatic artefact if it affects what characters know or what they can do. The purpose of asset tracking is to stop important items becoming vague once the plot becomes busy.

View File

@ -13,7 +13,7 @@ screenshot:
The Writer Workspace is a practical working view. It helps you decide what to do next without reopening every book, chapter and scene. Instead of showing the whole structure, it gathers scenes and reminders into useful queues: continue writing, needs attention, revision, polishing and story health reminders.
This is where PlotWeaver Studio becomes less like a filing cabinet and more like a desk. The timeline is for seeing story shape. The workspace is for choosing the next piece of work.
This is where PlotDirector becomes less like a filing cabinet and more like a desk. The timeline is for seeing story shape. The workspace is for choosing the next piece of work.
The queues are based on the information already recorded in your scenes and project. A scene that is planned may belong in a drafting queue. A scene with structural uncertainty may need attention. A nearly finished scene may belong in polishing. Reminders point you back to continuity, research or story health issues that should not be forgotten.

View File

@ -3,15 +3,15 @@ title: Help Authoring Guidelines
category: Internal
tags: help, authoring, guidelines
contextKey: internal.helpAuthoringGuidelines
micro: Internal guidance for writing PlotWeaver contextual help.
micro: Internal guidance for writing PlotDirector contextual help.
quickTitle: Help authoring guidelines
quickSummary: Internal guidance for applying the three-level help pattern across PlotWeaver Studio.
quickSummary: Internal guidance for applying the three-level help pattern across PlotDirector.
screenshot:
---
# Three-Level Help Pattern
Use this guideline when adding contextual help to a new PlotWeaver Studio area. The goal is to help authors understand the writing purpose of a page, section or field without exposing implementation details.
Use this guideline when adding contextual help to a new PlotDirector area. The goal is to help authors understand the writing purpose of a page, section or field without exposing implementation details.
# Level 1: Page Help

View File

@ -8,5 +8,5 @@ public sealed class EmailSettings
public string Password { get; set; } = string.Empty;
public bool EnableSsl { get; set; } = true;
public string FromAddress { get; set; } = string.Empty;
public string FromName { get; set; } = "PlotWeaver Studio";
public string FromName { get; set; } = "PlotDirector";
}

View File

@ -5,7 +5,7 @@ public sealed class ProjectBackupExport
public string Format { get; init; } = "PlotWeaver.ProjectBackup";
public string FormatVersion { get; init; } = "1.0";
public DateTime ExportedAtUtc { get; init; }
public string SourceApplication { get; init; } = "PlotWeaver Studio";
public string SourceApplication { get; init; } = "PlotDirector";
public Project? Project { get; init; }
public ProjectBackupData Data { get; init; } = new();
public ProjectBackupDiagnostics Diagnostics { get; init; } = new();

View File

@ -61,28 +61,28 @@ public sealed class EmailService(
{
var link = BuildAccountUrl("VerifyEmail", token);
var (plainText, html) = BuildTemplate(
"Verify your PlotWeaver Studio account",
"Verify your PlotDirector account",
displayName,
"Please verify your email address to finish setting up your PlotWeaver Studio account.",
"Please verify your email address to finish setting up your PlotDirector account.",
"Verify account",
link,
"This link expires in 24 hours.");
return QueueAsync(email, displayName, "Verify your PlotWeaver Studio account", plainText, html);
return QueueAsync(email, displayName, "Verify your PlotDirector account", plainText, html);
}
public Task SendPasswordResetEmailAsync(string email, string displayName, Guid token)
{
var link = BuildAccountUrl("ResetPassword", token);
var (plainText, html) = BuildTemplate(
"Reset your PlotWeaver Studio password",
"Reset your PlotDirector password",
displayName,
"Use the link below to choose a new password for your PlotWeaver Studio account.",
"Use the link below to choose a new password for your PlotDirector account.",
"Reset password",
link,
"This link expires in 24 hours. If you did not request a reset, you can ignore this email.");
return QueueAsync(email, displayName, "Reset your PlotWeaver Studio password", plainText, html);
return QueueAsync(email, displayName, "Reset your PlotDirector password", plainText, html);
}
private async Task QueueAsync(string toEmail, string displayName, string subject, string plainText, string html)
@ -140,7 +140,7 @@ public sealed class EmailService(
<html>
<body style="font-family:Segoe UI,Arial,sans-serif;background:#f7f1e8;margin:0;padding:32px;color:#251c17;">
<div style="max-width:620px;margin:0 auto;background:#fffaf2;border:1px solid #e4d4bd;border-radius:10px;padding:28px;">
<p style="margin:0 0 8px;text-transform:uppercase;letter-spacing:.08em;color:#7a5b3b;font-size:12px;font-weight:700;">PlotWeaver Studio</p>
<p style="margin:0 0 8px;text-transform:uppercase;letter-spacing:.08em;color:#7a5b3b;font-size:12px;font-weight:700;">PlotDirector</p>
<h1 style="margin:0 0 16px;font-size:26px;">{safeTitle}</h1>
<p>Hello {safeName},</p>
<p>{safeIntro}</p>
@ -160,13 +160,13 @@ public sealed class EmailService(
private static string CleanDisplayName(string value)
{
return string.IsNullOrWhiteSpace(value) ? "PlotWeaver Studio" : value.Trim();
return string.IsNullOrWhiteSpace(value) ? "PlotDirector" : value.Trim();
}
private string GetFromAddress()
{
return string.IsNullOrWhiteSpace(_settings.FromAddress)
? "hello@plotweaver.studio"
? "hello@plotdirector.com"
: _settings.FromAddress.Trim();
}
}
@ -220,7 +220,7 @@ public sealed class QueuedEmailSender(
private static string CleanDisplayName(string? value)
{
return string.IsNullOrWhiteSpace(value) ? "PlotWeaver Studio" : value.Trim();
return string.IsNullOrWhiteSpace(value) ? "PlotDirector" : value.Trim();
}
}

View File

@ -546,24 +546,24 @@ public sealed class ProjectCollaborationService(
var project = currentUser.UserId.HasValue ? await projects.GetForUserAsync(projectId, currentUser.UserId.Value) : null;
var projectName = project?.ProjectName ?? "a project";
var inviterName = CleanDisplayName(currentUser.DisplayName);
var subject = $"You have been added to {projectName} in PlotWeaver Studio";
var subject = $"You have been added to {projectName} in PlotDirector";
var plainText = $"""
You have been added as a collaborator.
Hello {CleanDisplayName(user.DisplayName)},
{inviterName} added you as a collaborator on "{projectName}" in PlotWeaver Studio. Sign in to PlotWeaver Studio to open the shared project.
{inviterName} added you as a collaborator on "{projectName}" in PlotDirector. Sign in to PlotDirector to open the shared project.
""";
var html = $"""
<!doctype html>
<html>
<body style="font-family:Segoe UI,Arial,sans-serif;background:#f7f1e8;margin:0;padding:32px;color:#251c17;">
<div style="max-width:620px;margin:0 auto;background:#fffaf2;border:1px solid #e4d4bd;border-radius:10px;padding:28px;">
<p style="margin:0 0 8px;text-transform:uppercase;letter-spacing:.08em;color:#7a5b3b;font-size:12px;font-weight:700;">PlotWeaver Studio</p>
<p style="margin:0 0 8px;text-transform:uppercase;letter-spacing:.08em;color:#7a5b3b;font-size:12px;font-weight:700;">PlotDirector</p>
<h1 style="margin:0 0 16px;font-size:24px;">You have been added as a collaborator</h1>
<p>Hello {WebUtility.HtmlEncode(CleanDisplayName(user.DisplayName))},</p>
<p>{WebUtility.HtmlEncode(inviterName)} added you as a collaborator on <strong>{WebUtility.HtmlEncode(projectName)}</strong>.</p>
<p>Sign in to PlotWeaver Studio to open the shared project.</p>
<p>Sign in to PlotDirector to open the shared project.</p>
</div>
</body>
</html>
@ -588,13 +588,13 @@ public sealed class ProjectCollaborationService(
private static string CleanDisplayName(string? value)
{
return string.IsNullOrWhiteSpace(value) ? "PlotWeaver Studio" : value.Trim();
return string.IsNullOrWhiteSpace(value) ? "PlotDirector" : value.Trim();
}
private string GetFromAddress()
{
return string.IsNullOrWhiteSpace(_emailSettings.FromAddress)
? "hello@plotweaver.studio"
? "hello@plotdirector.com"
: _emailSettings.FromAddress.Trim();
}
}

View File

@ -174,7 +174,7 @@ public sealed class ImportService(IImportRepository imports, ICurrentUserService
model.JsonText = await ReadJsonTextAsync(model);
var preview = await BuildPreviewAsync(model.JsonText);
var builder = new StringBuilder();
builder.AppendLine("PlotWeaver Studio JSON Import Validation Report");
builder.AppendLine("PlotDirector JSON Import Validation Report");
builder.AppendLine($"Generated: {DateTime.UtcNow:yyyy-MM-dd HH:mm} UTC");
builder.AppendLine();
builder.AppendLine($"Project: {preview.Package?.Project.Title ?? "(unreadable)"}");
@ -319,7 +319,7 @@ public sealed class ImportService(IImportRepository imports, ICurrentUserService
? $"{projectTitle.Trim()} (Imported {DateTime.Now:yyyy-MM-dd HH:mm})"
: null;
validation.Warnings.Add("This is a PlotWeaver project backup. It will be imported as a new project, not restored over an existing project.");
validation.Warnings.Add("This is a PlotDirector project backup. It will be imported as a new project, not restored over an existing project.");
if (duplicate)
{
validation.Warnings.Add($"A project with the same title already exists. If imported anyway, the new project will be named \"{duplicateTitle}\".");
@ -580,7 +580,7 @@ public sealed class ImportService(IImportRepository imports, ICurrentUserService
return ProjectImportFormat.LegacyPackage;
}
validation.Errors.Add("The uploaded JSON is not a recognised PlotWeaver import package or project backup.");
validation.Errors.Add("The uploaded JSON is not a recognised PlotDirector import package or project backup.");
return ProjectImportFormat.Unsupported;
}
catch (JsonException ex)
@ -610,7 +610,7 @@ public sealed class ImportService(IImportRepository imports, ICurrentUserService
Source = backup.Format,
CreatedBy = backup.SourceApplication,
CreatedDate = backup.ExportedAtUtc.ToString("yyyy-MM-dd HH:mm 'UTC'"),
Description = "Imported from a PlotWeaver project backup.",
Description = "Imported from a PlotDirector project backup.",
Project = new ImportProjectDto
{
Title = backup.Project?.ProjectName ?? string.Empty,

View File

@ -49,7 +49,7 @@ public sealed class StripeBillingService(
if (!level.RequiresStripeSubscription)
{
return StripeBillingActionResult.Failure("Draft Desk is managed inside PlotWeaver Studio and does not require Stripe Checkout.");
return StripeBillingActionResult.Failure("Draft Desk is managed inside PlotDirector and does not require Stripe Checkout.");
}
var billingInterval = NormalizeBillingInterval(request.BillingInterval);

View File

@ -7,7 +7,7 @@ namespace PlotLine.Services;
public sealed class TwoFactorService(ILogger<TwoFactorService> logger) : ITwoFactorService
{
private const string Issuer = "PlotWeaver Studio";
private const string Issuer = "PlotDirector";
private const int CodeDigits = 6;
private const int TimeStepSeconds = 30;
private const string Base32Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";

View File

@ -34,7 +34,7 @@ GO
MERGE dbo.GenreMetricPresets AS target
USING (VALUES
(N'Custom', N'Custom / No preset', N'Use the core PlotWeaver Studio metrics only.', 10),
(N'Custom', N'Custom / No preset', N'Use the core PlotDirector metrics only.', 10),
(N'CrimeThriller', N'Crime / Thriller', N'Suspense, danger, investigation and clues.', 20),
(N'Romance', N'Romance', N'Emotional intimacy, conflict, trust, longing and chemistry.', 30),
(N'Fantasy', N'Fantasy', N'Wonder, world building, magic, politics and quest progress.', 40),

View File

@ -26,7 +26,7 @@ public sealed class PricingViewModel
public sealed class PublicPageViewModel
{
public string SupportEmail { get; set; } = "support@plotweaver.studio";
public string SupportEmail { get; set; } = "support@plotdirector.com";
public string LastUpdated { get; set; } = "June 7, 2026";
}

View File

@ -23,7 +23,7 @@ public sealed class ImportIndexViewModel
{
"packageVersion": "1.0",
"source": "JSON Import Phase 1G sample",
"createdBy": "PlotWeaver Studio sample generator",
"createdBy": "PlotDirector sample generator",
"createdDate": "2026-06-02",
"description": "Phase 1G sample with aliases, metadata, dependencies, and a few validation warnings.",
"project": {

View File

@ -11,7 +11,7 @@
<section class="edit-panel">
<div class="alert alert-warning mb-3">
You do not have access to that part of PlotWeaver Studio.
You do not have access to that part of PlotDirector.
</div>
<a class="btn btn-outline-secondary" asp-controller="Home" asp-action="Index">Back to Home</a>
</section>

View File

@ -7,7 +7,7 @@
<div>
<p class="eyebrow">Account</p>
<h1>Login</h1>
<p class="lead-text">Sign in to PlotWeaver Studio.</p>
<p class="lead-text">Sign in to PlotDirector.</p>
</div>
</div>

View File

@ -7,7 +7,7 @@
<div>
<p class="eyebrow">Account</p>
<h1>Create your account</h1>
<p class="lead-text">Create a PlotWeaver Studio account so your workspace can use the new authentication foundation.</p>
<p class="lead-text">Create a PlotDirector account so your workspace can use the new authentication foundation.</p>
</div>
</div>

View File

@ -7,7 +7,7 @@
<div>
<p class="eyebrow">Account</p>
<h1>Reset password</h1>
<p class="lead-text">Choose a new password for your PlotWeaver Studio account.</p>
<p class="lead-text">Choose a new password for your PlotDirector account.</p>
</div>
</div>

View File

@ -11,7 +11,7 @@
<section class="edit-panel">
<div class="alert alert-info mb-3">
Your email address has been verified. You can now log in to PlotWeaver Studio.
Your email address has been verified. You can now log in to PlotDirector.
</div>
<a class="btn btn-primary" asp-action="Login">Login</a>
</section>

View File

@ -11,7 +11,7 @@
<div>
<p class="eyebrow">Guidance</p>
<h1>Help Centre <help-icon key="helpCentre.overview" /></h1>
<p class="lead-text">Find practical guidance for planning, tracking, and shaping your story in PlotWeaver Studio.</p>
<p class="lead-text">Find practical guidance for planning, tracking, and shaping your story in PlotDirector.</p>
</div>
</div>

View File

@ -1,18 +1,18 @@
@{
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["SeoTitle"] = "PlotDirector | Novel Planning Software for Authors";
ViewData["SeoDescription"] = "PlotDirector 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["CanonicalUrl"] = "https://plotdirector.com/";
ViewData["StructuredData"] = new[]
{
"""
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "PlotWeaver Studio",
"url": "https://plotweaver.studio",
"name": "PlotDirector",
"url": "https://plotdirector.com",
"description": "Novel planning and story organisation software for authors."
}
""",
@ -20,11 +20,11 @@
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "PlotWeaver Studio",
"name": "PlotDirector",
"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",
"url": "https://plotdirector.com",
"offers": {
"@type": "Offer",
"priceCurrency": "GBP",
@ -36,9 +36,9 @@
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "PlotWeaver Studio",
"url": "https://plotweaver.studio",
"logo": "https://plotweaver.studio/android-chrome-512x512.png",
"name": "PlotDirector",
"url": "https://plotdirector.com",
"logo": "https://plotdirector.com/android-chrome-512x512.png",
"sameAs": []
}
"""
@ -49,16 +49,16 @@
<section class="marketing-hero reveal-section">
<div class="marketing-container marketing-hero__grid">
<div class="marketing-hero__copy">
<p class="marketing-eyebrow">PlotWeaver Studio for novelists</p>
<p class="marketing-eyebrow">PlotDirector for novelists</p>
<h1>Finally finish the novel you've always wanted to write.</h1>
<p class="marketing-lead">
Forgotten clues. Contradictory timelines. Notes scattered across half a dozen documents. PlotWeaver Studio helps you bring every part of your story together so you can write with confidence.
Forgotten clues. Contradictory timelines. Notes scattered across half a dozen documents. PlotDirector helps you bring every part of your story together so you can write with confidence.
</p>
<div class="marketing-actions">
<a class="marketing-btn marketing-btn--primary" asp-controller="Account" asp-action="Register">Start Free Trial</a>
<a class="marketing-btn marketing-btn--secondary" href="#overview">Watch 2 Minute Overview</a>
</div>
<dl class="hero-proof" aria-label="PlotWeaver highlights">
<dl class="hero-proof" aria-label="PlotDirector highlights">
<div>
<dt>9</dt>
<dd>story systems brought together</dd>
@ -70,13 +70,13 @@
</dl>
</div>
<div class="browser-frame hero-product" id="overview" aria-label="PlotWeaver Studio product preview">
<div class="browser-frame hero-product" id="overview" aria-label="PlotDirector product preview">
<div class="browser-frame__chrome" aria-hidden="true">
<span></span><span></span><span></span>
</div>
<div class="product-mockup">
<aside class="product-sidebar">
<strong>PlotWeaver</strong>
<strong>PlotDirector</strong>
<span class="is-active">Story Health</span>
<span>Timeline</span>
<span>Characters</span>
@ -127,7 +127,7 @@
<section class="problem-intro reveal-section">
<div class="marketing-container">
<p class="marketing-eyebrow">Made for real drafting problems</p>
<h2>Every writer faces these challenges. PlotWeaver helps solve them.</h2>
<h2>Every writer faces these challenges. PlotDirector helps solve them.</h2>
</div>
</section>
@ -143,7 +143,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Losing track of story details</p>
<h3>Your story should feel alive, not impossible to remember.</h3>
<p>You shouldn't have to remember what colour someone's eyes were fifty thousand words ago, or which chapter introduced an important clue. PlotWeaver keeps the details connected so you can focus on telling the story.</p>
<p>You shouldn't have to remember what colour someone's eyes were fifty thousand words ago, or which chapter introduced an important clue. PlotDirector keeps the details connected so you can focus on telling the story.</p>
</div>
</div>
@ -159,7 +159,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Managing complex plots</p>
<h3>See the shape of your book before it tangles.</h3>
<p>When plots, subplots, mysteries, romances, and character arcs start pulling in different directions, it's easy to lose sight of the bigger picture. PlotWeaver helps you see how everything fits together.</p>
<p>When plots, subplots, mysteries, romances, and character arcs start pulling in different directions, it's easy to lose sight of the bigger picture. PlotDirector helps you see how everything fits together.</p>
</div>
</div>
@ -173,7 +173,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Continuity mistakes</p>
<h3>Catch contradictions before readers do.</h3>
<p>Readers notice when characters know things they shouldn't, important objects disappear, or timelines stop making sense. PlotWeaver helps you spot those problems before publication.</p>
<p>Readers notice when characters know things they shouldn't, important objects disappear, or timelines stop making sense. PlotDirector helps you spot those problems before publication.</p>
</div>
</div>
@ -186,7 +186,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Knowing what to work on next</p>
<h3>Turn overwhelm into a clear next step.</h3>
<p>Many novels stall because writers simply don't know what to tackle next. PlotWeaver helps you identify the scenes, revisions, and unresolved issues that deserve your attention today.</p>
<p>Many novels stall because writers simply don't know what to tackle next. PlotDirector helps you identify the scenes, revisions, and unresolved issues that deserve your attention today.</p>
</div>
</div>
@ -201,7 +201,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Drowning in notes and documents</p>
<h3>Stop searching through notes to find what matters.</h3>
<p>If your story lives across Word documents, notebooks, spreadsheets, and scraps of paper, you're not alone. PlotWeaver brings everything together in one organised place.</p>
<p>If your story lives across Word documents, notebooks, spreadsheets, and scraps of paper, you're not alone. PlotDirector brings everything together in one organised place.</p>
</div>
</div>
@ -215,7 +215,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Tracking character relationships</p>
<h3>Great stories are built on relationships.</h3>
<p>Friendships evolve. Rivalries deepen. Secrets change everything. PlotWeaver helps you track how your characters connect and how those relationships change over time.</p>
<p>Friendships evolve. Rivalries deepen. Secrets change everything. PlotDirector helps you track how your characters connect and how those relationships change over time.</p>
</div>
</div>
@ -243,7 +243,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Managing series and multiple books</p>
<h3>Keep your series organised from beginning to end.</h3>
<p>Long-running mysteries, character journeys, and future revelations become difficult to manage across multiple books. PlotWeaver helps you keep the bigger picture in view.</p>
<p>Long-running mysteries, character journeys, and future revelations become difficult to manage across multiple books. PlotDirector helps you keep the bigger picture in view.</p>
</div>
</div>
@ -258,7 +258,7 @@
<div class="problem-copy">
<p class="marketing-eyebrow">Understanding pacing and emotional flow</p>
<h3>Feel the rhythm of the novel as a whole.</h3>
<p>Action without breathing room can exhaust readers. Quiet moments without momentum can slow the story. PlotWeaver helps you visualise pacing and emotional balance across your manuscript.</p>
<p>Action without breathing room can exhaust readers. Quiet moments without momentum can slow the story. PlotDirector helps you visualise pacing and emotional balance across your manuscript.</p>
</div>
</div>
</div>
@ -268,7 +268,7 @@
<div class="marketing-container">
<div class="section-heading">
<p class="marketing-eyebrow">Loved by story-obsessed writers</p>
<h2>Authors use PlotWeaver to feel oriented again.</h2>
<h2>Authors use PlotDirector to feel oriented again.</h2>
</div>
<div class="testimonial-grid">
<figure>
@ -280,7 +280,7 @@
<figcaption>Maya K., crime novelist</figcaption>
</figure>
<figure>
<blockquote>"PlotWeaver turned my revision from panic into decisions. I knew what to fix next."</blockquote>
<blockquote>"PlotDirector turned my revision from panic into decisions. I knew what to fix next."</blockquote>
<figcaption>Elena S., romance series author</figcaption>
</figure>
</div>
@ -294,7 +294,7 @@
<p class="marketing-eyebrow">Built by an author</p>
<h2>Created by a novelist who needed the same calm.</h2>
<p>
PlotWeaver Studio was created by a novelist who was tired of juggling Word documents, spreadsheets, notebooks, and sticky notes while writing complex stories.
PlotDirector was created by a novelist who was tired of juggling Word documents, spreadsheets, notebooks, and sticky notes while writing complex stories.
</p>
<p>
The goal was simple: make a beautiful, dependable place where story structure, emotional logic, continuity, and the next writing step can live together.
@ -307,7 +307,7 @@
<div class="marketing-container final-cta__inner">
<p class="marketing-eyebrow">Start with the story you already have</p>
<h2>Ready to take control of your story?</h2>
<p>Whether you're writing your first novel or untangling an epic series, PlotWeaver Studio helps you stay organised, maintain confidence, and finally finish your story.</p>
<p>Whether you're writing your first novel or untangling an epic series, PlotDirector helps you stay organised, maintain confidence, and finally finish your story.</p>
<a class="marketing-btn marketing-btn--primary" asp-controller="Account" asp-action="Register">Start Your Free Trial</a>
</div>
</section>

View File

@ -8,7 +8,7 @@
<div>
<p class="eyebrow">Tools</p>
<h1>JSON Import <help-icon key="imports.overview" /></h1>
<p class="lead-text">Paste or upload a legacy JSON package or a PlotWeaver backup file, preview it, dry-run if needed, then import a new project.</p>
<p class="lead-text">Paste or upload a legacy JSON package or a PlotDirector backup file, preview it, dry-run if needed, then import a new project.</p>
</div>
<div class="button-row">
<a class="btn btn-outline-primary" asp-action="Sample">Download sample JSON</a>
@ -39,7 +39,7 @@
<form asp-action="Preview" method="post" enctype="multipart/form-data">
<div class="row g-3">
<div class="col-12">
<label asp-for="JsonFile" class="form-label">Upload JSON or PlotWeaver backup file</label>
<label asp-for="JsonFile" class="form-label">Upload JSON or PlotDirector backup file</label>
<input asp-for="JsonFile" class="form-control" type="file" accept=".json,.plotweaver,application/json" />
<div class="form-text">Uploading a file replaces the pasted text for this preview.</div>
<div class="form-text" data-upload-status></div>
@ -369,7 +369,7 @@
}
<div class="form-check import-duplicate-confirm mt-2">
<input asp-for="ConfirmImport" class="form-check-input" />
<label asp-for="ConfirmImport" class="form-check-label">I understand this will create new records in PlotWeaver Studio.</label>
<label asp-for="ConfirmImport" class="form-check-label">I understand this will create new records in PlotDirector.</label>
</div>
<div class="form-check import-duplicate-confirm mt-2">
<input asp-for="DryRun" class="form-check-input" />

View File

@ -7,7 +7,7 @@
<div>
<p class="eyebrow">Account</p>
<h1>Change Password</h1>
<p class="lead-text">Choose a new password for your PlotWeaver Studio account.</p>
<p class="lead-text">Choose a new password for your PlotDirector account.</p>
</div>
</div>

View File

@ -197,7 +197,7 @@
</dl>
@if (!level.RequiresStripeSubscription)
{
<p class="muted">Draft Desk is managed inside PlotWeaver Studio.</p>
<p class="muted">Draft Desk is managed inside PlotDirector.</p>
}
else
{

View File

@ -3,21 +3,21 @@
@{
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["SeoTitle"] = "Pricing | PlotDirector";
ViewData["SeoDescription"] = "Compare PlotDirector 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["CanonicalUrl"] = "https://plotdirector.com/pricing";
ViewData["StructuredData"] = new[]
{
"""
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "PlotWeaver Studio",
"name": "PlotDirector",
"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",
"url": "https://plotdirector.com",
"offers": {
"@type": "Offer",
"priceCurrency": "GBP",
@ -170,7 +170,7 @@
</article>
<article>
<h3>Can I subscribe without using the trial?</h3>
<p>Yes. Choose a paid plan from this page. If you are not signed in, PlotWeaver will ask you to log in before continuing to checkout.</p>
<p>Yes. Choose a paid plan from this page. If you are not signed in, PlotDirector will ask you to log in before continuing to checkout.</p>
</article>
<article>
<h3>Can I change plan later?</h3>
@ -178,10 +178,10 @@
</article>
<article>
<h3>What happens to my work if I cancel?</h3>
<p>Your existing story data remains in PlotWeaver. Your account may return to the application-managed Draft Desk level after the paid subscription ends.</p>
<p>Your existing story data remains in PlotDirector. Your account may return to the application-managed Draft Desk level after the paid subscription ends.</p>
</article>
<article>
<h3>Is PlotWeaver suitable for a series?</h3>
<h3>Is PlotDirector suitable for a series?</h3>
<p>Yes. The higher plan limits are designed for authors managing multiple books, long arcs, and larger casts.</p>
</article>
<article>
@ -196,7 +196,7 @@
<div class="marketing-container final-cta__inner">
<p class="marketing-eyebrow">Begin with clarity</p>
<h2>Ready to take control of your story?</h2>
<p>Try PlotWeaver Studio free, or choose the paid plan that fits the novel you are building.</p>
<p>Try PlotDirector free, or choose the paid plan that fits the novel you are building.</p>
<div class="marketing-actions">
<a class="marketing-btn marketing-btn--primary" asp-controller="Pricing" asp-action="StartTrial">Start Free Trial</a>
<a class="marketing-btn marketing-btn--secondary" href="#plans">View Plans</a>

View File

@ -42,7 +42,7 @@
@if (Model.Project.IsOwner)
{
<div class="dropdown-divider"></div>
<form asp-action="Archive" method="post" class="archive-button-form" data-confirm-message="Archive this project?&#10;&#10;Archived projects are hidden from your active workspace but remain stored within PlotWeaver Studio. Export your project first if you wish to maintain an external backup.">
<form asp-action="Archive" method="post" class="archive-button-form" data-confirm-message="Archive this project?&#10;&#10;Archived projects are hidden from your active workspace but remain stored within PlotDirector. Export your project first if you wish to maintain an external backup.">
<input type="hidden" name="id" value="@Model.Project.ProjectID" />
<button class="dropdown-item text-danger" type="submit">Archive Project</button>
</form>

View File

@ -54,7 +54,7 @@ else
@if (project.IsOwner)
{
<a class="btn btn-outline-secondary btn-sm" asp-controller="Exports" asp-action="ProjectBackup" asp-route-projectId="@project.ProjectID">Download backup</a>
<form asp-action="Archive" method="post" class="archive-button-form" data-confirm-message="Archive this project?&#10;&#10;Archived projects are hidden from your active workspace but remain stored within PlotWeaver Studio. Export your project first if you wish to maintain an external backup.">
<form asp-action="Archive" method="post" class="archive-button-form" data-confirm-message="Archive this project?&#10;&#10;Archived projects are hidden from your active workspace but remain stored within PlotDirector. Export your project first if you wish to maintain an external backup.">
<input type="hidden" name="id" value="@project.ProjectID" />
<button class="btn btn-outline-danger btn-sm" type="submit">Archive</button>
</form>

View File

@ -2,28 +2,28 @@
@{
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["SeoTitle"] = "About PlotDirector | Built for Novelists";
ViewData["SeoDescription"] = "Learn why PlotDirector 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";
ViewData["CanonicalUrl"] = "https://plotdirector.com/about";
}
<article class="marketing-home public-info-page">
<section class="public-hero">
<div class="marketing-container public-hero__inner">
<p class="marketing-eyebrow">About PlotWeaver Studio</p>
<p class="marketing-eyebrow">About PlotDirector</p>
<h1>Built by a novelist. Designed for writers.</h1>
<p class="marketing-lead">PlotWeaver Studio was created to help authors organise complex stories and write with confidence.</p>
<p class="marketing-lead">PlotDirector was created to help authors organise complex stories and write with confidence.</p>
</div>
</section>
<section class="public-content-section">
<div class="marketing-container public-narrative">
<p>PlotWeaver Studio was born from a simple frustration.</p>
<p>PlotDirector was born from a simple frustration.</p>
<p>While writing novels, I found myself constantly switching between Word documents, spreadsheets, notebooks, sticky notes, and countless pages of notes just to keep track of characters, plot threads, timelines, and important story details.</p>
<p>Existing tools either felt too simplistic for complex stories or too complicated to fit naturally into a writer's process.</p>
<p>PlotWeaver Studio was created to be the tool I wished I had: a place where characters, locations, relationships, plot lines, assets, scenes, and story structure could all work together.</p>
<p>Whether you're writing your first novel or managing an entire series, PlotWeaver Studio is designed to help you stay organised, maintain continuity, and focus on what matters most:</p>
<p>PlotDirector was created to be the tool I wished I had: a place where characters, locations, relationships, plot lines, assets, scenes, and story structure could all work together.</p>
<p>Whether you're writing your first novel or managing an entire series, PlotDirector is designed to help you stay organised, maintain continuity, and focus on what matters most:</p>
<p><strong>telling great stories.</strong></p>
</div>
</section>

View File

@ -2,10 +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["SeoTitle"] = "Contact PlotDirector";
ViewData["SeoDescription"] = "Contact PlotDirector 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";
ViewData["CanonicalUrl"] = "https://plotdirector.com/contact";
}
<article class="marketing-home public-info-page">
@ -22,7 +22,7 @@
<div class="marketing-container public-card-grid">
<article class="public-card">
<h2>General enquiries</h2>
<p>For questions about PlotWeaver Studio, subscriptions, or whether it is right for your writing process, email <a href="mailto:@Model.SupportEmail">@Model.SupportEmail</a>.</p>
<p>For questions about PlotDirector, subscriptions, or whether it is right for your writing process, email <a href="mailto:@Model.SupportEmail">@Model.SupportEmail</a>.</p>
</article>
<article class="public-card">
<h2>Support</h2>
@ -30,7 +30,7 @@
</article>
<article class="public-card">
<h2>Feedback and suggestions</h2>
<p>For feature suggestions, we'd love to hear how PlotWeaver Studio could better support your writing process.</p>
<p>For feature suggestions, we'd love to hear how PlotDirector could better support your writing process.</p>
</article>
</div>
</section>
@ -48,7 +48,7 @@
</article>
<article>
<h3>Can I suggest new features?</h3>
<p>Absolutely. PlotWeaver Studio continues to evolve based on feedback from writers.</p>
<p>Absolutely. PlotDirector continues to evolve based on feedback from writers.</p>
</article>
</div>
</div>

View File

@ -2,10 +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["SeoTitle"] = "Privacy Policy | PlotDirector";
ViewData["SeoDescription"] = "Read the PlotDirector 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";
ViewData["CanonicalUrl"] = "https://plotdirector.com/privacy";
}
<article class="marketing-home public-info-page">
@ -22,7 +22,7 @@
<div class="marketing-container public-policy">
<section>
<h2>Introduction</h2>
<p>PlotWeaver Studio respects your privacy and is committed to protecting your personal information.</p>
<p>PlotDirector respects your privacy and is committed to protecting your personal information.</p>
</section>
<section>
@ -32,7 +32,7 @@
<li>Email address</li>
<li>Account authentication information</li>
<li>Subscription and billing status information</li>
<li>Content that you choose to create and store within PlotWeaver Studio</li>
<li>Content that you choose to create and store within PlotDirector</li>
<li>Basic technical information required to operate and secure the service, such as IP addresses and login activity</li>
</ul>
<p>We do not collect phone numbers, postal addresses, or unnecessary personal information.</p>
@ -42,7 +42,7 @@
<h2>How We Use Information</h2>
<p>We use your information to:</p>
<ul>
<li>Provide and maintain the PlotWeaver Studio service</li>
<li>Provide and maintain the PlotDirector service</li>
<li>Authenticate users and secure accounts</li>
<li>Process subscriptions and payments</li>
<li>Communicate important service information</li>
@ -52,19 +52,19 @@
<section>
<h2>User Content Ownership</h2>
<p>You retain ownership of all stories, manuscripts, characters, notes, and other content you create within PlotWeaver Studio.</p>
<p>PlotWeaver Studio does not claim ownership of your content.</p>
<p>You retain ownership of all stories, manuscripts, characters, notes, and other content you create within PlotDirector.</p>
<p>PlotDirector does not claim ownership of your content.</p>
</section>
<section>
<h2>Payments</h2>
<p>Payments are processed securely by Stripe.</p>
<p>PlotWeaver Studio does not store full payment card details.</p>
<p>PlotDirector does not store full payment card details.</p>
</section>
<section>
<h2>Cookies and Local Storage</h2>
<p>PlotWeaver Studio uses essential authentication cookies required for users to securely access their accounts.</p>
<p>PlotDirector uses essential authentication cookies required for users to securely access their accounts.</p>
<p>The application may also use browser local storage to remember interface preferences and improve the user experience.</p>
<p>These technologies are used solely to provide core functionality.</p>
</section>

View File

@ -2,10 +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["SeoTitle"] = "Terms of Service | PlotDirector";
ViewData["SeoDescription"] = "Read the PlotDirector 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";
ViewData["CanonicalUrl"] = "https://plotdirector.com/terms";
}
<article class="marketing-home public-info-page">
@ -13,7 +13,7 @@
<div class="marketing-container public-hero__inner">
<p class="marketing-eyebrow">Terms</p>
<h1>Terms of Service</h1>
<p class="marketing-lead">Please read these terms carefully before using PlotWeaver Studio.</p>
<p class="marketing-lead">Please read these terms carefully before using PlotDirector.</p>
<p class="public-updated">Last updated: @Model.LastUpdated</p>
</div>
</section>
@ -22,12 +22,12 @@
<div class="marketing-container public-policy">
<section>
<h2>Acceptance of Terms</h2>
<p>By accessing or using PlotWeaver Studio, you agree to these Terms of Service.</p>
<p>By accessing or using PlotDirector, you agree to these Terms of Service.</p>
</section>
<section>
<h2>Use of the Service</h2>
<p>You agree to use PlotWeaver Studio lawfully and responsibly.</p>
<p>You agree to use PlotDirector lawfully and responsibly.</p>
<p>You must not:</p>
<ul>
<li>Attempt unauthorised access to the service</li>
@ -39,7 +39,7 @@
<section>
<h2>User Content</h2>
<p>You retain ownership of all content you create within PlotWeaver Studio.</p>
<p>You retain ownership of all content you create within PlotDirector.</p>
<p>You are responsible for the legality and appropriateness of the content you store.</p>
</section>
@ -56,9 +56,9 @@
<section>
<h2>Limitation of Liability</h2>
<p>PlotWeaver Studio is provided on an "as available" and "as is" basis.</p>
<p>PlotDirector is provided on an "as available" and "as is" basis.</p>
<p>While reasonable efforts are made to maintain availability and reliability, uninterrupted access cannot be guaranteed.</p>
<p>To the maximum extent permitted by law, PlotWeaver Studio shall not be liable for indirect, incidental, or consequential damages arising from the use of the service.</p>
<p>To the maximum extent permitted by law, PlotDirector shall not be liable for indirect, incidental, or consequential damages arising from the use of the service.</p>
</section>
<section>
@ -68,7 +68,7 @@
<section>
<h2>Changes to the Service</h2>
<p>PlotWeaver Studio may update or modify features and services over time.</p>
<p>PlotDirector may update or modify features and services over time.</p>
</section>
<section>

View File

@ -30,7 +30,7 @@
<div class="focused-validation-summary">
<span>@Model.Preview.DependencyCount dependenc@(Model.Preview.DependencyCount == 1 ? "y" : "ies") attached</span>
<span>@Model.Preview.ActiveWarningCount active warning@(Model.Preview.ActiveWarningCount == 1 ? "" : "s") on this scene</span>
<span>After confirming, PlotWeaver Studio will run validation for the target book.</span>
<span>After confirming, PlotDirector will run validation for the target book.</span>
</div>
@if (Model.CurrentWarnings.Any())

View File

@ -1,15 +1,15 @@
<!DOCTYPE html>
<!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 defaultTitle = $"{ViewData["Title"]} - PlotDirector";
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";
const string ogImageUrl = "https://plotdirector.com/og-image.png";
}
<head>
<meta charset="utf-8" />
@ -30,7 +30,7 @@
<link rel="canonical" href="@canonicalUrl" />
}
<meta name="robots" content="index, follow" />
<meta property="og:site_name" content="PlotWeaver Studio" />
<meta property="og:site_name" content="PlotDirector" />
<meta property="og:title" content="@seoTitle" />
@if (!string.IsNullOrWhiteSpace(seoDescription))
{
@ -88,7 +88,7 @@
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm border-bottom plotline-nav mb-3">
<div class="container-fluid">
<a class="navbar-brand fw-semibold" asp-area="" asp-controller="Home" asp-action="Index">PlotWeaver Studio</a>
<a class="navbar-brand fw-semibold" asp-area="" asp-controller="Home" asp-action="Index">PlotDirector</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
@ -185,7 +185,7 @@
{
<footer class="public-footer" aria-label="Public site footer">
<div class="marketing-container public-footer__inner">
<a class="public-footer__brand" asp-controller="Home" asp-action="Index">PlotWeaver Studio</a>
<a class="public-footer__brand" asp-controller="Home" asp-action="Index">PlotDirector</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>

View File

@ -565,7 +565,7 @@
<input type="hidden" name="ReturnSelectedSceneID" value="@Model.SelectedSceneID" />
<p class="scene-move-summary" data-scene-move-summary></p>
<div class="focused-validation-summary">
<span>After moving, PlotWeaver Studio will run continuity validation.</span>
<span>After moving, PlotDirector will run continuity validation.</span>
<span>Existing links, events, metrics, purposes, characters, assets, warnings and dependencies stay attached to the same SceneID.</span>
</div>
</div>
@ -582,7 +582,7 @@
{
<section class="empty-panel">
<h2>No timeline yet</h2>
<p>Add a book, then chapters and scenes, and PlotWeaver Studio will arrange them here as your narrative spine.</p>
<p>Add a book, then chapters and scenes, and PlotDirector will arrange them here as your narrative spine.</p>
</section>
}
else

View File

@ -18,7 +18,7 @@
<div>
<p class="eyebrow">Timeline Settings</p>
<h1>Configure timeline display</h1>
<p class="lead-text">Choose which workspace sections PlotWeaver Studio loads and renders for this project. Filters and saved views still work separately.</p>
<p class="lead-text">Choose which workspace sections PlotDirector loads and renders for this project. Filters and saved views still work separately.</p>
</div>
</div>

View File

@ -9,7 +9,7 @@
"Password": "",
"EnableSsl": true,
"FromAddress": "",
"FromName": "PlotWeaver Studio"
"FromName": "PlotDirector"
},
"Stripe": {
"PublishableKey": "",

View File

@ -1,4 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="PlotWeaver Studio icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="PlotDirector icon">
<rect width="128" height="128" rx="28" fill="#1F2A44"/>
<path d="M64 37c-11-9-25-12-40-9v56c15-3 29 0 40 9 11-9 25-12 40-9V28c-15-3-29 0-40 9Z" fill="#FAF8F5"/>
<path d="M64 37v56" fill="none" stroke="#D4A574" stroke-width="7" stroke-linecap="round"/>

Before

Width:  |  Height:  |  Size: 664 B

After

Width:  |  Height:  |  Size: 659 B

View File

@ -18,4 +18,4 @@ Disallow: /Archives/
Disallow: /HelpDrawer/
Disallow: /HelpDiagnostics/
Sitemap: https://plotweaver.studio/sitemap.xml
Sitemap: https://plotdirector.com/sitemap.xml

View File

@ -1,6 +1,6 @@
{
"name": "PlotWeaver Studio",
"short_name": "PlotWeaver",
"name": "PlotDirector",
"short_name": "PlotDirector",
"icons": [
{
"src": "/android-chrome-192x192.png",

View File

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