{"id":35066296,"url":"https://github.com/haseebn19/requizle","last_synced_at":"2025-12-27T11:07:16.207Z","repository":{"id":328161676,"uuid":"1101093398","full_name":"haseebn19/requizle","owner":"haseebn19","description":"ReQuizle is a web application designed to help users study efficiently through spaced repetition and active recall","archived":false,"fork":false,"pushed_at":"2025-12-16T04:23:35.000Z","size":2757,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-19T13:52:56.524Z","etag":null,"topics":["quiz","quizapp","study","webapp","website"],"latest_commit_sha":null,"homepage":"https://haseebn19.github.io/requizle/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/haseebn19.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":"2025-11-21T07:21:51.000Z","updated_at":"2025-12-16T04:23:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/haseebn19/requizle","commit_stats":null,"previous_names":["haseebn19/requizle"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/haseebn19/requizle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haseebn19%2Frequizle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haseebn19%2Frequizle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haseebn19%2Frequizle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haseebn19%2Frequizle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haseebn19","download_url":"https://codeload.github.com/haseebn19/requizle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haseebn19%2Frequizle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28077914,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-27T02:00:05.897Z","response_time":58,"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":["quiz","quizapp","study","webapp","website"],"created_at":"2025-12-27T11:04:47.826Z","updated_at":"2025-12-27T11:07:11.829Z","avatar_url":"https://github.com/haseebn19.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ReQuizle\n\n[![CI](https://github.com/haseebn19/requizle/actions/workflows/ci.yml/badge.svg)](https://github.com/haseebn19/requizle/actions/workflows/ci.yml)\n\n\u003cimg src=\"public/icon.svg\" alt=\"ReQuizle Logo\" width=\"250\"\u003e\n\nReQuizle is a modern web application designed to help users study efficiently through spaced repetition and active recall.\n\n## Features\n\n- **Focused Study Experience**: Clean, distraction-free UI with smooth animations.\n- **Mastery Tracking**: Track progress and mastery percentage for each subject and topic.\n- **Spaced Repetition**: Option to include or exclude mastered questions from the study queue.\n- **Multiple Question Types**: Support for various question formats:\n  - Multiple Choice\n  - Multiple Answer\n  - True/False\n  - Keywords\n  - Matching\n  - Word Bank\n- **LaTeX Support**: Render mathematical equations using `\\(...\\)` (inline) and `\\[...\\]` (block) syntax.\n- **Media Support**: Add images or videos to questions via URL, base64, or local file upload.\n- **Data Persistence**: Progress automatically saved to IndexedDB for large datasets.\n- **Custom Content Import**: Import your own subjects and questions via JSON with automatic type detection.\n- **Profile Management**: Create, rename, and manage multiple study profiles.\n- **Dark Mode**: Built-in theme toggle for comfortable studying.\n- **Responsive Design**: Works seamlessly on desktop and mobile devices.\n- **Collapsible Sidebars**: Hide sidebars for a focused study experience.\n- **Installable**: Can be installed as a Progressive Web App (PWA) on desktop and mobile.\n- **Privacy-Focused**: All data is stored locally in your browser - no server required.\n\n## Prerequisites\n\n- Node.js 18.x or higher\n- npm (Node Package Manager)\n- A modern web browser\n\n## Installation\n\n```bash\ngit clone https://github.com/haseebn19/ReQuizle.git\ncd ReQuizle\nnpm install\n```\n\n## Usage\n\n```bash\nnpm run dev\n```\n\n1. **Select a Subject**:\n   - Choose a subject from the left sidebar\n   - Select specific topics or study all\n\n2. **Answer Questions**:\n   - Questions appear one at a time in the center\n   - Submit your answer or skip to come back later\n   - Incorrect questions are automatically re-queued\n\n3. **Track Progress**:\n   - View mastery percentage for each subject and topic\n   - Toggle \"Include Mastered\" to review completed questions\n\n4. **Import Custom Content**:\n   - Use the Import tab in the right sidebar\n   - Upload JSON files with subjects, questions, or full profiles\n   - Import type is automatically detected\n   - Imported data merges with existing content (updates existing, adds new)\n\n## Importing Custom Content\n\nYou can import your own subjects and questions using JSON. Upload a file or paste JSON in the Import tab.\n\n### JSON Format\n\nThe format is designed to be simple and intuitive. IDs are auto-generated if not provided.\n\n```json\n[\n  {\n    \"name\": \"Example Subject\",\n    \"topics\": [\n      {\n        \"name\": \"All Question Types\",\n        \"questions\": [\n          {\n            \"type\": \"multiple_choice\",\n            \"question\": \"What is the capital of France?\",\n            \"choices\": [\"London\", \"Paris\", \"Berlin\", \"Madrid\"],\n            \"answerIndex\": 1,\n            \"explanation\": \"Paris is the capital of France.\"\n          },\n          {\n            \"type\": \"multiple_answer\",\n            \"question\": \"Select all prime numbers:\",\n            \"choices\": [\"2\", \"4\", \"5\", \"9\"],\n            \"answerIndices\": [0, 2],\n            \"explanation\": \"2 and 5 are prime. 4 and 9 are composite.\"\n          },\n          {\n            \"type\": \"true_false\",\n            \"question\": \"The Earth is flat.\",\n            \"answer\": false,\n            \"explanation\": \"The Earth is roughly spherical.\"\n          },\n          {\n            \"type\": \"keywords\",\n            \"question\": \"What gas do plants absorb from the air?\",\n            \"answer\": [\"carbon dioxide\", \"co2\"],\n            \"explanation\": \"Plants absorb CO2 for photosynthesis.\"\n          },\n          {\n            \"type\": \"matching\",\n            \"question\": \"Match the countries to their capitals:\",\n            \"pairs\": [\n              { \"left\": \"Japan\", \"right\": \"Tokyo\" },\n              { \"left\": \"Italy\", \"right\": \"Rome\" },\n              { \"left\": \"Egypt\", \"right\": \"Cairo\" }\n            ]\n          },\n          {\n            \"type\": \"word_bank\",\n            \"question\": \"Complete the sentence:\",\n            \"sentence\": \"The _ is the powerhouse of the _.\",\n            \"wordBank\": [\"mitochondria\", \"cell\", \"nucleus\", \"atom\"],\n            \"answers\": [\"mitochondria\", \"cell\"]\n          }\n        ]\n      }\n    ]\n  }\n]\n```\n\n### Structure Reference\n\n#### Subject (top level)\n| Field | Required | Description |\n|-------|----------|-------------|\n| `name` | ✓ | Display name |\n| `topics` | ✓ | Array of topics |\n| `id` | | Auto-generated if not provided. Provide to enable merging. |\n\n#### Topic (inside subject)\n| Field | Required | Description |\n|-------|----------|-------------|\n| `name` | ✓ | Display name |\n| `questions` | ✓ | Array of questions |\n| `id` | | Auto-generated if not provided. Provide to enable merging. |\n\n#### Question (inside topic)\n| Field | Required | Description |\n|-------|----------|-------------|\n| `type` | ✓ | One of: `multiple_choice`, `multiple_answer`, `true_false`, `keywords`, `matching`, `word_bank` |\n| `question` | ✓ | The question text (or use `prompt`) |\n| `id` | | Auto-generated if not provided. Provide to enable merging. |\n| `explanation` | | Shown after answering |\n| `media` | | Image/video URL or filename (see Media Support) |\n\n**Type-specific fields:**\n\n| Type | Required Fields |\n|------|----------------|\n| `multiple_choice` | `choices` (array), `answerIndex` (number) |\n| `multiple_answer` | `choices` (array), `answerIndices` (number array) |\n| `true_false` | `answer` (boolean) |\n| `keywords` | `answer` (string or string array) |\n| `matching` | `pairs` (array of `{left, right}`) |\n| `word_bank` | `sentence` (with `_` for blanks), `wordBank` (array), `answers` (array) |\n\n### Merging Behavior\n\nBy default, each import creates new content with unique auto-generated IDs. This prevents accidental data loss or mixing of unrelated content.\n\n**To update/merge existing content**, provide explicit matching `id` values:\n\n```json\n// First import - creates new subject with ID \"bio-101\"\n{\"id\": \"bio-101\", \"name\": \"Biology\", \"topics\": [...]}\n\n// Later import - updates the same subject because ID matches\n{\"id\": \"bio-101\", \"name\": \"Biology\", \"topics\": [...]}\n```\n\n**Without explicit IDs**, importing the same file twice creates separate copies:\n```json\n{\"name\": \"Biology\", ...}  // Creates \"Biology\" with ID \"subject-1234-0\"\n{\"name\": \"Biology\", ...}  // Creates another \"Biology\" with ID \"subject-1234-1\"\n```\n\n### Media Support\n\nQuestions can include images or videos that display above the prompt. Three formats are supported:\n\n#### 1. Online URLs (Recommended)\n```json\n{\n  \"prompt\": \"What organ is highlighted in this diagram?\",\n  \"media\": \"https://example.com/anatomy-diagram.png\"\n}\n```\n\nFor videos:\n```json\n{\n  \"prompt\": \"Watch the video and identify the process shown\",\n  \"media\": \"https://example.com/mitosis.mp4\"\n}\n```\n\n#### 2. Base64 Data URIs\n```json\n{\n  \"prompt\": \"Identify this structure\",\n  \"media\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...\"\n}\n```\n\n#### 3. Local Files (with Upload)\nReference files by name - you'll be prompted to upload them during import:\n```json\n{\n  \"prompt\": \"What is the capital marked on this map?\",\n  \"media\": \"europe-map.png\"\n}\n```\n\n**Supported formats:**\n- **Images**: PNG, JPG, GIF, WebP, SVG\n- **Videos**: MP4, WebM, OGG, MOV, AVI, MKV\n\nWhen importing JSON with local media references, a modal will appear listing the required files. Select the files from your computer, and they'll be embedded into the data.\n\n### LaTeX Support\n\nYou can include LaTeX mathematical notation in prompts, choices, explanations, and answers:\n\n- **Inline math**: Use `\\(...\\)` syntax, e.g., `\"The formula \\(E = mc^2\\) describes...\"`\n- **Block math**: Use `\\[...\\]` syntax for centered equations\n\nThese delimiters are used instead of `$...$` to avoid conflicts with literal dollar signs in text (e.g., \"$50\").\n\nExample:\n```json\n{\n  \"prompt\": \"Solve for \\\\(x\\\\) in the equation \\\\(2x + 5 = 15\\\\)\",\n  \"choices\": [\"\\\\(x = 5\\\\)\", \"\\\\(x = 10\\\\)\", \"\\\\(x = 7.5\\\\)\", \"\\\\(x = 2\\\\)\"],\n  \"answerIndex\": 0,\n  \"explanation\": \"Subtract 5 from both sides: \\\\(2x = 10\\\\), then divide by 2: \\\\(x = 5\\\\)\"\n}\n```\n\n## Development\n\n### Setup\n\n```bash\nnpm install\n```\n\n### Testing\n\n```bash\nnpm test\n```\n\nRun tests with coverage report:\n\n```bash\nnpm run test:coverage\n```\n\n### Linting\n\n```bash\nnpm run lint\n```\n\n## Building\n\n```bash\nnpm run build\n```\n\nThe build files will be created in the `dist` directory.\n\n## Project Structure\n\n```\nrequizle/\n├── src/\n│   ├── components/       # React components\n│   │   └── inputs/       # Question type input components\n│   ├── context/          # React context providers\n│   ├── store/            # Zustand state management\n│   ├── test/             # Test setup\n│   ├── utils/            # Utility functions\n│   ├── App.tsx           # Main application component\n│   ├── main.tsx          # Application entry point\n│   ├── types.ts          # TypeScript type definitions\n│   └── index.css         # Global styles\n├── public/               # Static assets\n├── .github/workflows/    # CI/CD configuration\n└── dist/                 # Production build output\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## Credits\n\n- [React](https://react.dev/) - UI framework\n- [Zustand](https://github.com/pmndrs/zustand) - State management\n- [Framer Motion](https://www.framer.com/motion/) - Animations\n- [TailwindCSS](https://tailwindcss.com/) - Styling\n- [Lucide](https://lucide.dev/) - Icons\n\n## License\n\nThis project is licensed under the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.en.html).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaseebn19%2Frequizle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaseebn19%2Frequizle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaseebn19%2Frequizle/lists"}