3926 Commits
Author SHA1 Message Date
000f2f98fb feat: Add TextPack (.textpack) support (#13235)
* feat: Add TextPack (.textpack) import support

Adds a single-document importer for TextPack, the zipped variant of
TextBundle used by Bear, Ulysses, iA Writer and others. Bare .textbundle
directories are not supported, as a directory cannot be delivered through
a browser file input.

The bundle's text entry may use any extension, per the spec, with
info.json's type deciding whether it can be read as markdown. Assets are
inlined as data URIs for the existing attachment pipeline to pick up,
bounded by the attachment size limit and a memory ceiling, and only for
media types markdown-it accepts as a link destination.

Also fixes an existing bug where a file embedded in an HTML or email
import as a data URI was stored in the document as base64 rather than
being uploaded as an attachment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Refactor to individual converters

* refactor

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 20:42:05 -04:00
d1ed467ba0 perf: Preload route chunks on sidebar hover intent (#13263)
The main app scenes were created with bare lazyWithRetry, so the sidebar
had no way to warm a route's chunk ahead of navigation — every click paid
the full fetch. Move them to createLazyComponent in a leaf module that
both the routes and the sidebar can import without a cycle, then preload
on the existing hover intent handlers.

Document and Collection links already prefetched their data on hover, so
the chunk preload rides along on the same event.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 15:04:05 -04:00
Tom MoorandGitHub d6d11171c3 Rename Members -> Users (#13262) 2026-08-02 14:46:20 -04:00
7992179978 fix: Multi-select swallows taps on mobile document list items (#13261)
The icon column stretched to the full height of a list item, so on mobile
– where items are tall enough to wrap a context snippet and meta – a large
strip down the left of every item toggled selection instead of navigating.
Hug the icon so that only a click on the icon itself begins a selection.

Also limit revealing the checkbox to real hover. On touch devices `hover`
resolves to `active`, and the rule additionally matched focus, so simply
tapping an item to navigate swapped its icon for an empty checkbox and the
state persisted. There the checkbox now appears once a selection is active.


Claude-Session: https://claude.ai/code/session_01WUpKTb4aEtvUwfQQoMC53v

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-02 14:07:34 -04:00
e5170b75b0 fix: Show roles as a selection list in the user role menu (#13260)
The user role submenu labelled each item "Promote to…" or "Demote to…"
depending on the target user's current role, and hid the role they
already had. Show the plain role names with a checkmark against the
current one, matching the group member role menu.


Claude-Session: https://claude.ai/code/session_01LfzcABi86HH7n6j9QrY4po

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-02 14:07:16 -04:00
73f960a544 fix: Invalid sort comparator for frequently used items (#13258)
* fix: Invalid sort comparator for frequently used items (#13241)

Extracts frequency tracking for icons, emojis, and code languages into a
shared FrequencyTracker with a spec-compliant, stable sort.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Snapshot frequently used icons while picker is open

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Sync frequent custom emojis to tracked ids, preserving order

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 08:43:28 -04:00
36b05130b6 fix: Suppress event before guard clauses in Templatize action (#13256)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 12:07:50 +00:00
4bb422425c fix: Bound plain text cache in command bar search index (#13252)
* fix: Bound plain text cache in command bar search index

Adds a shared LRUCache utility with optional sessionStorage persistence
and uses it for the command bar plain text cache, which previously grew
without limit, and for the Mermaid diagram cache, which had its own
bespoke LRU implementation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: Avoid double lookup in LRUCache.get

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: Read persisted LRUCache values lazily

Hydration now loads only the key index, reading each value from storage
on first access. This avoids a synchronous read and parse of the entire
cache on first use, and keeps in memory only the entries the session
actually touches.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test: Assert lazy LRUCache reads without a storage spy

Spying on Storage.prototype missed the calls under Node 26, where a
native Storage global shadows the jsdom one. Replacing the stored value
after hydration asserts the same behavior independently of environment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 07:56:28 -04:00
0e7c4bc756 fix: Don't show success toast when batch operation fails entirely (#13253)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:28:17 +00:00
Tom MoorandGitHub 890f0451a8 feat: Multi-select documents (#13041)
* first pass

* refactor

* refactor

* wip

* Fix BatchableApiMethods docs; remove ApiClient batch test

* Refactor actions

* refactor batch send to share error code handling

* Remove multi-select from read-only
Refactor performBatch to common

* refactor
2026-08-01 20:45:20 -04:00
Tom MoorandGitHub 8bcf4a43a7 Add control to collapse pinned docs (#13233)
* Add control to collapse pinned docs

* feedback
2026-08-01 20:36:12 -04:00
Tom MoorandGitHub fd5dfdb47e fix: Empty collaborators displayed on fresh model (#13231) 2026-08-01 22:47:49 +00:00
13b9b2c62d feat: Add support for web page and eml import (#13229)
* feat: Add support for web page and email import

* fix: Type mailparser result explicitly

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Combine HTML and Web Page

* fix: Validate mime type before inlining MIME archive parts

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 18:30:06 -04:00
Tom MoorandGitHub 93638564cf feat: Adds user profile cards on hover (#13230)
* wip

* Add option to suppress hover card
2026-08-01 18:12:09 -04:00
8b35f7bd17 feat: Import file dialog (#13228)
* feat: Replace import document file picker with a modal

Choosing "Import document" now opens a dialog that lists the supported
file formats with an icon for each, and accepts files either dropped onto
it or chosen with the system file picker.

Also closes the gaps between the formats the dialog advertises and those
the importer actually accepts:

- `.tsv` was offered by the file picker but rejected by the server, it is
  now converted to a table like CSV
- `.csv` and `.htm` are now recognised by extension, so they still import
  when the browser reports an unhelpful mime type
- `.markdown` is now offered by the file picker, it was already supported

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dj1UnjnRX336CQcdzw3ott

* Add intermediate dialog for file import

* tweaks, polish

* Update failure message

* test

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-01 17:46:47 -04:00
396ac980a8 Show search highlight chip on shared documents (#13227)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 16:29:25 -04:00
Tom MoorandGitHub bb520666ba Add time support to date mentions (#13222) 2026-08-01 11:47:46 -04:00
Tom MoorandGitHub 3b6a3f45e3 Add contextual menu to group table (#13220)
* Add contextual menu to group table

* feedback
2026-08-01 12:15:23 +00:00
Tom MoorandGitHub e6908c1511 feat: Inline read-only comments (#13209)
* feat: Inline read-only comments

* Improve anchor disambiguation

* fix: Spurious edits from inline comments
2026-08-01 08:08:52 -04:00
Tom MoorandGitHub 23d20d749d fix: policy serialization (#13211)
* fix: Membership IDs not serialized correctly in policies

* fix: Policy serialization
2026-07-31 21:41:16 -04:00
Tom MoorandGitHub 9a50a980f8 Update CSRF handling to set secure host-bound where possible (#13203) 2026-07-30 17:27:11 -04:00
Tom MoorandGitHub 2c161b8158 fix: Incorrect text wrap in version control (#13200) 2026-07-30 07:26:30 -04:00
uditandGitHub 64b931aad8 fix: Revision diff not shown when previous revision loads late (#13140)
The revision editor builds its extensions once, on mount, and is remounted
via its `key` when they change. Since revisions.list stopped returning
content in #12822 the previous revision's data is fetched after the first
render, so the Diff extension is created on a later render — by which point
the editor has already been built without it and the key, which only
tracked `compareTo`, does not change.

The result is a revision view with neither diff highlights nor a change
count, which appears intermittent because it works whenever the previous
revision's content already happens to be in the store.

Include the diff inputs in the editor key so the editor is rebuilt when the
comparison content arrives, when the compared-against revision changes, and
when changes are toggled on or off.

Closes #12964
2026-07-29 23:15:52 -04:00
Tom MoorandGitHub d54281cdb6 fix: Archived collections have incorrect depth (#13199) 2026-07-29 23:03:39 -04:00
Tom MoorandGitHub ade792f709 feat: Add ability to duplicate collection (#13197)
* feat: Add ability to duplicate collection

* Add confirmation dialog
2026-07-29 21:28:59 -04:00
Tom MoorandGitHub f78f285ec0 feat: Improve keyboard shortcuts guide ally (#13193)
* fix: Ally for keyboard shortcut guide

* Remove translations

* feedback
2026-07-29 19:17:11 -04:00
Tom MoorandGitHub f84ca3b9c3 Display model title in dialog header (#13196)
* Display model title in dialogs

* feedback
2026-07-29 19:12:24 -04:00
Tom MoorandGitHub 7bc6a3ca79 Add rubber-banding to sidebar resize (#13188)
* Add rubber-banding to sidebar resize

* refactor
2026-07-28 21:08:09 -04:00
c1ae5aa86e fix: Button elements in DocumentMeta incorrectly rendered as links (#13187)
* fix: Button elements in DocumentMeta rendered as links

* fix: Expose comments sidebar state on toggle button

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-28 20:53:52 -04:00
Tom MoorandGitHub 2ad5762523 fix: Crash on open share menu when receiving group membership over wss (#13186) 2026-07-28 18:22:51 -04:00
Tom MoorandGitHub 1fba97f8b6 fix: Mangled class names cause x is not a function in prod (#13184)
* fix: Mangled class names cause 'is not a function' in prod

* feedback, switch to WeakMap
2026-07-28 18:18:29 -04:00
Tom MoorandGitHub c5f9646337 Icon picker glow-up (#13177)
* Icon panel glow-up

* Move colorPalette to shared/constants
2026-07-28 08:47:09 -04:00
Tom MoorandGitHub 023bda8c1b Hide comment gutter icons on mobile (#13174) 2026-07-27 21:15:57 -04:00
Tom MoorandGitHub b0ed00fef4 fix: Cannot view past 25 archived collections (#13171) 2026-07-27 20:41:52 -04:00
Tom MoorandGitHub 854db75995 fix: Crash opening comment sidebar in Lightbox on public share (#13164) 2026-07-27 18:15:57 -04:00
Tom MoorandGitHub 3260153f9c fix: Suppress 499 error reporting (#13165) 2026-07-27 18:15:50 -04:00
Tom MoorandGitHub 3c53f4c75b fix: Evaluate of undefined in useKeyDown (#13163) 2026-07-27 17:58:43 -04:00
053a3fd438 fix: Respect move policy in sidebar drag and drop (#13150)
Drop targets that reorder or reparent an item now require the `move`
ability on the dragged item, so no drop cursor or highlight appears
where the move would be rejected by the server.

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-26 18:51:54 -04:00
17452bda5b Move socket management from client -> server (#13120)
* Move socket management from client -> server

* feedback

* fix: Reconcile collection rooms on visibility change

Handle collections.update transitions between private and team-visible by
joining or rebuilding the collection channel, route collection events through
the members channel so guests are excluded, and use removeData for the
collection ids cache invalidation.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-26 17:47:34 -04:00
Tom MoorandGitHub 42cd66f79f Reorder search in command menu, remove Fuse workers (#13137) 2026-07-25 14:21:46 -04:00
e1c906a1c2 feat: Fuse powered local content search (#13115)
* wip

* generalize

* refactor

* Extract SearchResultIcon for command bar results

Both search action builders rendered the same document icon inline. Move it
into a shared component alongside the other command bar pieces, forwarding
size so the command bar can continue to size icons via cloneElement.

Also drop the redundant charAt(0).toUpperCase() on the initial, as the Icon
component already normalizes it.

Co-Authored-By: Claude <noreply@anthropic.com>

* PR feedback
Prevent same doc showing twice in cmd k
Improve result ordering in main app command bar
Refactor to flattenTree

* Upgrade Fuse to 7.5.0, use workers

* fix: Re-register search actions when index is enriched

Include result contexts in the command bar registration key so that
snippets refresh when the same documents are enriched, and only mark a
server search as cached once its results are actually fed to the index.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-25 13:16:53 -04:00
8192bc0514 chore: Audit and move inline actions to definitions (#13133)
* chore: Audit and move inline actions to definitions

* fix: Reuse existing smart-quote translation key in emoji delete dialog

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove two usages of 'Link copied' translation

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-25 16:13:12 +00:00
Tom MoorandGitHub 60195ae0ee fix: Clear search chip highlight when opening CMD+F (#13135) 2026-07-25 12:05:26 -04:00
Tom MoorandGitHub 08a3b64295 chore: Exhaustive deps warning -> error (#13124)
* chore: Exhaustive deps turned to error

* Refactor useDragResize

* Refactor Lightbox to explicit state machine

* feedback

* ci
2026-07-25 10:43:49 -04:00
Tom MoorandGitHub b9354edb52 fix: Split view browser title (#13130) 2026-07-25 10:36:37 -04:00
CopilotandGitHub 796adb8b22 Rename split-view route helper to isSplittablePath (#13125) 2026-07-25 07:57:19 -04:00
Tom MoorGitHubCopilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
7fed1597df Apply suggested fix to app/components/EditorAwareHTML5Backend.ts from Copilot Autofix (#13126)
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
2026-07-25 07:56:23 -04:00
0f8a38ecd5 perf: Optimize drag and drop re-rendering (#13114)
* perf: optimize sidebar dragging

* Address copilot review comments

* deslop

* feedback

---------

Co-authored-by: Aron Granberg <aron.granberg@gmail.com>
2026-07-23 22:35:35 -04:00
Tom MoorandGitHub 87a4a40939 Remove ReactDOM from toDOM server rendering (#13109) 2026-07-23 20:06:27 -04:00
Tom MoorandGitHub 2d91a13647 fix: useKeyDown binding blocks browser defaults (#13098)
* fix: useKeyDown binding blocks browser defaults

* feedback
2026-07-22 21:42:32 -04:00