keep-writing

approved

by suffername

Asks you one question a day, inside your own notes. You answer in your words and get asked a followup question. Later it builds new questions out of writing you already did. You keep writing. - This plugin has not been manually reviewed by Obsidian staff.

14 downloadsUpdated 2d ago

keep-writing

A vault that interviews you, so that you keep writing.

A blank page stops you; a question doesn't. keep-writing puts one into your daily note in Obsidian, you answer it in your own words, and the next questions come out of what you already wrote — so it never runs out.

Three steps in a daily note: choosing "Mark this answer done" from the right-click menu; the answer gaining a link to the question it answers and the kind of question it was; then a follow-up question, composed from that answer, written in and answered.

In the community store, and early. Search community plugins for keep-writing. Needs Obsidian 1.13 or newer. Questions built from your own writing need a model endpoint; everything else works without one.

What it does

  • Starts the day for you. A new daily note is born holding a question, whoever made the note. No model call on that path, so it cannot fail.
  • Draws a question into today's note. Three to choose from — pick one, or press Escape and nothing is written.
  • Turns your old writing into new questions. Highlight a paragraph and you are asked about that paragraph. Let the draw find one and you get a question about your life now — most of what it can reach is years old, and a question about 2020 is a question for whoever you were then.
  • Follows up. Mark an answer done and the model reads it, then offers the next question. Run it again next week and it writes fresh ones.
  • Opens where you stopped. Leave a note about where to pick up, and tomorrow's first question comes from what you wrote, with your own words under it.
  • Links every answer to the question that caused it, which is what stops a question coming back once you have answered it.
  • Never writes your prose. It adds frontmatter, a block id, and the question itself — nothing else. No sentence of yours is ever inserted, edited or reworded.

Getting started

On first run it offers to fill your question bank: 2,274 questions written for this, as four plain Markdown notes you can edit or delete.

  1. Open today's daily note.
  2. Run Draw a question — ribbon icon, command palette, or right-click.
  3. Pick one. It lands in your note and the cursor goes where your answer starts:
## Asked

> [!ask] what do you get complimented on the most?
> from [[Bank/autobiographical#^b17850831]]

The draw offering three sources: two bank questions with their kind and address underneath, and one paragraph the owner wrote a week earlier, marked as a revisit.

  1. Write. Then, with the cursor still in your answer, run Mark this answer done, and follow up.

Your answer gets an id and a link back to the question, and the model reads what you wrote to offer the next one.

Commands

On the editor's right-click menu under keep-writing, and in the command palette.

CommandWhat happens
Draw a questionThree to choose from. A bank question is written straight in; a paragraph of yours goes to the model first.
Mark this answer done, and follow upLinks the answer the cursor is in, then offers what follows from it. Safe to run twice.
Ask about the selectionHighlight text in any note and be asked about it. The question lands in today's note.
Install the starter question bankWrites the question notes into your bank folder. Skips anything already there.
Open the menuAll of the above, as one chooser. Made for the mobile toolbar.

Obsidian's right-click menu with a keep-writing submenu open, holding Draw a question and Mark this answer done.

On a phone

There is no right-click on a phone, so the menu is a command instead. Settings → Toolbar, add keep-writing: Open the menu, and that one button reaches everything. It offers only what applies where you are — asking about a selection appears when you have selected something.

Settings

Findable from Obsidian's own settings search: type "bank folder" or "endpoint" anywhere in Settings.

Setting
Daily notes folderWhere your daily notes are. A folder picker, so you cannot name one that isn't there. Default Sittings.
Question bank folderWhere the questions are kept. Default Bank.
Ask about writing inOne folder per line. The plugin reads what you wrote there and asks about it. Your daily notes are included already; add a folder of finished writing to widen it.
Use a modelOff makes it bank-only, with no network call at all.
EndpointAny OpenAI-compatible server. Default is one on your own computer. For Ollama: http://localhost:11434/v1
ModelMust name a model your server has.
Reply budgetRaise it if you get no questions and no error. Default 2048.
API keyOnly if your server needs one. Saved as plain text in this vault.

The plugin's settings, in two groups. Vault: daily notes folder, question bank folder, and the folders it may read your writing from. Model: a switch, the endpoint, the model name, the reply budget and an API key.

Nothing you write leaves your computer unless you point the endpoint somewhere else. That is the whole of what changes.

More

The guide covers where questions come from and how the bank is built, spending a day on one note, picking up where you stopped, how the three model jobs differ, and how to read your vault in graph view.

Licence

Two licences, because there are two kinds of thing here.

  • The code is MIT.
  • The question bank in starter/ is CC BY-SA 4.0. It is writing, not code. Share and adapt it, as long as you credit the source and license what you build under the same terms.

NOTICE says which is which. Your answers are yours — neither licence reaches anything you write.

Development

npm install
npm run dev     # rebuild on change
npm test        # unit tests, no vault and no model needed
npm run build   # typecheck, then bundle

test/fake-vault.ts stands in for Obsidian's App — reads and the whole write surface — so the interview runs and is tested with no Obsidian and no DOM. Tests needing a live model are skipped unless KW_LIVE=1.

Releases are not cut by hand. Pushing a bare semver tag (0.2.0, never v0.2.0) runs .github/workflows/release.yml, which checks the tag against manifest.json and versions.json, tests, builds, attests the assets and publishes them. Every release is signed against the commit it was built from, which matters here because main.js carries all 2,274 questions and nobody can diff those by eye:

gh attestation verify main.js --repo micahchoo/keep-writing

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.