An open API service indexing awesome lists of open source software.

https://github.com/sandst1/remind.notes

A second brain app built on top of remind
https://github.com/sandst1/remind.notes

Last synced: 28 days ago
JSON representation

A second brain app built on top of remind

Awesome Lists containing this project

README

          

# remind.notes

A desktop "second brain" note-taking app. Write notes in markdown, and [remind](https://github.com/sandst1/remind) quietly extracts concepts, entities, and connections in the background using LLM-powered consolidation.

## Install

### macOS / Linux

```bash
curl -fsSL https://raw.githubusercontent.com/sandst1/remind.notes/main/scripts/install.sh | bash
```

### Windows

Download the latest `.msi` from [Releases](https://github.com/sandst1/remind.notes/releases/latest) and run it.

## How it works

- **Notes are episodes.** Each note is stored as a remind episode — a markdown string with a title and tags.
- **Notebooks are databases.** Each notebook is an isolated remind SQLite database file. No cross-notebook connections; if you need things linked, put them in the same notebook.
- **Consolidation happens on save.** When you save a note, remind's consolidation engine runs in the background — extracting entities, recognizing patterns, and building a concept graph from your notes.
- **Concepts emerge automatically.** Browse the concepts that remind has extracted: generalized knowledge, relationships, contradictions, all derived from your raw notes.

## Architecture

```
remind.notes/
├── frontend/ React + Vite + Tailwind CSS (UI)
├── src-tauri/ Tauri v2 (desktop shell, Rust)
├── sidecar/ Python FastAPI backend (wraps remind)
```

**Tauri** provides the desktop window. On launch, it spawns a **Python sidecar** (FastAPI on a random localhost port). The React frontend talks to the sidecar over HTTP. The sidecar uses remind's Python API (`remind-mcp` package) for all memory operations.

### Data flow

```
User writes note → Save (Cmd+S)
→ POST /api/notebooks/{name}/notes
→ remind.remember(content) [sync, fast, no LLM]
→ background: remind.consolidate() [async, LLM-powered]
→ entity extraction
→ concept generalization
→ relationship mapping
```

Consolidation only triggers on:
- New notes (always)
- Edits where the content diff exceeds 50 characters

### Key design decisions

- **Manual save only** — no autosave. Each saved version is an intentional snapshot.
- **Decay disabled** — notes are permanent knowledge, not ephemeral agent context.
- **User titles survive consolidation** — stored in `metadata["user_title"]` since remind's extraction phase overwrites `episode.title`.
- **One MemoryInterface per notebook** — cached in `MemoryManager`, invalidated on settings change.

## Prerequisites

- [Node.js](https://nodejs.org/) 18+ with [pnpm](https://pnpm.io/)
- [Rust](https://rustup.rs/) (stable)
- [Python](https://python.org/) 3.11+ with [uv](https://docs.astral.sh/uv/)
- LLM API keys (Anthropic, OpenAI, or local Ollama)

## Setup

```bash
# Install frontend dependencies
cd frontend && pnpm install

# Install sidecar dependencies
cd ../sidecar && uv sync
```

## Development

```bash
cd frontend && pnpm tauri dev
```

This starts both the Vite dev server and the Tauri app, which spawns the Python sidecar automatically.

On first launch, you'll be prompted to choose a folder for storing notebook databases.

## Configuration

Open Settings from the sidebar footer. Configure:

- **Notebooks folder** — where `.db` files are stored
- **LLM provider** — Anthropic, OpenAI, or Ollama
- **Embedding provider** — OpenAI or Ollama
- **API keys and models** — provider-specific settings

Settings are saved to `~/Library/Application Support/remind-notes/settings.json` (macOS).

## Sidecar API

The Python sidecar exposes a REST API on `http://127.0.0.1:{port}`:

| Endpoint | Description |
|---|---|
| `GET /health` | Health check |
| `GET/POST/PUT/DELETE /api/notebooks` | Notebook CRUD |
| `GET/POST/PUT/DELETE /api/notebooks/{name}/notes` | Note CRUD |
| `GET /api/notebooks/{name}/concepts` | Browse concepts |
| `GET/POST /api/notebooks/{name}/consolidation` | Consolidation status/trigger |
| `GET/PUT /api/settings` | App settings |

You can test the sidecar standalone:

```bash
cd sidecar && uv run python main.py
# prints PORT:{n}, then curl http://127.0.0.1:{n}/health
```

## Project structure

```
sidecar/
├── main.py Entry point (uvicorn + port printing)
├── api/
│ ├── app.py FastAPI factory + CORS
│ ├── notebooks.py Notebook CRUD (file operations)
│ ├── notes.py Note CRUD (remind episodes)
│ ├── concepts.py Read-only concept browsing
│ ├── consolidation.py Background consolidation status/trigger
│ └── settings.py Config management
├── core/
│ ├── config.py AppConfig (JSON persistence)
│ ├── memory_manager.py MemoryInterface cache per notebook
│ └── consolidation_worker.py Background asyncio task tracker
└── models/
└── schemas.py Pydantic request/response models

frontend/src/
├── lib/
│ ├── api.ts HTTP client to sidecar
│ └── tauri.ts Tauri invoke wrappers
├── stores/
│ └── appStore.ts Zustand state management
├── components/
│ ├── layout/ AppShell, Sidebar, StatusBar
│ ├── notebooks/ NotebookList
│ ├── notes/ NoteList, NoteEditor, MilkdownEditor, TagFilter
│ ├── concepts/ ConceptBrowser, ConceptList, ConceptDetail
│ └── settings/ SettingsDialog
└── types/
└── index.ts TypeScript interfaces
```

## Keyboard shortcuts

| Shortcut | Action |
|---|---|
| `Cmd+S` | Save note |
| `Cmd+N` | New note |
| `Cmd+Backspace` | Delete current note |
| `Cmd+1` | Switch to Notes view |
| `Cmd+2` | Switch to Concepts view |

## Production build

```bash
# 1. Bundle the Python sidecar as a standalone binary
./scripts/bundle-sidecar.sh

# 2. Build the Tauri app (includes the bundled sidecar)
cd frontend && pnpm tauri build
```

Output: `.dmg` / `.app` (macOS), `.msi` (Windows), `.deb` / `.AppImage` (Linux).

## Releasing

Tag a version and push to trigger the CI build across all platforms:

```bash
git tag v0.1.0
git push origin main --tags
```

GitHub Actions builds macOS ARM, Linux, and Windows artifacts automatically and creates a GitHub Release with all binaries attached.

## Built with

- [Tauri v2](https://tauri.app/) — desktop shell
- [React](https://react.dev/) + [Vite](https://vite.dev/) — frontend
- [Tailwind CSS](https://tailwindcss.com/) — styling
- [Milkdown](https://milkdown.dev/) (Crepe) — WYSIWYG markdown editor
- [Zustand](https://zustand.docs.pmnd.rs/) — state management
- [FastAPI](https://fastapi.tiangolo.com/) — sidecar backend
- [remind](https://github.com/sandst1/remind) — memory consolidation engine