Commit Graph
78 Commits
Author SHA1 Message Date
eezd d245eec810 feat(typography): bundle Maple Mono v7.9 as the default font 2026-10-24 18:13:04 +08:00
eezd b123ef36db feat(highlight): replace Prism with highlight.js and Atom One Dark 2026-10-24 18:12:49 +08:00
eezd 634ef9fc11 fix(tree): resolve file drop targets to their containing folders 2026-10-24 18:12:36 +08:00
eezd 08f4e4aa7d feat(assets): store note images in shared sibling assets directories 2026-10-24 18:12:23 +08:00
eezd 5abc99b89e feat(editor): replace format bar with selection appearance controls 2026-10-24 18:11:57 +08:00
eezd 19aab631ec feat(ui): streamline workspace settings and remove sharing
Unify compact workspace controls and panel transitions, move directory actions into the context menu, and remove backlink UI.

Reorganize settings with searchable sections, per-setting resets, shortcut search, and accurate save feedback.

Remove sharing UI, APIs, authentication helpers, and storage code; provide a transactional cleanup script with retirement tests. Reject directories during orphan image cleanup and cover mixed-batch preservation.
2026-10-24 12:32:23 +08:00
eezd a716794e41 feat(ui): improve readability and fix workspace regressions
Separate interface typography from document text and enlarge controls across the workspace and public reader. Keep tree menus within the viewport and make constrained dialogs scrollable.

Preserve nested image references, escape moved link paths, synchronize note creation and daily-note opening, and hydrate shared headings. Add regression coverage for settings and workspace behavior.
2026-10-23 10:55:53 +08:00
eezd 4d1339851b feat(ui): redesign public reading and complete glass workspace
Add scoped public navigation, reading progress, focus and print controls without loading the editor. Polish responsive settings, graph and media layouts.

Correct share expiry units, preserve math and code during link maintenance, and normalize Markdown destinations for templates and note navigation. Verify browser flows and document the new tools.
2026-10-22 15:43:52 +08:00
eezd 91a359c2b7 feat(assets): add searchable media library and verified orphan cleanup 2026-10-22 15:09:15 +08:00
eezd 06be0038cf feat(ui): add typography preferences and contextual formatting 2026-10-22 15:01:39 +08:00
eezd 2a35a392b7 feat(knowledge): add graph tags daily notes and Markdown templates 2026-10-22 14:56:48 +08:00
eezd a923c2dfb9 feat(knowledge): index note relationships and maintain moved links 2026-10-22 14:52:37 +08:00
eezd d34d1f2183 feat(ui): establish glass workbench and local typography 2026-10-22 14:46:22 +08:00
eezd ed83b2c590 Replace Shiki code highlighting with Prism.js 2026-10-22 13:08:12 +08:00
eezd b2d5a1f319 Restore the built-in Shiki GitHub Dark code palette 2026-10-22 12:26:33 +08:00
eezd 82d08b9d73 Add persistent pinned tabs protected from bulk closing 2026-10-22 12:11:08 +08:00
eezd 19d0feac23 Keep code block spacing stable when revealing fences 2026-10-21 21:05:07 +08:00
eezd 15e036b9cd Add source editing toggle beside the outline button 2026-10-21 19:14:45 +08:00
eezd 73ff88c3c3 Fix custom shortcut synchronization across platforms 2026-10-21 18:02:25 +08:00
eezd b4054189cf Fix attachment scanning for literal text and multiline links 2026-10-21 18:02:18 +08:00
eezd c08bb8a182 Document shortcuts, folder galleries and batch sharing 2026-10-21 16:37:01 +08:00
eezd 0ce509a0fe Finish shortcut dispatch and verify file operation safeguards 2026-10-21 16:34:29 +08:00
eezd e028614dba Adapt built-in themes to the supplied editor snippets 2026-10-21 16:34:02 +08:00
eezd 828d50f242 Support live collection shares with stable member scopes 2026-10-21 16:16:53 +08:00
eezd ffc95d6dbc Add tree multiselection, batch actions and Markdown export 2026-10-21 16:10:49 +08:00
eezd f473ec64b6 Manage folder images in a gallery and hide asset directories 2026-10-21 16:05:01 +08:00
eezd fbce545d98 Allow custom command shortcuts and heading bindings 2026-10-21 16:02:58 +08:00
eezd 7344bb19dc Polish sidebar controls, font input and tab menus 2026-10-21 15:57:33 +08:00
eezd d253536009 Add image listing and asset management
Show images in asset directories with preview, rename, replacement, and trash recovery. Update local Markdown references when images move and restore original files if related metadata cannot be committed.

