Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
> [!NOTE]
> This project is in a stable state as of May 2026 but is not under active maintenance.

> [!IMPORTANT]
> **This fork is a meta-fork of [calibrain/shelfmark](https://github.com/calibrain/shelfmark)** (which transitioned in May 2026 to maintenance updates only) that selectively ports noteworthy work from community forks (and also adds new original features) while keeping the Shelfmark identity, license, and naming intact. Each port is reviewed per-commit; rebranding, license switches, and major infrastructure changes are left out. Currently tracking:
>
> - [NemesisHubris/litfinder](https://github.com/NemesisHubris/litfinder) — bug fixes (#999, #956, #1010, #1021, #1025, #1031, #1040), multi-variant title search, multi-book flat-folder grouping, language detection from AA paths, "Leave in Place" output handler, and several quality-of-life improvements
> - [SloppyTurtle/pulsarr](https://github.com/SloppyTurtle/pulsarr) — author watchlist database, REST API, and test suite (issue #1)
>
> See `git log --grep="Cherry-picked from"` for the full list of attributed commits. Thanks to the maintainers of each fork for the work being ported.

Shelfmark is a self-hosted web interface for searching and requesting books and audiobooks across multiple sources. Bring your own sources, metadata providers, and download clients to build a single hub for your digital library. Supports multiple users with a built-in request system, so you can share your instance with others and let them browse and request books on their own.

Works great alongside the following library tools, with support for automatic imports:
Expand Down
6 changes: 6 additions & 0 deletions shelfmark/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@
SourceUnavailableError,
get_source_display_name,
)
from shelfmark.watchlist.db import WatchlistDB
from shelfmark.watchlist.routes import init_watchlist_routes, watchlist_bp

if TYPE_CHECKING:
from shelfmark.metadata_providers import BookMetadata, MetadataProvider
Expand Down Expand Up @@ -179,6 +181,8 @@ def _raise_runtime_error(message: str) -> NoReturn:
user_db.initialize()
download_history_service = DownloadHistoryService(_user_db_path)
activity_view_state_service = ActivityViewStateService(_user_db_path)
watchlist_db = WatchlistDB(_user_db_path)
watchlist_db.initialize()
import_module("shelfmark.config.users_settings")
from shelfmark.core.admin_routes import register_admin_routes
from shelfmark.core.oidc_routes import register_oidc_routes
Expand All @@ -187,6 +191,8 @@ def _raise_runtime_error(message: str) -> NoReturn:
register_oidc_routes(app, user_db)
register_admin_routes(app, user_db)
register_self_user_routes(app, user_db)
init_watchlist_routes(watchlist_db)
app.register_blueprint(watchlist_bp)
except (sqlite3.OperationalError, OSError) as e:
logger.warning(
"User database initialization failed: %s. Multi-user authentication features will be disabled. Ensure CONFIG_DIR (%s) exists and is writable.",
Expand Down
Empty file added shelfmark/watchlist/__init__.py
Empty file.
Loading