frontend-aesthetics
frontend-aesthetics — a Claude Code skill from crossbill-highlights/crossbill-web
Features
- ✓Sync highlights from KOReader with automatic deduplication
- ✓Web interface for viewing and managing highlights by book
- ✓Organize highlights with notes and metadata
- ✓Create flash cards from your highlights and sync them to Anki or get AI suggestions from highlights.
- ✓Create AI summaries from your reading sessions. Ollama, OpenAI, Anthropic and Gemini supported.
- ✓Self-hosted - your data stays on your server
- ✓Multi-user support
Installation Guide
docker-compose.yml on top level of this repository.cp .env.example .env
# Edit .env with your configurationdocker compose upThen install the Koreader [plugin on your e-reader](clients/koreader-plugin/crossbill.koplugin/README.md).
Background Worker
The docker-compose.yml includes an optional worker service that processes background jobs (e.g., batch AI prereading generation for book chapters). It uses the same Docker image as the main app with a different entrypoint.
The worker requires AI provider configuration (AI_PROVIDER, API keys) to process AI-related tasks. You can adjust concurrency via WORKER_CONCURRENCY (default: 5).
For development, run the worker separately:
make dev-workerS3-Compatible Storage (Optional)
By default, Crossbill stores ebook files and covers on the local filesystem. For multi-container deployments (e.g., Railway) where the app and worker containers cannot share a filesystem, you can configure S3-compatible storage so both containers access the same files.
Set these environment variables to enable S3 storage:
S3_ENDPOINT_URL=https://your-s3-endpoint.example.com
S3_ACCESS_KEY_ID=your-access-key
S3_SECRET_ACCESS_KEY=your-secret-key
S3_BUCKET_NAME=crossbill-files
S3_REGION=your-regionWhen these are set, Crossbill automatically uses S3 instead of local disk. When they are not set, local file storage is used (the book-files volume mount).
For local development or self-hosted server, you can use Garage as an S3-compatible server. The docker-compose.yml includes an optional garage service.
Start it and run the one-time setup script:
docker compose up -d garage
./scripts/setup_garage.sh
# After setting the environment variables restart containers if they are already running:
docker restart crossbill-app crossbill-workerThe script creates the bucket and API key, then prints the credentials to add to your .env. If you are going to use Garage in production, please refer their docs
for proper settings to be set in the garage.toml!