{"id":44975746,"url":"https://github.com/boltzmannentropy/mayari","last_synced_at":"2026-02-20T21:09:06.175Z","repository":{"id":336607489,"uuid":"1150372174","full_name":"BoltzmannEntropy/Mayari","owner":"BoltzmannEntropy","description":"Mayari - Read and listen to your PDF books. A moonlit companion for academic research with quote extraction and TTS.","archived":false,"fork":false,"pushed_at":"2026-02-14T20:44:48.000Z","size":972,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-15T04:34:24.145Z","etag":null,"topics":["read-aloud","tts"],"latest_commit_sha":null,"homepage":"https://boltzmannentropy.github.io/mayari-web/","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BoltzmannEntropy.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-02-05T07:44:03.000Z","updated_at":"2026-02-14T20:44:52.000Z","dependencies_parsed_at":"2026-02-18T17:00:48.271Z","dependency_job_id":null,"html_url":"https://github.com/BoltzmannEntropy/Mayari","commit_stats":null,"previous_names":["boltzmannentropy/mayari"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/BoltzmannEntropy/Mayari","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoltzmannEntropy%2FMayari","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoltzmannEntropy%2FMayari/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoltzmannEntropy%2FMayari/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoltzmannEntropy%2FMayari/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BoltzmannEntropy","download_url":"https://codeload.github.com/BoltzmannEntropy/Mayari/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BoltzmannEntropy%2FMayari/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29587066,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T16:55:40.614Z","status":"ssl_error","status_checked_at":"2026-02-18T16:55:37.558Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["read-aloud","tts"],"created_at":"2026-02-18T17:00:33.682Z","updated_at":"2026-02-18T17:01:15.421Z","avatar_url":"https://github.com/BoltzmannEntropy.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr\u003e\u003cbr\u003e\n  \u003ch1\u003e🌙 Mayari\u003c/h1\u003e\n  \u003cp\u003e\u003ci\u003eA moonlit companion for academic research\u003c/i\u003e\u003c/p\u003e\n  \u003cbr\u003e\n  \u003ccode\u003emacOS Only\u003c/code\u003e\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;Flutter Desktop\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;Kokoro TTS\n  \u003cbr\u003e\u003cbr\u003e\n  \u003ch2\u003eRead and listen to your PDF books\u003c/h2\u003e\n  \u003cp\u003eExtract quotes in seconds with automatic citation tracking. Listen with high-quality British TTS.\u003cbr\u003eNamed after the Philippine goddess of the moon.\u003c/p\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://boltzmannentropy.github.io/mayari-web/\"\u003e\u003cstrong\u003eWebsite\u003c/strong\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;·\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"https://github.com/BoltzmannEntropy/Mayari\"\u003e\u003cstrong\u003eView on GitHub\u003c/strong\u003e\u003c/a\u003e\n  \u003cbr\u003e\u003cbr\u003e\n\u003c/div\u003e\n\n\u003e **Read \u0026 Listen** | **Quote Extraction** | **Automatic Citations** | **Markdown Export**\n\nA macOS desktop application for **academic researchers**: **read your PDF books** in a clean two-pane interface, **listen with high-quality British TTS** while you work, **extract quotes** with a single keystroke (Cmd+D), and **export to Markdown** with properly formatted citations.\n\n---\n\n## Features at a Glance\n\n| Feature | Description |\n|---------|-------------|\n| **Quote Extraction** | Select text → Press Cmd+D → Quote captured with page number |\n| **Highlight Mode** | Toggle on to auto-capture every text selection |\n| **Citation Tracking** | Enter metadata once, every quote gets proper APA citation |\n| **Text-to-Speech** | Listen to PDFs with 8 British Kokoro voices |\n| **Markdown Export** | One-click export with formatted citations |\n| **PDF Library** | Browse and organize your research PDFs |\n| **Two-Pane Layout** | PDF viewer left, quotes panel right |\n\n---\n\n## Screenshot\n\n![Mayari Screenshot](assets/mayari-screenshot.png)\n\n### Two-Pane Research Workspace\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│  📚 Library  │        PDF Viewer         │    Quote Library     │\n│              │                           │                      │\n│  📄 Book1.pdf│  ┌───────────────────┐   │  ▼ Apology (Plato)   │\n│  📄 Book2.pdf│  │                   │   │    \"The only true... │\n│  📄 Book3.pdf│  │   Page Content    │   │    \"An unexamined... │\n│              │  │                   │   │                      │\n│              │  │                   │   │  ▼ Republic (Plato)  │\n│              │  └───────────────────┘   │    \"The measure of...|\n│              │                           │                      │\n│              │  ◀  Page 42 / 200  ▶     │  [Export Markdown]   │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n### UI Design\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│  Mayari - \"Book Title\"                                          │\n├────────────────────────────────────┬────────────────────────────┤\n│  [Zoom -][Zoom +] │ [◀][▶] │ [Highlight Mode]  │    Quotes [+]  │\n├────────────────────────────────────┼────────────────────────────┤\n│                                    │ ▼ \"Book Title\" - Author    │\n│                                    │   ┌────────────────────┐   │\n│                                    │   │ \"Quote text...\"    │   │\n│         PDF VIEWER                 │   │ p. 42  [Edit][Del] │   │\n│                                    │   └────────────────────┘   │\n│         (60% width)                │   ┌────────────────────┐   │\n│                                    │   │ \"Another quote...\" │   │\n│                                    │   │ p. 78  [Edit][Del] │   │\n│                                    │   └────────────────────┘   │\n│                                    │                            │\n│                                    │ ▶ \"Another Book\" - Author  │\n├────────────────────────────────────┼────────────────────────────┤\n│         Page 42 of 256             │ 5 quotes from 2 sources    │\n│                                    │              [Copy][Export]│\n└────────────────────────────────────┴────────────────────────────┘\n```\n\n---\n\n## Installation\n\n### System Requirements\n\n| Component | Requirement |\n|-----------|-------------|\n| **OS** | macOS 12+ (Monterey or later) |\n| **CPU** | Apple Silicon (M1/M2/M3/M4) or Intel |\n| **RAM** | 8GB minimum |\n| **Storage** | 500MB for app, 350MB for TTS models |\n| **Flutter** | 3.x with macOS desktop support |\n| **Python** | 3.10+ (for TTS backend) |\n\n### Quick Install\n\n```bash\ngit clone https://github.com/BoltzmannEntropy/Mayari.git\ncd Mayari\n\n# Install Flutter dependencies\nflutter pub get\n\n# Setup TTS backend (optional, ~350MB download)\n./scripts/bundle_kokoro.sh\n\n# Run the app\nflutter run -d macos\n```\n\n### Manual Setup\n\n```bash\n# 1. Clone repository\ngit clone https://github.com/BoltzmannEntropy/Mayari.git\ncd Mayari\n\n# 2. Install Flutter dependencies\nflutter pub get\n\n# 3. Setup TTS backend (optional)\ncd backend\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\ncd ..\n\n# 4. Download Kokoro TTS models (optional, ~350MB)\n./scripts/bundle_kokoro.sh\n\n# 5. Run the app\nflutter run -d macos\n```\n\n### Build for Release\n\n```bash\n# Build macOS app bundle\nflutter build macos --release\n\n# Output: build/macos/Build/Products/Release/Mayari.app\n\n# Create DMG (optional)\n./scripts/build-dmg.sh\n```\n\n---\n\n## Quick Start\n\n### 1. Open a PDF\n\n- Click **Open PDF** in the toolbar, or\n- Drag and drop a PDF onto the viewer, or\n- Select from your PDF library sidebar\n\n### 2. Enter Source Metadata\n\nWhen you open a new PDF, enter the bibliographic information:\n- **Title**: Book title\n- **Author**: Author name(s)\n- **Year**: Publication year\n- **Publisher**: (Optional) Publisher name\n\n### 3. Extract Quotes\n\n**Standard Mode:**\n1. Select text in the PDF viewer\n2. Press **Cmd+D** or click **Add Quote**\n3. Quote saved with page number\n\n**Highlight Mode:**\n1. Press **Cmd+H** to toggle highlight mode\n2. Orange border appears around PDF viewer\n3. Every text selection is automatically captured\n\n### 4. Listen to Your PDF (Optional)\n\n1. Click **▶ Play** in the TTS toolbar\n2. App extracts text and synthesizes speech\n3. Use playback controls: pause, skip, adjust speed\n4. Choose from 8 British voices\n\n### 5. Export to Markdown\n\n1. Click **Export** in the quotes panel\n2. Save the Markdown file\n3. Quotes organized by source with proper citations\n\n---\n\n## Keyboard Shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `Cmd+D` | Add selected text to quotes |\n| `Cmd+H` | Toggle highlight mode |\n| `←` / `→` | Previous / next page |\n| `Space` | Play / pause TTS |\n| `Escape` | Stop TTS |\n| `Cmd+O` | Open PDF file |\n| `Cmd+E` | Export quotes to Markdown |\n\n---\n\n## Text-to-Speech\n\nMayari includes optional text-to-speech powered by [Kokoro TTS](https://github.com/hexgrad/kokoro), an open-source neural TTS engine with high-quality British voices.\n\n### Available Voices\n\n| Voice | Gender | Quality |\n|-------|--------|---------|\n| **Emma** | Female | Best (Recommended) |\n| **Isabella** | Female | Good |\n| **Alice** | Female | Fair |\n| **Lily** | Female | Fair |\n| **George** | Male | Good |\n| **Fable** | Male | Good |\n| **Lewis** | Male | Fair |\n| **Daniel** | Male | Fair |\n\n### TTS Controls\n\n| Control | Function |\n|---------|----------|\n| **Play/Pause** | Start or pause reading |\n| **Stop** | Stop and reset to beginning |\n| **Skip** | Jump between paragraphs |\n| **Speed** | 0.5x to 2.0x playback speed |\n| **Voice** | Switch voices on-the-fly |\n\n### TTS Setup\n\nTTS requires a Python backend server running on localhost:8787.\n\n```bash\n# Download models and setup (~350MB)\n./scripts/bundle_kokoro.sh\n\n# Start the TTS server\ncd backend\nsource .venv/bin/activate\npython main.py\n```\n\nThe app will show server status in the TTS toolbar.\n\n---\n\n## Export Format\n\nQuotes export to Markdown with proper academic formatting:\n\n```markdown\n## Apology\n\nPlato (399 BCE). Apology. Athens Press.\n\n\u003e \"The only true wisdom is knowing you know nothing.\" (p. 42)\n\n\u003e \"An unexamined life is not worth living.\" (p. 38)\n\n## Republic\n\nPlato (380 BCE). Republic. Athens Press.\n\n\u003e \"The measure of a man is what he does with power.\" (p. 156)\n```\n\n---\n\n## Data Storage\n\nAll data is stored locally:\n\n| Data | Location |\n|------|----------|\n| **Quotes \u0026 Sources** | `~/Documents/mayari_data.json` |\n| **TTS Settings** | `~/Documents/mayari_data.json` |\n| **Generated Audio** | `backend/outputs/` |\n\nData is auto-saved on every change. No cloud sync, no accounts required.\n\n---\n\n## Architecture\n\n```\nMayari/\n├── lib/                              # Flutter app (4,496 lines Dart)\n│   ├── main.dart                     # App entry point\n│   ├── models/\n│   │   ├── source.dart               # PDF source with metadata\n│   │   └── quote.dart                # Extracted quote model\n│   ├── providers/                    # Riverpod state management\n│   │   ├── sources_provider.dart     # Quotes \u0026 sources state\n│   │   ├── tts_provider.dart         # TTS playback state\n│   │   ├── library_provider.dart     # PDF library browsing\n│   │   └── pdf_provider.dart         # PDF viewer state\n│   ├── screens/\n│   │   └── workspace_screen.dart     # Main two-pane layout\n│   ├── services/\n│   │   ├── storage_service.dart      # JSON persistence\n│   │   ├── export_service.dart       # Markdown export\n│   │   ├── tts_service.dart          # Kokoro TTS integration\n│   │   └── log_service.dart          # Debug logging\n│   └── widgets/\n│       ├── pdf_viewer/\n│       │   └── pdf_viewer_pane.dart  # PDF viewer (898 lines)\n│       ├── quotes_panel/\n│       │   ├── quotes_panel.dart     # Quotes library\n│       │   ├── quote_card.dart       # Individual quote\n│       │   └── source_header.dart    # Source grouping\n│       ├── tts/\n│       │   ├── tts_toolbar.dart      # Playback controls\n│       │   └── speaker_cards.dart    # Voice selection\n│       ├── library/\n│       │   └── library_sidebar.dart  # PDF library browser\n│       ├── dialogs/\n│       │   ├── source_metadata_dialog.dart\n│       │   ├── quote_edit_dialog.dart\n│       │   └── settings_dialog.dart\n│       └── logs/\n│           └── logs_panel.dart       # Debug logs\n│\n├── backend/                          # Python TTS server\n│   ├── main.py                       # FastAPI server (port 8787)\n│   ├── requirements.txt              # Python dependencies\n│   ├── tts/\n│   │   └── kokoro_engine.py          # Kokoro TTS wrapper\n│   └── outputs/                      # Generated audio\n│\n├── scripts/\n│   ├── bundle_kokoro.sh              # Download TTS models\n│   ├── install.sh                    # Setup script\n│   ├── flutter.sh                    # Build helper\n│   └── build-dmg.sh                  # macOS DMG builder\n│\n├── docs/plans/                       # Design documents\n├── macos/                            # macOS platform code\n└── test/                             # Widget tests\n```\n\n---\n\n## Codebase Statistics\n\n| Language | Lines of Code | Files |\n|----------|--------------|-------|\n| **Dart** (Flutter UI) | ~4,500 | 23 |\n| **Python** (TTS backend) | ~400 | 3 |\n| **Total** | **~4,900** | **26** |\n\n### Dart Breakdown\n\n| Component | Lines | Description |\n|-----------|-------|-------------|\n| `widgets/pdf_viewer/` | 898 | PDF viewer with text extraction |\n| `widgets/quotes_panel/` | 554 | Quotes library and cards |\n| `providers/` | 679 | Riverpod state management |\n| `services/` | 416 | Storage, export, TTS services |\n| `widgets/tts/` | 519 | TTS controls and voice selection |\n| `widgets/library/` | 292 | PDF library sidebar |\n| `widgets/logs/` | 251 | Debug logging panel |\n| `models/` | 132 | Source and Quote data classes |\n\n### Largest Files\n\n| File | Lines |\n|------|-------|\n| `widgets/pdf_viewer/pdf_viewer_pane.dart` | 898 |\n| `providers/tts_provider.dart` | 395 |\n| `widgets/quotes_panel/quotes_panel.dart` | 369 |\n| `widgets/library/library_sidebar.dart` | 292 |\n| `widgets/tts/tts_toolbar.dart` | 287 |\n\n---\n\n## API Reference (TTS Backend)\n\nThe TTS backend runs on `http://localhost:8787`.\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/health` | GET | Health check |\n| `/api/kokoro/voices` | GET | List available voices |\n| `/api/kokoro/generate` | POST | Synthesize text to speech |\n| `/api/kokoro/audio/list` | GET | List generated audio files |\n| `/api/kokoro/audio/{filename}` | DELETE | Delete audio file |\n\n### Generate Speech Example\n\n```bash\ncurl -X POST http://localhost:8787/api/kokoro/generate \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"text\": \"Hello, world!\", \"voice\": \"bf_emma\", \"speed\": 1.0}'\n```\n\n---\n\n## Dependencies\n\n### Flutter/Dart\n\n| Package | Version | Purpose |\n|---------|---------|---------|\n| `syncfusion_flutter_pdfviewer` | ^29.1.41 | PDF viewing |\n| `syncfusion_flutter_pdf` | ^29.1.41 | PDF text extraction |\n| `flutter_riverpod` | ^2.6.1 | State management |\n| `file_picker` | ^8.1.7 | File selection dialogs |\n| `desktop_drop` | ^0.4.4 | Drag-and-drop support |\n| `path_provider` | ^2.1.5 | File system paths |\n| `just_audio` | ^0.9.46 | Audio playback |\n| `http` | ^1.3.0 | HTTP client |\n| `uuid` | ^4.5.1 | Unique identifiers |\n\n### Python (TTS Backend)\n\n| Package | Version | Purpose |\n|---------|---------|---------|\n| `fastapi` | \u003e=0.100.0 | Web framework |\n| `uvicorn` | \u003e=0.23.0 | ASGI server |\n| `kokoro` | \u003e=0.9.0 | TTS engine |\n| `soundfile` | \u003e=0.12.0 | Audio file I/O |\n| `numpy` | \u003e=1.24.0 | Numerical operations |\n\n---\n\n## Data Model\n\n```dart\nSource {\n  id: String           // UUID\n  title: String        // Book title\n  author: String       // Author name(s)\n  year: int            // Publication year\n  publisher: String?   // Optional\n  filePath: String     // Path to PDF\n  quotes: List\u003cQuote\u003e  // Associated quotes\n}\n\nQuote {\n  id: String           // UUID\n  sourceId: String     // Parent source\n  text: String         // Quote text\n  pageNumber: int      // Page number\n  notes: String?       // User notes\n  order: int           // Manual ordering\n}\n```\n\n---\n\n## Troubleshooting\n\n### Common Issues\n\n**\"TTS server not available\"**\n```bash\n# Start the TTS server\ncd backend\nsource .venv/bin/activate\npython main.py\n```\n\n**\"Kokoro models not found\"**\n```bash\n# Download models (~350MB)\n./scripts/bundle_kokoro.sh\n```\n\n**\"PDF text selection not working\"**\n- Ensure the PDF contains selectable text (not scanned images)\n- Some PDFs have copy protection that prevents text selection\n\n**Flutter build fails**\n```bash\nflutter clean\nflutter pub get\nflutter build macos --release\n```\n\n**Port 8787 already in use**\n```bash\nlsof -i :8787\nkill -9 \u003cPID\u003e\n```\n\n### Performance Tips\n\n- **Large PDFs**: TTS extracts text in 10-page chunks for performance\n- **Memory**: Close other apps when working with very large PDFs\n- **Audio Generation**: First synthesis may take a moment while model loads\n- **Apple Silicon**: Kokoro uses MPS acceleration for faster synthesis\n\n---\n\n## Limitations\n\n- **Text-based PDFs only**: Scanned images require OCR (not built-in)\n- **Citation format**: Fixed APA-style format (MLA, Chicago, BibTeX planned)\n- **TTS Languages**: British English only (Kokoro limitation)\n- **Platform**: macOS only\n\n---\n\n## Future Ideas\n\n- [ ] Multiple citation formats (MLA, Chicago, BibTeX)\n- [ ] PDF annotation persistence\n- [ ] Quote tagging and categorization\n- [ ] Full-text search across all quotes\n- [ ] Cloud sync (optional)\n- [ ] Import existing quote collections\n- [ ] OCR for scanned PDFs\n\n---\n\n## Development Story\n\nMayari was designed to be:\n\n1. **Purpose-built**: Not a general PDF reader—specifically for quote extraction\n2. **Keyboard-first**: Most actions accessible via shortcuts\n3. **Local-first**: All data stays on your machine\n4. **Academic-focused**: Proper citation tracking from the start\n\n\n---\n\n## Author\n\n| | |\n|---|---|\n| **Author** | Shlomo Kashani |\n| **Affiliation** | Johns Hopkins University, Maryland, U.S.A. |\n\n---\n\n## Citation\n\n```bibtex\n@software{kashani2025mayari,\n  title={Mayari: PDF Quote Extraction Tool for Academic Research},\n  author={Kashani, Shlomo},\n  year={2025},\n  institution={Johns Hopkins University},\n  url={https://github.com/BoltzmannEntropy/Mayari},\n  note={Desktop application for extracting and organizing quotes from PDF books with automatic citation tracking}\n}\n```\n\n**APA Format:**\n\nKashani, S. (2025). *Mayari: PDF Quote Extraction Tool for Academic Research*. Johns Hopkins University. https://github.com/BoltzmannEntropy/Mayari\n\n**IEEE Format:**\n\nS. Kashani, \"Mayari: PDF Quote Extraction Tool for Academic Research,\" Johns Hopkins University, 2025. [Online]. Available: https://github.com/BoltzmannEntropy/Mayari\n\n---\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#BoltzmannEntropy/Mayari\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=BoltzmannEntropy/Mayari\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=BoltzmannEntropy/Mayari\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=BoltzmannEntropy/Mayari\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n---\n\n## License\n\n- Source code: Business Source License 1.1 (`LICENSE`)\n- Binary distribution: Binary Distribution License (`BINARY-LICENSE.txt`)\n- Overview: `LICENSE.md`\n\nThe official DMG/executable binaries may not be used commercially or redistributed.\n\n---\n\n## Acknowledgments\n\n- [Kokoro TTS](https://github.com/hexgrad/kokoro) - Fast, high-quality British TTS\n- [Syncfusion Flutter PDF](https://www.syncfusion.com/flutter-widgets/flutter-pdf-viewer) - Professional PDF rendering\n- [Flutter](https://flutter.dev) - Cross-platform UI framework\n- [Riverpod](https://riverpod.dev) - Reactive state management\n- [FastAPI](https://fastapi.tiangolo.com) - Python API framework\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003cbr\u003e\n  \u003ci\u003eNamed after Mayari, the Philippine goddess of the moon — illuminating knowledge in the darkness.\u003c/i\u003e\n  \u003cbr\u003e\u003cbr\u003e\n  🌙\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboltzmannentropy%2Fmayari","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboltzmannentropy%2Fmayari","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboltzmannentropy%2Fmayari/lists"}