When a proxy lets neither WebSocket nor SSE through, the app opens a
poll connection: the server buffers its events (an SSEClient without a
stream), each GET waits up to 25 s, and room joins work like for SSE.
Tasks and lists now update live there too, and note sync takes its
notifications from it instead of a second long poll. Idle connections
close after two minutes. The profile shows such a connection as limited.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Leaving the tab sent pending text with keepalive but kept it queued;
typing on folded it with newer keystrokes under the old base version,
which then conflicted with the user's own text. The flushed batch now
becomes the batch in flight.
- After a conflict, the focused field still showed the losing text and
every further batch made another copy. Typing on goes into the one
copy until the cursor leaves; on leaving, the field shows the block's
current text, and entering a block bases edits on what it shows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When no realtime connection gets through (proxy buffering SSE, notes on
long polling) but the server answers, the profile shows a yellow
"eingeschränkt" instead of "offline". A full connection now shows a
green "online" on the desktop too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
min-h-screen is 100vh, which mobile browsers measure without the address
bar, so short pages could be scrolled into empty space. 100dvh follows
the visible height.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Passwort vergessen?" came first in the markup; it now follows the field
and keeps its place next to the label.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The origin badge overlapped the watch button; on phones it is left out of
the header (the details stand at the bottom), as is the squeezed title.
The watch button gets the height of its neighbours.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The focused textarea was inline-block and left room for descenders below
it, so the row grew by 6 px and everything below shifted on every click.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New scopes notes:read (list_notes, get_note, notes in search) and
notes:create (create_note from Markdown). MCP only, REST stays closed;
new notes go into shared folders only with write access.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Admin switch in the system settings, MCP_ENABLED fixes it. Off: the
endpoint answers 404, OAuth is off, the API key settings hide the MCP tab.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A bullet that is only a link to a note (as left by /extract) gets a
"Notiz zurückholen" button. POST /documents/{id}/inline returns the
linked note's blocks with fresh ids and trashes the note; the editor
puts the title back as text and inserts the blocks as an own edit, so
Strg+Z restores the link and the note. Only own notes that no other
note links to. Release 0.52.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MindSift becomes the OAuth authorization server for its own MCP
endpoint: discovery (RFC 9728/8414), dynamic client registration,
authorization code with PKCE (S256), rotating refresh tokens with reuse
detection. The consent page lives in the app at /oauth/authorize. A
grant is an api_keys entry (kind 'oauth'), so scopes, origin badges,
renaming and revoking work as for keys; tokens are valid for /mcp only.
Unused connections expire after OAUTH_IDLE_DAYS (default 90). Requires
BASE_URL; off in demo mode. Release 0.51.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>