Sidecar comments with quote-first anchors, CriticMarkup suggestions through the OT path, per-member feed; first three tasks sized for MiniMax. Written by MiniMax M3.1 Flash (OpenCode Zen free route) with web research notes; three owner questions open.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Image tab: decode off the UI thread, zoom (wheel, buttons), pan, fit, rotate, neighbours, info, transparency checkerboard only when needed. Video tab reuses the ffmpeg embed player, PDF tab renders pages through Session::pdf_preview with previous/next and zoom. Copy tables moved into text/views/files to keep the folder under 12 loose files. Built by MiniMax M3.1 Flash (OpenCode Zen free route); verified from a clean checkout of the staged files: 901 lib tests, image_view, media_view and file_viewers_basic pass, xtask i18n clean. No elapsed time or page total yet; annotations not wired.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Info card (name, kind, size, modified, path, open with the system) for audio, video, PDF and other files; code_view highlighter (rust, js/ts, py, json, toml, yaml, sh, css, html) with line caps, not wired into tabs yet. Moves [ui.file-card] out of [ui.settings-view-calendar] (my earlier commit split it, which broke two calendar settings tests) and updates the Explorer test for show-all-types. Built by GLM 5.3 Flash via Pi; verified from a clean checkout of the staged files: lib tests 856 pass.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Comma-separated extensions, cleaned and capped through FilesConfig::repair_hidden; invalid-only input emits nothing. Built by GLM 5.3 Flash via Pi. Two calendar/feed settings tests already fail at HEAD (clocks_amounts_and_log_lines, adding_and_removing_a_feed_emit_engine_commands).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
TabKind gains Image, Video, Audio, Pdf, Code, Other; sidecars of existing images are hidden; Settings > Files toggles show_all_types and show_annotation_files. hidden_extensions has no Settings row yet. No viewers for the new kinds yet.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The previous commit added crates/annotate and an engine dependency on it but left out the root Cargo.toml entry, Cargo.lock and the layers table, so that commit did not build by itself.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Explorer: every non-hidden file is listed with its own icon and tab kind (image, video, audio, pdf, code, text, other); settings show_all_types, hidden_extensions and show_annotation_files; kinds without a viewer open a placeholder card, never the text editor
- crates/annotate: non-destructive image annotations (strokes, lines, rectangles, ellipses, text) with strict sidecar JSON validation, hit testing, zoom/pan transforms and undo
- engine: file.info, file.hash, file.neighbours, image.annotations.load and save (a corrupt sidecar is kept as .bad, the image is never modified), header-only image sizing for PNG, JPEG, GIF, WebP, BMP and SVG
- sync server: publish notes or folders as static HTML (raw HTML escaped, strict CSP, publish: false honoured, no attachments) and expiring revocable share links, with per-route rate limits and audit rows
- ui-egui: "Last edit - name, time ago" in the status bar from server.file_meta
- specs and designs: file viewers spec, 20 PaperCraft exports rated 8.2 of 10 (design/files/RATING.md), annotate and viewer briefs
Verified with cargo xtask ci (fmt, clippy -D warnings, workspace tests, layers, tree, i18n).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- engine: live.join, live.edit, live.poll, live.peers, live.selection, live.info and live.leave over the live session client (at most 8 rooms, no token in any answer, dropping a session with open rooms returns within 2 s); server.file_meta names the last editor of a file
- engine: sync.pending lists the local changes the server does not have yet (new, edited, deleted; at most 500, local comparison only)
- ui-egui: a "Waiting to sync" queue sheet opened from the sync sheet, and the "You are offline" banner on the compact Notes page
- tests: two sessions converge through the real server using live.* commands; stub-server, queue and banner tests
Verified with cargo xtask ci (fmt, clippy -D warnings, workspace tests, layers, tree, i18n).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- engine: ServerClient file_history, file_revision and restore; commands server.history, server.revision, server.restore (bound vault only, 5 MiB cap, no token in any answer)
- ui-egui: the Versions tab lists the server's revisions under the local snapshots with Compare (diff against the note) and a two-click Restore
- specs: collaboration research (browsed, 866 lines, 211 sources) and its ranked next features added to the collaboration task list
Verified with cargo xtask ci (fmt, clippy -D warnings, workspace tests, layers, tree, i18n).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- engine: Remote gains missing_chunks, put_chunk and put_chunked; upload_chunked streams a big file in 4 MiB chunks, sends only the chunks the server lacks, retries with backoff and reports progress (SyncStatus.transfer); the scan hashes by streaming and skips only files over 1 GiB
- engine: server.devices command and a sync.attachments option (non-Markdown files are skipped when it is off)
- ui-egui: the sync pill opens a bottom sheet on a phone-width window (status, devices, conflicts row, options, Sync now); wider windows keep Settings > Sync
- tests: chunk resume against the real server, 6 driven sheet tests, devices stub tests
Verified with cargo xtask ci (fmt, clippy -D warnings, workspace tests, layers, tree, i18n).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Sync and the server
- crates/sync: revision ledger (stale writers conflict, edit beats delete), client planner, three-way merge, conflict names, path and hash gates
- apps/notescraft-sync-server: pairing, device tokens, change log with long poll, blobs, accounts with many vaults, roles, invites, audit log, quota, GC, readiness, request ids
- server history (revisions, restore, retention), chunked resumable uploads, live editing endpoints (SSE rooms, presence, flush through the ledger)
- engine: HttpRemote, sync_once, SyncWorker, sync.* commands, share.* and server.* commands, live session client, note.capture, vault catalog and vaults.* commands
Editing together
- crates/collab: operational transformation core (TextOp, transform, client state machine, room, presence)
- ui-egui: Settings > Sync, sync pill, conflicts, Share dialog, live pill and remote carets, launcher Connect and Join flows
App shell
- vault launcher (desktop and phone layouts) wired into the app host (--launcher, File > Vaults...)
- compact (phone) layout with a bottom tab bar
Verified with cargo xtask ci (fmt, clippy -D warnings, workspace tests, layers, tree, i18n). Android and iOS shells are not built: the build machine has no NDK or Xcode.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The Visual view's block editor now shares the Source view's task toggle (keys::on_toggle_task).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ticks or unticks a box, adds a box to a list item, makes a plain or empty line a task.
Round 5 tasks 36-37 added; the Visual block editor's version (37) is open.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Every save of a changed note keeps a snapshot (at most one per 5 minutes, newest 20, under
.notescraft/history), engine history.list/history.read, a Versions tab with Compare and Restore.
Task 31 marked built (git history existed), task 34 deferred by the owner.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Source view: chevrons fold the section under a heading (laid out at a vanishing size, one buffer).
Graph: timelapse by file creation time with play/pause and a slider. Workspaces: save and load the tabs,
active tab, pins, panel sizes and sidebar tab by name (engine workspace.* commands, files in
.notescraft/workspaces). Copy a heading or block link (adds a ^id once), Outline context menu.
Round 4 tasks 31-35 added to specs/obsidian-basics/tasks.md.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Explorer: foldable calendar, hand-laid toolbar, no empty Bookmarks block, Move to... picker, folder notes,
Trash tab. Menu bar as flat text, title bar drawn whole each frame. New Outline pane, scrolling Related tab,
performance overlay (fps, frame time, memory, CPU), first-run UI scale from the desktop on Linux.
Editor: Extract to a new note, Merge into..., reading mode, indent settings, table row/column controls,
tags in notes searchable, search order and collapse, excluded search folders, user themes in the settings
folder. Engine: note.extract, note.merge, trash.list/restore/empty.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Editor previews (colour swatches, arrows, embeds), the 18 obsidian-basics tasks (find and replace
with regex, back/forward, auto-pair, footnotes, folding, search operators, split view, PDF/audio/
video embeds, spelling, drag and drop, pinned tabs, settings) and round 2: ```query blocks, stacked
tabs, pop-out windows, tasks ticked inside embeds, text around an embed, embeds that follow edits,
block menu shortcut. New crates: notescraft-regex (linear-time engine) and notescraft-syntax.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- card areas now cover their card, so egui sees the pointer over them (wheel scroll in note, diff, sidebar, assistant)
- Preview button on pending changes opens a full-window review; Side by side / Unified toggle
- math: log/ln/det/trig operators, \operatorname, \bmod, \pmod, \iint, \xrightarrow, negated relations
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>