Two approaches to the same patron workflow — a conversation starter
Somalia Jamall — Jacksonville Public Library
Patron-facing purchase suggestion system with staff review dashboard and automated hold placement. ~400 patrons have used it in production.
GitHub · AGPL-3.0
Ray Voelker — chimpy-me / CHPL
Datasette plugin with an automated bot pipeline for evidence extraction, catalog matching, and Open Library enrichment. Part of a broader Sierra data ecosystem.
| Aspect | Jacksonville (Polaris) | chimpy-me (Sierra) |
|---|---|---|
| Patron Input | Structured form — title, author, ISBN, format dropdown, age group | Free-text field — paste an Amazon link, type a title, enter an ISBN; bot parses it |
| Staff Review | Custom React/MUI dashboard with 5 status tabs, inline editing, action buttons, toast notifications | Datasette native table UI — filtering, sorting, SQL, CSV export come free; custom update route for status changes |
| Intelligence | Nightly script searches catalog by ISBN, places holds, detects checkouts | 7-stage bot pipeline: evidence extraction (ISBN validation, URL classification, ASIN extraction), tiered catalog search, Open Library enrichment. LLM stages planned. |
| Hold Placement | Fully automated — nightly script handles Polaris two-step hold confirmation | Planned (Stage 5) — not yet implemented |
| 4 touchpoints: submission received, already owned, rejected, hold placed. PHPMailer + smtplib. | Not yet implemented | |
| Auth | Polaris API for patron + staff; hardcoded staff username list | Sierra API for patrons; separate RBAC plugin for staff (viewer / staff / admin roles, PBKDF2 passwords) |
| Data Store | MariaDB — single title_requests table |
SQLite — 6 tables with migrations, full event audit trail (request_events) |
| Security | Form validation, suggestion rate limiting | Login rate limiting, CSRF protection, PII scrubbing on outbound queries, CSV injection prevention |
| Testing | — | Full test suite (15+ files); fake Sierra API server for local dev |
| Production | ~400 patrons served at Jacksonville PL | In development |
| Deployment | Docker Compose (PHP/Apache + MariaDB) | Datasette with pip-installable plugins |
| Clever Detail | eBook/eAudiobook requests redirect patrons to Libby instead of accepting | Patron can paste an Amazon URL and the bot extracts the ASIN, finds the ISBN, searches the catalog, and enriches with cover art — all before staff sees it |
The suggest-purchase plugin is part of a set of tools for working with Sierra data through Datasette:
ETL framework — SQL-first job definitions that stream data from Sierra's Postgres into SQLite. Collection data, patron data, items in transit.
Staff authentication plugin — validates credentials against Sierra's user API, manages roles (viewer / staff / admin) and permissions.
Extracts Sierra's 18 internal user management tables (users, roles, permissions, locations, branches) into SQLite for browsing.
We're solving the same problem for different ILS platforms from different angles — structured form vs. free text, custom React dashboard vs. Datasette, complete lifecycle vs. deep enrichment pipeline. I think there's a lot we could share.
Ray Voelker — github.com/rayvoelker · github.com/chimpy-me