Cloud-based RFID circulation, tagging, and gate monitoring for libraries. BookWaves pairs a modern UI with pluggable RFID middleware and LMS connectors to deliver self-service checkout, returns, gate alarms, and tag management in one console.
Try BookWaves without hardware at https://bookwaves-demo.vercel.app
- Login with any username/password.
- Stores data in browser memory only.
- Useses a simulated RFID reader and mock LMS, see bottom right corner for simulation deck.
- Self-checkout – Borrow, return, list items on the reader, and view patron accounts with LMS-backed status.
- Security gate – Live monitoring with audio/visual alerts for secured items.
- Reader console – Inspect items on a reader, secure/unsecure, edit media IDs, clear, or kill tags.
- Tagging – Batch-initialize blank tags from barcodes.
- Admin tooling – Pick middleware/reader pairs, inspect config, and exercise LMS endpoints via a test console.
- LMS integration – Integrated into Alma staff UI via official Alma RFID integration.
- Try-it-first – Built-in mock LMS and mock reader for demos without hardware; Feig middleware supported for production.
- Install prerequisites: Node 20+ and pnpm (
npm i -g pnpm). - Create config:
cp config.example.yaml config.yamland adjust values (see Configuration below). - Install deps:
pnpm install. - Run dev server:
pnpm dev(opens on http://localhost:5173).
There are 2 docker-compose files:
docker-compose.yml: Basic setup for testing BookWaves with mock middleware and LMS.docker/docker-compose.yml: Complete setup with BookWaves Feig middleware container and an nginx reverse proxy.
See the config files in the folder docker/ for more example configuration.
Start with:
docker compose up -dAccess BookWaves at http://localhost:80.
Copy config.example.yaml to config.yaml and edit:
Notes
- Keep
config.yamlout of git. SetCONFIG_FILE_PATHif you store it elsewhere. middleware_instancesdrives all reader pickers; at least one entry is required. The mock entry works without hardware.- Alma requires a valid API key; mock LMS needs no credentials. Login mode controls the checkout dialogs.
- Tagging whitelist blocks writes unless the EPC starts with an allowed prefix (override toggle available in UI).
theme.page_backgroundslets you override route background gradients (home,checkout,gate,reader,tagging,admin).theme.logolets you override the header logo (use an absolute path like/branding/logo.pngor anhttps://URL).
- Checkout: Menu for Borrow, Return, List, Account. Borrow/Return automatically call LMS actions and unsecure/secure tags on success. Pass
middleware_id/reader_id/checkout_profile_idin the URL to select the reader and LMS config to use. - Security Gate: Live monitor; shows secured items with siren UI/audio. Use
gate.show_all_detected_itemsto filter view. Passmiddleware_id/reader_idin the URL to select the reader to use. - Reader: Inventory snapshot, secure/unsecure, edit media IDs, clear tags, kill. Uses the currently selected reader from the selection dropdowns.
- Tagging: Polls a single tag, writes a media ID, enforces optional whitelists. Uses the currently selected reader from the selection dropdowns.
- Admin: Displays effective config, lists middleware readers, and offers an LMS test console (login, account, media lookup, lend/return, health).
- LMS Integration: Alma integration adds BookWaves as an RFID option in the staff UI (requires proper setup in Alma).
- Feig: Talks to the BookWaves Feig middleware. Configure a middleware entry with
type: feigand its baseurl. OptionalFEIG_INTERNAL_URLlets the app call the middleware over container networking. - Mock: Simulated reader with random items; supports inventory, secure/unsecure, edit, clear, initialize, analyze, and kill.
- Persistent selection: Choosing a reader in the Admin/Reader/Tagging pages stores
selectedMiddleware/selectedReaderinlocalStorage. - URL selection: Gate and Checkout use
?middleware_id=ID&reader_id=NAMEquery params (useful to fix a certain reader in a kiosk environment). Checkout also requirescheckout_profile_id=IDto select the LMS checkout profile (aka the library/circ desk combo for Alma). - Mock helpers: Quick links set
middleware_id=mock1&reader_id=MockReader1.
- Alma: Uses Alma Web Services (
api-eu.hosted.exlibrisgroup.comby default). Borrow/return, account, loans, and health checks are supported. Requireslms.api_keyand also checkout profiles for library/circ desk mapping that are used when performing checkout/return operations. The reader matching for the staff UI integration is done via the Alma Integration Profile setup (see below). - Mock: In-memory responses for demos; always healthy and requires no auth.
- Go to https://developers.exlibrisgroup.com/manage/keys/ and log in with your Alma developer account.
- Click Add API Key.
- Select (at least) the following scopes:
- Bibs:
Read/write - Users:
Read/write
- Bibs:
- You have BookWaves running and accessible from your local Browser
- BooWaves uses an HTTPs URL (self-signed certificates are supported)
- In Alma (as an Admin), navigate to Configuration → General → Integration Profiles.
- Click Add Integration Profile.
- Fill in the fields as follows:
- General Information
- Code: RFID (or any other unique identifier)
- Name: BookWaves (or any other descriptive name)
- Integration Type: RFID
- Syste: Other
- Actions
- Active: Checked
- Server URL: https://YOUR-BOOKWAVES-HOST/api/alma
- Handle Multple Items: Checked
- Item Information Update: Checked
- (nothing to do in the 3 sub-menus)
- Contact Info
- (nothing to do here)
- Save the Integration Profile.
- In Alma (as an Admin), navigate to Configuration
- In the top dropdown ("Condiguring"), select the library where the RFID reader is located.
- Navigate to Fulfillment → Circulation Desks.
- Select the desired circulation desk or create a new one.
- In the RFID Information set the IP address to the address (without port) of the RFID reader (the same as configtured in the Alma middleware configuration file).
- Save the changes.
In Alma, when at a circulation desk with an RFID reader configured, you should see a new button RFID in the top right of the UI. Clicking this button will start the Alma RFID popup and also display RFID buttons next to e.g. the search box, the checkout and return buttons, etc.
- “Reader not configured”: Ensure
middleware_instancesis populated and a reader is selected or provided via query params. - LMS calls failing: Verify
lms.typeand API key, and use Admin → LMS Test Console to confirm connectivity. - Gate shows no secured items: Set
gate.show_all_detected_items: falseif you want only secured tags highlighted.
The following sections are for developers who want to build, modify, or contribute to the project.
-
Install Docker with buildx support (included in Docker Desktop)
-
Authenticate with GitHub Container Registry (for pushing images):
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
Or create a Personal Access Token (PAT) with
write:packagesscope.
docker buildx build --tag ghcr.io/lukaslerche/bookwaves:latest --load .Note: The --load flag imports the image into your local Docker daemon for testing.
-
Build and push with version tags:
docker buildx build --platform linux/amd64,linux/arm64 \ --tag ghcr.io/lukaslerche/bookwaves:latest \ --tag ghcr.io/lukaslerche/bookwaves:1.4.0 \ --push . -
Verify the push by checking the GitHub Container Registry:
- Navigate to your GitHub profile → Packages
- Find
bookwavespackage
-
Make the package public (optional):
- Go to package settings
- Change visibility to public