{"id":46453552,"url":"https://github.com/jarynclouatre/bindery","last_synced_at":"2026-04-19T02:04:19.951Z","repository":{"id":342155607,"uuid":"1173046754","full_name":"jarynclouatre/bindery","owner":"jarynclouatre","description":"Automated e-book and comic converter","archived":false,"fork":false,"pushed_at":"2026-03-10T04:51:29.000Z","size":497,"stargazers_count":21,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-10T10:45:30.148Z","etag":null,"topics":["calibre","calibre-web","calibre-web-automated","comics","comics-reader","docker","kepubify","kindle","kindlecomicconverter","kobo","kobo-ereader","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"Python","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/jarynclouatre.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"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-05T00:36:44.000Z","updated_at":"2026-03-10T04:51:32.000Z","dependencies_parsed_at":"2026-03-09T04:01:40.212Z","dependency_job_id":null,"html_url":"https://github.com/jarynclouatre/bindery","commit_stats":null,"previous_names":["jarynclouatre/ereader-converter"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/jarynclouatre/bindery","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarynclouatre%2Fbindery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarynclouatre%2Fbindery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarynclouatre%2Fbindery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarynclouatre%2Fbindery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jarynclouatre","download_url":"https://codeload.github.com/jarynclouatre/bindery/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jarynclouatre%2Fbindery/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30372532,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"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":["calibre","calibre-web","calibre-web-automated","comics","comics-reader","docker","kepubify","kindle","kindlecomicconverter","kobo","kobo-ereader","self-hosted"],"created_at":"2026-03-06T01:03:43.970Z","updated_at":"2026-04-19T02:04:19.942Z","avatar_url":"https://github.com/jarynclouatre.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![Bindery](assets/logo.png)\n\n[![Tests](https://github.com/jarynclouatre/bindery/actions/workflows/test.yml/badge.svg)](https://github.com/jarynclouatre/bindery/actions/workflows/test.yml)\n\nA self-hosted, Dockerized converter that automatically processes e-books and comics dropped into watched folders — no manual steps required.\n\n**For Kobo users:** Converts `.epub` files to Kobo's native `.kepub` format using [kepubify](https://github.com/pgaskin/kepubify), giving you better performance and reading features than sideloaded EPUBs.\n\n**For all devices:** Converts comic archives (`.cbz`, `.cbr`, `.zip`, `.rar`) into device-optimised files using [Kindle Comic Converter (KCC)](https://github.com/ciromattia/kcc), with full control over profile, cropping, splitting, gamma, and more.\n\nAll settings are configurable at runtime via a WebUI on port 5000 — no container rebuild needed. Supports `PUID`/`PGID` permission mapping for NAS and multi-user environments.\n\n**Supported devices:** Kindle, Kobo, reMarkable, and any device KCC has a profile for.\n\n![Bindery WebUI](assets/webui.png)\n\n---\n\n## Quick Start\n\n```bash\n# 1. Copy docker-compose.yml from the repo and edit your paths\n# 2. Find your user/group IDs\nid\n# → uid=1000(you) gid=1000(you)\n\n# 3. Set PUID/PGID in docker-compose.yml, then start\ndocker compose up -d\n\n# 4. Open the WebUI\nhttp://\u003cserver-ip\u003e:5000\n```\n\n---\n\n## Folder Layout\n\n```\nbindery/\n├── books_in/        ← drop .epub files here (Kobo users only)\n├── books_out/       ← converted .kepub files appear here\n├── comics_in/       ← drop .cbz / .cbr / .zip / .rar here\n├── comics_out/      ← converted files appear here\n├── comics_raw/      ← drop a flat folder of images here; Bindery zips it to CBZ and processes it automatically\n│   ├── processed/   ← original image folders moved here on success\n│   └── unprocessed/ ← folders with subfolders or no images moved here\n└── config/          ← settings.json and jobs.json persisted here\n```\n\nAll folders are created automatically on first run. Subfolders are preserved — a file at `comics_in/Marvel/issue01.cbz` will land at `comics_out/Marvel/issue01.epub`.\n\n---\n\n## docker-compose.yml\n\n```yaml\nservices:\n  bindery:\n    image: dinkeyes/bindery:latest\n    container_name: bindery\n    ports:\n      - \"5000:5000\"\n    environment:\n      - PUID=1000   # replace with your uid\n      - PGID=1000   # replace with your gid\n    volumes:\n      - ./config:/app/config\n      - /path/to/books_in:/Books_in\n      - /path/to/books_out:/Books_out\n      - /path/to/comics_in:/Comics_in\n      - /path/to/comics_out:/Comics_out\n      - /path/to/comics_raw:/Comics_raw\n    restart: unless-stopped\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n```\n\n---\n\n## WebUI\n\nThe WebUI at port 5000 gives you full control over Bindery without touching config files or restarting the container.\n\n### Processing Status\n\nA live table shows every conversion job — filename, type, status (`queued` / `processing` / `success` / `failed`), timestamp, and elapsed time. Failed jobs show a **Retry** button that re-queues the file immediately. Job history is persisted in `/app/config/jobs.json` and survives container restarts (capped at 500 entries; oldest completed jobs are pruned first).\n\n### File Browser\n\nBrowse and download files directly from `Books_out` and `Comics_out` without needing Samba, SSH, or any other file access method. Switch between the two output folders using the tab buttons. Files are listed newest first with size and date.\n\n### Notifications\n\nBindery can send push notifications on conversion success and/or failure via [Apprise](https://github.com/caronc/apprise), which supports 60+ services including ntfy, Discord, Slack, Telegram, Pushover, and email. Enter one URL per line in the Service URLs box under Bindery Settings, check which events you want, and save.\n\nExample URLs:\n```\nntfy://your-ntfy-server.com/bindery\nntfy://bindery-alerts          ← uses the free ntfy.sh public server\ndiscord://webhook_id/token\ntgram://bot_token/chat_id\n```\n\nFull URL formats for every supported service are in the [Apprise docs](https://github.com/caronc/apprise/wiki).\n\n---\n\n## KCC Settings\n\nAll KCC settings are configured in the WebUI — each option includes a description inline. The most important settings to get right for your setup are:\n\n- **Device Profile** — match your exact device for correct resolution. Default is `KoLC` (Kobo Libra Colour).\n- **Output Format** — `EPUB` for Kobo, `MOBI` for Kindle.\n- **Manga Style** — enables right-to-left page order; enable for manga.\n- **Stretch** — fills the screen ignoring aspect ratio; on by default.\n- **Splitter** — controls how landscape pages are split. Use `Right then left` for manga.\n\nWhen **Device Profile** is set to **Generic / Custom**, width and height fields appear for custom resolutions.\n\n---\n\n## Bindery Settings\n\n| Setting | Default | Notes |\n|---------|---------|-------|\n| Watcher Mode | `poll` | `poll` scans every 10 s and works everywhere including NFS/SMB. `inotify` detects files instantly but only works on local filesystems — files on network mounts will be silently missed. Requires a container restart to take effect. |\n| File Stability Timeout | `60` s | How long Bindery waits for a file to finish transferring before skipping it. Increase for slow network drives. Range: 10–300 s. |\n| Notifications (Apprise) | *(blank)* | One Apprise service URL per line. Leave blank to disable notifications. See [Apprise docs](https://github.com/caronc/apprise/wiki) for URL formats. |\n\n---\n\n## Behaviour\n\n- Bindery watches `/Books_in`, `/Comics_in` and `/Comics_raw` using either **poll** mode (every 10 s, NAS/SMB/NFS compatible) or **inotify** mode (instant, local filesystems only).\n- Each file gets a per-file lock so the same file is never processed twice concurrently.\n- On success: converted file is moved to the output folder, source file is deleted.\n- On failure: source file is renamed to `\u003cfilename\u003e.failed` and will not be retried automatically. Use the Retry button in the WebUI to re-queue it.\n- Raw image folders in `Comics_raw` are held until stable (no file changes for 30 s) before processing begins.\n- Live logs are shown in the WebUI and streamed to `docker logs`.\n\n---\n\n## Use Cases\n\nBindery fits anywhere in a self-hosted media pipeline:\n\n- **[Calibre-Web Automated](https://github.com/crocodilestick/Calibre-Web-Automated)** — set `books_out` as the CWA ingest folder and converted `.kepub` files are imported to your library automatically\n- **[Calibre](https://calibre-ebook.com/) auto-add** — point Calibre's Auto Add folder at `books_out` or `comics_out` for hands-free import\n- **Cloud sync** — use rclone to push converted files to Google Drive, Dropbox, or any cloud storage automatically\n\n---\n\n## rclone Auto-Sync\n\nInstall rclone, configure a remote (`rclone config`), then run on a schedule with cron:\n\n```bash\ncrontab -e\n```\n\n```\n*/15 * * * * rclone sync /path/to/bindery/comics_out gdrive:Comics --log-file=/var/log/rclone-comics.log\n*/15 * * * * rclone sync /path/to/bindery/books_out gdrive:Books --log-file=/var/log/rclone-books.log\n```\n\nFull setup instructions including systemd service and provider-specific remote configuration are at [rclone.org/docs](https://rclone.org/docs/).\n\n---\n\n## Updating\n\n```bash\ndocker compose pull \u0026\u0026 docker compose up -d\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjarynclouatre%2Fbindery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjarynclouatre%2Fbindery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjarynclouatre%2Fbindery/lists"}