Not yet
- Editing between devices. Every promise holds between tabs of one browser, at /edit/. Between devices waits for your.os to carry the same bytes; until then a page moves as a saved file.
- A selection across blocks. Each block's words are their own ProseMirror, so a selection stops at a block's edge (How it works).
- A name. editor is a placeholder.
Every promise
Editing together
- provenEvery tab on a page edits the same page, livemeets app/sync.ts:4 · proves test/editor.spec.mjs:9
- provenEdits made offline merge when you reconnectmeets app/doc.ts:4 · meets app/sync.ts:4 · proves test/editor.spec.mjs:23
- provenYou see who else is here, and wheremeets app/presence.ts:5 · proves test/editor.spec.mjs:92
- provenUndo undoes only your own editsmeets app/doc.ts:51 · proves test/editor.spec.mjs:115
- provenTyping feels localmeets app/text.ts:5 · proves test/editor.spec.mjs:56
- provenThe editor syncs over anything that carries bytesmeets app/sync.ts:4 · proves test/editor.spec.mjs:9 · proves test/editor.spec.mjs:23
- provenComment on anything, and the comment stays with itmeets app/comments.ts:5 · proves test/together.spec.mjs:19
- provenReply, resolve, and find resolved threads againmeets app/comments.ts:5 · proves test/together.spec.mjs:54
- provenThe AI reads only what you send it, when you askmeets app/ai.ts:7 · proves test/together.spec.mjs:105
- provenThe AI edits through the same moves as a personmeets app/ai.ts:7 · proves test/together.spec.mjs:135
- provenThe AI's edits are a suggestion you acceptmeets app/ai.ts:7 · proves test/together.spec.mjs:232
- provenThe AI is a named collaboratormeets app/ai.ts:7 · meets app/history.ts:5 · proves test/together.spec.mjs:260
Changing the page
- provenThe pencil picks any element and shows its stylesmeets app/panel.tsx:53 · proves test/changing.spec.mjs:10
- provenA style change shows for everyone at oncemeets app/style.ts:5 · proves test/editor.spec.mjs:280
- provenChange a token, and every use of it changesmeets app/style.ts:5 · proves test/editor.spec.mjs:280
- provenStyles are a fixed list of properties and checked valuesmeets app/style.ts:5 · proves test/editor.spec.mjs:256
- provenDrag any block anywhere, and edits to it survive the movemeets app/doc.ts:4 · meets app/main.tsx:268 · proves test/editor.spec.mjs:136
- provenTwo moves of one block at once never duplicate or lose itmeets app/doc.ts:4 · proves test/editor.spec.mjs:160
- provenCut and paste within the page is a movemeets app/doc.ts:245 · proves test/changing.spec.mjs:199
- provenInsert any component from the librarymeets app/editor.ts:223 · proves test/changing.spec.mjs:56
- provenA component's settings are a form, made from its schemameets app/panel.tsx:219 · proves test/changing.spec.mjs:90
- provenA new component is made from existing onesmeets app/doc.ts:282 · meets app/library.ts:7 · meets app/panel.tsx:259 · proves test/changing.spec.mjs:143
- provenChanging a component changes every copy, keeping each copy's changesmeets app/library.ts:7 · proves test/changing.spec.mjs:162
- provenOne button flips between the page and its sourcemeets app/textform.ts:17 · proves test/changing.spec.mjs:225
- provenThe source shows everyone's edits as they happenmeets app/editor.ts:244 · proves test/changing.spec.mjs:258
- provenEditing the source edits the pagemeets app/editor.ts:244 · proves test/changing.spec.mjs:271
A real app
- provenComponents with behaviour come from the app's sourcemeets app/components.tsx:5 · proves test/changing.spec.mjs:56
- provenNothing an edit writes ever runsmeets app/doc.ts:4 · meets app/href.ts:2 · proves test/editor.spec.mjs:297
- provenNew code takes a rebuildmeets app/build.mjs:3 · meets app/components.tsx:5 · proves test/yours.spec.mjs:207
- provenThe page keeps working while you edit itmeets app/render.tsx:6 · proves test/editor.spec.mjs:223
- provenAny page renders, however edits mergedmeets app/render.tsx:6 · proves test/yours.spec.mjs:147
Yours
- provenGo back to any earlier versionmeets app/history.ts:5 · proves test/yours.spec.mjs:11
- provenA page is readable text in gitmeets app/textform.ts:17 · proves test/changing.spec.mjs:299
- provenYour page never leaves your browsermeets app/store.ts:5 · proves test/editor.spec.mjs:203
- provenSave a page as a file, and open it anywheremeets app/history.ts:5 · proves test/yours.spec.mjs:60
- provenPublished pages are plain HTMLmeets app/publish.ts:5 · proves test/yours.spec.mjs:108
How we know
- provenEvery test runs with one command, in Dockermeets Dockerfile:3 · proves test/yours.spec.mjs:255
- provenEnd-to-end tests use real browsers and the site as it shipsmeets test/playwright.config.mjs:3 · proves test/yours.spec.mjs:235
- provenEach test is shown to fail when its promise is brokenproves test/yours.spec.mjs:266
- provenFive pages, named what readers already call themmeets site/build.mjs:15 · proves test/site.spec.mjs:12
- provenEvery promise is on this pageproves test/site.spec.mjs:20
- provenWhat is proven is worked out, never typedmeets site/build.mjs:57 · meets site/components.mjs:22 · proves test/site.spec.mjs:27
- provenCompare is fair and datedmeets site/components.mjs:34 · proves test/site.spec.mjs:42
- provenEvery page reads with scripts off, and loads nothing from anyone elseproves test/site.spec.mjs:59
- provenEvery page reads on a phone, light or darkproves test/site.spec.mjs:80
- provenEvery page is also markdownmeets site/build.mjs:164 · proves test/site.spec.mjs:97