@model ImportIndexViewModel @{ ViewData["Title"] = "JSON Import"; var preview = Model.Preview; }

Tools

JSON Import

Paste or upload a Phase 1B package, preview it, confirm the summary, then import a new project.

Download sample JSON Back to projects
@if (!string.IsNullOrWhiteSpace(Model.StatusMessage)) {
Import paused

@Model.StatusMessage

@if (preview is { Package: not null, HasDuplicateProjectTitle: true }) {

Duplicate imports will be renamed to @preview.DuplicateImportProjectTitle.

} @if (!string.IsNullOrWhiteSpace(Model.TechnicalDetail)) {
Technical detail

@Model.TechnicalDetail

}
}
Uploading a file replaces the pasted text for this preview.
Supported JSON schema

Required

project.title, each book.title, each book.seriesOrder, each chapter.title, each chapter.order, each scene.title, and each scene.order.

Optional

packageVersion, source, descriptions, notes, subtitles, chapter summaries, scene summaries, plain-text POV, plain-text location, date/time text, purpose text, and outcome text.

Not imported yet

No AI extraction, Word/text parsing, character records, location records, plot lines, assets, dependencies, relationships, merge/update, or export logic. Unknown JSON fields are ignored safely.

@if (preview is not null) {

Preview

@(preview.Package?.Project.Title ?? "Import package")

@preview.BookCount books @preview.ChapterCount chapters @preview.SceneCount scenes
@if (preview.Validation.Errors.Any()) {
Errors block import
} @if (preview.Validation.Warnings.Any()) {
Warnings require confirmation
} @if (preview.Package is not null) {
@foreach (var bookPreview in preview.BookPreviews) { var book = bookPreview.Book;
Book @book.SeriesOrder: @(string.IsNullOrWhiteSpace(book.Subtitle) ? book.Title : $"{book.Title}: {book.Subtitle}") @bookPreview.ChapterCount chapters / @bookPreview.SceneCount scenes @foreach (var chapterPreview in bookPreview.ChapterPreviews) { var chapter = chapterPreview.Chapter;
Chapter @chapter.ChapterNumber: @chapter.Title @chapterPreview.SceneCount scenes
    @foreach (var scene in chapter.Scenes.OrderBy(x => x.Order)) {
  • Scene @scene.SceneNumber: @scene.Title
  • }
}
}

Confirm import

This will create @preview.Package.Project.Title with @preview.BookCount books, @preview.ChapterCount chapters, and @preview.SceneCount scenes.

@if (preview.HasDuplicateProjectTitle) {

Because this title already exists, the created project will be named @preview.DuplicateImportProjectTitle if you continue.

}
@if (preview.Validation.Warnings.Any()) {
} @if (preview.HasDuplicateProjectTitle) {
}
}
} @section Scripts { }