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
- Host: GitHub
- URL: https://github.com/it-at-m/bib-pods
- Owner: it-at-m
- License: mit
- Created: 2026-03-03T13:59:40.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-07-07T18:10:10.000Z (2 days ago)
- Last Synced: 2026-07-07T20:07:07.902Z (2 days ago)
- Topics: data-literacy, data-sovereignty, library, personalization, solid-pods
- Language: JavaScript
- Homepage: https://it-at-m.github.io/bib-pods/
- Size: 423 KB
- Stars: 10
- Watchers: 0
- Forks: 0
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
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