Refresh image previews after replacement and compare actual contents when deduplicating subsequent uploads.
2026-10-21 15:14:07 +08:00
eezd 8b54ccba18 Remove setup code from first-run initialization 2026-10-21 14:19:11 +08:00
eezd 8b54258df5 Update project collaboration and implementation guidelines 2026-10-21 14:11:24 +08:00
eezd 34d2acbbd5 Add Markdown and ZIP notebook import 2026-10-21 12:56:38 +08:00
eezd 903a617439 Move app installation entry into About settings 2026-10-21 12:32:15 +08:00
eezd 606e08ca39 Use port 21000 and document CDN hostname requirements 2026-10-21 12:18:57 +08:00
eezd 96596110ec Add Docker Compose deployment and HTTPS proxy configuration 2026-10-21 12:04:53 +08:00
eezd 9e9ab03c2b Add About settings with build identity and API documentation 2026-10-21 11:47:27 +08:00
eezd fcd0fdd7a4 Recognize sibling ordered list items when rewriting asset links 2026-10-21 11:32:48 +08:00
eezd f188f0fc32 Add synchronized editor spelling and tab width preferences 2026-10-20 19:08:43 +08:00
eezd f9cfb138ea Resync initial event connections and render nested task blocks 2026-10-20 18:59:54 +08:00
eezd 2df1ab87df Preserve code samples and watcher state during file updates 2026-10-20 18:59:41 +08:00
eezd 3a8248e560 Preserve drafts and asset paths across note moves 2026-10-20 18:59:26 +08:00
eezd 8c13dfeaec Convert pasted web content to Markdown and import remote images 2026-10-20 18:18:00 +08:00
eezd 84e89c8fe4 Support live recursive folder shares and follow subject moves 2026-10-20 17:20:23 +08:00
eezd 89472fe6fd Subscribe to vault events before completing WebSocket upgrades 2026-10-20 17:01:29 +08:00
eezd e66fee9dac Include note filenames in new share links 2026-10-20 14:41:43 +08:00
eezd ac81544e03 Propagate synchronization and plugin failures correctly 2026-10-20 12:58:41 +08:00
eezd 1e33f50c5e Block encoded unsafe links and revoked event credentials 2026-10-20 12:55:00 +08:00
eezd df064155c7 Preserve vault state on failed file operations 2026-10-20 12:46:55 +08:00
eezd 7e52d9a00b Fix note saves and drafts across asynchronous edits 2026-10-20 12:43:11 +08:00
eezd 8ce4a11b33 Add managed plugins with lifecycle cleanup and editor extensions 2026-10-20 11:53:29 +08:00
eezd 9fd7e2a948 Add built-in white and black themes 2026-10-20 10:26:49 +08:00
eezd 7f65162115 Add synced themes, color modes and custom CSS snippets 2026-10-20 10:06:58 +08:00
eezd 1562519f08 Add installable PWA shell with safe updates and offline status 2026-10-19 13:22:56 +08:00
eezd 64915a7b94 Add tab reordering, sidebar resize and collapse, and outline panel
- Drag tabs to reorder; context menu to close, close others, close right
- Resizable sidebar width (synced setting), collapsible with Mod+\
- Outline panel (Mod+Shift+O): right column on desktop, overlay on mobile
- Mobile: title opens quick switcher, swipe left closes the drawer,
  44px touch targets
2026-10-17 17:44:05 +08:00
eezd 91da6e116e Add mobile format toolbar, image picker and move-to dialog
- Markdown format commands shared by Ctrl+B/I/K and a toolbar above the
  soft keyboard on touch devices; bold and italic stack correctly
- Fit the app to the visual viewport so the keyboard does not cover the
  caret or the toolbar
- Insert images from the photo library or a file picker
- Move notes and folders with a folder picker from the file tree menu or
  the command palette
- Open the file tree menu with a long press on touch devices
2026-10-17 17:12:43 +08:00
eezd eb63b14c8e Add settings page with synced appearance and password change
- Store app settings as one JSON document on the server, merged per key and
  pushed to other devices; cache locally to avoid a flash on load
- Settings page groups appearance, account, shortcuts, shares, API tokens and
  trash; full screen with a section list on phones
- Font size and content width settings
- Change the login password, signing out other sessions
- Settings writes and password changes only accept a login session
2026-10-17 16:23:39 +08:00
eezd 5b326a70bf Lock out a source for 15 minutes after 30 failed passwords
Login and share password failures share one counter per source. A correct
share password does not reset it, so it cannot be used to keep guessing the
login password.
2026-10-17 15:51:40 +08:00
eezd 5ac01894e6 Add read-only sharing, API tokens and OpenAPI spec
- Share a note as a live read-only page at /s/{token} with optional password and expiry
- Share page renders with the shared parser (TOC, footnotes, math, Mermaid, code highlighting)
  and only serves images from the note's own .assets directory
