The Blue Pencil app is a proofreader that runs on your own model. Type or paste a draft into the top field and the checked version fills in below as you write: spelling, grammar, punctuation and capitalization corrected, the wording left alone.
An app, a script or a coding agent that talks to exe over HTTP gets one thing from it: the call Blue Pencil is built on, which asks the model one question and streams the answer. Ask the model from an app or a script, at the end of this chapter, describes it.
Your drafts are listed down the left, with New under them. Beside the list, the top field is where you write, and the field under it shows the checked text. Clear, Copy and Accept are in a row below the two fields.
The status line at the foot says how the check stands: Checking…, then No changes or the number of changes. Its right end names the model and its thinking level. Click that name for the options.
| Button | What it does |
|---|---|
| Clear | Empties the top field to start over. |
| Copy | Copies the checked text: the paragraphs checked so far as corrected, the rest as you typed them. |
| Accept | Puts that same text into the top field, in place of what you typed. |
Clear and Accept go in as typing does, so Undo brings your text back. Copy and Accept stay grey until a paragraph has been checked.
Blank lines separate the paragraphs. A draft of more than 20,000 characters is not checked, and the status line says so.
The status line counts the changes. To see the corrected text with no marks at all, turn off Mark changes in the checked text in the options.
The model is told to correct every error of spelling, grammar, punctuation and capitalization, and to leave alone:
To have it leave more alone, or work to a rule of your own, see Tell the pencil how you write, below.
The column down the left lists your drafts, the way a Claude Code or Codex window lists its sessions: one row per draft, newest first, titled by its first line.
The pencil keeps working on the drafts you are not looking at: the open one first, then the rest. While the window shows one draft, a mark on another row says how that one stands. Hover a row for which.
| Mark on a row | What it means |
|---|---|
| A pulsing green dot | The pencil is still checking that draft. |
| A black dot | The pencil finished it, and it is waiting for you. |
Right-click a row for its contextual menu. It opens with when the draft was started, in grey, and then offers:
On a phone the column is a strip of tabs above the fields, with New at its right end. There, Clear and then any other row is how a draft goes.
Every draft is kept, checked paragraphs included. Reload the window, or open it on another desk sharing this node, and the column comes back as it was without asking the model again. Drafts are app data, so desks joined to this one get them too, merged draft by draft; see Joining desks together. Which draft is open, and how wide the list is, are this browser's own.
With a draft open on two desks at once, the text belongs to the desk you type in.
Click the model name at the right end of the status line, and Blue Pencil Options opens:
| Option | What it sets |
|---|---|
| Check on | The backend the check runs on: Ollama, the endpoint in Configuration, or ChatGPT, the subscription signed in under Configuration → OpenAI. |
| Model | A model of that backend for this app alone. Configured keeps the one named in Configuration. |
| Thinking | How hard the model thinks. Max is the default: the best reading of the passage is worth the wait. |
| Custom prompt | Your own instructions to the model, sent with every check. |
| Mark changes in the checked text | Whether changes are marked at all. |
gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, … The Ollama list is what ollama ls shows, cloud models too: ollama pull muse-spark-open:cloud on the node puts that model on it. The dialog's own advice is that a small local model is plenty for proofreading and answers faster.Another backend, model or thinking level takes over from where the pencil is: what was checked stays checked, and what you type or edit from then on goes to the new choice. Another custom prompt is new rules, so every draft is checked again under it, the open one first. The options are kept with the app's data: every desk on this node checks with them, and so does the Hub composer.
Custom prompt, in the same options, is for what the pencil should know about your writing. Say it in your own words, in any language:
I prefer writing in lowercase.Use British spelling.中英文之间加一个空格。It goes to the model with every check, behind the pencil's own rules, and wins where the two differ. With the first line above, a lowercase draft keeps its lowercase and still has its spelling and grammar put right.
The check runs on the Ollama endpoint in Configuration (ollama.base_url, ollama.model) unless the options point it at ChatGPT. With a local model nothing you write leaves this machine. On ChatGPT the passage goes to OpenAI.
Text is checked a paragraph at a time, and only the paragraph you touched is checked again, which keeps long documents cheap.
A draft open on two desks of this node — or in the Hub composer too — still costs one model call a paragraph. The desk you type in asks first, and the others join its answer as it streams. A paragraph edited mid-check has its call cancelled once every desk has let go of it.
The status line says why, in red:
A working Blue Pencil also proofreads the Hub app's composer, in place: blue rules under what it would change, and a floating menu to accept them. It runs on the settings chosen here. The Hub says how to use it.
Any app can ask the model a question the way Blue Pencil does. POST /v1/chat/complete asks one question and streams the answer back, with no session, no tools and no history. The daemon holds the model's address and key, so the caller needs neither. Like every /v1/ call it takes the daemon's API token where one is set.
The body is JSON:
| Field | What it is |
|---|---|
prompt | The question. It cannot be empty, and holds up to 64 KB. |
system | The instructions the model answers under, up to 8 KB. |
provider | "openai" runs the call on the ChatGPT subscription: openai.model, openai.effort, and the sign-in under Configuration → OpenAI. Left out, the call runs on the Ollama endpoint. |
model, effort | Optional. They override the configuration for this one call. |
options | Optional. Ollama options such as temperature and seed, for this one call. |
share | Optional. true lets identical calls be one model call. |
The answer is newline-delimited JSON: {"delta": …} lines, a fragment of the answer in each, then {"done": true} with the model and the provider that ran it.
$ curl -sN 127.0.0.1:7777/v1/chat/complete -d '{"prompt": "Say hello."}'
{"delta":"Hello"}
{"delta":"!"}
{"done":true,"model":"…","provider":"ollama"}
A call that cannot start answers a JSON {"error": …} with an error status, and one that fails part way ends on an {"error": …} line. Closing the request cancels the model call.
With "share": true, identical calls — the same backend, model, effort, prompts and options — are one model call:
"shared": true on the done line.Leave share off when every call should sample afresh. Blue Pencil itself asks with share on and Ollama's temperature at 0: proofreading wants the likeliest correction, and the same one each time.