{"id":45697930,"url":"https://github.com/jnsgruk/booklog","last_synced_at":"2026-02-24T21:08:59.744Z","repository":{"id":338614441,"uuid":"1156396316","full_name":"jnsgruk/booklog","owner":"jnsgruk","description":"B{ook}log is a self-hosted, multi-user book tracking platform for avid readers. Each user maintains a personal library and wishlist, with per-user readings, stats, and timeline.","archived":false,"fork":false,"pushed_at":"2026-02-15T12:39:59.000Z","size":497,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-15T18:39:44.603Z","etag":null,"topics":["axum","books","claude","datastar","flake","flyio","nix","reading","rust","tailwind"],"latest_commit_sha":null,"homepage":"https://books.jnsgr.uk","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jnsgruk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2026-02-12T15:50:04.000Z","updated_at":"2026-02-15T12:40:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jnsgruk/booklog","commit_stats":null,"previous_names":["jnsgruk/booklog"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/jnsgruk/booklog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnsgruk%2Fbooklog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnsgruk%2Fbooklog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnsgruk%2Fbooklog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnsgruk%2Fbooklog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jnsgruk","download_url":"https://codeload.github.com/jnsgruk/booklog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jnsgruk%2Fbooklog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29800990,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T21:02:39.706Z","status":"ssl_error","status_checked_at":"2026-02-24T21:02:21.834Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["axum","books","claude","datastar","flake","flyio","nix","reading","rust","tailwind"],"created_at":"2026-02-24T21:08:59.141Z","updated_at":"2026-02-24T21:08:59.736Z","avatar_url":"https://github.com/jnsgruk.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"![cover image](./static/og-image.png)\n\n**B{ook}log** is a self-hosted, multi-user book tracking platform for avid readers. Each user\nmaintains a personal library and wishlist, with per-user readings, stats, and timeline.\n\nBooklog features an LLM-powered extraction feature, which enables it to automatically fill\nbook and author information using a photo of a book cover.\n\nBooklog ships as a single Rust binary that serves a web UI, a REST API, and a CLI client. The\napplication uses SQLite as a backend, and will automatically create and migrate the database on\nstart-up.\n\n\u003e [!NOTE]\n\u003e This application was built almost entirely with Claude Code. I used this project as an\n\u003e excuse to explore the current state of the art in agentic coding tools. I've reviewed\n\u003e much of the code, and I'm largely responsible for the rules and the layout of the repository\n\u003e but nonetheless the vast majority of the code was written by Claude and Opus 4.6.\n\n## Quick Start (Demo)\n\nOptionally, sign up for [OpenRouter](https://openrouter.ai) to enable AI-powered book cover\nextraction. Then create a `docker.env` file:\n\n```env\n# Optional: API key from OpenRouter for AI extraction\nBOOKLOG_OPENROUTER_API_KEY=sk-or-...\n# I've had good results with Gemini models, but you can try 'openrouter/free' to experiment\nBOOKLOG_OPENROUTER_MODEL=google/gemini-3-flash-preview\n```\n\nSee the full list of configuration options [below](#configuration). Once the `.env` file is\nready, start the container using the environment file:\n\n```bash\n# Create a data directory to store the database\nmkdir data\n# Run the container\ndocker run \\\n  --rm \\\n  -p 3000 \\\n  --env-file docker.env \\\n  -v $PWD/data:/data \\\n  ghcr.io/jnsgruk/booklog:latest\n```\n\nOn first start with an empty database the server prints a one-time registration URL:\n\n```\nNo users found. Register the first user at:\n  http://localhost:3000/register/abc123...\nThis link expires in 1 hour.\n```\n\nOpen that URL, choose a display name, and register a passkey. This creates an admin account\nand signs in automatically. Additional users can be invited from the admin page.\n\n### Install from Git\n\nTo build and install from source, a working Rust toolchain is required:\n\n```bash\ncargo install --locked --git https://github.com/jnsgruk/booklog.git\n```\n\nThen create a `.env` file and start the server:\n\n```bash\nbooklog serve\n```\n\n### CLI Authentication\n\nTo use the CLI or API for write operations, create a token via browser hand-off:\n\n```bash\nbooklog token create --name \"my-cli-token\"\n# Browser opens → authenticate with a passkey → token printed once\n\nexport BOOKLOG_URL=\"http://localhost:3000\"\nexport BOOKLOG_TOKEN=\"\u003ctoken from above\u003e\"\n\n# Create data from the CLI\nbooklog author add --name \"George Orwell\" --nationality \"British\"\n```\n\nRun `booklog --help` for the full command reference.\n\n### Maintenance\n\nRebuild timeline event snapshots (e.g. after editing entities whose changes need to propagate):\n\n```bash\nbooklog timeline rebuild\n```\n\n## Configuration\n\nAll settings are read from environment variables or CLI flags. A `.env` file in the working\ndirectory is loaded automatically via [dotenvy](https://crates.io/crates/dotenvy).\n\n### Server (`booklog serve`)\n\n| Variable                   | Purpose                                                                | Default                 |\n| -------------------------- | ---------------------------------------------------------------------- | ----------------------- |\n| `BOOKLOG_RP_ID`            | WebAuthn Relying Party ID (server domain)                              | `localhost`             |\n| `BOOKLOG_RP_ORIGIN`        | WebAuthn Relying Party origin (full URL)                               | `http://localhost:3000` |\n| `BOOKLOG_DATABASE_URL`     | Database connection string                                             | `sqlite://booklog.db`   |\n| `BOOKLOG_BIND_ADDRESS`     | Server bind address                                                    | `127.0.0.1:3000`        |\n| `BOOKLOG_INSECURE_COOKIES` | Disable the `Secure` cookie flag (auto-enabled for localhost defaults) | `false`                 |\n| `RUST_LOG`                 | Log level filter                                                       | `info`                  |\n| `RUST_LOG_FORMAT`          | Set to `json` for structured log output                                | —                       |\n\n### CLI Client\n\n| Variable        | Purpose                               | Default                 |\n| --------------- | ------------------------------------- | ----------------------- |\n| `BOOKLOG_URL`   | Server URL                            | `http://localhost:3000` |\n| `BOOKLOG_TOKEN` | API bearer token for write operations | —                       |\n\n### Integrations\n\n| Variable                     | Purpose                                                        | Default           |\n| ---------------------------- | -------------------------------------------------------------- | ----------------- |\n| `BOOKLOG_OPENROUTER_API_KEY` | [OpenRouter](https://openrouter.ai/) API key for AI extraction | (optional)        |\n| `BOOKLOG_OPENROUTER_MODEL`   | LLM model for AI extraction                                    | `openrouter/free` |\n\n## Contributing\n\n```bash\ncargo build                           # Build\ncargo clippy --allow-dirty --fix      # Lint\ncargo fmt                             # Format\ncargo test                            # Test\n```\n\nSee [CLAUDE.md](CLAUDE.md) for architecture, code patterns, and development conventions.\n\n## License\n\n[Apache License 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjnsgruk%2Fbooklog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjnsgruk%2Fbooklog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjnsgruk%2Fbooklog/lists"}