| --- |
| title: Bookscope |
| sdk: gradio |
| app_file: app.py |
| pinned: false |
| tags: |
| - hackathon |
| - backyard-ai |
| - best-demo |
| - best-agent |
| - vision |
| - ocr |
| - minicpm-v |
| - codex |
| --- |
| |
| # Bookscope |
|
|
| Bookscope turns messy shelf photos into a searchable used-book inventory. It is built for the used bookstore problem: rotated spines, partial titles, mixed categories, and shelves that are valuable but hard to browse. |
|
|
| ## Submission Links |
|
|
| - App: https://huggingface.co/spaces/build-small-hackathon/bookscope |
| - Demo video: TODO: add public demo video URL before the deadline |
| - Social post: TODO: add public social post URL before the deadline |
| - GitHub PR with Codex-attributed commits: https://github.com/SpanishPeacoq/bookscope/pull/1 |
| - Team: `SpanishPeacoq` |
|
|
| ## Hackathon MVP |
|
|
| The first working loop is intentionally small: |
|
|
| 1. Upload or capture a shelf photo. |
| 2. Extract visible book candidates into an editable table. |
| 3. Enrich the rows with public book metadata from Open Library. |
| 4. Correct uncertain rows as a human second pass. |
| 5. Keep structured inventory rows, not raw shelf photos, by default. |
|
|
| The vision model is provider-swappable. In deployed mode, Bookscope defaults to the public `openbmb/MiniCPM-V-4.6-Demo` Space. For offline/local UI work, set `BOOKSCOPE_DEMO_MODE=true` to use built-in sample rows. |
|
|
| ## Why This Exists |
|
|
| Used bookstores often contain valuable inventory that is hard to search because the shelves are physically chaotic: spines face different directions, categories are mixed, books are stacked horizontally, and titles are partially hidden. Bookscope treats scanning as an incremental workflow rather than a perfect one-shot OCR problem. |
|
|
| The first pass gives a fast machine read of the shelf. The second pass lets a person correct uncertain rows. Over time, repeated scans can converge into a more reliable shelf inventory without asking the store owner to reorganize the shelves first. |
|
|
| ## How It Works |
|
|
| - MiniCPM-V 4.6 reads the uploaded shelf image and returns candidate title/author rows. |
| - Bookscope normalizes the model response into an editable Gradio table. |
| - The enrichment step searches Open Library by title and author. |
| - When available, it adds ISBN, first publish year, publisher, subjects, and an Open Library link. |
| - If a match is uncertain or missing, the row remains editable instead of pretending the inventory is solved. |
|
|
| ## Prize Targets |
|
|
| - Backyard AI: practical daily-life tool for physical shelf inventory. |
| - Best MiniCPM Build: MiniCPM-V 4.6 is the core vision model. |
| - Best Use of Codex: the GitHub PR contains Codex co-authored commits. |
| - Best Agent: the app combines vision extraction, structured row normalization, metadata lookup, and human correction. |
| - Best Demo: the value is clearest in a before/after shelf scan. |
|
|
| All models used by Bookscope are under the 32B parameter limit. MiniCPM-V 4.6 is listed by the Build Small field guide as an image/OCR model around 1.3B parameters. |
|
|
| ## Quick Start |
|
|
| ```bash |
| python -m venv .venv |
| .venv\Scripts\activate |
| pip install -r requirements.txt |
| python app.py |
| ``` |
|
|
| Copy `.env.example` to `.env` for local development and set real values locally. Never commit secrets. |
|
|
| ## Configuration |
|
|
| | Variable | Purpose | |
| | --- | --- | |
| | `HF_TOKEN` | Hugging Face token for the selected hosted model/provider. | |
| | `BOOKSCOPE_HF_MODEL` | Model or endpoint identifier used by `huggingface_hub.InferenceClient`. | |
| | `BOOKSCOPE_HF_PROVIDER` | Optional Hugging Face inference provider name. | |
| | `BOOKSCOPE_GRADIO_SPACE` | Optional Hugging Face Space name when the model is exposed through a Gradio demo. Defaults to `openbmb/MiniCPM-V-4.6-Demo`. | |
| | `BOOKSCOPE_GRADIO_API_NAME` | Gradio API endpoint name, usually `/predict` until inspected. | |
| | `BOOKSCOPE_GRADIO_INPUT_ORDER` | Space call shape: `minicpm_v46`, `image_prompt`, `prompt_image`, or `image`. | |
| | `BOOKSCOPE_DEMO_MODE` | Set to `true` for offline sample rows. Leave unset or set to `false` for live MiniCPM-V scans. | |
|
|
| ## Privacy Boundary |
|
|
| Bookscope is designed to process shelf images transiently and save structured book rows. Raw images are not persisted by the current app. |
|
|
| Current image handling: |
|
|
| - Gradio receives the uploaded image for the current browser session. |
| - Bookscope converts it to an in-memory PIL image for scanning. |
| - Bookscope downsizes very large images before model calls to keep inference responsive. |
| - When calling the MiniCPM-V Gradio Space, Bookscope writes a temporary JPEG only long enough to send the request, then deletes that temporary file. |
| - Live MiniCPM-V mode sends the shelf image to the external `openbmb/MiniCPM-V-4.6-Demo` Space on Hugging Face. Bookscope controls its own temporary files, but it cannot control retention or logging inside that upstream public Space. |
| - The repo ignores local image and video files by default so test shelf photos do not enter Git. |
| - A future scan-session feature may optionally save thumbnails only when the user asks for audit/debug history. |
|
|
| For sensitive/private shelves, run Bookscope against a model endpoint you control instead of the public demo Space. |
|
|
| ## Known Limits |
|
|
| - Wide shelf photos still produce mistakes, especially on tiny, blurry, or partially hidden spines. |
| - Cropping to one shelf band usually improves recognition. |
| - Open Library matches are useful but not authoritative; older editions and obscure used books may need manual correction. |
| - The current app does not persist scan sessions. It focuses on the fast demo loop: image in, candidate rows out, metadata enrichment next. |
|
|
| ## Project Structure |
|
|
| ```text |
| . |
| |-- app.py |
| |-- bookscope.py |
| |-- requirements.txt |
| |-- README.md |
| |-- AGENTS.md |
| |-- CONTRIBUTING.md |
| |-- SECURITY.md |
| |-- docs/ |
| | |-- architecture.md |
| | `-- adr/ |
| `-- .github/ |
| ``` |
|
|
| ## Built With Codex |
|
|
| The initial Gradio MVP was built with OpenAI Codex as an implementation collaborator. Commits for hackathon work should keep clear messages and include a Codex co-author trailer when appropriate. |
|
|
| ## Status |
|
|
| Current status: reviewed Gradio MVP with live MiniCPM-V 4.6 scanning, Open Library enrichment, image-handling documentation, and regression tests for the main failure paths. |
|
|