A Django app for storing, cataloguing, and reading e-Books (PDF, EPUB, CBZ)
Project description
django-bookkeeper
A Django app for storing, cataloguing, and reading e-Books (PDF, EPUB, CBZ).
Features
- Upload PDF, EPUB, and CBZ files (drag-and-drop or browse)
- Automatic metadata extraction — title, author, publisher, cover image
- Deduplication by SHA-256 hash
- Modern reader with:
- Reader settings: light/sepia/dark themes, font family & size, line height, column width
- Highlights in five colours with optional notes
- Bookmarks with titles and notes
- Reading progress — auto-saved position and percentage
- 5-star ratings per user
- Favourites and finished-book tracking
- Extensible hook signals for recent-books lists, activity feeds, etc.
- PWA-installable — add to your home screen on iOS and Android for a full-screen, standalone reading app
- Django best-practices:
django-storagescompatible,AUTH_USER_MODELaware, namespaced URLs
Screenshots
Try the demo
The fastest way to see Bookkeeper in action — one command downloads five public-domain classics from Project Gutenberg and starts a local server:
git clone https://github.com/ehwio/django-bookkeeper
cd django-bookkeeper
make demo
Then open http://127.0.0.1:8000/ and sign in as demo / demo.
On subsequent runs, use
make demo-runto start the server without re-seeding. Usemake demo-resetto wipe the database and media and re-seed from scratch.
Admin interface: after seeding, create an admin account to access /admin/:
cd demo
PYTHONPATH=../src:.. uv run python manage.py create_admin
Then visit http://127.0.0.1:8000/admin/ and sign in with your admin credentials.
Or with Docker:
docker compose up
Uses
Dockerfile.demo— builds the demo image from thedemo/directory.
The demo ships with:
- Pride and Prejudice — Jane Austen
- Twenty Thousand Leagues Under the Seas — Jules Verne
- The Time Machine — H.G. Wells
- Alice's Adventures in Wonderland — Lewis Carroll
- Frankenstein — Mary Wollstonecraft Shelley
Books are downloaded from Project Gutenberg on first run. They are public domain and freely distributable.
Progressive Web App (PWA)
Bookkeeper can be installed on your device's home screen for a full-screen, app-like experience with no browser chrome. On supported browsers, look for the Share → Add to Home Screen (iOS) or Install app option.
This requires no service worker — the manifest and meta tags enable the A2HS flow; offline reading is a future enhancement.
Installation
pip install django-bookkeeper
# or
uv add django-bookkeeper
Add to INSTALLED_APPS:
INSTALLED_APPS = [
...
"bookkeeper",
]
Include URLs:
# urls.py
from django.urls import include, path
urlpatterns = [
path("books/", include("bookkeeper.urls", namespace="bookkeeper")),
]
Run migrations:
python manage.py migrate
Dependencies
django-bookkeeper requires Django 4.2 or later and uses these packages:
| Package | Purpose |
|---|---|
django-storages |
Storage backend abstraction |
Pillow |
Image processing (covers) |
ebooklib |
EPUB metadata/structure extraction |
PyMuPDF |
PDF text/metadata extraction |
python-magic |
File type detection |
beautifulsoup4 |
HTML/XML parsing |
lxml |
Fast XML/HTML processing |
rarfile |
CBR comic support |
Optional dependencies
| Feature | Package / Requirement |
|---|---|
| Social login | social-auth-app-django |
| CBR comic support | system unrar or unar binary |
| Cloud storage | Already included — django-storages is a required dependency |
Hooks
Connect to Bookkeeper signals to extend behaviour:
from bookkeeper.hooks import book_opened, book_finished, progress_updated
@book_opened.connect
def track_recent(sender, user, book, **kwargs):
RecentBook.objects.update_or_create(user=user, defaults={"book": book})
Available signals: book_opened, progress_updated, book_finished, book_rated,
book_uploaded, highlight_created, bookmark_created.
Development
git clone https://github.com/ehwio/django-bookkeeper
cd django-bookkeeper
uv sync --extra dev
uv run pytest --cov
uv run ruff check src/ tests/ demo/
GitFlow
main— stable releasesdevelop— integration branchfeature/*— new featuresfix/*— bug fixesrelease/*— release prep
See RELEASING.md for the step-by-step release process (TestPyPI → PyPI via GitHub Actions).
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_bookkeeper-0.4.0.tar.gz.
File metadata
- Download URL: django_bookkeeper-0.4.0.tar.gz
- Upload date:
- Size: 8.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c69436f62a908afa48edd4308b576ecfb9f502f0feb82f9bbbb84edf36064a89
|
|
| MD5 |
e91e18725a3daf08832ebd6eb2f0c346
|
|
| BLAKE2b-256 |
ae4edb43da6b05e93bd51f3300c6160bfe3abbd86a84e7d7405449a28c29885c
|
Provenance
The following attestation bundles were made for django_bookkeeper-0.4.0.tar.gz:
Publisher:
publish-pypi.yml on ehwio/django-bookkeeper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_bookkeeper-0.4.0.tar.gz -
Subject digest:
c69436f62a908afa48edd4308b576ecfb9f502f0feb82f9bbbb84edf36064a89 - Sigstore transparency entry: 1908751777
- Sigstore integration time:
-
Permalink:
ehwio/django-bookkeeper@7f969555f0338300d7b376234bd5acbf331e1fe0 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/ehwio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7f969555f0338300d7b376234bd5acbf331e1fe0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file django_bookkeeper-0.4.0-py3-none-any.whl.
File metadata
- Download URL: django_bookkeeper-0.4.0-py3-none-any.whl
- Upload date:
- Size: 66.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5554d8429f642157eb6dd2aabc540c336e184fa2bc90a5a73801ceaa63e0269f
|
|
| MD5 |
579aea1ed4dc6b709a3c750c32a3b1c6
|
|
| BLAKE2b-256 |
3e1c975d27c47c9c7c9442ac85b8cf53c1ec331da7de53ae7e4d103863d6ed7b
|
Provenance
The following attestation bundles were made for django_bookkeeper-0.4.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on ehwio/django-bookkeeper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_bookkeeper-0.4.0-py3-none-any.whl -
Subject digest:
5554d8429f642157eb6dd2aabc540c336e184fa2bc90a5a73801ceaa63e0269f - Sigstore transparency entry: 1908751904
- Sigstore integration time:
-
Permalink:
ehwio/django-bookkeeper@7f969555f0338300d7b376234bd5acbf331e1fe0 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/ehwio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7f969555f0338300d7b376234bd5acbf331e1fe0 -
Trigger Event:
release
-
Statement type: