## What changed - unifies the assistant prompt, thread workspace, inbox, and quick-note editor AI surfaces - adds generated-card draft review with per-thread and inbox-wide approval actions - keeps reviewed conversations in place and preserves remaining pending drafts - fits the quick-note editor popout to the taller of the editor and AI panel - adds a protected BRAT beta release channel using `X.Y.Z-beta.N` tags from `pre-release` ## Why The assistant flow needed a consistent thread-based UI, reliable draft review behavior, and a safe opt-in distribution channel before a stable rollout. ## Impact Users can review and approve AI-generated cards without losing their place, use the assistant directly alongside the quick-note editor, and opt into beta builds through BRAT without exposing prereleases through normal Obsidian updates. ## Validation - `bun run test` — 2397 tests passed - `bun run build` — TypeScript and production bundle passed - Biome checks passed for changed release and assistant files - beta release helper dry-run verified automatic `beta.N` incrementing |
||
|---|---|---|
| .github | ||
| .opencode | ||
| assets | ||
| cli | ||
| mcp-server | ||
| packages | ||
| scripts | ||
| .build-tmp-test.js | ||
| .claudeignore | ||
| .editorconfig | ||
| .gitignore | ||
| .hotreload | ||
| .stint.json | ||
| AGENTS.md | ||
| AI_SYSTEM_ROADMAP.md | ||
| biome.json | ||
| bun.lock | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| esbuild.config.mjs | ||
| eslint.config.mjs | ||
| knip.ts | ||
| LICENSE | ||
| manifest.json | ||
| meta.json | ||
| opencode.json | ||
| package.json | ||
| README.md | ||
| sql-wasm.wasm | ||
| sqlite3.wasm | ||
| styles.css | ||
| tsconfig.base.json | ||
| tsconfig.json | ||
| version-bump.mjs | ||
| versions.json | ||
| vitest.config.ts | ||
| vitest.workspace.ts | ||
True Recall
The next-gen spaced repetition system for Obsidian.
Create flashcards inside your notes, review them with FSRS v6 scheduling, and track progress with comprehensive analytics — all without leaving Obsidian.
Documentation · Pricing · Sponsor on GitHub
Features
- FSRS v6 Algorithm — State-of-the-art spaced repetition with 21 trainable parameters. Optimizes to your personal memory patterns after 400+ reviews.
- AI Card Generation — Select text, get instant flashcards. Supports Basic, Cloze, Reversed, and Image Occlusion card types. Multiple models via OpenRouter (Gemini, GPT, Claude, Llama).
- Local-First Storage — All data in a portable SQLite database inside your vault (
.true-recall/true-recall.db). Your data stays with you. - Projects System — Organize cards across notes with many-to-many relationships. Review by topic, inherit FSRS presets from parent projects.
- Anki Compatible — Import
.apkgdecks and export to Anki or CSV/TSV. - Analytics & Widgets — Dashboard, statistics, calendar heatmap, forecast charts, and 25+ inline codeblock widgets you can embed in any note.
- Card Browser — Powerful query syntax for finding cards by state, properties, source note, and more.
- Type-in Mode — Type answers with AI semantic grading or diff-based checking.
Installation
Via BRAT (Recommended)
- Install BRAT from Obsidian Community Plugins
- Settings → BRAT → Add Beta Plugin → enter
pieralukasz/true-recall - Enable True Recall in Settings → Community plugins
Manual
- Download the latest release from GitHub Releases
- Copy
main.js,styles.css, andmanifest.jsoninto<your-vault>/.obsidian/plugins/true-recall/ - Enable the plugin in Settings → Community plugins
From Source
git clone https://github.com/pieralukasz/true-recall.git
cd true-recall
bun install
bun run build
cp main.js styles.css manifest.json <your-vault>/.obsidian/plugins/true-recall/
Requirements
- Obsidian 1.7.2+
- Desktop (Windows, macOS, Linux). True Recall is marked desktop-only in
manifest.json.
Quick Start
- Open a note and select some text
- Use the selection toolbar to generate flashcards with AI
- Open the Flashcard Panel to see and collect your cards
- Start a review session — rate cards as Again, Hard, Good, or Easy
- Track progress in the Statistics view or embed widgets in your notes
For a complete walkthrough, see the documentation.
Privacy & Background Activity
True Recall is local-first. It does not send telemetry or analytics. Network access is limited to the explicit feature paths below.
Periodic timers (setInterval) — all local, no network:
- Database safety-flush — writes pending changes to the local SQLite file in your vault.
- Optional background backup — writes a backup file inside your vault when enabled in settings.
- Device-lock heartbeat — updates a small lock file inside your vault to prevent two Obsidian Sync clients from corrupting the database when both are open. Local file write only.
- UI status polling — reads in-memory state to refresh diagnostics/backup panels.
Network requests — only on explicit user action or one-time per release:
- Update check — when the plugin version differs from the last seen version, a single
requestUrlcall is made to the GitHub Releases API to fetch release notes. Runs once per version, not on a timer. - AI / RAG features (opt-in) — flashcard generation, semantic grading, image-occlusion detection, and knowledge-base chat require a configured AI provider. Depending on settings, requests can go to OpenRouter,
ai.truerecall.appfor True Recall Pro, a local LM Studio/Ollama endpoint, or a custom OpenAI-compatible endpoint you enter. - Local API server (desktop, opt-in) — binds to
127.0.0.1only, used by the optional companion CLI and MCP server. It is disabled by default and does not expose a public network listener. - External links — documentation, pricing, sponsorship, Discord, and Anki shared-deck links are opened only when you click UI links.
Storage: All flashcards and review data live in .true-recall/true-recall.db inside your vault. Backups and lock files live in the same .true-recall/ folder. Device identity and optional device labels use localStorage so multiple synced devices can avoid database conflicts.
Vault and clipboard access:
- Vault reads/writes are core to the plugin: True Recall reads selected/current notes, creates or updates notes for projects/imports, and stores its SQLite database and backups inside the vault.
- Vault enumeration is used for note pickers, project discovery, media lookup, export/import, and optional RAG indexing.
- Clipboard writes happen only from explicit copy actions. Clipboard paste/drop handlers are used only in image/media workflows initiated by the user.
Bundled runtime components:
- The plugin embeds
@sqlite.org/sqlite-wasmso SQLite works locally in Obsidian. This is the expected.wasmmodule in the bundle. - Base64 encoding is used to pass selected vault images to configured AI vision providers for image-occlusion region detection. It is not used to hide network destinations or source strings.
License
Source-available under the PolyForm Strict License 1.0.0
(SPDX: PolyForm-Strict-1.0.0).
Permitted: noncommercial use, including personal study, research, hobby projects, and use by charitable / educational / public-research / government organizations. Fair-use rights are preserved.
Not permitted under this license: redistribution, modification and derivative works, commercial use, hosting as a service, or building a competing product.
Commercial licensing. A separate commercial license is required for any
use beyond what PolyForm Strict allows — including production deployments
inside a business, paid services built on True Recall, or distributing
derivative works. Contact pieralukasz@gmail.com to discuss terms.



