Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ src-tauri/gen

# Local, machine-specific Claude Code settings (gitignored) — not part of the codebase to format.
.claude/settings.local.json
# Isolation-mode worktrees are gitignored full-repo copies — don't format duplicated sources.
.claude/worktrees
154 changes: 123 additions & 31 deletions CLAUDE.md

Large diffs are not rendered by default.

31 changes: 24 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Markdown files, and they are yours.
<img alt="Gravity Notes" src="assets/gravity-notes-dark.png">
</picture>

## Features (v1)
## Features

- **Choose your storage** on first run: a folder of plain `.md` files (Chromium browsers, or natively
in the desktop app), or in-browser/in-app storage that works everywhere
Expand All @@ -34,7 +34,11 @@ Markdown files, and they are yours.
the storage menu (the `⋯` orb)
- **Full-text search** across note titles _and_ bodies, ranked by relevance, with the matching
passage shown as a snippet in the list (multi-word queries match all terms)
- Gravity Markdown editor (WYSIWYG + markup modes) with a read-only **preview** mode
- Gravity Markdown editor (WYSIWYG + markup modes) with a read-only **preview** mode (a floating
"Preview" chip shows while it's on — click it to exit)
- **Live URLs**: bare `https://…` links render as real links in the editor and the preview (typing one
linkifies on the trailing space), and open in your browser via ⌘-click (or a plain click in
preview). Explicit schemes only — a stray `Notes.md` never turns into a link or gets rewritten
- **`[[wiki links]]`** between notes: type `[[` for a note picker, or write them by hand. They render
like links (no brackets) and ⌘-click follows them — creating the note if it doesn't exist yet;
unresolved links are dimmed. Stored verbatim as `[[Title]]`, so they're Obsidian-compatible
Expand All @@ -48,7 +52,11 @@ Markdown files, and they are yours.
accent color, and the text-column width — app-wide, per workspace, or per note (the `⋯` button or
`⌘⇧I`). Per-note choices live in the folder's metadata, so they survive renames and moves
- **Multiple workspaces**: open several note folders and switch with `⌃R` (or the orb menu's Open
Recent) — on the desktop, each workspace can have its own window
Recent) — on the desktop, each workspace can have its own window (`⌘-click` a recent, `⌘↵` in the
switcher — works on "Open Folder…" too)
- **Per-note windows** (desktop): `⌘↵` or `⌘-click` a note in the list (or "Open in New Window" from
its menu) to open just that note in a small window with the panels tucked away — reopening the same
note focuses its existing window, and `⌘0` brings back the workspace's main window
- **Automatic updates** (desktop app): the macOS app checks for a newer release on launch and installs
it in place once you confirm — plus a manual **Check for Updates…** in the storage menu. Updates are
delivered through GitHub Releases and verified by signature
Expand All @@ -65,6 +73,8 @@ Markdown files, and they are yours.
| `⌘J` / `⌘K` | Preview next / previous note (works while editing) |
| `⌘[` / `⌘]` | Go back / forward through visited notes (browser-style history) |
| `Enter` | Edit the selected note |
| `⌘Enter` / `⌘-click` | Open the selected note in its own window (desktop) |
| `⌘0` | Show this workspace's main window (desktop; also in Window ▸ Main Window) |
| `Esc` | Editor → list → search (then close / clear) |
| `⌘L` | Jump to the search box (`⌘L` in the desktop app; browsers reserve it) |
| `⌘⇧Enter` / `⌘N` | New note (`⌘N` in the desktop app; browsers reserve it) |
Expand All @@ -88,7 +98,9 @@ menu the row's `⋯` button opens, at the cursor.

A **folder rail** (toggle with `⌘⇧\`) lists your folders left of the notes list; it's off by default,
so the app stays a two-pane view until you want it. Selecting a folder scopes the notes list to it
(**All Notes** shows everything), while search stays global. **New note** (`⌘N`) lands in the selected
(**All Notes** shows everything), while search stays global. With the rail closed, a small **folder
chip** above the list names the active scope (click it to open the rail, ✕ to go back to All Notes).
**New note** (`⌘N`) lands in the selected
folder. Drag a note onto a folder to file it, or drag a folder onto another to nest it (onto **All
Notes** to move it back to the root). Double-click or `F2` renames a folder; with a folder focused, `n`
makes a subfolder and `⌫` removes an empty one.
Expand Down Expand Up @@ -170,14 +182,19 @@ Key modules:
- **External changes** to the open note are detected when you return focus to the tab, not live while
it stays focused.
- **A selected image shows a faint caret line** beside it in the editor — the browser's native
object-selection caret, which resists CSS hiding. Cosmetic only; editing is unaffected. See
`TODO.md`.
object-selection caret, which resists CSS hiding. Cosmetic only; editing is unaffected.
- **Auto-update (desktop) starts from the release that introduced it.** A build without the updater
(≤ 0.2.0) has to be updated by hand once; from there the macOS app updates itself in place. arm64 only.

### Backlog

- Search index update on external file updates (+ reload workspace menu item?)
- iCloud dataless files: not-yet-downloaded files list by name/mtime with an empty preview/search
body, and recover once macOS materializes them (a focus refresh picks up the filled-in preview).
Consider `startDownloadingUbiquitousItemAtURL` to kick off downloads in the background + a
"downloading…" preview state so it isn't silent.

- Live file-watching for external edits (today the list + search index refresh when the window
regains focus, not while it stays focused) + an explicit "reload workspace" menu item?
- Density (line spacing) setting to complement the per-note font/width overrides?
- Restore all workspace windows on relaunch (today only the last-active one comes back)

Expand Down
7 changes: 6 additions & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@ import importOrderConfig from '@gravity-ui/eslint-config/import-order';
import prettierConfig from '@gravity-ui/eslint-config/prettier';

export default [
{ignores: ['dist', 'coverage', 'src-tauri']},
// Flat config does NOT read .gitignore, and its only default ignores are node_modules/.git.
// '.vite' matters: a stray root-level Vite dep-cache (340 multi-MB minified chunks) once made
// `eslint .` grind for 40+ minutes inside prettier/scope-analysis before anyone saw output.
// '.claude' holds machine-local settings + isolation-mode worktrees (full repo copies) — linting
// those duplicates the whole tree and reports phantom errors; nothing tracked there is JS/TS.
{ignores: ['dist', 'coverage', 'src-tauri', '.vite', '.claude']},
...baseConfig,
...clientConfig,
...importOrderConfig,
Expand Down
6 changes: 4 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
"tauri:build": "tauri build"
},
"dependencies": {
"@codemirror/commands": "^6.10.3",
"@codemirror/state": "^6.6.0",
"@diplodoc/color-extension": "^0.1.1",
"@diplodoc/cut-extension": "^1.0.0",
"@diplodoc/file-extension": "^0.2.1",
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/capabilities/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "enables the default permissions",
"windows": ["main", "ws-*"],
"windows": ["main", "ws-*", "note-*"],
"permissions": [
"core:default",
"core:window:allow-start-dragging",
Expand Down
Loading
Loading