Modules › Editing
Editing
Text, notes, formatting, node types, undo.
30 of 30 working
18 delighted · 7 verified · 5 tested
- verified π Click anywhere and edit in place /help/add-edit-format
- verified π Every bullet has a note field; Shift+Enter focuses itA note holds markup like the bullet above it. It held plain text, so an imported link arrived reading `[hier](https://pyfio.com)` in full: source on the screen, the same complaint as the tags and the same answer. /help/hotkeys
- verified π Enter mid-text splits the bullet at the cursorImplied by an outliner but not stated upstream. Pando splits, and the tail keeps the children.
- verified π Backspace at position zero merges into the previous bulletUndocumented upstream. Pando merges only when the target has no children.
- verified π Bold with Ctrl/Cmd+B /help/hotkeys
- verified π Italic with Ctrl/Cmd+I /help/hotkeys
- verified π Underline with Ctrl/Cmd+Utest/markup.test.js /help/hotkeys
- verified π Text colour and highlight from a formatting toolbarSeven names for ink and seven for highlight, written {red|like this} and {~yellow|like this}. A closed set, so the stylesheet can give each name one value in a light theme and another in a dark one, and nothing can put an arbitrary colour on the page. /help/add-edit-format
- verified π Typing # at the start makes a heading /help/add-edit-format
- verified π Typing --- makes a divider`---`, `--`, `***` and `___`. The ledger promised `---` and only `--` worked. /help/add-edit-format
- verified π Typing - [ ] makes a checkboxBoth spellings: `- [ ]` because that is what Markdown says, and `[]` because it is shorter. `- [x]` arrives already done. Only the second worked until a persona typed the first. /help/add-edit-format
- verified π Backtick fences make a code block /help/add-edit-format
- verified π Ctrl/Cmd+K links the selected textCtrl/Cmd+K with something selected links it; with nothing selected the same chord goes somewhere, which is how upstream gives that chord both jobs without them colliding. /help/hotkeys
- verified π Pasted indented text becomes hierarchy /help/add-edit-format
- tested Pasted markdown and HTML keep their formattingtest/markup.test.js /help/add-edit-format
- verified Drag and drop an image into the documentDropped or pasted into a bullet, shrunk in the browser first, stored and served at /f/<id> with the permission checked against the bullet it was dropped on. R2 is not enabled on the account so the bytes are in D1; the URL shape is the same either way, so moving them later changes nothing anybody has written. The photographer now drops a real File through a DataTransfer onto a bullet and reloads, so the file listeners on #rows are driven rather than assumed. It covered this feature before while never dropping anything: every picture went in by POSTing to the API, which proves the store and nothing about the gesture. Falsified twice - once by refusing the drop, once by showing the picture without storing it.persona: photographer /help/add-edit-format
- verified Ctrl/Cmd+Enter completes a bulletpersona: keyboard /help/hotkeys
- verified π Ctrl+O shows or hides completed itemstest/project.test.js /help/hotkeys
- verified π Alt/Cmd+Shift+D duplicates a bullet and its subtree /help/hotkeys
- verified π Ctrl/Cmd+Shift+Backspace deletes a bullet /help/hotkeys
- verified Undo with Ctrl/Cmd+ZOne step per word rather than per keystroke, and it goes through the queue like any other change, so undoing something you are no longer allowed to touch is refused the same way doing it would be.persona: backtracker /help/hotkeys
- verified Redo with Ctrl/Cmd+Y or Ctrl+Shift+Zpersona: backtracker /help/hotkeys
- verified π Print with Ctrl/Cmd+PPaper gets the screenβs own renderer rather than a second one, which is why the print stylesheet is eleven lines. It also meant that the day the outline started arriving a page at a time, so did the paper: everything is drawn for as long as the printing takes, and the page goes back to its size afterwards. /help/hotkeys
- tested Protect a bullet from changes, including from agents pandoA flag enforced in the kernel, in the one function every mutation passes through, so the API and the MCP server get the same answer as the browser. Inherited by everything underneath. The only patch it lets through is one that touches nothing but the flag. It also guards downwards: deleting an ordinary parent that holds a protected bullet is refused, and the refusal names the bullet that answered, because it may be several levels out of sight. A protected bullet mirrored somewhere else is not lost by such a removal, so that one goes through. Two doors, one answer: a locked row keeps the keyboard, or protecting a bullet would take away the command that unprotects it. A copy arrives unlocked, because a copy exists to be filled in: a template made from a protected original produced a bullet nobody could type into, so protection and templates could not both be used. A mirror is the opposite and stays protected, because it is not a copy but the same node seen twice. The lock has an audience: everyone, which is what a bare flag has always meant and what every stored lock keeps meaning, or agents only, where a bearer token is refused and the person at the keyboard is not. Decided by how the mutation arrived rather than by anything it says about itself, so an agent cannot describe itself as a person. It also has a depth. A plain lock is deep and refuses everything under it, which is what every stored lock means. A template lock holds its own line and the shape of everything inside it, and leaves the lines themselves writable: a structure nobody may rearrange, full of lines anybody may fill in. A structural change is refused by every lock above it either way, because a structure that can be dismantled from inside is not protected.test/protect.test.js, test/e2e/doors2.mjs
- tested A note shows its first line until you open it pandoIt had stopped working, silently: the editing class was added when the caret entered a note and removed nowhere, and rows survive a redraw, so once you had written in a note it never clamped again. An outline with notes on it filled with paragraphs - which is precisely what the stylesheet says the clamp exists to prevent. Swept from the draw now, keyed on focus rather than on the caret, because blurring a note does not clear the caret. test/e2e/parity.mjs asserts one line at rest, that there is more than is shown, and that opening it releases the clamp. Falsified three ways.test/e2e/parity.mjs
- tested Completing a bullet dims what is under it pandoFinishing something finishes what it was made of. Visual only: the children are not marked done in the graph, because they were not.test/project.test.js
- tested How big a picture is drawn is a settingtest/e2e/parity.mjs puts a 400px picture in a bullet and measures it drawn at two settings. Driven through the class the preference resolves to, which is stated as the bound: it proves the setting reaches the picture, not that the settings screen writes it. Falsified by making both sizes the same.test/e2e/parity.mjs /help/add-edit-format
- verified A code block has a button that copies itThe text without the markup, because the thing anybody wants from a code block is its contents.persona: editor blog 2026.01
- verified Pictures, short clips and PDFs in a bulletOne construct for all three: the URL carries its own kind as a suffix, so the projection stays a pure function of the text and a bullet pasted elsewhere draws the same thing. HEIC goes in and comes back as WebP wherever the browser can decode it, so an iPhone photo is visible to everybody rather than to Safari. The cap is 1.5MB while the bytes live in D1. The photographer persona uploads a png, a clip and a pdf against the deployed site, checks the bytes come back rather than a stringified array, that each is drawn as the element its suffix decides, that a stranger cannot fetch any of them, and that typing beside a picture does not eat it. test/e2e/files.mjs adds the server rules: the kinds refused, the empty file, the cap, and the claim that matters - a picture inside a shared branch is visible to the people it was shared with and one outside it is not.persona: photographer blog 2026.05
- verified Add a picture, clip or PDF from the menuA phone cannot drag a file onto anything, so until this existed a picture could only be added at a desk: the feature was there and half the devices could not reach it. The photographer opens the menu, finds the entry, and asserts that choosing it opens a chooser offering every kind the store accepts. The dialog itself belongs to the operating system and is not driven; everything up to it is. Falsified by narrowing the accept list, by not opening the chooser, and by taking the command off every surface.persona: photographer Principle 4