Suggest-a-Purchase

Two approaches to the same patron workflow — a conversation starter

This page is not linked from the main site. It's a personal reference for a conversation between Ray Voelker and Somalia Jamall at IUG 2026.

Auto-Suggest-a-Purchase

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.

Polaris React 19 PHP 8.2 MariaDB Python Docker

GitHub · AGPL-3.0

Datasette Suggest-Purchase

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.

Sierra Datasette Python SQLite Open Library

GitHub

How Each System Works

Jacksonville (Polaris)

PatronCard + PIN login
FormTitle, Author, ISBN, Format
StaffReview in React dashboard
Nightly BotSearches catalog by ISBN
Auto-HoldPlaces hold via Polaris API
ClosedDetects checkout, emails patron

chimpy-me (Sierra)

PatronBarcode + PIN login
Free TextPaste a link, type a title, anything
Bot: ExtractISBN validation, URL parsing, heuristics
Bot: SearchTiered catalog lookup
Bot: EnrichOpen Library metadata
StaffReview in Datasette

Side by Side

AspectJacksonville (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
Email 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

Where We Complement Each Other

What I'd love to borrow from yours

  • The complete hold lifecycle — your nightly script handles the full loop: catalog search → hold placement → checkout detection → close. My Stage 5 needs exactly this.
  • eBook → Libby redirect — elegant way to handle digital formats without creating suggestions staff can't fulfill.
  • Email at every stage — patron communication is critical and I haven't built it yet.
  • Real production data — 400 patrons is real validation. I'd love to hear what surprised you.

What might be useful from mine

  • Evidence extraction — ISBN check-digit validation, Amazon/Goodreads URL parsing, heuristic title/author detection could reduce staff triage time.
  • Open Library enrichment — free metadata + cover images for items not yet in the catalog.
  • Datasette as the staff UI — gets you filtering, SQL, CSV export without building a custom dashboard. Could complement or replace the React admin.
  • Audit trail via event table — every action logged with actor + timestamp instead of appending to a notes field.

The Broader chimpy-me Ecosystem

The suggest-purchase plugin is part of a set of tools for working with Sierra data through Datasette:

chimpy-extract

ETL framework — SQL-first job definitions that stream data from Sierra's Postgres into SQLite. Collection data, patron data, items in transit.

GitHub

datasette-sierra-ils-auth

Staff authentication plugin — validates credentials against Sierra's user API, manages roles (viewer / staff / admin) and permissions.

GitHub

sierra-users-datasette

Extracts Sierra's 18 internal user management tables (users, roles, permissions, locations, branches) into SQLite for browsing.

GitHub

Let's Talk

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 Voelkergithub.com/rayvoelker · github.com/chimpy-me