{"id":50497994,"url":"https://github.com/codebude/librislog","last_synced_at":"2026-06-02T09:30:52.933Z","repository":{"id":361935803,"uuid":"1234479317","full_name":"codebude/librislog","owner":"codebude","description":"Just a book tracker.","archived":false,"fork":false,"pushed_at":"2026-06-01T21:47:37.000Z","size":22204,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T23:16:24.096Z","etag":null,"topics":["book-tracker","books","reading-time","reading-tracker","self-hosted","selfhosted"],"latest_commit_sha":null,"homepage":"https://codebude.github.io/librislog/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codebude.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["codebude"],"open_collective":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"codebude","thanks_dev":null,"custom":null}},"created_at":"2026-05-10T08:31:36.000Z","updated_at":"2026-06-01T21:44:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/codebude/librislog","commit_stats":null,"previous_names":["codebude/librislog"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/codebude/librislog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codebude%2Flibrislog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codebude%2Flibrislog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codebude%2Flibrislog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codebude%2Flibrislog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codebude","download_url":"https://codeload.github.com/codebude/librislog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codebude%2Flibrislog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33816486,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["book-tracker","books","reading-time","reading-tracker","self-hosted","selfhosted"],"created_at":"2026-06-02T09:30:52.213Z","updated_at":"2026-06-02T09:30:52.921Z","avatar_url":"https://github.com/codebude.png","language":"Python","funding_links":["https://github.com/sponsors/codebude","https://buymeacoffee.com/codebude"],"categories":[],"sub_categories":[],"readme":"# LibrisLog\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://codebude.github.io/librislog/\"\u003e📚 Full Documentation\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"https://codebude.github.io/librislog/guide/getting-started\"\u003eQuick Start\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"https://codebude.github.io/librislog/api/\"\u003eAPI Reference\u003c/a\u003e\n  \u0026nbsp;·\u0026nbsp;\n  \u003ca href=\"https://codebude.github.io/librislog/next/\"\u003eNightly Docs\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/codebude/librislog/actions/workflows/tests.yml\"\u003e\u003cimg src=\"https://github.com/codebude/librislog/actions/workflows/tests.yml/badge.svg\" alt=\"Tests\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/codebude?tab=packages\u0026repo_name=librislog\"\u003e\u003cimg src=\"https://github.com/codebude/librislog/actions/workflows/docker.yml/badge.svg\" alt=\"Docker Build\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codebude.github.io/librislog/\"\u003e\u003cimg src=\"https://github.com/codebude/librislog/actions/workflows/docs.yml/badge.svg\" alt=\"Docs Build\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/python-3.14-%233776AB?logo=python\" alt=\"Python\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/svelte-5-%23FF3E00?logo=svelte\" alt=\"Svelte\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/FastAPI-0.136-%23009688?logo=fastapi\" alt=\"FastAPI\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\"\u003e\n\u003c/p\u003e\n\n**Multi-user book tracking webapp** — maintain four reading lists, import books from Open Library \u0026 Google Books, scrape cover art, and get rich reading analytics — all on your own hardware.\n\n\u003e `docker compose up -d` → full data ownership, no vendor lock-in, no API keys required.\n\n---\n\n## Quick Start\n\n```bash\nmkdir librislog \u0026\u0026 cd librislog\ncurl -O https://raw.githubusercontent.com/codebude/librislog/main/docker-compose.yml\ncurl -O https://raw.githubusercontent.com/codebude/librislog/main/.env.example\ncp .env.example .env\n# generate a random secret key\nsed -i \"s/CHANGE_ME_TO_32PLUS_CHARS/$(openssl rand -base64 32)/\" .env\ndocker compose up -d\n```\n\nOpen **http://localhost:8001** and create your account.\n\n---\n\n## Screenshots\n\n\u003cdiv\u003e\n  \u003ca href=\"docs/public/screenshots/dashboard.png\"\u003e\u003cimg src=\"docs/public/screenshots/dashboard-thumb.png\" width=\"270\" alt=\"Dashboard\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/public/screenshots/library-read.png\"\u003e\u003cimg src=\"docs/public/screenshots/library-read-thumb.png\" width=\"270\" alt=\"Library\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/public/screenshots/statistics.png\"\u003e\u003cimg src=\"docs/public/screenshots/statistics-thumb.png\" width=\"270\" alt=\"Statistics\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\u003cdiv\u003e\n  \u003ca href=\"docs/public/screenshots/progress-detail.png\"\u003e\u003cimg src=\"docs/public/screenshots/progress-detail-thumb.png\" width=\"270\" alt=\"Reading Progress\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/public/screenshots/data-import.png\"\u003e\u003cimg src=\"docs/public/screenshots/data-import-thumb.png\" width=\"270\" alt=\"Book Import\"\u003e\u003c/a\u003e\n  \u003ca href=\"docs/public/screenshots/admin-backup.png\"\u003e\u003cimg src=\"docs/public/screenshots/admin-backup-thumb.png\" width=\"270\" alt=\"Administration\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n---\n\n## Why LibrisLog?\n\n- **Your data, your rules.** Fully self-hosted under MIT license — no ads, no tracking, no vendor lock-in. A single SQLite file you can back up anytime.\n- **No API keys required.** Works with Open Library out of the box. Add Google Books or Hardcover.app tokens optionally for richer search results.\n- **Rich insights from day one.** Calendar heatmap, language/status/page distribution charts, books finished per month/year, top authors — all on your hardware.\n- **Multi-user from the start.** User roles (admin/user), optional OIDC SSO, per-user libraries. One instance works for your whole household or small group.\n- **Import any format you have.** Goodreads CSV with automatic field mapping, generic CSV with per-field Python transforms, JSON, ZIP with covers.\n- **Point your phone at an ISBN barcode.** Real-time barcode scanning in the browser — no native app required.\n- **Cover art from multiple sources.** Automatic search across AbeBooks, Open Library, Amazon, and Hardcover — plus manual upload or URL paste.\n- **Full REST API.** OpenAPI-documented backend you can script against — build your own frontend, connect home automation, or pipe data into your own tools.\n- **Lightweight.** Two Docker containers, one SQLite database.\n- **Bilingual UI.** English and German with a localization framework ready for more languages.\n\n---\n\n## Features\n\n- **Library** — Grid/list view, search and sort, four reading statuses (Want to Read, Currently Reading, Read, Did Not Finish)\n- **Reading progress** — Page-level slider, full progress timeline per book with edit/history\n- **Statistics dashboard** — Calendar heatmap, distribution charts, books finished per period, top authors\n- **Book import** — Search Open Library, Google Books, Hardcover.app. Scan ISBN barcodes on mobile. Manual entry for anything not found\n- **Data portability** — Export as JSON, CSV, or ZIP with covers. Import from Goodreads or any CSV with custom field mapping\n- **Cover management** — Automatic multi-source cover search with manual override, URL paste, or file upload\n- **Data hygiene** — Find and fix missing metadata (covers, page counts, authors) in bulk\n- **Multi-user** — Admin/user roles, per-user libraries, optional OIDC login\n- **Themes** — Light, dark, and custom DaisyUI themes with persistent preferences\n- **Administration** — Full backup/restore of the SQLite database, user management, API key management\n\n---\n\n## API\n\nThe backend is a standalone FastAPI application. The full API is documented via Swagger UI at `/api/docs` when the server is running.\n\nCreate API keys from the web UI (Profile → API Keys) for headless access. See the [API Reference](https://codebude.github.io/librislog/api/) for details.\n\n```bash\ncd backend\nuv sync\nuv run alembic upgrade head\nuv run uvicorn app.main:app --reload\n```\n\n---\n\n## Stack\n\n| Layer | Technology |\n|---|---|\n| **Backend** | FastAPI, SQLModel, SQLite, Alembic, Pydantic v2 |\n| **Frontend** | Svelte 5, SvelteKit, Tailwind CSS v4, DaisyUI v5 |\n| **Auth** | Session cookies, optional OIDC (Authlib) |\n| **Deployment** | Docker, Docker Compose |\n| **Package managers** | `uv` (Python), `npm` (Node) |\n| **Testing** | pytest + pytest-cov (backend), Vitest + Testing Library (frontend), Playwright (E2E) |\n\n---\n\n## Contributing\n\nSee the [Developer Setup](https://codebude.github.io/librislog/guide/developer-setup) guide for instructions on running LibrisLog locally, running tests, and using the CLI tool.\n\nThis project was developed with the assistance of AI coding tools under a human-supervised workflow. No AI-generated code is committed without human review and approval.\n\n## License\n\nMIT\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/#codebude/librislog\u0026Date\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=codebude/librislog\u0026type=Date\u0026theme=dark\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=codebude/librislog\u0026type=Date\" /\u003e\n    \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=codebude/librislog\u0026type=Date\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodebude%2Flibrislog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodebude%2Flibrislog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodebude%2Flibrislog/lists"}