An open API service indexing awesome lists of open source software.

https://github.com/it-at-m/bib-pods

Bibliotheks-Pods: datensouveräne personalisierte Empfehlungen in Bibliotheken
https://github.com/it-at-m/bib-pods

data-literacy data-sovereignty library personalization solid-pods

Last synced: about 20 hours ago
JSON representation

Bibliotheks-Pods: datensouveräne personalisierte Empfehlungen in Bibliotheken

Awesome Lists containing this project

README

          

# Bibliotheks-Pods

Bibliotheksnutzer*innen soll es ermöglicht werden persönliche Daten wie ihre Präferenzen und Ausleihhistorie in einem [Solid Pod](https://solidproject.org/) zu verwalten.
Diese persönlichen Daten können für personalisierte Angebote und Empfehlungen genutzt werden, ohne dass die Bibliothek diese Daten selbst speichern muss.

Die [Webseite der Münchner Stadtbibliothek](https://www.muenchner-stadtbibliothek.de/) basiert auf [typo3](https://opensource.muenchen.de/de/software/typo3.html) und kann mit einem Plug-in erweitert werden.
Nachnutzung durch andere Bibliotheken wird von Anfang an angestrebt.

Das System wird so konzipiert, dass perspektivisch weitere Apps und Services dem Ökosystem beitreten können, um ihre Angebote/Informationen zu personalisieren, ohne selbst Nutzer*innendaten speichern zu müssen.

Das Projekt wird unterstützt durch die Abteilung [Media & Digital bei der Münchner Stadtbibliothek](https://www.muenchner-stadtbibliothek.de/daten-algorithmen) und dem [OSPO](https://opensource.muenchen.de/de/ospo.html).

Auch das Positionspapier [Digitale Souveränität mit Solid, für interoperable und dezentrale Datenökosysteme in der Verwaltung](https://positionspapier-solid-in-der-verwaltung-29ff8c.usercontent.opencode.de/) der Stabsstelle Digitalisierung der Landeshauptstadt Kiel, empfiehlt in seinen Handlungsempfehlungen ''auch die Länder und Kommunen sollten Solid als interoperable Basistechnologie aktiv erproben und in ihre Digitalstrategien integrieren''.

## Architektur

*vorläufig*

```mermaid
flowchart TD
classDef nonArch fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef nonArchDashed fill:#dcfce7,stroke:#16a34a,color:#14532d,stroke-dasharray: 5 5
classDef planned stroke:#9ca3af,color:#6b7280,stroke-dasharray: 5 5
classDef ghost fill:none,stroke:none,color:#374151
style moreUseCases stroke:#9ca3af,color:#6b7280,stroke-dasharray: 5 5

subgraph msb["

Münchner Stadtbibliothek

"]
data["Datenquellen
#bull; Katalogdaten (OAI)
data-bib.muenchen.de
#bull; Veranstaltungen (VADB)
#bull; Weitere (z.B. Blogposts)
"]
site["Webseite"]
typo3["Typo3 Plugin
#bull; Interessensverwaltung
#bull; Empfehlungsmodul
#bull; One-Klick-Modul
"]
index["Index: ElasticSearch"]
typo3 -->|speist persönliche Daten in Suche ein| index
index -->|indiziert| data
site -->|integriert| typo3
end

subgraph moreUseCases["

Weitere Anwendungen

"]
connectBtn["Integration eines
Connect your Pod
Buttons"]
textNode["

Das könnten beispielsweise sein:
#bull; Weitere Bibliotheken
#bull; Restaurants in Kiel
#bull; Berliner Volkshochschulen
#bull; Angebote für Erstsemester-Studierende einer Uni
→ Letztlich alle Apps und Services, die Angebote personalisieren möchten, ohne Nutzer*innendaten selbst zu speichern: Privacy-preserving Personalization-as-a-Service
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
"]:::ghost
end

subgraph cori["

CORI

Contextual Relational Infrastructure"]
client["Client
serverless
#bull; Profile verwalten
#bull; Import/Export
#bull; Zugriffshistorie
"]
psi["Profile Storage Interface"]
admin["Admin
#bull; Gesamtvokabular verwalten
#bull; Änderungen kommunizieren
#bull; Liste teilnehmender Apps"]
exec["Execution Engine"]:::planned
integrate["Integration SDK"]
client -->|nutzt| integrate
integrate <-->|read/write| psi
integrate -.-> exec
exec -.->|führt Verarbeitungslogik aus| psi
end

bibComm["Bibliotheksübergreifende Zusammenarbeit
#bull; Gemeinsame Vokabularentwicklung
#bull; Gemeinsame Feature-Entwicklung
"]:::nonArch

pod1["Managed Solid Pod"]
pod2["Eigener Solid Pod"]
pod3["Weitere
#bull; EUDI Wallet?
#bull; Local Storage
#bull; In-Memory
"]:::planned

communityInput["Weitere Kuratierungs- und Empfehlungsquellen
#bull; Von anderen Nutzer*innen hinterlegte Muster wie manuell kuratierte Empfehlungen oder lokale Events
#bull; Weitere Empfehlungsalgorithmen via Plugins
"]:::nonArchDashed

psi --> pod1
psi --> pod2
psi --> pod3

cori ~~~ msb
msb ~~~ spacer[" "] ~~~ cori
style spacer fill:none,stroke:none
typo3 -->|nutzt| integrate
connectBtn -->|nutzt| integrate
msb -->|koordiniert| bibComm
communityInput -->|fließen ein| typo3
```

## Repo-Struktur

- **Bibliotheks-App**: die Funktionalität, mit der Nutzer*innen ihre Profile verwalten und personalisierte Empfehlungen erhalten. Aus einer gemeinsamen Codebasis über drei Auslieferungsziele bereitgestellt: die Demo-Seiten (`docs`), die in die Bibliotheksseite eingebundene TYPO3-Extension (`typo3/bib_pods`) und die HTTP-API (`api`). Aufgeteilt in fünf Schichten (siehe unten).
- **`interim-index/`**: Übergangslösung: ein lokaler Solr-Index aus den OAI-Katalogdaten der Münchner Stadtbibliothek. Enthält den Importer und einen Allowlist-Proxy.
- **`solid-server/`**: lokaler Community Solid Server.

### Die Schichten der Bibliotheks-App

```
cori-sdk/ ← generic integration SDK source
bib-src/ ← library-domain source
docs/ ← assembler #1
typo3/bib_pods/ ← assembler #2
api/ ← assembler #3
```

- **`cori-sdk/`**: headless Integration-SDK. Enthält die Storage-Abstraktion mit Backends für lokalen Browser-Speicher und Solid-Pods, das Meta-Vokabular (`UserAction`, `Message`) und RDF-Hilfsfunktionen.
- **`bib-src/`**: bibliotheksspezifische Schicht. Baut auf cori-sdk auf und stellt das Bibliotheks-Pods-Widget (Anmeldung, Benachrichtigungen und – auf der Hauptseite – Speicherortwahl, Profil und Empfehlungen), den Buch-Prompt (Folgefragen beim Klick auf ein Buch), die Buch-Dekoration auf Katalogseiten, die Solr-gestützten Empfehlungen sowie das domänenspezifische Vokabular (`favoriteAuthor`, `RecommendationStrategy`, …) bereit.
- **`docs/`**: arbeitet Aspekte von `bib-src` über GitHub Pages heraus im Sinne einer Dokumentation + Demo + selber experimentieren.
- **`typo3/bib_pods/`**: bündelt `bib-src` zur TYPO3-Extension, die in der lokalen Instanz und auf der Webseite der Münchner Stadtbibliothek eingebunden wird.
- **`api/`**: minimaler HTTP-Server, der `bib-src` headless einbindet: Nutzer*innen senden ihr Profil-Turtle und erhalten Empfehlungen als JSON zurück. Dieselbe Empfehlungslogik wie im Plugin, nur anders ausgeliefert.

### Hilfsskripte

- **`repo.sh {install|build|clean}`**: Sammelaktion über alle npm-Pakete im Repo: `cori-sdk`, `bib-src`, `docs`, `typo3/bib_pods`, `api`, `solid-server`, `interim-index`.
- **Vorverarbeitung der Vokabulare**: `.ttl`-Dateien werden als generierte `.ttl.js`-Geschwister gebündelt (`npm run ttl-to-js` in `cori-sdk` bzw. `bib-src`; läuft bei `npm install` automatisch, nach dem Editieren einer `.ttl` manuell nötig). Die Auswahllisten für Profil-Dropdowns (z.B. `bib-src/resources/genre-values.ttl`) sind committete Snapshots aus dem Katalog-Index: `npm run extract-value-sets` in `bib-src` erzeugt sie neu (inkl. `ttl-to-js`) — nach jedem Reindex ausführen.
- **`typo3/script.sh {setup|start|stop|flush}`**: lokales TYPO3-Setup via DDEV. `setup` baut eine frische TYPO3-Installation auf, mountet `bib_pods` als Extension und startet Frontend + Backend.
- **`typo3/sync.sh {pull|push|diff}`** — spiegelt `typo3/bib_pods` zu/von einem entfernten SFTP-Pfad (für Deployments auf den TYPO3-Server der Bibliothek). Zugangsdaten kommen aus `.syncdetails` neben dem Skript.

## Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.

If you have a suggestion that would make this better, please open an issue with the tag "enhancement", fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement".
Don't forget to give the project a star! Thanks again!

1. Open an issue with the tag "enhancement"
2. Fork the Project
3. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
4. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
5. Push to the Branch (`git push origin feature/AmazingFeature`)
6. Open a Pull Request

More about this in the [CODE_OF_CONDUCT](/CODE_OF_CONDUCT.md) file.

## License

Distributed under the MIT License. See [LICENSE](LICENSE) file for more information.

## Contact

it@M - opensource@muenchen.de