Files
personotes/GEMINI.md

202 lines
10 KiB
Markdown

# GEMINI.md
This file provides guidance to Google's Gemini models when working with code in this repository.
## Project Overview
A lightweight, web-based Markdown note-taking application with a Go backend and a modern JavaScript frontend. Notes are stored as plain Markdown files with YAML front matter containing metadata (title, date, last_modified, tags). The system provides a sophisticated CodeMirror 6 editor with live preview, rich search capabilities, hierarchical organization, and automatic front matter management.
The project uses a hybrid architecture combining a Go backend, htmx for dynamic interactions, and a modern JavaScript frontend built with Vite and CodeMirror 6.
## Features
* **File-based Notes:** All notes are stored as plain Markdown files (`.md`) on the filesystem.
* **Daily Notes:** Quick daily journaling with interactive calendar, keyboard shortcuts (`Ctrl/Cmd+D`), and structured templates.
* **Tag Indexing:** Notes are indexed by tags specified in their YAML front matter, enabling quick search.
* **CodeMirror 6 Editor:** Modern, powerful Markdown editor with syntax highlighting and One Dark theme.
* **Live Markdown Preview:** Side-by-side editor and live preview pane with scroll synchronization.
* **Automatic Front Matter:** Automatically generates and updates `title`, `date` (creation), `last_modified`, and `tags` in YAML front matter.
* **Slash Commands:** Insert common Markdown elements and dynamic content (like current date) using `/` commands in the editor.
* **Search Modal:** Press `Ctrl/Cmd+K` to open a powerful search modal with keyboard navigation and real-time results.
* **Interactive Calendar:** Monthly calendar widget showing daily notes with visual indicators and one-click access.
* **Dynamic File Tree:** Automatically updating file tree in the sidebar to navigate notes.
* **Hierarchical Organization:** Organize notes in folders with drag-and-drop file management.
* **Rich Search:** Search by keywords, tags (`tag:projet`), title (`title:meeting`), or path (`path:backend`).
* **REST API:** Full REST API (`/api/v1/notes`) for programmatic access - list, read, create, update, and delete notes via HTTP.
* **Lightweight Frontend:** Built with htmx for dynamic interactions, minimizing JavaScript complexity.
* **Go Backend:** Fast and efficient Go server handles file operations, indexing, and serving the frontend.
## Technologies Used
* **Backend:** Go
* `net/http`: Standard library for the web server.
* `github.com/fsnotify/fsnotify`: For watching file system changes and re-indexing.
* `gopkg.in/yaml.v3`: For parsing and marshaling YAML front matter.
* **Frontend:** HTML, CSS, JavaScript
* [htmx](https://htmx.org/): For dynamic UI interactions without writing much JavaScript.
* [CodeMirror 6](https://codemirror.net/6/): For the robust Markdown editor.
* [Vite](https://vitejs.dev/): For bundling frontend JavaScript modules.
* [marked.js](https://marked.js.org/): For client-side Markdown parsing in the preview.
* [DOMPurify](https://dompurpurify.com/): For sanitizing HTML output from Markdown to prevent XSS vulnerabilities.
* [Highlight.js](https://highlightjs.org/): For syntax highlighting in code blocks.
* Custom CSS theme with dark mode inspired by VS Code and GitHub Dark.
## Architecture
The project uses a **hybrid architecture** that combines:
- **Go Backend**: Fast, type-safe server handling file operations and indexing.
- **HTMX**: "HTML over the wire" for dynamic interactions with minimal JavaScript.
- **Modern JavaScript**: For UI enhancements like the CodeMirror 6 editor, drag-and-drop, and animations.
- **Vite**: Modern build tool for efficient JavaScript bundling.
### Backend (Go)
Located under `internal/`, the backend has three main packages:
- **`indexer`**: Maintains an in-memory index of notes, parsing YAML front matter. It's thread-safe using `sync.RWMutex`.
- **`watcher`**: Uses `fsnotify` to monitor the notes directory for changes and triggers re-indexing (with a 200ms debounce).
- **`api`**: Contains HTTP handlers for serving HTML templates and handling CRUD operations on notes. It automatically manages front matter on save.
The server entrypoint is `cmd/server/main.go`.
### Frontend
The frontend source is in `frontend/src/` and is built using Vite.
- **`main.js`**: The entry point that imports all other modules.
- **`editor.js`**: Implements the CodeMirror 6 editor, live preview, scroll sync, and slash commands.
- **`file-tree.js`**: Handles the interactive file tree, including drag-and-drop functionality.
- **`search.js`**: Implements the `Ctrl/Cmd+K` search modal.
- **`ui.js`**: Handles general UI interactions like toggling the sidebar.
### HTMX + JavaScript Coordination
The core principle is that **HTMX handles all server interactions and DOM updates**, while **JavaScript provides client-side UI enhancements**.
- **Flow**: User Interaction → HTMX (AJAX) → Go Server (sends HTML) → HTMX (swaps DOM) → JS listens to `htmx:*` events to enhance the new content.
- **Best Practice**: Use `htmx.ajax()` for JS-initiated requests and listen to HTMX events (`htmx:afterSwap`, `htmx:oobAfterSwap`) instead of using `MutationObserver`. This creates a more performant and maintainable system. The server uses out-of-band (OOB) swaps to update multiple parts of the UI at once (e.g., updating the file tree after saving a note).
## Development Workflow
### Prerequisites
* [Go](https://go.dev/doc/install) (version 1.22 or higher)
* [Node.js](https://nodejs.org/) (for the frontend build process)
### Frontend Build Process
**IMPORTANT**: The frontend JavaScript must be built before running the application. The compiled assets are required for the editor and other interactive features to work.
1. **Install Node.js dependencies** (first time only):
```bash
cd frontend
npm install
```
2. **Build the frontend for production**:
```bash
npm run build
```
This command compiles, bundles, and minifies the source files from `frontend/src/` into the `static/dist/` directory.
3. **Run in watch mode for development**:
```bash
npm run build -- --watch
```
This will automatically rebuild the frontend assets when you make changes to the source files.
### Running the Application
1. Ensure the **frontend has been built** at least once.
2. Start the Go backend server from the project root:
```bash
go run ./cmd/server
```
3. The application will be accessible at `http://localhost:8080`.
### Server Configuration
The server accepts the following command-line flags:
- `-addr :PORT` - Change server address (default: `:8080`)
- `-notes-dir PATH` - Change notes directory (default: `./notes`)
Example: `go run ./cmd/server -addr :3000 -notes-dir ~/my-notes`
### Testing
Run all Go tests:
```bash
go test ./...
```
## Key Implementation Details
### CodeMirror 6 Editor
Implemented in `frontend/src/editor.js`, the editor features:
- **Markdown Support**: Full syntax highlighting via `@codemirror/lang-markdown`.
- **Theme**: `one-dark` theme for a VS Code-like feel.
- **Live Preview**: A preview pane that updates 150ms after you stop typing.
- **Scroll Sync**: The editor and preview scroll in unison.
- **Auto-Save**: Automatically saves the note 2 seconds after inactivity.
- **Slash Commands**: A command palette triggered by `/` for inserting Markdown snippets.
### Slash Commands
A productivity feature in the editor (`frontend/src/editor.js`).
- **Trigger**: Type `/` at the start of a line.
- **Commands**: Includes `h1`, `h2`, `h3`, `list`, `date`, `link`, `bold`, `italic`, `code`, `codeblock`, `quote`, `hr`, `table`.
- **Interaction**: Navigate with arrow keys, select with `Enter` or `Tab`.
### Search
- **Modal**: A fast search modal is available via `Ctrl/Cmd+K`.
- **Syntax**: Supports general keywords, `tag:value`, `title:value`, `path:value`, and `"quoted phrases"`.
- **Ranking**: Results are scored by relevance, with title matches scoring highest.
### REST API
A full REST API is available under `/api/v1/` for programmatic access. See `API.md` for detailed documentation.
- **Endpoints**: `GET /notes`, `GET /notes/{path}`, `PUT /notes/{path}`, `DELETE /notes/{path}`.
- **Content Negotiation**: Supports `application/json` and `text/markdown`.
### Security
- **Path Traversal**: The backend validates all file paths to prevent access outside the notes directory.
- **XSS**: `DOMPurify` is used to sanitize HTML rendered from Markdown, preventing Cross-Site Scripting attacks.
- **API Security**: The REST API has no authentication by default. It is recommended to place it behind a reverse proxy with authentication if exposing it publicly.
### Recent Fixes
- **Bulk Deletion 404 Error**: The issue with bulk deletion returning a 404 error has been resolved. The `DELETE /api/files/delete-multiple` endpoint now correctly processes requests. This involved:
- Changing the HTTP method from `POST` to `DELETE` in both `frontend/src/file-tree.js` and `internal/api/handler.go`.
- Adapting the Go backend handler (`handleDeleteMultiple`) to manually read and parse the URL-encoded request body for `DELETE` requests, as `r.ParseForm()` does not automatically process bodies for this method.
## Project Structure
```
project-notes/
├── cmd/server/main.go # Server entry point
├── internal/ # Go backend packages (api, indexer, watcher)
│ ├── api/
│ ├── indexer/
│ └── watcher/
├── frontend/ # Frontend source and build configuration
│ ├── src/
│ │ ├── main.js # JS entry point
│ │ ├── editor.js # CodeMirror 6 editor
│ │ ├── file-tree.js # Drag-and-drop file tree
│ │ ├── search.js # Search modal
│ │ └── ui.js # Misc UI scripts
│ ├── package.json
│ └── vite.config.js
├── static/ # Served static assets
│ ├── dist/ # Compiled/bundled frontend assets (generated by Vite)
│ └── theme.css # Main stylesheet
├── templates/ # Go HTML templates
├── notes/ # Default directory for user's Markdown notes
├── go.mod
├── API.md # REST API documentation
├── ARCHITECTURE.md # Detailed architecture document
└── GEMINI.md # This file
```