- Shares follow renames made through the API or externally
- Manage shares and API tokens from the command palette and file tree
- Accept read/write API tokens as Bearer credentials; management endpoints require a session
- Serve a hand-written openapi.json, checked against the route table in tests
2026-10-17 15:21:47 +08:00
eezd 7b076346a4 Drop note encryption from README 2026-10-17 14:58:07 +08:00
eezd 3c98a6bbd9 Revert "Add encrypted note storage and keyring endpoints"
This reverts commit 35d3138c7d.
2026-10-17 14:56:23 +08:00
eezd b26c5aa693 Revert "Add client-side note encryption"
This reverts commit 5cf5a45682.
2026-10-17 14:56:23 +08:00
eezd 5cf5a45682 Add client-side note encryption
- WebCrypto keyring (PBKDF2 600k + AES-GCM master key) and per-note/per-image keys
- Encrypt/decrypt commands convert the note and its own images, deleting the originals
- Unlock, setup and change-password dialogs; manual lock; lock on page close
- Encrypted images are decrypted to blob URLs; pasted images are encrypted before upload
- Rewrite image links in the browser when renaming an encrypted note
- Skip local drafts for encrypted notes and confirm before closing with unsaved changes
- Show encrypted notes as locked with an explanation outside secure contexts
2026-10-17 14:51:08 +08:00
eezd 35d3138c7d Add encrypted note storage and keyring endpoints
- Treat name.md.enc as encrypted notes; forbid coexisting twins sharing assets
- Convert between plain and encrypted notes via PUT ?convertFrom
- Store keyring at .rawmark/keyring.json with versioned writes
- Allow permanent deletion of single asset files
- Exclude encrypted notes from the search index
2026-10-17 14:24:55 +08:00
eezd 75000fc571 Add Typora extension syntax
- Parser extensions shared by the editor and the HTML renderer: ==highlight==, $inline math$
  (Pandoc rules, so amounts like $5 are not math), $$ math blocks, footnote references and
  definitions, [TOC], and YAML front matter
- Live preview: highlight, superscript/subscript, emoji names (gemoji), footnote references
  with the definition as tooltip, a clickable table of contents, styled front matter
- Math (KaTeX) and Mermaid render in place; while editing a block the source is shown with a
  live preview below. KaTeX, Mermaid and the emoji table are loaded only when a note uses them
- KaTeX is pinned to 0.18 so Mermaid shares the same copy
- Move editor focus tracking out of table.ts so block widgets and tables use the same state
2026-10-17 13:38:53 +08:00
eezd 919575f3e7 Add command palette and command registry
- Commands (with optional shortcuts and availability checks) are registered in one place;
  global shortcuts are dispatched from it, and plugins can use registerCommand later
- The quick switcher lists commands when the input starts with '>' (VS Code style),
  opened with Ctrl+Shift+P or F1 (Firefox reserves Ctrl+Shift+P), plus buttons in the
  sidebar footer and the mobile top bar; recently used commands come first
- Built-in commands: quick open, search, new note/folder, save, rename, delete, close tab,
  trash, log out
- Mount the trash dialog at the workspace level so it is not positioned inside the
  transformed mobile drawer
2026-10-17 12:14:11 +08:00
eezd d096f0da70 Add quick switcher and fix directory refresh races
- Ctrl+P quick switcher with fuzzy matching on note titles and folders; empty input lists
  recent notes with the previous note first; creates the note (and folders) when no note
  has that name; also reachable from the mobile top bar
- Track recently opened notes, following renames and moves
- Serialize directory refreshes and discard responses that raced with local edits; a stale
  response could drop an optimistically added note, and debounced callers could wait
  forever, leaving the workspace startup unfinished
- Wait for a pending note creation before renaming it
- Focus the editor after opening a note from the switcher or search
2026-10-16 21:45:01 +08:00
eezd 55f0ee174e Add full-text search
- Index notes in a separate, rebuildable SQLite database (index.db) using FTS5 trigram,
  synced from watcher snapshots so external edits are picked up; terms under 3 characters
  fall back to LIKE
- GET /api/v1/search?q= returns matching notes with the first matching line and a snippet;
  path matches rank first
- Sidebar search panel (Ctrl+Shift+F) with highlighted terms and keyboard navigation;
  opening a result jumps to and selects the match
- Restore scroll position on tab switch with scroll snapshots; restoring scrollTop drifted
  by a few lines after line heights were re-estimated
2026-10-16 20:17:24 +08:00
eezd a11e0ec498 Fix redo shortcut on Windows, table rendering at doc start, and save on tab close
- Bind Mod-Shift-z to redo on all platforms (CodeMirror only binds it on Linux/macOS)
- Render tables based on editor focus so a note starting with a table is not shown as source
- Send the save request without waiting for the IndexedDB draft write, and flush on pagehide;
  Firefox could drop the last edit when a tab was closed right after typing
