[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74491":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":16,"starSnapshotCount":16,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},74491,"grimmory","grimmory-tools\u002Fgrimmory","grimmory-tools","Grimmory is an independent community fork of Booklore.","https:\u002F\u002Fgrimmory.org",null,"Java",3405,230,17,122,0,42,99,320,126,109.09,"GNU Affero General Public License v3.0",false,"develop",[],"2026-06-12 04:01:15","> [!NOTE]\n> Grimmory is an independent community fork of Booklore.\n\n\u003Cdiv align=\"center\">\n\n\u003Cpicture>\n  \u003Csource srcset=\"assets\u002Flogo-with-text.svg\">\n  \u003Cimg src=\"assets\u002Flogo-with-text.svg\" alt=\"Grimmory\" height=\"80\" \u002F>\n\u003C\u002Fpicture>\n\n**Grimmory is a self-hosted digital library for people who take their reading seriously.**\n\n[![Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fgrimmory-tools\u002Fgrimmory?color=818CF8&style=flat-square&logo=github)](https:\u002F\u002Fgithub.com\u002Fgrimmory-tools\u002Fgrimmory\u002Freleases)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fgrimmory-tools\u002Fgrimmory?color=fab005&style=flat-square)](LICENSE)\n[![Docker Pulls](https:\u002F\u002Fimg.shields.io\u002Fdocker\u002Fpulls\u002Fgrimmory\u002Fgrimmory?color=2496ED&style=flat-square&logo=docker&logoColor=white)](https:\u002F\u002Fhub.docker.com\u002Fr\u002Fgrimmory\u002Fgrimmory)\n[![Discord](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDiscord-5865F2?style=flat-square&logo=discord&logoColor=white)](https:\u002F\u002Fdiscord.gg\u002F9YJ7HB4n8T)\n\n[Documentation](https:\u002F\u002Fgrimmory.org\u002Fdocs) · [Quick Start](#quick-start) · [Discord](https:\u002F\u002Fdiscord.gg\u002F9YJ7HB4n8T) · [Releases](https:\u002F\u002Fgithub.com\u002Fgrimmory-tools\u002Fgrimmory\u002Freleases)\n\n\u003C!-- ![Grimmory Demo](assets\u002Fdemo.gif) -->\n\n\u003C\u002Fdiv>\n\n---\n\n## Features\n\n| Feature | Description |\n| :--- | :--- |\n| **Smart Shelves** | Custom and dynamic shelves with rule-based filtering, tagging, and full-text search |\n| **Metadata Lookup** | Covers, descriptions, reviews, and ratings pulled from Google Books, Open Library, and Amazon, all editable |\n| **Built-in Reader** | Read PDFs, EPUBs, and comics in the browser with annotations, highlights, and reading progress tracking |\n| **Device Sync** | Connect a Kobo, use any OPDS-compatible app, or sync progress with KOReader |\n| **Multi-User** | Separate shelves, progress, and preferences per user with local or OIDC authentication |\n| **BookDrop** | Drop files into a watched folder and Grimmory detects, enriches, and queues them for import automatically |\n| **One-Click Sharing** | Send any book to a Kindle, an email address, or another user directly from the interface |\n\n### Supported Formats\n\n| Category | Formats |\n| :--- | :--- |\n| eBooks | EPUB, MOBI, AZW, AZW3, FB2 |\n| Documents | PDF |\n| Comics | CBZ, CBR, CB7 |\n| Audiobooks | M4B, M4A, MP3, OPUS |\n\n---\n\n## Quick Start\n\n> [!TIP]\n> For OIDC setup, advanced configuration, or upgrade guides, see the [full documentation](https:\u002F\u002Fgrimmory.org\u002Fdocs\u002Fgetting-started).\n\nRequirements: [Docker](https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F) and [Docker Compose](https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Finstall\u002F).\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong>Image Repositories\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n| Registry | Image |\n| --- | --- |\n| Docker Hub | `grimmory\u002Fgrimmory` |\n| GitHub Container Registry | `ghcr.io\u002Fgrimmory-tools\u002Fgrimmory` |\n\n\u003C\u002Fdetails>\n\n### Step 1: Environment Configuration\n\nCreate a `.env` file:\n\n```ini\n# Application\nAPP_USER_ID=1000\nAPP_GROUP_ID=1000\nTZ=Etc\u002FUTC\n\n# Database\nDATABASE_URL=jdbc:mariadb:\u002F\u002Fmariadb:3306\u002Fgrimmory\nDB_USER=grimmory\nDB_PASSWORD=ChangeMe_Grimmory_2025!\n\n# Optional: enable API docs + export OpenAPI JSON (defaults to false)\nAPI_DOCS_ENABLED=false\n\n# Storage: LOCAL (default) or NETWORK (disables file operations; see Network Storage section)\nDISK_TYPE=LOCAL\n\n# MariaDB\nDB_USER_ID=1000\nDB_GROUP_ID=1000\nMYSQL_ROOT_PASSWORD=ChangeMe_MariaDBRoot_2025!\nMYSQL_DATABASE=grimmory\n```\n\n### Step 2: Docker Compose\n\nStable images are published from semantic-release tags on `main` as `vX.Y.Z` plus `latest`. Nightly images are built from `develop` and tagged `nightly`.\n\n> [!NOTE]\n> Migrating from an existing Booklore container? You can keep your current service name, `container_name`, database name and user, ports, and mounted volumes the same. Replace only the `image:` line with `grimmory\u002Fgrimmory:\u003Ctag>` or `ghcr.io\u002Fgrimmory-tools\u002Fgrimmory:\u003Ctag>`.\n\n```yaml\nservices:\n  booklore:\n    image: grimmory\u002Fgrimmory:v2.2.1\n```\n\nCreate a `docker-compose.yml` or copy and adapt [`deploy\u002Fcompose\u002Fdocker-compose.yml`](deploy\u002Fcompose\u002Fdocker-compose.yml):\n\n```yaml\nservices:\n  grimmory:\n    image: grimmory\u002Fgrimmory:latest\n    # Convenience tag:\n    # image: grimmory\u002Fgrimmory:\u003Crelease-version>\n    # Alternative: ghcr.io\u002Fgrimmory-tools\u002Fgrimmory:\u003Crelease-version>\n    # To build from source instead: comment out 'image' and uncomment below\n    # build: .\n    container_name: grimmory\n    environment:\n      - USER_ID=${APP_USER_ID}\n      - GROUP_ID=${APP_GROUP_ID}\n      - TZ=${TZ}\n      - DATABASE_URL=${DATABASE_URL}\n      - DATABASE_USERNAME=${DB_USER}\n      - DATABASE_PASSWORD=${DB_PASSWORD}\n      - API_DOCS_ENABLED=${API_DOCS_ENABLED}\n      - DISK_TYPE=${DISK_TYPE}\n    depends_on:\n      mariadb:\n        condition: service_healthy\n    ports:\n      - \"6060:6060\"\n    volumes:\n      - .\u002Fdata:\u002Fapp\u002Fdata\n      - .\u002Fbooks:\u002Fbooks\n      - .\u002Fbookdrop:\u002Fbookdrop\n    healthcheck:\n      test: wget -q -O - http:\u002F\u002Flocalhost:6060\u002Fapi\u002Fv1\u002Fhealthcheck\n      interval: 60s\n      retries: 5\n      start_period: 60s\n      timeout: 10s\n    restart: unless-stopped\n\n  mariadb:\n    image: lscr.io\u002Flinuxserver\u002Fmariadb:11.4.5\n    environment:\n      - PUID=${DB_USER_ID}\n      - PGID=${DB_GROUP_ID}\n      - TZ=${TZ}\n      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n      - MYSQL_DATABASE=${MYSQL_DATABASE}\n      - MYSQL_USER=${DB_USER}\n      - MYSQL_PASSWORD=${DB_PASSWORD}\n    volumes:\n      - .\u002Fmariadb\u002Fconfig:\u002Fconfig\n    restart: unless-stopped\n    healthcheck:\n      test: [\"CMD\", \"mariadb-admin\", \"ping\", \"-h\", \"localhost\"]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n```\n\n### Step 3: Launch\n\n```bash\ndocker compose up -d\n```\n\nOpen http:\u002F\u002Flocalhost:6060, create your admin account, and start building your library. (All libraries must be created within directories mounted on the host, e.g. the `\u002Fbooks\u002F` directory in the sample `docker-compose.yml` above.)\n\nAdditional deployment examples:\n\n- Docker Compose: [`deploy\u002Fcompose\u002Fdocker-compose.yml`](deploy\u002Fcompose\u002Fdocker-compose.yml)\n- Helm: [`deploy\u002Fhelm\u002Fgrimmory\u002FChart.yaml`](deploy\u002Fhelm\u002Fgrimmory\u002FChart.yaml)\n- Podman Quadlet: [`deploy\u002Fpodman\u002Fquadlet\u002FREADME.md`](deploy\u002Fpodman\u002Fquadlet\u002FREADME.md)\n\n---\n\n## Developer Surfaces\n\n\nContributor workflow, PR policy, and release semantics live in [CONTRIBUTING.md](CONTRIBUTING.md). \n\nGeneral purpose development guidelines live in [DEVELOPMENT.md](DEVELOPMENT.md). Component-specific implementation guidance lives in:\n\n- [`backend\u002FDEVELOPMENT.md`](backend\u002FDEVELOPMENT.md)\n- [`frontend\u002FDEVELOPMENT.md`](frontend\u002FDEVELOPMENT.md)\n\nThe root [`Justfile`](Justfile) is the primary local command surface and mirrors the folder-local `backend\u002FJustfile` and `frontend\u002FJustfile` entrypoints.\n\n```bash\njust               # Show root + api + ui recipes\njust test          # Run backend and frontend tests\njust api test      # Run backend tests only\njust ui dev        # Start the frontend dev server\n```\n\n---\n\n## API Reference Docs\n\nWhen enabled via `API_DOCS_ENABLED`, API reference documentation is available as both an `openapi.json` and as publicly accessible docs. The endpoints are:\n- API reference docs are available at `http:\u002F\u002Flocalhost:6060\u002Fapi\u002Fdocs`\n- OpenAPI JSON is available at `http:\u002F\u002Flocalhost:6060\u002Fapi\u002Fopenapi.json`\n\n---\n\n## BookDrop\n\nDrop book files into a watched folder. Grimmory picks them up, pulls metadata, and queues them for your review.\n\n```mermaid\ngraph LR\n    A[Drop Files] --> B[Auto-Detect]\n    B --> C[Extract Metadata]\n    C --> D[Review and Import]\n```\n\n| Step | What Happens |\n| --- | --- |\n| 1. Watch | Grimmory monitors the BookDrop folder continuously |\n| 2. Detect | New files are picked up and parsed automatically |\n| 3. Enrich | Metadata is fetched from Google Books and Open Library |\n| 4. Import | You review, adjust if needed, and add to your library |\n\nMount the volume in `docker-compose.yml`:\n\n```yaml\nvolumes:\n  - .\u002Fbookdrop:\u002Fbookdrop\n```\n\n---\n\n## Network Storage\n\nSet `DISK_TYPE=NETWORK` in your `.env` to run Grimmory against a network-mounted file system (NFS, SMB, etc.).\nIn this mode, direct file operations (delete, move, rename from the UI) are disabled to avoid destructive changes on shared mounts.\nAll other features — reading, metadata, sync — remain fully functional.\n\n---\n\n## Community and Support\n\n| Channel | |\n| :--- | :--- |\n| Report a bug | [Open an issue](https:\u002F\u002Fgithub.com\u002Fgrimmory-tools\u002Fgrimmory\u002Fissues\u002Fnew?template=bug_report.yml) |\n| Request a feature | [Open an issue](https:\u002F\u002Fgithub.com\u002Fgrimmory-tools\u002Fgrimmory\u002Fissues\u002Fnew?template=feature_request.yml) |\n| Contribute | [Contributing Guide](CONTRIBUTING.md) |\n| Join the discussion | [Discord Server](https:\u002F\u002Fdiscord.gg\u002F9YJ7HB4n8T) |\n\n> [!WARNING]\n> Before opening a pull request, open an issue first and get maintainer approval. Pull requests without a linked issue, without screenshots or video proof, or without pasted test output will be closed. All code must follow the project [backend](CONTRIBUTING.md#backend-conventions) and [frontend](CONTRIBUTING.md#frontend-conventions) conventions. AI-assisted contributions are welcome, but you must run, test, and understand every line you submit. See the [Contributing Guide](CONTRIBUTING.md) for full details.\n\n--- \n\n## License\n\nDistributed under the terms of the [AGPL-3.0 License](LICENSE).\n","Grimmory 是一个自托管的数字图书馆，专为认真阅读的人设计。它支持智能书架、元数据查找、内置阅读器、设备同步、多用户管理以及文件自动导入等核心功能。技术上采用 Java 开发，并提供 Docker 镜像以简化部署过程。用户可以通过规则过滤、标签和全文搜索来管理和组织书籍；同时，Grimmory 支持多种电子书格式（如 EPUB、PDF）及漫画和有声读物的在线阅读与注释。此外，它还允许通过电子邮件或 Kindle 直接分享书籍。适用于个人或小团队建立私有图书库，进行高效便捷的阅读管理和资源共享。",2,"2026-06-11 03:50:10","high_star"]