Lenny is a free, open source, Library-in-a-Box for libraries to preserve and lend digital books.

docker
for deployment and containerizationnginx
handles patron requests (reverse proxy to app)FastAPI
(python) as the web & API microframeworkMinio
API for storing digital assets (Amazon, Internet Archive, or local flat-file)yaml
for configuring library-level rulespostgres
for the databaseSQLAlchemy
for the database pythonORM
- Readium
LCP
for DRM; see LCP Server - Readium Web SDK for a secure web reading experience
OPDS
RSS-like standard for syndicating holdings
/v{1}/api
/v{1}/manage
/v{1}/read
/v{1}/opds
/v{1}/stats
To install and run Lenny as a production application:
curl -fsSL https://raw.githubusercontent.com/ArchiveLabs/lenny/refs/heads/main/install.sh | sudo sh
If you have git
and docker
installed on your system, the following commands will set up Lenny:
git clone [email protected]:ArchiveLabs/lenny.git
cd lenny
./run.sh
This process will run docker/configure.sh
and generate a gitignored .env
file with reasonable default values, if not present.
Navigate to localhost:8080 or whatever $LENNY_PORT
is specified in your .env
You may enter the API container via:
docker exec -it lenny_api bash
# Run the importer: you can Ctrl+c after a few books are loaded (will load ~800)
docker exec -it lenny_api python scripts/load_open_books.py
# Load a manifest URL
BOOK=$(echo -n "s3://bookshelf/32941311.epub" | base64 | tr '/+' '_-' | tr -d '=')
# Should be http://localhost:15080/czM6Ly9ib29rc2hlbGYvMzI5NDEzMTEuZXB1Yg/manifest.json
echo "http://localhost:15080/$BOOK/manifest.json"
curl "http://localhost:15080/$BOOK/manifest.json"
docker compose -p lenny down
docker compose -p lenny up -d --build
We're seeking partnerships with libraries who would like to try lending digital resources to their patrons.
- Authentication - How does your library perform authentication currently?