{"id":50411562,"url":"https://github.com/garuda8887/recall","last_synced_at":"2026-05-31T04:01:09.830Z","repository":{"id":360452217,"uuid":"1250209846","full_name":"Garuda8887/recall","owner":"Garuda8887","description":"Self-hosted spaced repetition calendar — SM-2 scheduling, forgetting curves, knowledge graph \u0026 dark mode. Privacy-first Anki alternative for visual learners.","archived":false,"fork":false,"pushed_at":"2026-05-26T12:48:44.000Z","size":3095,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-26T14:22:15.687Z","etag":null,"topics":["anki-alternative","calendar","dark-mode","education","forgetting-curve","javascript","knowledge-graph","nodejs","productivity","pwa","self-hosted","sm2","spaced-repetition","sqlite","study-planner"],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Garuda8887.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-26T12:09:50.000Z","updated_at":"2026-05-26T12:48:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Garuda8887/recall","commit_stats":null,"previous_names":["garuda8887/recall"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Garuda8887/recall","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Garuda8887%2Frecall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Garuda8887%2Frecall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Garuda8887%2Frecall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Garuda8887%2Frecall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Garuda8887","download_url":"https://codeload.github.com/Garuda8887/recall/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Garuda8887%2Frecall/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33718446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anki-alternative","calendar","dark-mode","education","forgetting-curve","javascript","knowledge-graph","nodejs","productivity","pwa","self-hosted","sm2","spaced-repetition","sqlite","study-planner"],"created_at":"2026-05-31T04:01:09.089Z","updated_at":"2026-05-31T04:01:09.823Z","avatar_url":"https://github.com/Garuda8887.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Recall — Spaced Repetition Calendar\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/)\n[![Frontend](https://img.shields.io/badge/frontend-zero%20dependencies-orange.svg)]()\n[![Database](https://img.shields.io/badge/database-SQLite-lightgrey.svg)]()\n\n\u003e Anki's algorithm. A calendar you actually want to open.\n\nAnki is effective but its interface is stuck in 2004. Recall gives you the same scientifically-proven SM-2 spaced repetition wrapped in a month-view calendar that makes your entire study schedule visible at a glance. Self-hosted, no sync fees, no card decks — log what you studied and show up when it tells you to.\n\nIf Recall is useful to you, consider giving it a ⭐ — it helps others find it.\n\n![Calendar main view](screenshots/recall.gif)\n\n---\n\n## Features\n\n| Feature | Description |\n|---|---|\n| **SM-2 Spaced Repetition** | Reviews are scheduled at scientifically-optimal intervals (default: +1, +3, +7, +14, +30 days). Confidence ratings adapt future intervals via ease-factor. |\n| **Calendar View** | Month-view calendar with colour-coded chips: studied sessions, review 1–5, overdue indicators. |\n| **Confidence Ratings** | Mark reviews with Blank / Hard / Okay / Good / Perfect — the SM-2 algorithm reschedules the next review accordingly. |\n| **Forgetting Curve** | Per-session exponential decay chart showing memory retention over time with study and upcoming review markers. |\n| **Recurring Sessions** | Schedule a topic to auto-recur weekly or at a fixed interval — catch-up instances are created automatically on login. |\n| **Drag-and-Drop Reschedule** | Drag undone review chips to any other calendar day to reschedule them. |\n| **Subject Filter** | Filter the calendar by subject (Biology, Languages, Maths…) with one click. |\n| **Tags** | Add free-form tags to sessions; filter the calendar by tag from the tag bar. |\n| **Full-Text Search** | Instant search across topic, notes, subject and tags with match count. |\n| **Second Brain Links** | Connect sessions with typed relations — *Builds on*, *Prerequisite of*, *Related to*, *See also* — displayed inline in the day modal. |\n| **Knowledge Graph** | Obsidian-style force-directed graph of all linked sessions with pan, zoom, draggable nodes, and per-subject dimming. |\n| **Stats \u0026 Heatmap** | Activity heatmap (last 13 weeks), per-subject retention bars with overdue count, and per-topic retention list. |\n| **Dark Mode** | Toggle dark mode — the calendar, modals, and knowledge graph all adapt. |\n| **Custom Intervals** | Set your own review intervals (e.g. 1 / 7 / 21 / 60 / 120 days). Changes apply to new sessions going forward. |\n| **JWT Auth** | Full registration and login; all data is isolated per user. |\n| **PWA** | Installable as a native-feeling app on iOS and Android — works offline, home screen icon, no app store required. |\n\n---\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/03-calendar-populated.png\"/\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003ePopulated calendar\u003c/b\u003e — studied chips in subject colour, review chips in red → blue gradient.\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/07-confidence-rating.png\"/\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eConfidence rating\u003c/b\u003e — rate recall after each review; SM-2 reschedules the next date.\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/08-forgetting-curve.png\"/\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eForgetting curve\u003c/b\u003e — per-session exponential decay chart with past and upcoming review markers.\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/11-knowledge-graph.png\"/\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eKnowledge graph\u003c/b\u003e — Obsidian-style force-directed graph of all linked sessions.\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/12-dark-mode-graph.png\"/\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eDark mode\u003c/b\u003e — full dark palette across the calendar, modals, and graph.\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/09-stats-modal.png\"/\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eStats \u0026 heatmap\u003c/b\u003e — 13-week activity heatmap and per-subject retention bars.\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMore screenshots\u003c/summary\u003e\n\n### Add Study Session\n![Add session modal](screenshots/02-add-session-modal.png)\n*Log a new topic with subject, notes, tags, and an optional weekly or interval-based recurrence rule.*\n\n### Full-text search\n![Search](screenshots/04-search-mechanics.png)\n*Live search filters the calendar to matching sessions. Matches topics, notes, subject, and tags simultaneously.*\n\n### Subject filter\n![Subject filter](screenshots/05-subject-filter.png)\n*One-click subject pill hides all other subjects. Physics selected here — only Newton's Laws and Projectile Motion shown.*\n\n### Day modal — session details, tags \u0026 links\n![Day modal](screenshots/06-day-modal.png)\n*Click any day to see all sessions and reviews. Shows tags, second-brain links, forgetting-curve button, and edit/delete controls.*\n\n### Second brain — link sessions\n![Link sessions](screenshots/10-link-sessions.png)\n*Link any two sessions with a typed relationship. Choose the relation type and target session — click Save Link to persist.*\n\n### Knowledge graph — subject focus\n![Graph subject filter](screenshots/11b-graph-subject-filter.png)\n*Click a subject pill in the graph toolbar to dim non-matching nodes — isolates a discipline's knowledge cluster at a glance.*\n\n### Drag-and-drop reschedule\n![Drag and drop](screenshots/13-drag-reschedule.png)\n*Drag any undone review chip to a new calendar day to reschedule it. The server persists the new date immediately.*\n\n### Settings — custom intervals\n![Settings](screenshots/14-settings-intervals.png)\n*Override the default SM-2 intervals with any values you prefer. Preview dates update live as you type.*\n\n\u003c/details\u003e\n\n---\n\n## Getting Started\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) 18 or later\n- npm\n\n### Install \u0026 run\n\n```bash\ngit clone https://github.com/Garuda8887/recall.git\ncd recall\nnpm install\nnode server.js\n```\n\nOpen **http://localhost:3000** in your browser, register an account, and start logging sessions.\n\n### Environment variables\n\n| Variable | Default | Description |\n|---|---|---|\n| `PORT` | `3000` | HTTP port |\n| `JWT_SECRET` | `recall-dev-secret-please-change-in-production` | **Change this in production** |\n\n```bash\nJWT_SECRET=my-super-secret-key PORT=8080 node server.js\n```\n\n### Install as an app (PWA)\n\nRecall is a fully installable Progressive Web App — no app store required.\n\n| Platform | How to install |\n|---|---|\n| **iOS / iPadOS** | Open in Safari → Share → **Add to Home Screen** |\n| **Android** | Open in Chrome → three-dot menu → **Add to Home Screen** (or accept the install prompt) |\n| **Desktop (Chrome / Edge)** | Click the install icon in the address bar |\n\nOnce installed it launches fullscreen with its own icon, just like a native app. It also works offline — the app shell is cached locally so the UI loads instantly even without a connection (data syncs when you're back online).\n\n**Updating:** just `git pull` on your server. The service worker detects the new version and refreshes automatically on next open — no reinstall needed.\n\n---\n\n## How it works\n\n### SM-2 algorithm\n\nAfter each review you rate your recall from 1 (blank) to 5 (perfect). SM-2 uses that score to grow or shrink the next interval — ace it repeatedly and reviews get pushed further out; struggle and it resets to the next day. The default schedule after a new session is **+1 · +3 · +7 · +14 · +30 days**, fully customisable in Settings.\n\n### Recurring sessions\n\nSet a session to recur *every Tuesday* or *every N days*. Any missed instances since the last login are auto-created (capped at 14 catch-ups per series).\n\n---\n\n## Tech stack\n\n| Layer | Technology |\n|---|---|\n| Server | Node.js + Express |\n| Database | SQLite via `better-sqlite3` (zero-config, single file) |\n| Auth | JWT (`jsonwebtoken`) + bcrypt |\n| Frontend | Vanilla HTML/CSS/JS — single-file SPA (`public/index.html`) |\n| Graph | Custom force-directed simulation (Coulomb repulsion + Hooke springs + gravity) rendered in SVG |\n\n---\n\n## API reference\n\nAll session routes require `Authorization: Bearer \u003ctoken\u003e`.\n\n| Method | Path | Description |\n|---|---|---|\n| `POST` | `/api/auth/register` | Register `{ email, password }` |\n| `POST` | `/api/auth/login` | Login → returns JWT |\n| `GET` | `/api/auth/me` | Verify token |\n| `GET` | `/api/sessions` | List all sessions (auto-creates due recurrences) |\n| `POST` | `/api/sessions` | Create a session |\n| `PUT` | `/api/sessions/:id` | Update topic / subject / notes / tags |\n| `DELETE` | `/api/sessions/:id` | Delete session and its links |\n| `PATCH` | `/api/sessions/:id/reviews/:index` | Mark done (with confidence + SM-2), undo, or reschedule (`newDate`) |\n| `GET` | `/api/links` | List knowledge-graph links |\n| `POST` | `/api/links` | Create a link `{ fromId, toId, relation }` |\n| `DELETE` | `/api/links/:id` | Remove a link |\n| `GET` | `/api/settings` | Get custom intervals |\n| `PUT` | `/api/settings` | Save custom intervals |\n\n---\n\n## License\n\nMIT © [Garuda8887](https://github.com/Garuda8887)\n\nFree to use, copy, modify and distribute. The copyright notice above must be included in all copies or substantial portions of the software — if you build on this, you must credit the original author.\n\n---\n\n*Built with ❤️ as a self-hosted alternative to Anki, optimised for visual learners who think in calendars.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaruda8887%2Frecall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaruda8887%2Frecall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaruda8887%2Frecall/lists"}