From 80d370d71ca6fbe214ab0aaf408af01e45364037 Mon Sep 17 00:00:00 2001 From: Evan Buss Date: Wed, 10 Jul 2024 01:17:51 +0000 Subject: [PATCH] docs: add readme --- .github/screenshot.png | Bin 0 -> 19647 bytes README.md | 57 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 .github/screenshot.png create mode 100644 README.md diff --git a/.github/screenshot.png b/.github/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..940a9c972ace54385cfb1bf3651e1cdeccc8599f GIT binary patch literal 19647 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 BYN`ML literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..99bbe6f --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# OPDS Proxy + +OPDS Proxy provides a minimal web interface over XML-based OPDS feeds. +Your eReader likely does not support OPDS, but it does have a rudimentary web browser. +By running your own OPDS Proxy you can allow eReaders to navigate and download books from your library and any OPDS feed without installing custom eReader software. + +

+ +

+ +## Features +- Minimal web interface that works on any web browser +- Multiple OPDS feeds +- Automatically converts your `.epub` files into the proprietary format your eReader requires. + - Kobo: `*.epub` to `*.kepub` (see [benefits](https://www.reddit.com/r/kobo/comments/vz3nx6/kepub_vs_epub/)) + - Kindle: `*.epub` to `*.mobi` + - Other: `*.epub` +- Allows accessing HTTP basic auth OPDS feeds from primitive eReader browsers that don't natively support basic auth. + +## Getting Started +1. Download the latest release binary or pull the latest docker image. +2. Configure your OPDS feeds via environment variables or config file (YML or JSON) +3. Navigate your library and download books to your eReader + +## Motivation +KOReader is great and I've been running it for years on my jailbroken Kindle and Kobo eReaders. +To me, the standout feature is its ability to speak OPDS which allows myself / family / friends to have access to my library from anywhere. +That being said, the Kindle / Kobo native reader software is faster, better looking, has a lower learning curve, and doesn't require a complicated installation process that oftens breaks on device updates. + +## My Setup +- All books are stored and managed via Calibre (Docker) in standard `.epub` format. +- Calibre's OPDS feed is turned on but not exposed to the outside world. +- OPDS Proxy is pointed to the Calibre OPDS feed. +- eReaders access OPDS Proxy via web browser. Book files are automatically converted to device-specific proprietary format on download. + +### Why Not Use An Exisitng Solution? +- Calibre + - Good for metadata management but not for the web interface. + - Doesn't support Kobo `.kepub` files natively without installing multiple plugins. + - HTTP basic auth doesn't work on eReader web browsers. + - Requires converting and storing eReader specific proprietary formats. + To me, `.epub` is the [master](https://mixbutton.com/mastering-articles/what-is-the-master-recording/) from which all other copies should be derived. +- Calibre-Web + - Takes over your entire library and makes it no longer compatible to be managed via Calibre. + - Dated interface + - Does too much + - No automatic conversions +- COPS + - No longer maintained + - Dated interface + - No automatic conversions +- send.djazz.se/ + - Requires uploading private content to unknown server + - Only supports 1 book at a time + - Doesn't connect to your existing library + - Single User + - Can't share library with friends / family \ No newline at end of file