Skip to content

Releases: vvorth/inpx-shelf

Release list

v26.10.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 12:07

26.10.0 / 2026-10-20

  • Releases now ship when ready, without betas, and are numbered by date: 26.10.0, 26.10.1, … (year, month and the number of the release in that month). The beta Docker image is no longer updated: switch to latest. The updateChannel setting (INPX_UPDATE_CHANNEL) is gone: the update check always looks at the latest release. dev builds show a version with a commit mark, for example 26.10.0+dev.b95beaa.
  • Action required: signing in to a profile is always required: without it only the app shell with the login form and the health checks (/health, /ready, /api/index-status) are open. allowAnonymousAccess and INPX_ALLOW_ANONYMOUS_ACCESS are removed. Without a web login, books, covers and OPDS open only with OPDS credentials; signed OPDS links and the remote library token no longer work without a login. A profile without a password opens only through SSO binding. Kobo and KOReader keep their own authentication, as before.
  • Guest access can be turned on again, now with a fixed scope: Administration → Users → Guest access or INPX_GUEST_ACCESS=true. A guest searches the catalog, opens author, series and book pages, downloads and reads books and sees the shared discovery shelves; lists, progress, personal shelves, book delivery and administration still need a login. A guest never acts as a profile, a profile without a password included. OPDS has its own switch (Catalog without sign-in in the shared OPDS settings, INPX_OPDS_GUEST_ACCESS=true): the catalog and downloads open without credentials, profiles, their lists and progress still ask for the OPDS password. Both are off by default.
  • Action required: the access password (accessPassword, accessTimeout) is removed: the profile login now guards the whole app. The "Lock the library" menu item is gone.
  • Action required: OPDS readers sign in with the profile login and a separate OPDS password; the profile password no longer works for OPDS. Create the OPDS password in Profile and devices → Devices: a generated one is shown once, or set your own (at least 10 characters); a new one replaces the old. The "Require password for OPDS" checkbox is gone: OPDS login is on once an OPDS password exists.
  • Action required: /metrics opens only with metricsToken; without a token it is closed. metricsExemptAuth and INPX_METRICS_EXEMPT_AUTH are removed. The token is accepted only in the Authorization: Bearer header; the ?token= parameter no longer works.
  • A new profile is created only with a login and password; without a password only with SSO binding (proxyBindProfile).
  • Profile passwords must be at least 10 characters (when created or changed; existing passwords keep working). Guessing the password of one login from many addresses is slowed down: after 5 failures each next attempt for that login waits twice as long, up to 5 minutes; the login is never locked. The response time no longer tells whether a login exists.
  • Action required: everyone signs in once more after the update. The browser session is now a signed HttpOnly cookie (key session-secret in the data directory) and the server stores no sessions, so a restart keeps everyone signed in and any copy of the server accepts the cookie. A session lasts 30 days from the login and ends after 7 days without use. A password or login change and deleting the profile end its sessions; a full backup restore and an admin password reset end everyone's. Deleting session-secret signs everyone out.
  • Signing out gives the browser a new session without a profile, but a copy of the old cookie saved elsewhere stays valid until its limits; change the password to end it too.
  • The web app no longer sends X-User-Id and X-Profile-Token, and the server ignores them: the profile comes only from the session cookie.
  • On start the server logs every HTTP path it serves and, for each, who may open it.
  • The library can live in S3: an s3://bucket/prefix path in LIBDIR, INPX or a source is read straight from S3 - INPX, archives, covers, illustrations and reviews, without downloading the library to disk. AWS (ECS/Fargate task role or keys) and self-hosted S3 servers (AWS_ENDPOINT_URL_S3) are supported. Sources on disk and in S3 can be mixed. AWS Fargate setup is in docker.md.
  • Action required: CACHE_DIR now really sets the cache directory: the book and cover cache (public-files) and tmp. The variable was in the Docker examples before, but the app did not read it and kept everything in the data directory. The cache an earlier version built in public-files of the data directory is not moved: books and covers are prepared again as they are opened, and the old public-files directory can be deleted. The search DB stays in the data directory. Without CACHE_DIR everything stays in the data directory, as before.
  • Action required: the Audiobookshelf metadata provider is removed: the /api/audiobookshelf route is gone, and INPX_ABS_ENABLED, INPX_ABS_TOKEN, INPX_ABS_PUBLIC_URL and INPX_ABS_MAX_RESULTS have no effect. If the provider was added in Audiobookshelf, remove it there.
  • The /#/reader-lab debug screen opens only a .fb2 from the user's computer: the "Open sample" button, the sample= parameter and the /reader-lab-source server route, which read FB2 from the library directory, are removed.
  • djxl and dwebp are no longer looked up in a bin directory inside or next to the library: only the converterPaths path, the bin directory next to the program and PATH. The Docker image already has both. If they were only in the library's bin, move them to bin next to inpx-shelf or set the path in converterPaths. The source check in administration no longer has a bin item.
  • Reader: uploading your own background picture is removed together with the "Background" tab and the "Shadow" switch (the letter shadow was visible only over a picture). The picture, up to 4 MB, was kept in the profiles file and rewritten on every save of the reading position. Saved pictures are dropped from the settings on the first save; reader settings are now limited by the general API request limit (1 MiB, INPX_API_MESSAGE_LIMIT_MB) rather than 6 MiB.
  • The book window and OPDS show the date added as in the INPX: 2024-03-15 instead of 15.03.2024.
  • If a prepared book cannot be read from the cache, the download answers with an error instead of sending the compressed cache file as the book.
  • The password administration suggests for a new profile is now 16 random characters (abcd-efgh-...) instead of two words and a number: there were only 36 thousand of the old ones, few enough to guess through the login in a few hours. Passwords like that already handed out should be changed.
  • Reader, page mode: a paragraph split between pages no longer gets extra spaces around emphasized words ("said he .", "C hapter"), and in rare unmeasured splits the short start of a paragraph is no longer lost.
  • The profile backup keeps the OPDS and KOReader password hashes and the KOReader progress: after a restore, reader apps sign in with their old passwords.
  • Action required, incompatible: the remote library protocol is replaced, and neither side supports the old one (WebSocket get-inpx-file / get-book-link and download over /book) any more. A server of this version does not serve its library to earlier inpx-shelf or inpx-web versions and cannot use them as a remote library: update both servers and set up the connection again. The remote library now works over the /remote/ HTTP API with tokens. allowRemoteLib and remoteLib are removed and ignored on start: the server with the library issues tokens in Administration → Library → Access for other servers (each token has its own libraries), and the connecting server adds the remote library in the same place, next to its own. Each side can have several libraries; the same book is shown once. The INPX is downloaded again only after it changes, covers come from the server with the library, and a book is downloaded on first use and stays in the cache; the annotation and contents of a remote book come with the "Get metadata" button. See config.md.
  • The web app talks to the server over plain HTTP requests (<root>/api/) instead of a WebSocket. A reverse proxy needs no WebSocket settings (Upgrade, Connection "upgrade"), and with proxy auth the user header is checked on every request. Browser tabs opened before the update must be reloaded.
  • A large book is unpacked from its archive straight to disk: a 150 MB file used to take about 450 MB of extra memory while it was extracted, now a few MB. The illustrations of a book and the files of a compressed EPUB are extracted in one pass over the archive instead of one pass per file.
  • The book page no longer loads the whole book text: the cached book description of an 8 MB FB2 is 12 KB instead of 8 MB, and a cached book page opens in about a millisecond instead of 50. The reader downloads the book file itself. A damaged cache file is rebuilt instead of breaking the book page.
  • FB2 books with a line break or tab after a tag name, or with attributes in single quotes (a cover link among them), are read correctly: the contents and the cover are no longer lost. A blank line with Windows line endings in an INPX no longer adds an empty book.
  • Kobo: "Refresh on device" is no longer lost while the converter queue is full; the refresh goes out on a later sync.
  • Saving settings in administration writes only the changed settings to config.json. Before, it also wrote values set by environment variables and command-line options (for example INPX_GUEST_ACCESS, INPX_REQUIRE_AUTH, --port), so they stayed in effect after the variable was removed: check config.json for such values. A backup restore resets settings missing from the backup to their defaults, and environment and command-line ...
Read more