{"id":47026055,"url":"https://github.com/the-mrinal/revise","last_synced_at":"2026-03-13T00:01:05.850Z","repository":{"id":342758206,"uuid":"1174297815","full_name":"the-mrinal/revise","owner":"the-mrinal","description":"Track coding practice with spaced repetition. Browser extension + FastAPI server for LeetCode, CodeChef, HackerRank \u0026 more.","archived":false,"fork":false,"pushed_at":"2026-03-11T12:59:03.000Z","size":1428,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-12T02:18:05.540Z","etag":null,"topics":["browser-extension","coding-practice","leetcode","spaced-repetition"],"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/the-mrinal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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-03-06T09:31:13.000Z","updated_at":"2026-03-11T15:59:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/the-mrinal/revise","commit_stats":null,"previous_names":["the-mrinal/code-revision-tracker","the-mrinal/revise"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/the-mrinal/revise","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-mrinal%2Frevise","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-mrinal%2Frevise/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-mrinal%2Frevise/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-mrinal%2Frevise/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/the-mrinal","download_url":"https://codeload.github.com/the-mrinal/revise/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/the-mrinal%2Frevise/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30450872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T21:31:01.033Z","status":"ssl_error","status_checked_at":"2026-03-12T21:30:43.161Z","response_time":114,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["browser-extension","coding-practice","leetcode","spaced-repetition"],"created_at":"2026-03-11T23:11:51.961Z","updated_at":"2026-03-13T00:01:05.832Z","avatar_url":"https://github.com/the-mrinal.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Revise\n\n**Never forget what you learn.**\n\nTrack everything you study — coding problems, math exercises, design tutorials, language lessons, and more. The SM-2 algorithm tells you exactly when to revise, so knowledge sticks for good.\n\n[![Live Demo](https://img.shields.io/badge/Live-revise.mrinal.dev-6366f1?style=for-the-badge\u0026logo=vercel\u0026logoColor=white)](https://revise.mrinal.dev)\n[![License](https://img.shields.io/badge/License-MIT-22c55e?style=for-the-badge)](LICENSE)\n[![Python](https://img.shields.io/badge/Python-FastAPI-3b82f6?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://fastapi.tiangolo.com)\n[![Supabase](https://img.shields.io/badge/Supabase-Postgres-3ecf8e?style=for-the-badge\u0026logo=supabase\u0026logoColor=white)](https://supabase.com)\n\n\u003cbr /\u003e\n\n![Landing Page](docs/images/landing-hero.png)\n\n\u003c/div\u003e\n\n## What It Does\n\nYou learn something. You forget it in a week. This fixes that.\n\nRevise is a browser extension + web dashboard that:\n- **Auto-detects** the platform you're using (LeetCode, Codeforces, HackerRank, Khan Academy, etc.)\n- **Lets you add custom platforms** — track any website you learn from\n- **Times your study** with a built-in timer — no manual entry\n- **Schedules revisions** using the SM-2 spaced repetition algorithm (same algorithm behind Anki and SuperMemo)\n- **Shows a dashboard** with stats, charts, activity feed, and a filterable table of everything you've tracked\n\nNo passwords. Sign in with a magic link. Your data is yours.\n\n## Screenshots\n\n### Landing Page\n\n![Supported Platforms](docs/images/landing-platforms.png)\n\n\u003e 10+ platforms supported out of the box, plus add your own.\n\n### Dashboard\n\n![Dashboard](docs/images/dashboard.png)\n\n\u003e Full analytics: items tracked, difficulty breakdown, platform distribution, revision schedule, and daily activity — all in one view.\n\n### Magic Link Login\n\n![Login](docs/images/login.png)\n\n\u003e No passwords to remember. Enter your email, click the link, you're in.\n\n### Browser Extension\n\n\u003cp\u003e\n  \u003cimg src=\"docs/images/extension-auto-detect.png\" width=\"280\" alt=\"Extension - Auto Detect\" /\u003e\n  \u003cimg src=\"docs/images/extension-capture.png\" width=\"280\" alt=\"Extension - Capture Problem\" /\u003e\n\u003c/p\u003e\n\n\u003e The extension auto-detects the URL and title. Navigate to any supported platform and it picks it up instantly.\n\n\u003cp\u003e\n  \u003cimg src=\"docs/images/extension-timer.png\" width=\"280\" alt=\"Extension - Timer Running\" /\u003e\n  \u003cimg src=\"docs/images/extension-save.png\" width=\"280\" alt=\"Extension - Save Question\" /\u003e\n\u003c/p\u003e\n\n\u003e Start a timer when you begin studying. When you're done, rate your recall (1-5 stars), add notes, and save. The SM-2 algorithm handles the rest.\n\n## How It Works\n\n```\nBrowser Extension (Chrome / Safari)\n        |\n        |  REST API\n        v\n   FastAPI Server  --\u003e  Supabase (Postgres + Auth)\n        |\n        v\n   Web Dashboard (revise.mrinal.dev/dashboard)\n```\n\n1. **Study something** on any supported platform (or add your own)\n2. **Click the extension** — it auto-detects the URL and title\n3. **Start the timer**, study, stop when done\n4. **Rate your recall** (1-5 stars) and save\n5. **SM-2 schedules your next review** — things you found hard come back sooner, easy ones later\n6. **Check the dashboard** for what's due today, your stats, and your full history\n\n## Supported Platforms\n\n| Platform | Auto-detected |\n|----------|:---:|\n| LeetCode | Yes |\n| Codeforces | Yes |\n| HackerRank | Yes |\n| CodeChef | Yes |\n| GeeksForGeeks | Yes |\n| InterviewBit | Yes |\n| AtCoder | Yes |\n| NeetCode | Yes |\n| AlgoMonster | Yes |\n| DesignGurus.io | Yes |\n| **Custom Platforms** | **User-defined** |\n\nAny other URL works too — it's tagged as \"other\". You can add custom platforms from the dashboard settings to auto-detect any website.\n\n## Features\n\n- **SM-2 Spaced Repetition** — the same algorithm behind Anki and SuperMemo. Rate your recall 1-5 stars, and the system schedules your next review at the optimal time.\n- **Built-in Timer** — start when you begin studying, pause/resume, stop when done. Time is recorded automatically.\n- **Custom Platforms** — add any website from the dashboard settings. Define a name and URL pattern, and it auto-detects just like the built-in platforms.\n- **Analytics Dashboard** — items tracked, difficulty breakdown, platform distribution, revision schedule, daily activity feed.\n- **Magic Link Auth** — no passwords. Enter your email, click the link in your inbox, done. Powered by Supabase Auth.\n- **10+ Platforms** — auto-detects LeetCode, Codeforces, HackerRank, CodeChef, GeeksForGeeks, InterviewBit, AtCoder, NeetCode, AlgoMonster, DesignGurus.\n- **Browser Extension** — Chrome and Safari. Captures the current URL with one click.\n- **Due for Revision** — the extension and dashboard both show which items are due today, so you always know what to revise.\n- **CSV Export** — download your entire history as a CSV.\n- **Per-user Data Isolation** — Row Level Security on Supabase. Each user only sees their own data.\n\n## Getting Started\n\n### Use the hosted version (easiest)\n\n1. Go to [revise.mrinal.dev](https://revise.mrinal.dev)\n2. Click **Get Started Free**\n3. Enter your email and click **Send Magic Link**\n4. Check your inbox, click the link — you're logged in\n5. Install the browser extension (see below)\n6. Start learning!\n\n### Install the Chrome Extension\n\n1. Download [`extension.zip`](https://github.com/the-mrinal/code-revision-tracker/raw/main/extension.zip)\n2. Unzip the downloaded file\n3. Open `chrome://extensions` in Chrome\n4. Enable **Developer mode** (top right toggle)\n5. Click **Load unpacked** and select the unzipped folder\n6. Pin the extension from the puzzle icon in the toolbar\n\n**Safari:** Available on request. It requires a macOS/iOS native app wrapper built with Xcode. Reach out at dmrinal626@gmail.com and I'll send you the build.\n\n### Self-host (for developers)\n\n#### 1. Supabase Setup\n\nCreate a [Supabase](https://supabase.com) project and run this in the SQL Editor:\n\n```sql\ncreate table public.questions (\n  id bigint generated always as identity primary key,\n  user_id uuid not null references auth.users(id) on delete cascade,\n  url text not null,\n  title text,\n  platform text,\n  difficulty text,\n  self_rating integer check (self_rating between 1 and 5),\n  time_taken integer,\n  notes text,\n  solved_at timestamptz default now(),\n  easiness_factor double precision default 2.5,\n  interval integer default 1,\n  repetitions integer default 0,\n  next_review date,\n  last_reviewed timestamptz,\n  attempts integer default 1\n);\n\nalter table public.questions enable row level security;\n\ncreate policy \"Users see own questions\" on public.questions for select using (auth.uid() = user_id);\ncreate policy \"Users insert own questions\" on public.questions for insert with check (auth.uid() = user_id);\ncreate policy \"Users update own questions\" on public.questions for update using (auth.uid() = user_id);\ncreate policy \"Users delete own questions\" on public.questions for delete using (auth.uid() = user_id);\n\ncreate index idx_questions_user_url on public.questions(user_id, url);\ncreate index idx_questions_next_review on public.questions(user_id, next_review);\n\n-- Custom platforms (for user-defined URL patterns)\ncreate table public.user_platforms (\n  id bigint generated always as identity primary key,\n  user_id uuid not null references auth.users(id) on delete cascade,\n  name text not null,\n  url_pattern text not null,\n  created_at timestamptz default now()\n);\n\nalter table public.user_platforms enable row level security;\n\ncreate policy \"Users see own platforms\" on public.user_platforms for select using (auth.uid() = user_id);\ncreate policy \"Users insert own platforms\" on public.user_platforms for insert with check (auth.uid() = user_id);\ncreate policy \"Users update own platforms\" on public.user_platforms for update using (auth.uid() = user_id);\ncreate policy \"Users delete own platforms\" on public.user_platforms for delete using (auth.uid() = user_id);\n\ncreate unique index idx_user_platforms_unique on public.user_platforms(user_id, name);\n```\n\nConfigure Auth redirect URLs in Supabase Dashboard:\n- **Site URL**: `https://your-domain.com/dashboard`\n- **Redirect URL**: `https://your-domain.com/api/auth/callback`\n\n#### 2. Environment Variables\n\nCreate a `.env` file:\n\n```env\nSUPABASE_URL=https://xxx.supabase.co\nSUPABASE_ANON_KEY=eyJ...\nSUPABASE_SERVICE_ROLE_KEY=eyJ...\nSUPABASE_JWT_SECRET=your-jwt-secret\nSERVER_URL=https://your-domain.com\n```\n\n#### 3. Run\n\n```bash\ndocker compose up -d\n```\n\nThe server starts at `http://localhost:8765`. The landing page is at `/` and the dashboard at `/dashboard`.\n\n#### 4. Point the extension at your server\n\nUpdate the `SERVER_URL` in the extension's config to point to your self-hosted instance.\n\n## API Endpoints\n\nAll endpoints except auth require an `Authorization: Bearer \u003ctoken\u003e` header.\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/api/auth/magic-link` | Send magic link email |\n| `GET` | `/api/auth/callback` | Handle auth callback (PKCE + implicit flow) |\n| `POST` | `/api/auth/refresh` | Refresh access token |\n| `POST` | `/api/questions` | Save a new item |\n| `GET` | `/api/questions` | List all items |\n| `PUT` | `/api/questions/{id}` | Edit an item |\n| `DELETE` | `/api/questions/{id}` | Delete an item |\n| `POST` | `/api/questions/{id}/review` | Submit a review rating (triggers SM-2) |\n| `GET` | `/api/revisions/today` | Get items due for revision today |\n| `GET` | `/api/activity/today` | Today's new + revised items |\n| `GET` | `/api/stats` | Summary statistics |\n| `GET` | `/api/platforms` | List built-in + custom platforms |\n| `POST` | `/api/platforms` | Add a custom platform |\n| `DELETE` | `/api/platforms/{id}` | Delete a custom platform |\n\n## SM-2 Algorithm\n\nThe revision schedule uses the [SM-2 algorithm](https://en.wikipedia.org/wiki/SuperMemo#Description_of_SM-2_algorithm):\n\n| Rating | Meaning | What happens |\n|--------|---------|--------------|\n| 1-2 | Forgot / struggled | Interval resets — review again soon |\n| 3 | Hard recall | Short interval |\n| 4 | Good recall | Moderate interval |\n| 5 | Easy recall | Long interval |\n\nThe easiness factor adjusts over time. Things you consistently nail appear less frequently. Things you struggle with keep coming back until they stick.\n\n## Tech Stack\n\n- **Backend**: Python, FastAPI\n- **Database**: Supabase (Postgres + Row Level Security)\n- **Auth**: Supabase Auth (magic link / passwordless)\n- **Frontend**: Vanilla HTML/CSS/JS (no frameworks)\n- **Extension**: Manifest V3 (Chrome \u0026 Safari)\n- **Deployment**: Docker Compose\n\n## Contributing\n\nContributions welcome! Open an issue or submit a PR.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-mrinal%2Frevise","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthe-mrinal%2Frevise","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthe-mrinal%2Frevise/lists"}