Extensions for Novalist,
built with Novalist.Sdk - see the SDK these need.
Everything here is work that the audit deliberately placed outside core: format readers and writers, read-only analysis, networked lookups, and static site generation. None of it needs to ship inside the app to be available in it, and most of it is the kind of specialist, occasionally-breaking work that is better versioned on its own.
The AI features live in their own repository (novalist-aiassistant), because AI reaches Novalist only through extension contributions.
These are the ones to add to the gallery.
| Extension | Id | Tag prefix | What it does |
|---|---|---|---|
| Formats | com.novalist.formats |
formats-v* |
Exports to HTML, RTF, ODT, plain text, Fountain and FictionBook 2, each marked with the language you write in and carrying your cover where the format can hold one, plus CSV, JSON and OPML for pulling the outline into a spreadsheet, a script or an outliner. Imports Scrivener projects, Ulysses sheets, folders of Markdown, and CSV/TSV files. Checks a finished EPUB before you send it. |
| Insight | com.novalist.insight |
insight-v* |
Read-only reports over the whole manuscript: name drift and consistency, project health (orphan entries, dangling links, unused images), a continuity worklist when a Codex entry changes, a word-frequency concordance, a pacing curve, and a cast presence report showing who drops out of the book and for how long. Also reports what is in the manuscript: chapters, scenes, words, characters and a printed-page estimate. |
| Toolkit | com.novalist.toolkit |
toolkit-v* |
Writing sprints and a Pomodoro timer, a task board over your to-do comments, dictionary and thesaurus lookup on a selected word, an offline name generator with per-culture data, and web page capture that keeps the readable text rather than just the title. |
| Speech | com.novalist.speech |
speech-v* |
The speech engine behind the Narration view: designs a voice from a character's description, and performs a line in that voice with the emotion supplied separately, so one character sounds like themselves whether they are furious or wrecked. Runs entirely on the writer's machine, on the graphics card where there is one, and builds its own Python environment on first use. |
| Publish | com.novalist.publish |
publish-v* |
Generates a self-contained static website from your wiki, your world bible or your manuscript, for sharing a draft or publishing a series bible. Codex sections keep their Markdown formatting and their links, and the site is written in your language. |
Each row is one release artefact: com.novalist.<name>.zip, containing the
assembly, its manifest, and any locale, web or data files.
Tag it. The tag names the extension and the version, and only that extension is built and published:
git tag formats-v1.0.0
git push origin formats-v1.0.0
The workflow stamps the version from the tag into extension.json, builds
against the latest stable SDK package from NuGet, runs the whole test suite, and attaches
com.novalist.formats.zip to a GitHub release. Adding it to the gallery is a
separate, manual step.
One repository, several extensions, separate versions on purpose: a fix to the EPUB check has no business bumping the version of the writing timer.
All five extensions require Novalist 3.6.0 or later and build with the .NET 10 SDK. Earlier hosts can continue using older compatible extension releases.
Local builds use the SDK source in the adjacent novalist-official checkout.
CI and release builds set UseLocalSdk=false and restore the latest stable
Novalist.Sdk package from NuGet using Version="*". Each workflow refreshes
dependencies during restore, then uses those resolved versions for build and test.
The SDK package version is managed by the host's CI and is separate from the
desktop version. When adopting new SDK APIs, update the extension's minimum host
version to the release that supports them.
Local builds reference the SDK source next door, so a change to the SDK is testable here without a package round trip:
d:/git/
novalist-official/ <- the app and the SDK
novalist-extension/ <- this repository
dotnet build
dotnet test
A build also copies each extension into your local Novalist extensions folder
(%APPDATA%/Novalist/Extensions/<Name> on Windows), so a rebuild is all it takes
to see the change in the running app.
For a build without deploying into your installed extensions, pass
-p:ExtensionFolder=. To build locally against the NuGet package, pass
-p:UseLocalSdk=false.
- A folder named
Novalist.Extensions.<Name>with acsprojthat sets<ExtensionFolder>and nothing else —Directory.Build.propsandDirectory.Build.targetssupply the rest. - An
extension.jsonwhoseidiscom.novalist.<name>and whoseentryAssemblyisNovalist.Extensions.<Name>.dll. CI checks both. - A row in the table above, and a case in
.github/workflows/release.yml. - Tests in
tests/Novalist.Extensions.Tests.
The SDK does not allow it, and that is deliberate:
- No extension here rewrites prose you wrote. When one wants to change a sentence it proposes a suggested edit with its name on it, and you take it or turn it down.
- Nothing here erases a chapter, a scene or a Codex entry. The strongest verbs available are moving a chapter to the trash and archiving a scene, both of which you can undo.
- The EPUB check reads your file and reports on it. It never rewrites an export you are about to send.
MIT, per extension. See each folder's LICENSE.