
Introduction Link to heading
A few weeks ago, I joined the board of my local AVIS branch. Our AVIS needs to organize about 30-40 slots for blood donations per month, plus variable plasma donations based on the availability of the transfusion center.
A program should allow us to quickly identify people eligible for donation and, once contacted, to quickly enter the reservation.
In the current system, there is nothing fast or simple.
Current situation Link to heading
We are currently provided with two distinct software systems (Emodonor, AvisNet). One should be obsolete, but it still maintains functionalities that are completely missing from the “new” system. The latest software is developed in ASP.NET Web Forms with heavy use of jQuery 2 and, obviously, does not expose any API.
The booking process Link to heading
The procedure for organizing a donation day is almost entirely manual:
- Download a massive Excel file from the platform
- Manually select eligible donors, according to precise criteria that, however, are not reported or easily filterable in the sheets
- Contact each individual donor via WhatsApp to verify availability
- For each available donor, access the website and complete the booking in several minutes
- Hope not to have to suspend donors, or perform other operations that require continuously pinging the provincial AVIS by phone
The user experience is decidedly problematic and makes the process extremely long and laborious.
My plan Link to heading
Create an application that takes two Excel files as input (both at first startup and for updates with a merge system), populates a local database and presents filtered tables, plus some useful automation features.
Since this need coincides with the release of Claude 4 Sonnet, I chose to use it to develop the project and test its capabilities.
Let’s move on to the initial analysis
PrenotAVIS Technical Analysis Link to heading
Application Objective (offline, cross-platform, minimal) Link to heading
PrenotAVIS is an application for offline management of blood and plasma donation appointments. All data remains local, without external synchronization.
The app must be cross-platform: function as a web application, and be compilable (at a later time) for Android and iOS.
The user base is limited (~250 active donors), so performance is not a critical constraint.
Technology Stack Link to heading
Frontend Link to heading
Technology | Description |
---|---|
Angular | Modern, modular web framework, I know it well |
Angular Material | Minimal, accessible and responsive UI with predefined components (forms, dialogs, date picker, etc.) |
Capacitor | Allows compiling the app for Android/iOS starting from Angular |
Local Database Link to heading
Technology | Description |
---|---|
SQLite | Embedded, lightweight and reliable database, ideal for local data |
@capacitor-community/sqlite | Capacitor plugin that enables SQLite usage on Android, iOS and browser (via IndexedDB) |
SQLite will be the core of local data storage, without the need for a backend.
For now, I’m not interested in multi-user functionality, in the future I’ll evaluate options for database sharing without going through the cloud and therefore maximum privacy guarantee.
CSV / Backup Link to heading
To process Excel input, I need SheetJS
No external libraries are used for CSVs. All management is done with native JavaScript, for example:
Function | Technique |
---|---|
CSV file reading | HTML FileReader + manual parsing (split("\n"), split(",")) |
CSV export | String generation via Array.map() + join(), Blob creation for download |
Backup and restore | CSV as exchange/import format between installations |
For dates, I avoid using libraries like date-fns or moment, native JS Date objects are sufficient.
Local Database Structure (SQLite) Link to heading
Three fundamental tables: donatori, giornate_donazione, prenotazioni.
Table donatori Link to heading
Contains demographic, clinical and contact information.
Table giornate_donazione Link to heading
Each event where donations are collected.
Table prenotazioni Link to heading
Links each donor to one or more days, with a time slot.
Import / Export (local backup) Link to heading
The app allows:
- Initial import from two XLSX files (donor history and active donors)
- Periodic backup export to CSV (future incremental and automatic)
- No external connections, everything happens locally
Future Extensions Link to heading
- Automatic filling of appointments with eligible donors
- Visualization of available slots
- Basic reporting: donations made, suspended donors, etc.
- Automations to speed up donor contact (preset messages, copy to clipboard on click)
Conclusion Link to heading
This minimalist architecture offers:
- 100% offline, guaranteed privacy
- Cross-platform app on web, Android and iOS
- Elegant and simple user interface (Material)
- Very few dependencies → maximum stability and control