AuthorshipA place to write a novel inside VS Code. Your manuscript stays a file — markdown, in your own repository, with your own history. Authorship adds an editor that understands what a story is made of, a reader that tells you what is wrong with a passage, and a way out to an EPUB. Every model it uses runs on your machine; nothing you write is sent anywhere.
Contents
What it needs
The model weights are large because the work is done on your machine rather than sent to somebody else's. If the disk is the problem, note that no model is fetched until the first time you ask for the thing it does: you can write, export and publish for as long as you like without ever downloading one. First runThe first time Authorship starts after an install or an update, it builds the Python environment its models run in. This is a download of a few gigabytes and takes a few minutes on a cold machine. It happens once per version, in the background, with a notification saying how it is getting on — VS Code stays usable throughout, and the editor works before it has finished. Everything it installs goes into the extension's own storage — its own copy of
Python, its own packages, its own cache. Nothing is written into your project,
and nothing is put on your If anything goes wrong, the whole story is in the Authorship output channel (View › Output, then pick Authorship from the dropdown). Starting a storyA story lives in a Start empty. Make a new file called Bring a manuscript you already have. Open a
The editorA
Nothing is drawn over anything else: each of the three has room of its own.
Editing. Double-click a section — or select it and press Where you are. The line at the top of the toolbar names the part and chapter you are reading, taken from what is on screen rather than from what you last clicked — scroll through a hundred thousand words and it keeps up. The word count sits at the other end. What it weighs. Every chapter says in its footer how many words are written under it, and every part says what its chapters weigh together. The same count as the toolbar's, made of the same words — the prose and nothing else, so a title you rename and a note you leave yourself weigh nothing in either. Both keep up with the keys rather than with the file. Folding. Folding a section takes away its body and its footer and leaves its header exactly as it was — the same name, in the same place, saying the same thing. A folded document is the headers of its sections and nothing else. Splitting and joining. Hover between two paragraphs and a line appears at the nearest seam, with a button on it. Press it to cut the section in two there, or — at the seam above a section — to join it to the one before.
Adding, moving, removing. The strip in the gap between two sections adds
one there, which is nearly always what "add a chapter" means: a button each for
the kinds you reach for while writing — Markdown, Chapter, Note, Part — and a
Find and replace.
Several cursors. Select a word and press
The file underneath. View Source in the toolbar opens the same file as plain text, in VS Code's own markdown editor. It is the same document — edits in either show up in the other, and git sees one file, not two.
SectionsA section's kind is what it is, and it is never guessed from what it says: a chapter called "Disclaimer" is still a chapter.
Sections with fields — a title page, a chapter, an about page — show them as labelled boxes rather than as prose you have to remember the shape of.
The order on the page is the order in the book. Move the disclaimer above the title page here and it is above it in the EPUB; there is no second list of front matter to keep in step. The pages you write onceThree of the pages above are the same in every book you write and different for every author who writes one: the disclaimer, the About the Author page, and the name and publisher on a title page. Authorship has no words of its own for any of them, and does not want any — a disclaimer shipped with an editor is that editor's opinion of what a story warns its readers about, and it would be the wrong opinion for somebody. So these pages are yours, kept per workspace in
which Authorship writes — empty — the first time you open a story in a folder that has none. Fill it in once, and every disclaimer, author page and title page you add from then on starts from what you wrote. Leave it alone and those sections are simply added blank, for you to write in the editor as you would any other.
It is a file in your repository, so the templates travel with the stories and their history is your history — not a preference on one machine. A page of prose is a list of lines rather than one string, because JSON has no multi-line string and a disclaimer kept as one is a disclaimer nobody wants to edit. This way it also diffs a line at a time. One plain string works too, if you would rather write one. Anything you leave empty is left out of the section entirely: a title page in a workspace with no publisher is added with no publisher field, not with a blank one to read past. Edits take effect as you save them; there is no need to reopen a story. A file that is not valid JSON is reported once and then ignored, so a half-finished edit never silently changes what a page says. A story opened from outside a workspace has nowhere to keep templates, and starts these pages empty. Checking the proseNothing is checked until you ask. Drafting is the other half of writing, and an opinion arriving mid-sentence is an opinion nobody wanted. Press Check Prose in the toolbar and Authorship reads the whole document once, then re-reads each paragraph as you finish writing it.
Two passes run: a set of rules that answers in milliseconds, and a grammar model that takes a few seconds. The rules draw first and the model adds to what they put up, so you are never waiting on the slowest thing in the report. What the rules look for
Stopping on a mark. Hover an underline and a box says what is wrong and why. Where the rule already knows what belongs there, the replacement is offered outright. Where it does not, the Fix button asks the model for one — it rewrites the marked phrase only, in your tense and register, and the fix is thrown away unless the rule that found the fault agrees it is gone. Marks live for as long as the editor is open and are written nowhere. What a check thinks of your prose is not part of your prose. Writing a blurbGenerative AI disclosure: this functionality uses a locally running AI to create a draft of the blurb. It is highly advised to treat the generated blurb as a working draft rather than a finished section. Add a Blurb section and press the run button in the column beside it. The model reads the book the way a reader reads it — the first chapter, then each chapter after it with the blurb so far — and what comes back at the end is the blurb the story has earned. Nothing has to hold the whole manuscript at once, so this works on a novel and not only on a short story. The bar counts chapters, because that is the division the work actually has. You can go on writing elsewhere while it reads, and the square button stops it.
The blurb is written from the story alone: the notes in your margin, the scaffolding of the format and any blurb already there are all kept out of it. It is copy for a shop listing, so it is not printed in the book. The story so farGenerative AI disclosure: this functionality uses a locally running AI to create a draft of the recap. It is highly advised to treat the generated recap as a working draft rather than a finished section. The blurb's near relation, for a serial. Add a The Story So Far section, write the earlier documents into its Documents box — separated by commas, named the way they sit beside this one — and press the run button beside it.
They are read in alphabetical order — with numbers read as numbers, so
The reading is the same as a blurb's: a chapter at a time, with the recap so far carried between them, so a shelf of finished volumes is no harder than one. The bar counts the chapters of all of them together, you can go on writing while it reads, and the square button stops it. The paths are written relative to the document, so a story that is moved, cloned or opened on another machine still finds its earlier volumes. Like the blurb, this is written beside the story rather than in it: it is not printed in the book and not counted in the word count, and it is yours to edit once it lands. Fixing style and grammar
Generative AI disclosure: unlike everything else here, this one sends your manuscript to Google's Gemini API, on your own account. Read Privacy before you use it, and treat what comes back as an edit to review rather than an edit to accept. Fix Style & Grammar — the sparkle in the toolbar, next to Check Prose — reads the whole manuscript and corrects it, a chapter at a time. Where a check underlines what it thinks is wrong and leaves the prose alone, this rewrites it: clumsy sentences, wrong words, tangled clauses, punctuation. It works a chapter at a time and each chapter goes to the model with every chapter already corrected in front of it — so the second half of the book is edited towards the first half as this pass left it, and a name spelt one way in chapter one is spelt that way in chapter forty. That context is the reason this tool needs an API rather than the model beside your editor: no model small enough to run on a laptop can hold a novel while it reads. A bar under the toolbar counts the chapters, and the square button stops it. The
manuscript is locked while it runs — every section is about to be replaced in
turn — and each chapter's corrections land as they come back, so a pass you stop
halfway leaves the chapters it finished corrected. It all lands as ordinary
edits: Authorship asks Gemini to relax its adjustable safety filters, since a novel is the author's own work being copy-edited rather than anything the model is being asked to invent. Google's prohibited-content policy sits behind those filters and is not adjustable; a manuscript it refuses cannot be corrected this way. A chapter is only written back if what came back is plausibly that chapter: about as long as it went in, ending where a sentence ends, and in the same number of sections it was cut into. Anything else — a model that ran out of room, that stopped against a filter, that summarised instead of edited — is thrown away and the chapter is left exactly as you wrote it. Authorship says afterwards which chapters those were and why, because a chapter left alone looks in the document exactly like a chapter that needed nothing. Only the story goes: the chapters' titles and the markdown written under them. Your notes, the blurb, the cover, the title page and the table of contents stay here — they are about the book rather than in it. Signing in, and being askedThe first time you press it, Authorship asks for a Gemini API key. You can make one for free at Google AI Studio; usage is billed to that account, and a long novel is not free. The key is checked before it is kept, and it is kept in this machine's keychain — VS Code's secret store — not in your settings and not in a file beside your manuscript. Gemini is a VS Code account like any other, so the Accounts menu — the avatar at the foot of the activity bar — is where it lives. Before you have signed in it carries a badge and an entry offering to sign in for Authorship; afterwards it lists Google Gemini with the last few characters of the key, beside your GitHub account and anything else, and signing out is there too. Three other ways in, all the same account: the Account drawer at the top of
the Authorship sidebar, which also says what the key
is for and what it costs you in privacy; pressing Fix Style & Grammar, which
asks if you have not signed in; and Then — and every time you press the button after that, signed in or not — a dialog names the document and asks whether to send its chapters to Google. It says what goes and what stays. Nothing leaves your machine until you answer it, and answering it is the only way this tool runs: there is no don't ask again, because everything else here is local and that is worth being reminded of.
Choosing the modelAuthorship ships with a Gemini model it has been written against, and signing in writes with that model rather than merely checking the key — the smallest generation there is. So a name Google has retired, and a model your plan does not include, are both caught in the sign-in box rather than forty minutes into a manuscript. Note that the strongest models are generally not on the free tier. Google does retire them, and keeps its strongest models off the free tier. So which model this is pointed at is worth being able to see and change: the Account drawer in the Authorship sidebar carries a Model dropdown listing what your key can actually write with. The list comes from Google when the drawer is drawn — not from anything shipped in here, which is the part that goes stale — and the ↻ beside it asks again. Picked rather than guessed. Which model corrects your book changes both the prose and the bill, so Authorship never moves you onto another one on its own; the list is only ordered with the newest first.
Building the bookRun All builds every section that is built rather than written — today that is the table of contents, made from the chapters around it in an instant. A built section whose source has moved on says so in the column beside it, so you can see at a glance what is stale. Export EPUB binds the book beside the document. Everything it needs is in the document itself — the title page names and credits it, the cover section points at the art, the contents section asks for a table of contents, the chapters are the story, and the disclaimer and about pages open and close it. Notes and the blurb stay out. There is no second file carrying half the answer. A book that is not ready is not bound. Ask for the export and the answer is either the file or what is standing in the way of it: sections that are missing, sections a reader would not find where they are, and sections that are there with nothing in them. That last one is worth saying plainly — adding a title page does not give a book a title, and a cover pointing at art nobody has drawn is no more a cover than none at all. The five the book waits for are Cover, Title Page, Table of Contents and Blurb opening the document, and About the Author closing it. Fix lays the sections out — writing in what is absent, moving what is out of place, and leaving everything you wrote exactly as you wrote it — then marks in red what is still to write and stops. No book is bound. Export Anyway binds what is there, because it is your book and you have been shown what is missing. A fix goes in as one edit, so a single undo takes it back out, and the marks lift at the next export that finds those sections written. All of that is decided where the book is bound, in
Export Markdown writes the document out as one plain markdown manuscript —
Dividing a long story into partsDivide into Parts cuts the story into Where a story breaks is a question about the story, so it is answered in the story. A Part you want the reader to meet — the tale, in a book of tales — is printed as a page of its own and divides the files as well. A Part that is only there to say "break here" is marked unprinted: untick Printed on it, and it divides the files while the book goes out with no page where it stands. A story with no Parts at all is asking to be divided nowhere, and is left alone. Each part is a story document like any other: it carries the book's furniture, its title page renumbered, and its share of the chapters — and it opens in this editor and exports to an EPUB by the same buttons. A file cut at an unprinted Part inside "Day One" is still titled Veriona — Day One — Part 2.
The Authorship sidebarThe Authorship icon in the activity bar opens the Manuscript view, which reports on the machinery rather than on the book: whether there is a Gemini account and which model it will use — only once the experiment is on — which local models are resident, what they are holding against what the machine has, and what work the server has in hand. A running job can be stopped from here, and Gemini can be signed in and out of. Account is first because it is the only drawer about something outside this machine. Everything below it — the models, their memory, the queue — is local, which is the whole reason the one thing that is not gets the top of the panel rather than a line in a readme.
The status bar
The file formatA
Three things follow from that, and they are the reason for it: Every markdown reader renders it. The markers are comments, so GitHub, your static site, and the preview pane all show the story and none of the scaffolding. Plain markdown is already a story document. A file with no markers reads as one prose section holding the lot. Nothing you have written is locked out. Nothing is lost to a version that does not understand it. A section kind this editor has never heard of is carried through untouched, so a document written by hand, or by a newer version, survives a round trip through an older one. And because the file is text and the editor edits the text, git behaves: a diff
of a chapter is a diff of that chapter,
Keyboard
CommandsEvery toolbar button is also a command, so it is in the Command Palette
(
And two that have no button, because they are about your account rather than about a document:
PrivacyEverything runs on your machine, with one exception, and the exception is opt-in. The models are downloaded once and then run locally, against a server the
extension starts on Fix Style & Grammar is the exception, and it is switched off until you switch it on: Experimental › Use Gemini For Style Correction in Settings. It sends the chapters of the document it is run on to Google's Gemini API, over the internet, on your own API key. It sends the chapter titles and the markdown written under them, and nothing else — your notes, blurb, cover, title page and contents stay here. Nothing is sent until you press the button, and Authorship asks you to sign in before it will send anything at all. What Google does with it is governed by the terms of the account the key belongs to, not by this extension. Your key is kept in this machine's keychain, through VS Code's secret store. It
is not written to settings, does not sync, and never goes anywhere except to the
local server that uses it. TroubleshootingThe status bar says The first run is taking a long time. It is downloading a Python interpreter and several gigabytes of packages. The notification shows the line the installer is on; the output channel shows all of them. It happens once per version. A check found nothing. Checks are off until you press Check Prose. If they are on and nothing is underlined, look at the status bar: the first check after a start has to load a model, and the models are large. There is no sparkle in the toolbar. The feature is experimental and off by
default. Settings → search Gemini would not read a chapter ( A chapter came back unchanged. The pass refuses an answer that is not plausibly the chapter — too short, too long, cut off mid-sentence, or in the wrong number of sections — and leaves your text alone rather than putting a fragment in the document. The message at the end names the chapters and the reason. Running it again often settles it; a chapter that fails repeatedly is usually one long enough to exhaust the model's output budget. Gemini says a model is no longer available. Google retires model names.
Pick another from the Model dropdown in the Account drawer — the refusal
also names its replacement, if you would rather type it into
Gemini says the quota is exceeded, with The pass paused and carried on. Every tier is rate-limited and a novel is dozens of requests in a row, so being told to slow down is ordinary. Authorship waits as long as Google asks and offers the chapter again, up to five times before giving up. Stopping the pass ends the wait as well. Gemini would not take my key. The key is checked when you sign in, so a key
that worked and has stopped working has usually been revoked or has run out of
quota — the message says which. Authorship forgets a key Gemini rejects and asks
for a new one; Fixing the style left a chapter untouched. A chapter is often several sections, and they have to come back as the same several. When the model runs them together the chapter cannot be put back where it came from, so it is left exactly as you wrote it rather than have its seams moved for you. Running the pass again usually settles it. Export failed. Exporting an EPUB is done by the local server, so it needs
the server up — see Two windows, one server. The first VS Code window to start the server serves
every window after it. Closing that window stops the server, and the windows
left behind read Reporting a problemPlease open an issue at github.com/robodatalab/writer, with what the Authorship output channel said if the extension itself misbehaved. |

