- Fall back to clipboardData.items when pasting images with an empty files list
2026-10-16 19:19:16 +08:00
eezd b3f05b501a build: add one-command dev launcher
scripts/dev.sh checks toolchains and ports, installs frontend deps when
the lockfile changes, starts the Go server and Vite with prefixed logs,
and stops both on Ctrl+C or when either exits. The Vite proxy reads the
same API_PORT so custom ports keep working.
2026-10-16 18:48:58 +08:00
eezd dc7e43bc3c build: support running the server with go run during development
- The dev build tag reads web/dist from disk instead of embedding it,
  so the backend starts without building the frontend first; Vite
  serves the UI and proxies /api and WebSocket to the Go server
- Document the two-terminal dev workflow and ignore .dev-data/
2026-10-16 18:46:13 +08:00
eezd bfe0a0654d build: add Docker image and deployment notes
- Multi-stage build: frontend, static Go binary with embedded assets,
  distroless nonroot runtime (~35 MB) with a built-in healthcheck
- Explain how to fix data directory permission errors on bind mounts
2026-10-16 18:37:14 +08:00
eezd 02d904056c feat(web): add Vue workspace with file tree, tabs, autosave and live sync
- Login and first-run setup screens
- File tree with inline create/rename, context menu, drag-and-drop
  move and trash with undo; all operations update the UI first and roll
  back on failure
- Tabs keep a CodeMirror state each; edits autosave after 500 ms with
  If-Match revisions, unsent edits persist in IndexedDB, and conflicts
  or remote deletions surface as banners with explicit choices
- WebSocket events sync external edits, moves and deletions into open
  tabs; reconnects trigger a full resync
- Pasted or dropped images show instantly and upload to note.assets/
- Responsive layout with a swipe-in sidebar drawer on phones
- Switch to TypeScript 6: vue-tsc does not support TypeScript 7 yet
2026-10-16 18:37:14 +08:00
eezd c4d2bd4636 feat(server): add Go backend with vault, auth, events and REST API
- vault: path validation (no traversal, hidden segments or symlink
  escape), atomic writes with If-Match/If-None-Match revisions, moves
  that carry the note's .assets folder and rewrite its image links,
  trash with restore, content-addressed asset uploads
- auth: single-user Argon2id password, sliding sessions in SQLite,
  login rate limiting, first-run setup gated by a one-time code written
  to the data directory
- watch: fsnotify plus periodic rescans diffed against a snapshot, so
  both RawMark and external edits are broadcast as tree/changed/moved/
  deleted events over WebSocket
- api: stdlib router, SameSite=Strict cookies plus Origin checks,
  sandboxed raw file serving, embedded SPA with gzip and CSP
2026-10-16 18:23:23 +08:00
eezd 5746f2e9ae docs: add README 2026-10-16 18:16:10 +08:00
eezd 63f508d3df feat(web): add code copy button, block-scoped select-all, table toolbar polish
- Copy button in the top-right of fenced code blocks, with execCommand
  fallback when the Clipboard API is unavailable over plain HTTP
- Mod-A inside a code block selects the block content first; pressing
  it again selects the whole document
- Paint code block backgrounds on a ::before layer below CodeMirror's
  selection layer so selections inside code blocks are visible
- Table toolbar sits in reserved space above the table instead of
  overlapping it, with grouped icon buttons
2026-10-16 18:07:42 +08:00
eezd 54fecf71c8 feat(web): render editable tables and make images clickable
- Top-level GFM tables render as an editable widget: click a cell to
  edit its Markdown source, Tab/Enter/arrows to navigate, toolbar to
  insert/delete rows and columns or switch to source
- Structural table edits are isolated undo steps; focus is restored
  after the widget is rebuilt
- Clicking an image moves the cursor to its syntax to reveal the source
- Renderer escapes raw HTML and filters dangerous URL schemes by default
2026-10-16 17:37:40 +08:00
eezd a1597697e5 feat(web): add M0 live preview editor prototype
- CodeMirror 6 editor with Obsidian/Typora-style live preview: block
  markup revealed per line, inline markup revealed per element
- Fenced code highlighting via Shiki (github-dark, JS regex engine) in a
  Web Worker, languages loaded on demand
- Lezer syntax tree to HTML renderer for share pages, checked against
  the CommonMark 0.31.2 spec (640/652; 12 known parser deviations)
- Use markdownLanguage directly to avoid bundling lang-html/css/js
2026-10-16 17:23:58 +08:00
eezd 4636649576 chore: initialize repository 2026-10-16 17:08:28 +08:00