{"id":49200971,"url":"https://github.com/quantavil/anidash","last_synced_at":"2026-04-23T14:04:00.543Z","repository":{"id":352392495,"uuid":"1214854367","full_name":"quantavil/Anidash","owner":"quantavil","description":"AniDash is a modern, personal anime tracker powered by SvelteKit, Tailwind CSS v4, and the MyAnimeList API.","archived":false,"fork":false,"pushed_at":"2026-04-19T11:50:39.000Z","size":541,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-19T12:10:37.121Z","etag":null,"topics":["anime","anime-tracker","myanimelist","myanimelist-api","myanimelist-profile"],"latest_commit_sha":null,"homepage":"https://anidash.pages.dev/","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/quantavil.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-04-19T06:16:11.000Z","updated_at":"2026-04-19T11:50:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/quantavil/Anidash","commit_stats":null,"previous_names":["quantavil/anidash"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/quantavil/Anidash","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quantavil%2FAnidash","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quantavil%2FAnidash/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quantavil%2FAnidash/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quantavil%2FAnidash/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/quantavil","download_url":"https://codeload.github.com/quantavil/Anidash/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quantavil%2FAnidash/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32183357,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T11:42:27.955Z","status":"ssl_error","status_checked_at":"2026-04-23T11:42:18.877Z","response_time":53,"last_error":"SSL_read: 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":["anime","anime-tracker","myanimelist","myanimelist-api","myanimelist-profile"],"created_at":"2026-04-23T14:03:58.242Z","updated_at":"2026-04-23T14:04:00.531Z","avatar_url":"https://github.com/quantavil.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AniDash ✨\n\n![AniDash Preview](static/screenshots/preview.png)\n\nAniDash is a premium, high-end personal anime tracker with a focus on **Ethereal Glass** aesthetics and high-performance list management. Powered by **Svelte 5 (Runes)**, **Tailwind CSS v4**, and the **MyAnimeList API**.\n\n## ✨ Features\n\n- **Ethereal Glass UI**: A custom-crafted design system using frosted glassmorphism, fluid animations, and high-contrast OLED black themes.\n- **Offline-First Resilience**: Full IndexedDB caching for your entire watch list. Browse, check stats, and view anime details even without an internet connection.\n- **Fused Filtering Logic**: Optimized `+page.svelte` by consolidating chained filter calls into a single `O(N)` pass, reducing intermediate array allocations and GC pressure during user interaction.\n- **Offline Sync Queue**: Implemented a discrete `syncQueue` IndexedDB store (DB_VERSION 2) to natively sequester offline or failed user mutations. Ensures offline mutations are maintained optimistically and re-attempted sequentially upon resolving `navigator.onLine` or triggering `flushPersistentQueue`.\n- **Zero-Dependency Visuals**: Implemented score and media format distribution charts using pure CSS/Svelte logic, maintaining high performance and small bundle size while providing premium analytics.\n- **Bi-Directional Sync**: Modern MAL API v2 integration with proper PKCE OAuth, real-time status updates, and permanent list deletion support.\n- **MAL-Dubs Integration**: Instantly identify which anime have English dubs available using the MAL-Dubs dataset with a persistent 7-day TTL cache.\n- **Advanced Recommendations**: Dual-source suggestions from both MyAnimeList and the Jikan community, unified into a premium suggested gallery.\n- **Dynamic Stats \u0026 Sorting**: Comprehensive dashboard tracking your watching habits, episode distribution, and rating history with responsive visualizations. Enhanced data navigation with \"MAL Rating\" sorting for your personal list and seasonal anime.\n- **Smart Data Insights**: Community rating and member statistics (e.g., \"8.3 | 250K\") displayed on poster overlays using short-scale formatting (K/M) for maximum density.\n- **Bilingual Title Support**: Global settings toggle to seamlessly switch between English and Romaji (Japanese) anime titles, complete with smooth flip animations and persistent local preferences.\n- **Interactive Discovery**: Turn empty states into opportunities with glassmorphic \"Plan to Watch Roulette\" and \"Seasonal Surprise\" widgets built directly into the Browse page.\n- **Enhanced Detail Gallery**: Lazy-loaded characters, community recommendations from Jikan, and a \"Quick Stats\" row with precise scoring user counts.\n- **Integrated Airing Schedules**: Stay ahead of the season with native MAL broadcast times (e.g. \"Airs Mondays at 23:30 JST\") displayed directly on anime detail pages for accurate airing information.\n- **Visual Analytics Dashboard**: Deep dive into your watch history with score distribution histograms and media format charts built natively for maximum performance.\n- **Detailed Search Context**: Search and browse results now explicitly show your list status (Watching, Completed, etc.) and real-time watch progress (e.g. 12/24) directly on the posters.\n\n## 🏗️ Architecture\n\nAniDash is a unified SvelteKit application optimized for **Cloudflare Pages**.\n\n1. **Frontend**: SvelteKit SPA using Svelte 5's fine-grained reactivity (Runes).\n2. **Backend**: Serverless Edge Functions that handle secure MAL token exchange and CORS proxying.\n3. **Database**: Client-side IndexedDB for lightning-fast performance and offline availability.\n\n---\n\n## 🛠 Setup \u0026 Development\n\n### 1. Get MAL API Credentials\n\n1. Go to [MyAnimeList API Settings](https://myanimelist.net/apiconfig).\n2. Create a new ID.\n   - **App Type**: `web`\n   - **Redirect URI**: `http://localhost:5173/auth/callback` (for local development)\n\n### 2. Environment Variables\n\nCreate a `.env` file in the root for the frontend:\n\n```env\nVITE_MAL_CLIENT_ID=your_mal_client_id\n```\n\nFor local development of server-side routes, create a `.dev.vars` file in the root (used by Wrangler):\n\n```env\nMAL_CLIENT_ID=your_mal_client_id\nMAL_CLIENT_SECRET=your_mal_client_secret\n```\n\n### 3. Running Locally\n\n```sh\nnpm install\nnpm run dev\n```\n\n_The app will run on [http://localhost:5173](http://localhost:5173)._\n\n---\n\n## 🚀 Deployment (Cloudflare Pages)\n\nAniDash is optimized for Cloudflare Pages.\n\n### 1. Preparation\n\n1. Ensure your MAL API Client settings include your production URL in the **Redirect URIs**:\n   `https://your-app.pages.dev/auth/callback`\n\n### 2. Cloudflare Pages Setup\n\n1. Connect your repository to **Cloudflare Pages**.\n2. **Build settings**:\n   - **Framework preset**: `SvelteKit`\n   - **Build command**: `npm run build`\n   - **Build output directory**: `.svelte-kit/cloudflare`\n3. **Environment Variables**:\n   In the Cloudflare Dashboard, go to **Settings \u003e Variables and Secrets** and add:\n\n   | Variable             | Type                          | Description                                 |\n   | -------------------- | ----------------------------- | ------------------------------------------- |\n   | `VITE_MAL_CLIENT_ID` | Environment Variable          | Public Client ID for the frontend build.    |\n   | `MAL_CLIENT_ID`      | Environment Variable / Secret | Client ID for backend proxying.             |\n   | `MAL_CLIENT_SECRET`  | Secret                        | Your MAL Client Secret (Keep this private). |\n\n4. **Compatibility Date**:\n   Ensure the compatibility date is set to at least `2024-04-01` in the dashboard or `wrangler.toml`.\n\n## License\n\nThis project is licensed under the [GNU General Public License v3.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquantavil%2Fanidash","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquantavil%2Fanidash","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquantavil%2Fanidash/lists"}