{"id":51533215,"url":"https://github.com/it-at-m/bib-pods","last_synced_at":"2026-07-09T05:30:24.067Z","repository":{"id":341839988,"uuid":"1171688995","full_name":"it-at-m/bib-pods","owner":"it-at-m","description":"Bibliotheks-Pods: datensouveräne personalisierte Empfehlungen in Bibliotheken","archived":false,"fork":false,"pushed_at":"2026-07-07T18:10:10.000Z","size":433,"stargazers_count":10,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-07T20:07:07.902Z","etag":null,"topics":["data-literacy","data-sovereignty","library","personalization","solid-pods"],"latest_commit_sha":null,"homepage":"https://it-at-m.github.io/bib-pods/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/it-at-m.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T13:59:40.000Z","updated_at":"2026-07-07T11:34:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/it-at-m/bib-pods","commit_stats":null,"previous_names":["it-at-m/bib-pods"],"tags_count":0,"template":false,"template_full_name":"it-at-m/oss-repository-en-template","purl":"pkg:github/it-at-m/bib-pods","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Fbib-pods","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Fbib-pods/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Fbib-pods/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Fbib-pods/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/it-at-m","download_url":"https://codeload.github.com/it-at-m/bib-pods/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/it-at-m%2Fbib-pods/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35288805,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-literacy","data-sovereignty","library","personalization","solid-pods"],"created_at":"2026-07-09T05:30:23.154Z","updated_at":"2026-07-09T05:30:24.008Z","avatar_url":"https://github.com/it-at-m.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bibliotheks-Pods\n\nBibliotheksnutzer*innen soll es ermöglicht werden persönliche Daten wie ihre Präferenzen und Ausleihhistorie in einem [Solid Pod](https://solidproject.org/) zu verwalten.\nDiese persönlichen Daten können für personalisierte Angebote und Empfehlungen genutzt werden, ohne dass die Bibliothek diese Daten selbst speichern muss. \n\nDie [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.\nNachnutzung durch andere Bibliotheken wird von Anfang an angestrebt.\n\nDas 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.\n\nDas Projekt wird unterstützt durch die Abteilung [Media \u0026 Digital bei der Münchner Stadtbibliothek](https://www.muenchner-stadtbibliothek.de/daten-algorithmen) und dem [OSPO](https://opensource.muenchen.de/de/ospo.html).\n\nAuch 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''.\n\n## Architektur\n\n*vorläufig*\n\n```mermaid\nflowchart TD\n    classDef nonArch fill:#dcfce7,stroke:#16a34a,color:#14532d\n    classDef nonArchDashed fill:#dcfce7,stroke:#16a34a,color:#14532d,stroke-dasharray: 5 5\n    classDef planned stroke:#9ca3af,color:#6b7280,stroke-dasharray: 5 5\n    classDef ghost fill:none,stroke:none,color:#374151\n    style moreUseCases stroke:#9ca3af,color:#6b7280,stroke-dasharray: 5 5\n\n    subgraph msb[\"\u003ch2\u003eMünchner Stadtbibliothek\u003c/h2\u003e\"]\n        data[\"\u003cb\u003eDatenquellen\u003c/b\u003e\n            #bull;\u0026nbsp;Katalogdaten (OAI)\n                \u003ci\u003edata-bib.muenchen.de\u003c/i\u003e\n            #bull; Veranstaltungen (VADB)\n            #bull; Weitere (z.B. Blogposts)\n        \"]\n        site[\"\u003cb\u003eWebseite\u003c/b\u003e\"]\n        typo3[\"\u003cb\u003eTypo3 Plugin\u003c/b\u003e\n            #bull; Interessensverwaltung\n            #bull; Empfehlungsmodul\n            #bull; One-Klick-Modul\n        \"]\n        index[\"\u003cb\u003eIndex\u003c/b\u003e: ElasticSearch\"]\n        typo3 --\u003e|speist persönliche Daten in Suche ein| index\n        index --\u003e|indiziert| data\n        site --\u003e|integriert| typo3\n    end\n\n    subgraph moreUseCases[\"\u003ch2\u003eWeitere Anwendungen\u003c/h2\u003e\"]\n        connectBtn[\"Integration eines\u003cbr\u003e\u003cb\u003eConnect your Pod\u003c/b\u003e\u003cbr\u003eButtons\"]\ntextNode[\"\u003cdiv align='left'\u003e\n\u003cb\u003eDas könnten beispielsweise sein:\u003c/b\u003e\n#bull; Weitere Bibliotheken\n#bull; Restaurants in Kiel\n#bull; Berliner Volkshochschulen\n#bull; Angebote für Erstsemester-Studierende einer Uni\n→ Letztlich alle Apps und Services, die Angebote personalisieren möchten, ohne Nutzer*innendaten selbst zu speichern: \u003ci\u003ePrivacy-preserving Personalization-as-a-Service\u003c/i\u003e\n\u003cspan style='opacity:0'\u003exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\u003c/span\u003e\n\u003c/div\u003e\"]:::ghost\n    end\n\n    subgraph cori[\"\u003ch2\u003eCORI\u003c/h2\u003eContextual Relational Infrastructure\"]\n        client[\"\u003cb\u003eClient\u003c/b\u003e\n            \u003csmall\u003e\u003ci\u003eserverless\u003c/i\u003e\u003c/small\u003e\n            #bull; Profile verwalten\n            #bull; Import/Export\n            #bull; Zugriffshistorie\n        \"]\n        psi[\"\u003cb\u003eProfile Storage Interface\u003c/b\u003e\"]\n        admin[\"\u003cb\u003eAdmin\u003c/b\u003e\u003cbr\u003e#bull;\u0026nbsp;Gesamtvokabular\u0026nbsp;verwalten\u003cbr\u003e#bull;\u0026nbsp;Änderungen\u0026nbsp;kommunizieren\u003cbr\u003e#bull;\u0026nbsp;Liste\u0026nbsp;teilnehmender\u0026nbsp;Apps\"]\n        exec[\"\u003cb\u003eExecution Engine\u003c/b\u003e\"]:::planned\n        integrate[\"\u003cb\u003eIntegration SDK\u003c/b\u003e\"]\n        client --\u003e|nutzt| integrate\n        integrate \u003c--\u003e|read/write| psi\n        integrate -.-\u003e exec\n        exec -.-\u003e|führt Verarbeitungslogik aus| psi\n    end\n\n    bibComm[\"\u003cb\u003eBibliotheksübergreifende\u0026nbsp;Zusammenarbeit\u003c/b\u003e\n        #bull;\u0026nbsp;Gemeinsame\u0026nbsp;Vokabularentwicklung\n        #bull;\u0026nbsp;Gemeinsame\u0026nbsp;Feature-Entwicklung\n    \"]:::nonArch\n\n    pod1[\"\u003cb\u003eManaged Solid Pod\u003c/b\u003e\"]\n    pod2[\"\u003cb\u003eEigener Solid Pod\u003c/b\u003e\"]\n    pod3[\"\u003cb\u003eWeitere\u003c/b\u003e\n        #bull; EUDI Wallet?\n        #bull; Local Storage\n        #bull; In-Memory\n    \"]:::planned\n\n    communityInput[\"\u003cb\u003eWeitere Kuratierungs- und Empfehlungsquellen\u003c/b\u003e\n#bull;\u0026nbsp;Von\u0026nbsp;anderen\u0026nbsp;Nutzer*innen\u0026nbsp;hinterlegte\u0026nbsp;Muster\u0026nbsp;wie manuell\u0026nbsp;kuratierte\u0026nbsp;Empfehlungen\u0026nbsp;oder\u0026nbsp;lokale\u0026nbsp;Events\n#bull;\u0026nbsp;Weitere\u0026nbsp;Empfehlungsalgorithmen\u0026nbsp;via\u0026nbsp;Plugins\n    \"]:::nonArchDashed\n\n    psi --\u003e pod1\n    psi --\u003e pod2\n    psi --\u003e pod3\n\n    cori ~~~ msb\n    msb ~~~ spacer[\" \"] ~~~ cori\n    style spacer fill:none,stroke:none\n    typo3 --\u003e|nutzt| integrate\n    connectBtn --\u003e|nutzt| integrate\n    msb --\u003e|koordiniert| bibComm\n    communityInput --\u003e|fließen ein| typo3\n```\n\n\n## Repo-Struktur\n\n- **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).\n- **`interim-index/`**: Übergangslösung: ein lokaler Solr-Index aus den OAI-Katalogdaten der Münchner Stadtbibliothek. Enthält den Importer und einen Allowlist-Proxy.\n- **`solid-server/`**: lokaler Community Solid Server.\n\n### Die Schichten der Bibliotheks-App\n\n```\n  cori-sdk/          ← generic integration SDK source\n  bib-src/           ← library-domain source\n  docs/              ← assembler #1\n  typo3/bib_pods/    ← assembler #2\n  api/               ← assembler #3\n```\n\n- **`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.\n- **`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.\n- **`docs/`**: arbeitet Aspekte von `bib-src` über GitHub Pages heraus im Sinne einer Dokumentation + Demo + selber experimentieren.\n- **`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.\n- **`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.\n\n### Hilfsskripte\n\n- **`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`.\n- **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.\n- **`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.\n- **`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.\n\n## Contributing\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf 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\".\nDon't forget to give the project a star! Thanks again!\n\n1. Open an issue with the tag \"enhancement\"\n2. Fork the Project\n3. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n4. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n5. Push to the Branch (`git push origin feature/AmazingFeature`)\n6. Open a Pull Request\n\nMore about this in the [CODE_OF_CONDUCT](/CODE_OF_CONDUCT.md) file.\n\n\n## License\n\nDistributed under the MIT License. See [LICENSE](LICENSE) file for more information.\n\n\n## Contact\n\nit@M - opensource@muenchen.de\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fit-at-m%2Fbib-pods","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fit-at-m%2Fbib-pods","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fit-at-m%2Fbib-pods/lists"}