Initial commit
Photo-based book cataloger with AI identification. Room → Cabinet → Shelf → Book hierarchy; FastAPI + SQLite backend; vanilla JS SPA; OpenAI-compatible plugin system for boundary detection, text recognition, and archive search.
This commit is contained in:
73
README.md
Normal file
73
README.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# Bookshelf
|
||||
|
||||
Photo-based book cataloger. Organizes books in a Room -> Cabinet -> Shelf -> Book hierarchy. Photographs shelf spines; AI plugins identify books and look up metadata in library archives.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.11+, [Poetry](https://python-poetry.org/)
|
||||
- An OpenAI-compatible API endpoint (OpenRouter recommended)
|
||||
|
||||
## Setup
|
||||
|
||||
```
|
||||
poetry install
|
||||
```
|
||||
|
||||
Create `config/credentials.user.yaml` with your API key:
|
||||
|
||||
```yaml
|
||||
credentials:
|
||||
openrouter:
|
||||
api_key: "sk-or-your-key-here"
|
||||
```
|
||||
|
||||
Start the server:
|
||||
|
||||
```
|
||||
poetry run serve
|
||||
```
|
||||
|
||||
Open `http://localhost:8000` in a browser.
|
||||
|
||||
## Configuration
|
||||
|
||||
Config is loaded from `config/*.default.yaml` merged with `config/*.user.yaml` overrides. User files take precedence; dicts merge recursively, lists replace entirely. User files are gitignored.
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `credentials.default.yaml` | API endpoints and keys |
|
||||
| `models.default.yaml` | Model selection and prompts per AI function |
|
||||
| `functions.default.yaml` | Plugin definitions (boundary detection, text recognition, identification, archive search) |
|
||||
| `ui.default.yaml` | UI display settings |
|
||||
|
||||
To use a different model for a function, create `config/models.user.yaml`:
|
||||
|
||||
```yaml
|
||||
models:
|
||||
vl_recognize:
|
||||
credentials: openrouter
|
||||
model: "google/gemini-2.0-flash"
|
||||
```
|
||||
|
||||
To add an alternative provider, add it to `config/credentials.user.yaml` and reference it in `models.user.yaml`.
|
||||
|
||||
## Usage
|
||||
|
||||
1. Add a room, then cabinets and shelves using the tree in the sidebar.
|
||||
2. Upload a photo of each cabinet or shelf.
|
||||
3. Drag boundary lines on the photo to segment shelves (or books within a shelf). The AI boundary detector can suggest splits automatically.
|
||||
4. Run the text recognizer on a book to extract spine text, then the book identifier to match it against library archives.
|
||||
5. Review and approve AI suggestions in the detail panel. Use the batch button to process all unidentified books at once.
|
||||
6. On mobile, use the photo queue button on a cabinet or shelf to photograph books one by one with automatic AI processing.
|
||||
|
||||
## Development
|
||||
|
||||
```
|
||||
poetry run presubmit # black check + flake8 + pyright + pytest + JS tests
|
||||
poetry run fmt # auto-format Python with black
|
||||
npm install # install JS dev tools (ESLint, Prettier) — requires network
|
||||
npm run lint # ESLint
|
||||
npm run fmt # Prettier
|
||||
```
|
||||
|
||||
Tests are in `tests/` (Python) and `tests/js/` (JavaScript).
|
||||
Reference in New Issue
Block a user