home.social

#digitalemundigkeit — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #digitalemundigkeit, aggregated by home.social.

  1. „Ich hielt das Fediverse lange für Nerd-Spielzeug. Keine Promis, keine Reichweiten-Maschinerie, keine „Personal Brands“. Doch genau das wurde plötzlich seine Stärke: Während US-Medien einknickten, Threads leer blieb und Bluesky Twitter cosplayte, wurde das Fediverse für viele zum einzigen Ort für verlässliche Infos, kuratierte Links und echte Diskussionen. Spannender Perspektivwechsel.“

    #Fediverse #Mastodon #SocialMedia #DigitaleMündigkeit #Dezentralisierung

    matduggan.com/boy-i-was-wrong- (Artikel in englischer Sprache)

  2. Digitale Mündigkeit, informationelle Selbstbestimmung, individuelle und gesellschaftliche digitale Souveränität, das ist das Gegenteil von Überwachung, Ausforschung und Manipulation. Die digital unterstützte Repression und Kontrolle sind Teil des Kriegs Reich gegen Arm, den die Reichen und Mächtigen begonnen haben, um die Krise des Kapitalismus und des Kapitals zu bewältigen. Deshalb ist digitale Mündigkeit, wie sie auch beim DIDay / Digitalen Unabhängigkeitstag gecoacht wird, Klassenkampf. Nicht jede.r DIDay-Aktive wird das so sehen, und es ist auch nicht erstrebenswert, am DIDay unbedingt diese Diskussion zu führen. Am ersten Sonntag im Monat konzentriere ich mich auf die praktische Hilfe. Das ist bloß die Bedeutung, die der DIDay für mich hat.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  3. Digitale Mündigkeit, informationelle Selbstbestimmung, individuelle und gesellschaftliche digitale Souveränität, das ist das Gegenteil von Überwachung, Ausforschung und Manipulation. Die digital unterstützte Repression und Kontrolle sind Teil des Kriegs Reich gegen Arm, den die Reichen und Mächtigen begonnen haben, um die Krise des Kapitalismus und des Kapitals zu bewältigen. Deshalb ist digitale Mündigkeit, wie sie auch beim DIDay / Digitalen Unabhängigkeitstag gecoacht wird, Klassenkampf. Nicht jede.r DIDay-Aktive wird das so sehen, und es ist auch nicht erstrebenswert, am DIDay unbedingt diese Diskussion zu führen. Am ersten Sonntag im Monat konzentriere ich mich auf die praktische Hilfe. Das ist bloß die Bedeutung, die der DIDay für mich hat.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  4. Digitale Mündigkeit, informationelle Selbstbestimmung, individuelle und gesellschaftliche digitale Souveränität, das ist das Gegenteil von Überwachung, Ausforschung und Manipulation. Die digital unterstützte Repression und Kontrolle sind Teil des Kriegs Reich gegen Arm, den die Reichen und Mächtigen begonnen haben, um die Krise des Kapitalismus und des Kapitals zu bewältigen. Deshalb ist digitale Mündigkeit, wie sie auch beim DIDay / Digitalen Unabhängigkeitstag gecoacht wird, Klassenkampf. Nicht jede.r DIDay-Aktive wird das so sehen, und es ist auch nicht erstrebenswert, am DIDay unbedingt diese Diskussion zu führen. Am ersten Sonntag im Monat konzentriere ich mich auf die praktische Hilfe. Das ist bloß die Bedeutung, die der DIDay für mich hat.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  5. Digitale Mündigkeit, informationelle Selbstbestimmung, individuelle und gesellschaftliche digitale Souveränität, das ist das Gegenteil von Überwachung, Ausforschung und Manipulation. Die digital unterstützte Repression und Kontrolle sind Teil des Kriegs Reich gegen Arm, den die Reichen und Mächtigen begonnen haben, um die Krise des Kapitalismus und des Kapitals zu bewältigen. Deshalb ist digitale Mündigkeit, wie sie auch beim DIDay / Digitalen Unabhängigkeitstag gecoacht wird, Klassenkampf. Nicht jede.r DIDay-Aktive wird das so sehen, und es ist auch nicht erstrebenswert, am DIDay unbedingt diese Diskussion zu führen. Am ersten Sonntag im Monat konzentriere ich mich auf die praktische Hilfe. Das ist bloß die Bedeutung, die der DIDay für mich hat.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  6. Digitale Mündigkeit, informationelle Selbstbestimmung, individuelle und gesellschaftliche digitale Souveränität, das ist das Gegenteil von Überwachung, Ausforschung und Manipulation. Die digital unterstützte Repression und Kontrolle sind Teil des Kriegs Reich gegen Arm, den die Reichen und Mächtigen begonnen haben, um die Krise des Kapitalismus und des Kapitals zu bewältigen. Deshalb ist digitale Mündigkeit, wie sie auch beim DIDay / Digitalen Unabhängigkeitstag gecoacht wird, Klassenkampf. Nicht jede.r DIDay-Aktive wird das so sehen, und es ist auch nicht erstrebenswert, am DIDay unbedingt diese Diskussion zu führen. Am ersten Sonntag im Monat konzentriere ich mich auf die praktische Hilfe. Das ist bloß die Bedeutung, die der DIDay für mich hat.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  7. Hunde schnüffeln beim Hallo-Sagen an ihren Körpern, besonders am Hintern des anderen Hundes. Dabei erfahren sie, wie der.die Andere drauf ist.

    Unsere datenhungrigen Behörden und Unternehmen weltweit würden den gesamten Überwachungsapparat abschaffen und nur noch an unseren Hintern schnüffeln, wenn sie dabei so viel erfahren könnten wie die Hunde. Wäre ein noch schlimmerer Albtraum als die gegenwärtige und wahrscheinliche zukünftige Realität, aber rein visuell finde ich die Vorstellung zum Lachen.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Hunde #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  8. Hunde schnüffeln beim Hallo-Sagen an ihren Körpern, besonders am Hintern des anderen Hundes. Dabei erfahren sie, wie der.die Andere drauf ist.

    Unsere datenhungrigen Behörden und Unternehmen weltweit würden den gesamten Überwachungsapparat abschaffen und nur noch an unseren Hintern schnüffeln, wenn sie dabei so viel erfahren könnten wie die Hunde. Wäre ein noch schlimmerer Albtraum als die gegenwärtige und wahrscheinliche zukünftige Realität, aber rein visuell finde ich die Vorstellung zum Lachen.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Hunde #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  9. Hunde schnüffeln beim Hallo-Sagen an ihren Körpern, besonders am Hintern des anderen Hundes. Dabei erfahren sie, wie der.die Andere drauf ist.

    Unsere datenhungrigen Behörden und Unternehmen weltweit würden den gesamten Überwachungsapparat abschaffen und nur noch an unseren Hintern schnüffeln, wenn sie dabei so viel erfahren könnten wie die Hunde. Wäre ein noch schlimmerer Albtraum als die gegenwärtige und wahrscheinliche zukünftige Realität, aber rein visuell finde ich die Vorstellung zum Lachen.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Hunde #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  10. Hunde schnüffeln beim Hallo-Sagen an ihren Körpern, besonders am Hintern des anderen Hundes. Dabei erfahren sie, wie der.die Andere drauf ist.

    Unsere datenhungrigen Behörden und Unternehmen weltweit würden den gesamten Überwachungsapparat abschaffen und nur noch an unseren Hintern schnüffeln, wenn sie dabei so viel erfahren könnten wie die Hunde. Wäre ein noch schlimmerer Albtraum als die gegenwärtige und wahrscheinliche zukünftige Realität, aber rein visuell finde ich die Vorstellung zum Lachen.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Hunde #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  11. Hunde schnüffeln beim Hallo-Sagen an ihren Körpern, besonders am Hintern des anderen Hundes. Dabei erfahren sie, wie der.die Andere drauf ist.

    Unsere datenhungrigen Behörden und Unternehmen weltweit würden den gesamten Überwachungsapparat abschaffen und nur noch an unseren Hintern schnüffeln, wenn sie dabei so viel erfahren könnten wie die Hunde. Wäre ein noch schlimmerer Albtraum als die gegenwärtige und wahrscheinliche zukünftige Realität, aber rein visuell finde ich die Vorstellung zum Lachen.

    #DiDay #DigitaleMündigkeit #Schnüffler #Datenhunger #Ozapftis #Hunde #Intelligenz #DigitaleSelbstverteidigung #InformationelleSelbstbestimmung #Überwachung #Manipulation #Ausforschung #DigitalerUnabhängigkeitstag #DUTgemacht #DIDit

    di.day

  12. Super-simple Wikis für Zusammenarbeit: ein Klassiker-Werkzeug, das immer noch hilfreich ist

    In Hinblick auf die technologische Entwicklung ist gerade eine spannende Zeit: Während viele Menschen schon länger mit Wissensmanagement-Anwendungen im Sinne eines ‚Second Brain‘ experimentieren, kommt nun noch die Möglichkeit dazu, in solche Systeme auch KI-Technologie zu integrieren oder KI-Tools direkt zu einer Art Bibliothekar dieses zweiten Gedächtnisses zu machen. Die Idee für die Interaktion mit der KI ist dann nicht mehr: „Hier sind viele Dateien. Ich stelle dir Fragen dazu!“, sondern vielmehr: „Hier sind viele Dateien. Bringe sie in ein vernetztes System und verknüpfe jeweils neue Inhalte sinnvoll damit.“ Auf diese Weise bekommen – so die Idee und Hoffnung – KI-Tools eine Art Gedächtnis und sind nicht mehr nur Archiv, das jedes Mal wieder von Neuem durchsucht wird.

    Angesichts solcher Entwicklungen mutet es ziemlich altertümlich an, nach wie vor zugleich auch ein super-simples, weil statisches Wiki-System für die Zusammenarbeit zu verwenden. Ich empfinde das aber gar nicht als Gegensatz. Vielmehr erscheint es mir gerade in solch einer Situation, wo es mehr und mehr automatisierte und aufwendige Technologie gibt, die vielfach zugleich monopolisiert ist, umso wichtiger, immer wieder die Perspektive von selbst-gehosteten und einfachen Tools aufzumachen, die insbesondere Einzelpersonen ohne größere Infrastruktur oder Organisation im Hintergrund und mit wenig Zeit online stellen und warten können. Das ist dann eine sehr realistische und konkrete Perspektive für digitale Mündigkeit.

    Solche Wikis nutze ich – ich habe nachgerechnet – tatsächlich schon seit rund 20 Jahren in der Zusammenarbeit mit anderen Menschen. Die Software hat sich in dieser Zeit verbessert: die Installation ist deutlich niederschwelliger, es braucht nur noch minimale Infrastruktur-Anforderungen und die Arbeit damit funktioniert auch mobil. Die grundsätzlichen Prinzipien sind aber gleich geblieben. Und ich finde Wikis immer noch und vielleicht gerade wegen so vieler weiterer und neuerer Möglichkeiten sehr hilfreich!

    In diesem Blogbeitrag möchte ich deshalb genauer vorstellen, was ein Wiki in der Zusammenarbeit genau leistet und wie es eingesetzt werden kann, welche Software ich empfehle und wie sich diese installieren lässt.

    Spoiler vorab: Du brauchst nicht einmal 10 Minuten, um dir ein selbst-gehostetes Wiki Open Source und datenschutzkonform aufzusetzen. Und die anschließende Zusammenarbeit und der kollaborative Aufbau einer Wissensbasis kann damit sehr gut funktionieren!

    Was ist ein Wiki und warum ist es cool?

    Was ein Wiki ist, muss dank der großen Bekanntheit der Wikipedia kaum mehr erklärt werden. Im Kern handelt es sich einfach um eine erweiter- und veränderbare Sammlung mit Inhalten, die beliebig miteinander verlinkt werden können.

    Ich mag an Wikis vor allem diese Aspekte:

    • Offen und flexibel: Ein neu installiertes Wiki gibt erst einmal gar nichts vor. Ich kann mir eine eigene Startseite gestalten und genau die Struktur und den Rahmen aufsetzen, die wir für unsere jeweilige Zusammenarbeit brauchen. Und in diesem Rahmen kann dann kollaborativ ganz wunderbar viel entstehen.
    • Relativ selbsterklärend: Tools zur Zusammenarbeit setzen voraus, dass alle Beteiligten in einer Gruppe diese Tools auch gut und niederschwellig nutzen können. Bei einem Wiki scheint mir diese Anforderung relativ gut erfüllt zu sein. Wer Wikis noch nicht kennt, muss eigentlich nur verstehen, dass alle an allen Inhalten schreiben können, immer frühere Versionen gespeichert werden und vor allem dass sich interne und externe Links meist mit eckigen Klammern setzen lassen, um Verknüpfungen herzustellen.
    • Offene Formate: In einem Wiki sind Inhalte in offenen Dateiformaten gespeichert. Ich kann sie jederzeit auch aus dem Wiki herausholen und anderweitig weiter nutzen. Damit ist nicht nur die Sicherung von Dateien völlig unproblematisch. Sie lassen sich zugleich auch in vielen anderen Tools nutzen. Ohne solche offenen Formate wäre ein Aufbau einer Wissensbasis deutlich weniger nachhaltig.

    Neben dieser Nutzungsebene mag ich aus Perspektive von digitaler Mündigkeit und Offenheit, dass es eine Vielzahl von Open Source Software gibt, die eine realistische Selfhosting-Option ermöglicht.

    Das bedeutet: Ich muss keine aufwendige Serverkonfiguration kennen oder eine Datenbank einrichten. Sobald ich ein bisschen Webspace zur Verfügung habe, kann ich die Software hochladen und kann dann direkt an die Einrichtung gehen. Auch eine Sicherung des Wikis ist dank der offenen Dateistruktur sehr unkompliziert.

    Wie geht das genau?

    Meine Lieblings-Software für ein Wiki ist zurzeit die Open Source Software DokuWiki. Mit dieser funktioniert Installation und Nutzung genau wie oben beschrieben.

    Ganz konkret:

    • Du kaufst dir bei einem Hosting-Anbieter für rund einen Euro im Monat ein bisschen Webspace und bekommst von dort die Zugangsdaten. Wenn du ohnehin schon eine Webseite hast, kannst du das Wiki einfach in einem Unterordner installieren. Du benötigst keine Datenbank.
    • Du lädst dir die Software von der DokuWiki-Website herunter und dann auf deinen Webspace hoch. Dazu kannst du ein Tool wie FileZilla verwenden.
    • Du öffnest den entsprechenden Ordner auf der Website und ergänzt beim Link /install.php.
    • Das öffnet einen Konfigurations-Screen, in dem du die Sprache (das DokuWiki gibt es in zahlreichen Sprachen und auch auf Deutsch, sogar mit Unterscheidung zwischen formeller und informeller Sprache) auswählst und einen Admin-Zugang mit Passwort bestimmst. (Der Admin-Zugang kann insbesondere weitere Benutzer anlegen. Außerdem kannst du entscheiden, ob das Wiki ganz offen genutzt werden kann (= alle können auch ohne Registrierung alles bearbeiten) oder ein geschützter Raum mit begrenztem Zugang sein soll. Auch die Lizenz der Inhalte ganz festgelegt werden.)
    • Anschließend kannst du die Datei install.php löschen – und direkt damit starten, dein Wiki einzurichten.

    Wie lässt sich solch ein Wiki nutzen?

    Nach der Installation können beliebig viele Benutzer-Accounts angelegt werden. Alternativ kann man auch eine offene Registrierung erlauben.

    Vor dem Teilen mit der ganzen Gruppe empfiehlt es sich, ein bisschen vorzustrukturieren. Standardmäßig nehme ich zum Beispiel gerne eine Aktuelles-Rubrik auf, ein Log von Besprechungen/Treffen, einen Gedankenspeicher oder eine Linksammlung.

    Wenn ein Wiki vor allem auch als ‚Master-Doc‘, d.h. zur auch synchronen Zusammenarbeit z.B. für Mitschriebe bei Treffen verwendet werden soll, bietet sich eine Kombination mit einem Etherpad an. Das kann so aussehen, dass z.B. das jeweils nächste Treffen einer Gruppe zu einem Etherpad verlinkt wird. Dort kann dann mitgeschrieben werden. Nach dem Treffen wird der Mitschrieb ins Wiki übertragen und somit gesichert.

    Wer auch im Bereich von Videokonferenzen Open Source Software und hier ganz konkret BigBlueButton verwendet, kann auf diesen Schritt auch verzichten, denn BigBlueButton verfügt mit den ‚geteilten Notizen‘ über eine kollaborative Mitschreibmöglichkeit.

    Das Vorgehen ist dann:

    • direkt synchron in der Videokonferenz mitschreiben
    • Mitschrieb sichern
    • ins Wiki übertragen.

    Fazit

    Das war eine schnelle Darstellung und unbedingte Empfehlung gerade in kleineren Projekten eine Wiki-Nutzung in Erwägung zu ziehen. Diese Empfehlung bedeutet nicht, dass es nicht auch viel neue und spannende Tools gibt, mit denen es sich zu experimentieren lohnt. Wenn wir aber eine realistische Umsetzungsperspektive für digital-mündige Technologienutzung haben wollen, dann braucht es aus meiner Sicht zugleich noch viel mehr solcher Möglichkeiten, die eben ganz niederschwellig auch ‚ganz normalen‘ Menschen, ohne Infrastruktur einer größeren Organisation und ohne große Zeitkapazitäten für Sicherungen und Serverkonfiguration möglich ist. Ein Wiki auf Basis der DokuWiki Software ist dazu aus meiner Sicht eine sehr gute Möglichkeit!

    Aus all diesen Gründen kann ich dir das Ausprobieren sehr empfehlen. Schreibe mich gerne an, falls du Fragen dazu hast oder Unterstützung benötigst.

    #DigitaleMündigkeit #Tools
  13. Wozu lernen wir – und für und mit welcher Technologie?

    Ich habe vor kurzem in meinem Blog aufgeschrieben, dass ich die ‚Nordsterne‘ in pädagogischen Transformationsdebatten oft zu eng gefasst finde. Denn diese betrachten in der Regel die Frage: Wie wollen wir lehren und lernen? Ich habe als Ergänzung formuliert: Wozu lernen wir? Als Antwort habe ich die Perspektive einer l(i)ebenswerten Welt vorgeschlagen, die sich aus dem ‚Woher?‘ ergibt – den in uns angelegten menschlichen Potenzialen, die es in Lernräumen zu entfalten gilt.

    In diesem Blogbeitrag möchte ich gerne noch einen Schritt weiter gehen und diese Perspektive eines doppelt erweiterten Nordsterns mit meinem Fokus auf Bildung und Digitalisierung zusammenbringen.

    Warum ein pädagogischer Nordstern unter Einbezug von Digitalisierung?

    Debatten zu Bildung und Digitalisierung beschränken sich erfreulicherweise schon lange nicht mehr nur um ‚Lehren und Lernen mit digitalen Tools‘. Stattdessen gerät zusätzlich immer mehr auch die Perspektive von ‚Lehren und Lernen in einer digital-geprägten Welt‘, also die Frage der Lernkultur, in den Blick. Relativ unverbunden steht dann aber oft daneben, dass wir Digitalisierung auch als Lerngegenstand betrachten und reflektieren sollten. Dieser Aspekt ist bleibt dann meist nur ein kleines Add-On.

    Aus meiner Sicht gehören diese drei Ansätze zusammen, sollten verbindend reflektiert werden und führen zu der dann um den Fokus der Digitalisierung erweiterten Nordstern-Frage:

    Wozu lernen wir – und für und mit welcher Technologie?

    Diese Erweiterung ist aus meiner Sicht vor allem deshalb relevant, weil wir Bildung ausgehend von unserer zunehmend digital-geprägten Gesellschaft gestalten. Das hat eine doppelte Konsequenz:

    1. Es gilt zu klären, welche Digitalisierung wir uns in und für eine l(i)ebenswerte Welt vorstellen. Wir müssen also mit dem gesamtgesellschaftlichen Nordstern auch einen Technologie-Nordstern entwickeln.
    2. Es gilt zu reflektieren, wie die gegenwärtige Ausgestaltung von Digitalisierung unsere Handlungsmöglichkeiten hin zur Realisierung dieser Nordsterne behindert oder auch befördern kann.

    Welche Digitalisierung wollen wir für eine l(i)ebenswerte Welt?

    Eine l(i)ebenswerte Welt ist eine Welt, in der Leben entfaltet ist und sich weiter entfalten kann. Damit das gelingt, müssen wir uns an ‚organischer Intelligenz‘ orientieren.

    Organische Intelligenz funktioniert nicht über den Versuch der Kontrolle, sondern durch Verbindung. Das Bild ist hier ein Garten, in dem ich etwas pflanzen und das Wachstum der Pflanzen unterstützen kann. Es ist keine Fabrik, in der nach festen Vorgaben etwas durchgeplant entsteht.

    Die vorherrschende Digitalisierung funktioniert dagegen überwiegend konträr zu diesem Leitbild der Lebendigkeit. Sie ist geprägt von Plattformen, die Silos darstellen, deren Infrastruktur auf Verwertbarkeit durch Monopolisierung und Machtkonzentration zielt. Pädagogisch ist hierbei relevant, dass genau diese Grundlage auch einen Einfluss auf unsere Nutzungspraxis hat: Diese Form der Digitalisierung unterstützt und befördert Individualisierung, Konkurrenzdenken und Standardisierung.

    Für eine Digitalisierung, die sich an organischer Intelligenz orientiert und diese befördert, wäre stattdessen Dezentralität der für mich wichtigste Hebel von Veränderung.

    Hintergrund ist hier, dass Dezentralität im Kern bedeutet, nicht auf Kontrolle zu setzen, sondern Verbindung und Offenheit zu ermöglichen. Wenn Digitalisierung deshalb statt auf Monopolisierung auf Dezentralisierung setzen würde, dann würde sie sich sehr grundlegend verändern und ein verändertes, viel menschlicheres Handeln ermöglichen.

    Im Fediverse habe ich das wie folgt beschrieben:

    Dezentralisierung würde in diesem Sinne ermöglichen:

    • Communities statt Plattformen
    • Schnittstellen und Interoperabilität statt abgegrenzten Silos
    • Demokratie, Mündigkeit und Selbstbestimmung statt Machtkonzentration, Abhängigkeit und Manipulation
    • Gemeinschaftlichkeit statt Individualisierung
    • Kooperation statt Konkurrenz
    • Gemeinwohl statt Verwertbarkeit
    • Demut und Bedeutung statt Ego und Lärm
    • Vielfalt statt Standardisierung
    • Sicherheit und Experimentieren statt Angst und Druck

    Ich finde an solchen Gegenüberstellungen mit einer pädagogischen Brille spannend, dass wir auf der Ebene von Haltung und Werten sehr viele Überschneidungen dazu sehen, wie wir uns nicht nur eine bessere Technologie, sondern auch eine bessere Bildung vorstellen. Es steckt also viel Synergiepotential darin, diese wünschenswerten Systemveränderungen verbindend zu betrachten. Und es wird deutlich, dass eine pädagogische Perspektive für die Gestaltung einer veränderten Technologie sehr viel beizutragen hat.

    Wie nutzen und gestalten wir Digitalisierung, um zu einer l(i)ebenswerten Welt zu gelangen?

    Wenn der Nordstern klarer wird, dann schließt sich die Frage an, wie wir ihn erreichen können. Herausfordernd ist dabei in der Bildung vor allem die extreme Ambivalenz, die mit der vorherrschenden, gegenwärtigen Technologie verbunden ist:

    1. Auf der einen Seite steht die vorherrschende Digitalisierung wie oben dargestellt konträr zu Lebendigkeit und damit zu menschlichen Potenzialen, die wir im Interesse einer l(i)ebenswerten Welt eigentlich zur Entfaltung bringen wollen.
    2. Auf der anderen Seite ermöglicht selbst diese Digitalisierung, weil ihr Geschäftsmodell ist, menschliche Bedürfnisse anzusprechen, immer wieder flüchtige Einblicke und auch konkrete Möglichkeiten, sie im Sinne von organischer Intelligenz zu nutzen. Beispielsweise kann ich die Mustererkennung von monopolisierten KI-Modellen als Hilfe für Gruppenprozesse nutzen oder für mich hilfreiche soziale Verbindungen über proprietäre Social Media Plattformen aufbauen.

    In dieser Ambivalenz ist pädagogisch für mich ein Dreiklang nötig:

    1. Akzeptanz: Anerkennen, dass es Technologie in ihrer gegenwärtigen Form gibt und dass sie Teil unserer Lebenswelt – der Lehrenden wie auch der Lernenden – ist.
    2. Reflexion: Am besten ausgehend von konkreter Nutzung Räume schaffen, um zu reflektieren, wo Technologie uns manipuliert und wo wir uns deshalb vor ihr schützen sollten und wie uns trotz alledem in manchen Bereichen ein ‚Hacking‘ gelingen kann.
    3. Alternativen: Perspektiven für eine veränderte Technologie öffnen, die genau mit den Mustern bricht, die wir oben als konträr zum Prinzip der Lebendigkeit identifiziert haben.

    Je verbindender wir diese drei Herausforderungen aufgreifen und je mehr wir sie mit der Nordstern-Orientierung verbinden, umso wirkungsvoller.

    Für den zurzeit viel diskutierten Bereich der künstlichen Intelligenz kann das beispielsweise bedeuten:

    • KI nicht verbieten/aussperren, sondern in der Bildung zu einem Thema machen.
    • Über KI-Nutzung reflektieren, bewusst auch Lernen ohne KI ermöglichen und uns zugleich an einer kontra-intuitiven KI-Nutzung versuchen, die KI nicht als Antwortmaschine, sondern als Resonanzmaschine versteht.
    • Auf die Suche begeben, wo es eine andere Form von KI gibt, was für mich vor allem offene KI-Modelle sind und zugleich auch nicht-generative KI, die in der gegenwärtigen Diskussion fast gar nicht im Blick ist.

    Am Beispiel von Social Media könnte es bedeuten:

    • Social Media als Teil von Lebensrealität anerkennen und mit einem offenen Blick Nutzungspraktiken und Gewohnheiten verstehen und besprechen.
    • Räume schaffen, um zu reflektieren, was Social Media mit uns macht und gemeinsam zu Vereinbarungen zu kommen, wo Abschalten allen Beteiligten besser tut. Und zugleich erkunden, wo Social Media zum Beispiel Verbindung und Zuspruch ermöglichen kann.
    • Alternativen wie das Fediverse stärken und gerade im Bildungskontext erfahrbar machen.

    Fazit: Pädagogische Diskussion erweitern

    Ich freue mich darauf, diese erweiterten Perspektiven, die jede einzelne für sich sicher nicht neu sind, mit solch einem verbindenden Nordstern-Blick im Kontext von Bildung und Digitalisierung aufzugreifen und zu gestalten.

    Durch die Entwicklungen rund um KI sehe ich in diesem Bereich aktuell einen wirkungsvollen Hebel. um Veränderungen anstoßen zu können, weil sich angesichts von immer leistungsfähigeren Maschinen gesamtgesellschaftlich immer drängender die Frage stellt, was uns als Menschen ausmacht – und damit auch, welche Digitalisierung wir eigentlich wollen. Ich denke, dass wir mit einem Blick auf Lernen als Entwicklung, Ermöglichung und Ermächtigung in einer gemeinschaftlichen Perspektive hier vieles beitragen können.

    Wer am 18. April bei der edunautika in Hamburg ist: Sehr gerne möchte ich dazu in einer Session gemeinsam weiter denken!

    #DigitaleMündigkeit #KünstlicheIntelligenzKI
  14. Beim Gautinger Internettreffen

    Immer mal wieder hatte ich in den letzten Jahren vom Gautinger Internettreffen gehört oder gelesen. Dieses Jahr war ich selbst mit einem Impuls zu zukunftsgestaltendem Lernen dabei. Das Motto des diesjährigen Treffens lautete: digital und selbstbestimmt. Meine These dazu war:

    Digital und selbstbestimmt braucht ganzheitlich und verbunden.

    Ich habe mich dieser These in drei Schritten genähert:

    1. Ausgangspunkt war für mich die Möglichkeitsmut-Wippe: Um im Kontext technologischer Entwicklungen weder in naiven Optimismus noch in Bildungsalarmismus zu verfallen, hilft eine bewusste Verschiebung weg von Abwehr, Angst und Fatalismus, hin zu Akzeptanz, Neugierde und Gestaltungszuversicht.
    2. Diese Gestaltungszuversicht gerät allerdings unter Druck, wenn wir technologische Entwicklungen in ihrer Tiefe betrachten. Eine digitale Infrastruktur, die von Kommerzialisierung, Monopolisierung und Machtkonzentration geprägt ist, kann leicht das Gefühl von Ohnmacht erzeugen. Umso wichtiger ist es, sich klarzumachen: Diese Herausforderungen sind nicht nur äußere Bedingungen, denen wir ausgeliefert sind. Innere Entwicklung und äußere Veränderung hängen zusammen. Ohne ein ‚In die Zukunft lehnen‘ im Inneren bleibt auch Gestaltung von Technologie im Außen begrenzt.
    3. Auf diesem Weg können wir den Blick auf die DeepSkills richten, die uns als Menschen zur Verfügung stehen. Sie entstehen in Lernkontexten, die Ganzheitlichkeit und Verbundenheit ermöglichen.

    In diesem Sinne wird für mich verständlich, warum digital und selbstbestimmt ohne ganzheitliche und verbundene Lernprozesse nicht denkbar ist. Durch die so ermöglichte Entfaltung menschlicher Potenziale können Lernprozesse der Ermächtigung entstehen.

    Solche Lernprozesse sind natürlich kein Selbstläufer, aus denen automatisch eine bessere Bildung oder eine bessere Technologie entsteht. Wenn ich zum Beispiel als Pädagogin mit einem potenzialorientierten Blick auf Lernende schaue, dann kann ich in der Folge leicht in Konflikt mit der vorherrschenden Prüfungskultur geraten. Genau die so entstehenden Widersprüche können dann aber wiederum produktiv genutzt werden, um auch im Äußeren für Veränderungen einzutreten. Ohne die innere Entwicklung hin zu einem Growth Mindset hätte ich mich gar nicht auf diesen Weg gemacht.

    Was für die Gestaltung von Bildung gilt, gilt auch für die Entwicklung von Technologie. Mit Ganzheitlichkeit und Verbundenheit öffnen wir den Blick auf die Frage: Welche Technologie entwickeln wir für die Welt, die wir eigentlich wollen? Wir bleiben also nicht mehr bei der Frage stehen: Wie nutzen wir Technologie möglichst effizient innerhalb des bestehenden Systems?

    Spätestens dann wird deutlich, dass Technologie an dieser Stelle natürlich nur ein Ausschnitt ist. Wir können diese Herangehensweise insgesamt auf die Herausforderungen dieser Welt übertragen. Durch Entfaltung menschlicher Potenziale im Inneren im Sinne von Ganzheitlichkeit und Verbundenheit kommt eine bessere, weil l(i)ebenswerte Welt in den Blick.

    Im Ergebnis lässt sich dann sagen:

    Gute Pädagogik ist immer auch Aktivismus für eine bessere Welt!

    Herzlichen Dank für die Einladung und den schönen Austausch vor Ort in Gauting!

    Credits und zugleich Vertiefungs-Empfehlungen des Impulses waren:

    #DigitaleMündigkeit
  15. Kartenset: Grundrechte im Digitalen

    Im vergangenen Jahr war ich daran beteiligt, mit dem Bildungs-Team der Wikimedia ein Kartenset zum Thema ‚Grundrechte im Digitalen‘ zu konzipieren und zu erstellen. Inzwischen liegt das Ergebnis gestaltet und gedruckt vor und ich konnte es mir beim heutigen Gautinger Internettreffen auch selbst anschauen.

    Ich freue mich sehr, dass dieses Kartenset als offenes Bildungsmaterial veröffentlicht ist. Das bedeutet: Du kannst es dir auf der Website herunterladen und für deine Zwecke anpassen. Gedacht ist das Kartenset für einen haptischen Einsatz in offenen, austauschorientierten Lernprozessen. Vor diesem Hintergrund gibt es auf der Website auch die Möglichkeit, das Kartenset gedruckt zu bestellen.

    Was ist das für ein Kartenset?

    Das Kartenset besteht aus einer kurzen, didaktischen Handreichung, in der einige Inspirationen zu finden sind, wie mit den Karten gemeinsam gelernt werden kann. Der Fokus liegt hier auf der Methode des Kartenaustausch, um sich unterschiedliche Konzepte und Perspektiven im Austausch miteinander zu erschließen.

    Im Kartenset sind dafür drei Kartentypen enthalten:

    1. Basiskarten mit denen bestimmte Begriffe erklärt und mit einem Beispiel veranschaulicht werden. Dabei wird dann immer auch der Bezug zu den Grundrechten deutlich gemacht. Solche Begriffe sind z.B. Deep Fakes, Algorithmus, Bias, Barrierefreiheit oder Netzneutralität.
    2. Persona-Karten, in denen vielfältige Personas dargestellt werden, in deren Rolle im Austausch geschlüpft werden kann.
    3. Aktions-Karten mit Anregungen für umfangreichere Projekte.

    Zielgruppe des Kartensets sind Jugendliche und Erwachsene ab ca. 14 Jahren.

    Wie geht es damit weiter?

    Schön an der OER-Veröffentlichung des Kartensets ist, dass immer eine Weiterentwicklung möglich ist. Beim heutigen Workshop gab es insbesondere die Anregung, auch eine Version in leichter Sprache zu veröffentlichen oder noch die Kartenkategorie ‚Lebenswelt‘ zu ergänzen.

    Fazit

    Ich freue mich sehr, dass die Wikimedia dieses Thema aufgegriffen und das Material veröffentlicht hat. Ich selbst werde es sicher in der Erwachsenenbildung nutzen, um Grundlagenwissen zu dem Thema gemeinsam zu entwickeln. Falls das Material für deinen Kontext auch spannend sein kann, dann probiere es gerne aus. Viel Freude damit!

    Zum Kartenset bei der Wikimedia

    #DigitaleMündigkeit
  16. 5. DI.DAY in Erlangen im ZAM: mein Browser, das unbekannte Wesen

    3. Mai 2026, 15:00:00 CEST - GMT+2 - Hauptstraße 65-67, 91054 Erlangen, 65-67 Hauptstraße (Erlangen)

    f.termine.di.day/events/5ca1e0

  17. 4. DI.DAY in Erlangen im ZAM: Clouds aus regionaler Aufzucht?

    12. April 2026, 15:00:00 CEST - GMT+2 - Hauptstraße 65-67, 91054 Erlangen, 65-67 Hauptstraße (Erlangen)

    f.termine.di.day/events/1e4a59

  18. Eine eigene Website – ohne Wartungsaufwand

    Ich finde es eine gute, hilfreiche und sinnvolle Sache, wenn Menschen, die kluge Gedanken haben, diese nicht nur für sich behalten und sie auch nicht nur über Social Media Plattformen publizieren, wo sie nicht nachhaltig auffindbar sind, keine Hoheit darüber besteht und sie vor allem auch sehr schlecht referenziert werden können. Stattdessen rege ich in solchen Fällen sehr gerne und häufig an, sich doch eine eigene Website einzurichten.

    Mein Standard-Vorschlag hierzu war eine WordPress-Website. Wenn es die eigene Website ist, dann nutzt man hier nicht WordPress.com, sondern lädt sich über wordpress.org die Open Source Software herunter und installiert sie auch auf einen Server. Ich habe das Vorgehen in diesem Beitrag ausführlich beschrieben. Der große Vorteil an WordPress ist, dass die Software direkt viele hilfreiche Funktionalitäten mitbringt. Im Blog können z.B. direkt Kommentare freigeschaltet werden. Außerdem lassen sich über WordPress unter anderem Formulare anlegen oder auch H5P-Inhalte erstellen und teilen. So etwas kann im pädagogischen Alltag sehr hilfreich sein.

    In letzter Zeit habe ich nun aber immer öfter die Erfahrung gemacht, dass WordPress für viele Menschen auch keine sinnvolle Wahl ist. Insbesondere dann, wenn Menschen sehr eingespannt sind, wahrscheinlich eher weniger bloggen, sondern einfach nur immer mal wieder etwas online stellen wollen, aber ansonsten mit der Website möglichst wenig zu tun haben wollen. In diesem Fall ist WordPress eine schlechte Wahl, weil es schon nötig ist, dort regelmäßig drauf zu schauen, Updates zu installieren und die Seite (gerade wenn man Kommentare oder andere interaktive Möglichkeiten nutzt) im Blick zu behalten.

    Auf eine eigene Website muss dann trotzdem nicht verzichtet werden, aber ich würde dann nicht WordPress, sondern besser ein statisches Website-Tool empfehlen. Am liebsten mag ich hier gerade Publii, weil es grundsätzlich sehr benutzerfreundlich und nicht zu nerdig angelegt ist, so dass auch technisch nicht sehr affine Menschen damit zurecht kommen sollten.

    Beim Einrichten solcher Websites kommt man schnell zu einer gewissen Routine und übersieht, dass beim ersten Mal doch mehr getan werden muss, als es sich für mich inzwischen anfühlt. Um die erstmalige Erstellung einer solchen Website für dich so einfach wie möglich zu machen, kommen hier die Schritte, die du nacheinander durchgehen kannst – inklusive einer offen nutzbaren Vorlage, um direkt ohne langes Einrichten mit der inhaltlichen Arbeit beginnen zu können:

    1. Domain und Webspace kaufen

    Für einen eigenen Ort im Netz benötigst du Webspace und eine Domain (= der Name, über den andere deine Website aufrufen können). Ich empfehle dazu, sich einen Account bei Hetzner anzulegen, dann das Webhosting Paket S auszuwählen, dort einen Namen festzulegen und die Domain einzugeben. Weitere Angaben braucht es nicht. Wenn die Domain noch frei ist, kann sie direkt bestellt werden. Jetzt braucht es 1-2 Stunden bis der Account und die Domain nutzbar sind. Du kannst in dieser Zeit direkt mit den nächsten Schritten weitermachen.

    2. Publii installieren

    Wir wollen die Website ja mit Publii bauen. Das ist ein Programm, über das du dann Inhalte für die Website schreiben kannst und von dort aus dann auch direkt auf den Webspace hochladen kannst. Damit du dieses Programm nutzen kannst, musst du es dir auf deinem Desktop-Gerät installieren. Du lädst es dir dazu von hier herunter passend zu deinem Betriebssystem und lässt dich durch den Installationsprozess führen. Dann kannst du das Programm öffnen.

    3. Website in Publii anlegen

    In Publii kommt dann jetzt der interessantere Part. Du kannst dir dort deine gewünschte Website anlegen. Um dir die ersten Schritte möglichst einfach zu machen, empfehle ich dir, deine Website nicht neu, sondern von einem Backup anlegen. Dazu lädst du dir hier diese Datei herunter und dann bei Publii rein.

    start-fuer-deine-websiteHerunterladen

    Also: ‚Create new Website‘ und dann ‚Install from Backup‘. Dann kannst du direkt den gewünschten Seitennamen angeben und mit einem bereits fertigen Rohgerüst starten. Du musst dann diese Schritte gehen:

    • Unter Site Settings deine Beschreibung eingeben.
    • Unter Author deinen Namen eintrage
    • Unter Theme unten bei Layout runterscrollen bis du zur Hero-Section kommst. Dort dann deinen Begrüßungstext eingeben. Unter Footer kannst du Accounts von Social Media eintragen.
    • Unter Pages bei Impressum und Datenschutz deine Kontaktangaben eingeben

    Danach kannst du zu Posts gehen und deinen ersten Beitrag schreiben.

    Nützlich ist noch der File-Manager, wenn du z.B. eine Präsentation oder eine andere Datei hochladen und dann in Posts oder Pages verlinken kannst. Du findest den File Manager unter Tools & Plugins.

    4. Mail und SSL Verschlüsselung

    Nun müssen wir deine Website noch ins Internet bringen. Zuerst einmal verschlüsseln wir dazu deine Domain. Das machst du in deinem Hetzner-Account. Du gehst dort zur Domain (nicht zum Account). Auf Einstellungen, ganz unten SSL. Dann Basic Zertifikat auswählen. Länge des Schlüssels nicht ändern. Rechts daneben den Pfeil zum Laden anklicken. Das braucht eine gute Minute. Dann darunter: HTTPS-Weiterleitung auf ein schieben.

    Wichtig: Dieser Schritt funktioniert erst, wenn deine Domain erreichbar ist. Das ist meist ca. 1-2 Stunden nach der Bestellung der Fall.

    Update: Wenn du vorher deine Domain irgendwo anders hattest und diese Domain umziehst, musst du zusätzlich noch den SSL-Manager öffnen und die Domain korrekt zuweisen. Wenn du die Domain aber neu kaufst, sollte alles automatisch funktionieren.

    Anschließend kannst du dir unter E-Mail noch direkt eine Mailadresse oder Weiterleitung zu deiner Domain anlegen.

    5. Publii mit Webspace verbinden

    Bei Hetzner findest du dann auch die Zugangsdaten, die wir jetzt für Publii zur Verbindung der erstellten Inhalte auf deinem Desktop mit dem Webspace brauchen. Dazu gehst du zum Account (also nicht mehr Domain). Du kannst da direkt in der Kopfzeile in den Breadcrumbs eins weiter vorne anklicken.

    Die Zugangsdaten findest du dann unter Einstellungen und Logindaten. Diese Sachen musst du dann bei Publii eingeben:

    • Dazu gehst du zu Server.
    • Dann SFTP auswählen.
    • Die Website-URL ist deine Domain.
    • Port müsste bei 22 sein. Also nicht ändern.
    • Server von Hetzner reinkopieren (z.B. wwwxxx.your-server.de oder etwas ähnliches).
    • Ebenso Loginname als Username und das Passwort.
    • ‚Always ask for password‘ kannst du ausgestellt lassen, wenn du auf deinem eigenen Gerät arbeitest.
    • Dann bei remote path eintragen: public_html/
    • Dann unten Test Connection.

    Wenn kein Fehler kommt: Save Settings.

    Jetzt fehlt dann nur noch die Übertragung. Dafür kannst du links unten ‚Sync your Website‘ wählen. Alles wird hochgeladen – und wenn du jetzt deine Website-Adresse im Browser öffnest, stehen deine Inhalte online. Du kannst jederzeit ändern/ ergänzen und dann einfach immer wieder syncen. Manchmal sind Dateien noch im Cache des Browsers und du siehst nicht direkt Änderungen.

    Geschafft! 🎉

    Ich wünsche dir viel Freude mit deiner Website. Melde dich gerne, wenn du nicht weiter kommst!

    #DigitaleMündigkeit
  19. Di.Day zu KI in Halle

    Heute war ich mit beteiligt, einen weiteren Raum für den Digital Independence Day bei uns in Halle (Saale) zu öffnen. Wir haben uns im Co-Working Space am Klaustor mit dem Thema Offenheit und KI auseinander gesetzt.

    Der Di.Day ist eine bundesweite Initiative: Jeden ersten Sonntag im Monat kommen Menschen zusammen, um ganz konkret für mehr digitale Unabhängigkeit aktiv zu werden.

    Bei uns war heute eine bunte Mischung an Menschen gekommen: Rentner, Lehrkräfte, medienpädagogisch tätige Menschen, Jugendliche … Meine Rolle habe ich darin gesehen, den Rahmen für das Gespräch zu setzen und zu halten. Wir haben dazu mit der Viereck-Methode zunächst als Blitzlicht gesammelt, was die Beteiligten an Infos mitbringen, welche Fragen sie haben und was sie zuversichtlich bzw. besorgt stimmt. Diese Aspekte konnten wir dann zunächst im Plenum bearbeiten, bevor es in kleine Gesprächs- und Erkundungsrunden ging.

    Gemeinsam haben wir auch festgehalten, dass es den Di.Day an diesem Ort auch zukünftig geben soll. Das nächste Mal (wegen Ostern) nicht am 1. Sonntag des April, sondern erst am 12. April 2026.

    Ich finde das eine sehr gute Sache. Es gibt wohl kaum etwas Sinnvolleres, was man in der gegenwärtigen Situation einer zunehmenden gesellschaftlichen Spaltung tun kann, als Räume zum Austausch und zum gemeinsamen Lernen zu öffnen und zu gestalten.

    #DigitaleMündigkeit
  20. Gemeinwohlorientierte Digitalpädagogik

    Erschließe dir den Beitrag mit KI-Interaktion!

    Wähle die Interaktion, die dich bei der Erschließung dieses Beitrags am meisten interessiert. Klicke auf den Button – ein vollständiger Prompt wird automatisch in deine Zwischenablage kopiert. Füge ihn dann in ein Sprachmodell deiner Wahl ein.

    Erkläre mir den Inhalt des Textes einfach und prägnant! Warum könnte dieser Beitrag für mich spannend sein? Was spricht gegen die Thesen dieses Beitrags? Gib mir drei Fragen für einen Austausch über den Beitrag Was wäre ein konkreter Schritt, den ich aufbauend auf diesem Beitrag angehen könnte?

    Hiermit möchte ich den Nordstern einer gemeinwohlorientierten Digitalpädagogik in die Debatte zu Bildung im digitalen Wandel einführen. Ich sehe den folgenden Beitrag dazu als ersten Aufschlag und freue mich über zusätzliche Perspektiven und gemeinsames Weiterdenken.

    Was ist und warum braucht es gemeinwohlorientierte Digitalpädagogik?

    Bildung findet heute zu einem großen Teil im Spannungsfeld zwischen vielfältigen Möglichkeiten und gesamtgesellschaftlichen Krisen statt. Aufgabe von Bildung ist es in dieser Situation insbesondere, zu gesellschaftlicher Handlungsfähigkeit zu ermutigen und zu ermächtigen. Das bedeutet konkret, dass Lernende angesichts der zahlreichen Krisen nicht mit Rückzug und Fatalismus reagieren, sondern bestärkt und befähigt werden, gemeinsam mit anderen für soziale, demokratische, friedliche und ökologische Veränderungen aktiv zu werden.

    Im Kontext der Digitalisierung ist das besonders relevant, denn gerade hier ist zwischen digitaler Utopie und digitaler Dystopie, die sich in der gesamtgesellschaftlichen Debatte munter abwechseln, kaum Raum, um ins Gestalten zu kommen. Gemeinwohlorientierte Digitalpädagogik eröffnet dazu einen Weg.

    Das Konzept hat dabei zwei wichtige Grundlagen:

    1. Digitalisierung wird nicht primär als Werkzeug eingeordnet, was es überwiegend individuell zu lernen und zu gestalten gilt. Stattdessen geht es um eine systemische Perspektive auf die Digitalisierung, die kollektives Lernen und Gestalten erfordert.
    2. Digitalisierung wird mit einer normativen Orientierung verbunden. Das Ziel ist die Erfüllung menschlicher Bedürfnisse und damit die Erweiterung von Gemeinwohl.

    Grundlegend für eine gemeinwohlorientierte Digitalpädagogik ist für mich, dass mit diesem Ansatz digitale Infrastruktur und Eigentum sowie die damit verbundenen Interessen in den Blick genommen werden. Das ist nötig, um eine grundlegende Alternative zur vorherrschenden Form der Digitalisierung zu eröffnen. Denn digitale Anwendungen werden in dieser vorherrschenden Gestaltungsform meist im Sinne einer solutionistischen Herangehensweise entwickelt, die erstens Technik anstelle sozialer Aushandlung als primäre Lösung für Herausforderungen einordnet und zweitens erkannte Bedürfnisse direkt auf ihre Verwertbarkeit hin abklopft. Digitalisierung wird mit dieser Herangehensweise somit vor allem als Möglichkeit verstanden, um Anwendungen zu entwickeln, die Profite versprechen und bestehende Macht- und Eigentumsstrukturen nicht antasten oder diese sogar noch weiter zementieren. Gemeinwohlorientierte Digitalisierung zielt stattdessen auf eine Digitalisierung, die der Allgemeinheit dient. Menschen können auf diese Weise tatsächlich zu Gestalter*innen ihrer (längst und immer mehr digital geprägten) Lebenswelt werden.

    Solche grundsätzlichen Änderungen brauchen kritisches Denken, Verlernen und Neulernen. Dazu ist Pädagogik erforderlich. Zugleich ermöglichen diese Änderungen dann wiederum pädagogische Perspektiven, die Lernenden Gestaltungsmacht für die Entwicklung wünschenswerter Zukünfte ermöglichen.

    Gemeinwohlorientierte Digitalpädagogik hat dabei Ähnlichkeit mit medienpädagogischen Ansätzen und insbesondere der kritischen Medienpädagogik. Als Bild eines Eisbergs dargestellt erweitert sie klassische Medienkompetenzmodelle (z. B. nach Dieter Baacke), die vor allem sichtbar-individuelle Handlungsebenen adressieren, um eine stärker strukturelle und systemische Perspektive. Es geht dann nicht mehr nur um das Verstehen und Reflektieren von Medien, sondern digitale Infrastrukturen, Macht- und Eigentumsstrukturen und ihre gesellschaftlichen Auswirkungen kommen stärker in den Blick. Bei Nutzung und Gestaltung von Medien wird auf souveräne und selbstbestimmte Nutzung digitaler Räume mit Blick auf die dahinterliegenden Strukturen gezielt und die aktive, gemeinwohlorientierte Mitgestaltung digitaler Infrastrukturen und Praktiken in den Fokus genommen.

    Gemeinwohlorientierte Digitalpädagogik hat für mich vor diesem Hintergrund zwei zentrale Dimensionen:

    • Sie ist erstens Lerngegenstand: Hier geht es darum, weg von einem Werkzeugverständnis der Digitalisierung hin zu einer systemischen Betrachtungsweise zu kommen. Es geht darum zu analysieren, zu reflektieren und Schritt für Schritt zu verstehen, wie die für uns sichtbare Digitalisierung durch die dahinterliegende Infrastruktur geprägt wird und diese zugleich politisch, ökonomisch und kulturell mitformt. Diese Perspektive ermöglicht es, ein Verständnis zu entwickeln, an welchen Hebeln eine gemeinwohlorientierte Digitalisierung ansetzen muss.
    • Sie ist zweitens Gestaltungsprinzip: Hier geht es darum, zu lernen und vor allem praktisch zu erkunden, wie Digitalisierung orientiert am Gemeinwohl gestaltet sein kann. Wie immer im Kontext der Digitalisierung geht es hier natürlich auch um technische Fragen (z.B. Wie baue ich einen eigenen Server auf?). Mindestens ebenso wichtig (und pädagogisch aus meiner Sicht wahrscheinlich noch relevanter) ist die Frage, welche Praktiken der Zusammenarbeit und der Gestaltung eine gemeinwohlorientierte Digitalisierung braucht. Hier lassen sich dann Ansätze wie Commons und Open Source, Kultur des Teilens, Open Educational Resources und Open Educational Practices und viele andere Ansätze aufgreifen und vertiefen.

    Der Kern all dieser Aktivitäten ist eine kollektive Herangehensweise. Denn Änderungen auf systemischer Ebene werden nicht individuell erreicht werden können.

    Genau dieser kollektive Ansatz ist es dann auch, der in der Pädagogik realistische Wege ausgehend vom Hier und Jetzt für die Ermächtigung und Ermutigung von Lernenden zu gesellschaftlicher Handlungsfähigkeit ermöglicht. Schulen und andere Bildungseinrichtungen können und sollten deshalb Treiber und Akteure einer gemeinwohlorientierten Digitalpädagogik sein.

    Leseempfehlung

    Einen ausgezeichneten Einstieg in das Thema der gemeinwohlorientierten Digitalpädagogik bekommst du über das Buch Broligarchie von Aya Jaff. Die große Stärke dieses Buches liegt für mich darin, dass Aya in dem Buch ihren eigenen Weg als Lernreise beschreibt. Sie war früher Teil der vorherrschenden Digitalszene. Ihr Buch ist nun weniger ein klassischer Aussteigerbericht (auch wenn das schon auch Teil ist), sondern Schritt für Schritt die Darstellung, wie und warum sie die damit verbundenen grundlegenden Widersprüche für sich reflektiert hat und wie sie damit beginnt, sich mit anderen zusammenzuschließen und Alternativen zu entwickeln.

    Das Buch ist dabei durchgängig klar und niederschwellig geschrieben. Sie beschönigt nicht, aber bleibt auch nicht bei der Beklagung des Ist-Zustands stehen, sondern macht Mut, sich einzubringen und aktiv zu werden.

    #DigitaleMündigkeit #OEROffenheit
  21. Das Netz ist politisch.

    Das Buch von @adfichter ist soeben eingetroffen. Mit Liebe verpackt von der Buchhandlung Bodmer.

    Jetzt erst mal gemütlich machen und mir einen Überblick verschaffen.

    #buch #lesen #analog #netzpolitik #digitalemündigkeit #digitalesouveränität #dnip

  22. Neues Jahr, neue Nerdigkeiten. 😊

    Tauscht euch mit uns aus über #DigitaleMündigkeit. Alle Kenntnis-Niveaus von null bis 1 sind herzlich willkommen. 😊

    Erste Themen: #Rädli, #DIDay, Nextcloud. Und, was ihr so mitbringt.

    📅 Freitag, 23.01.2026
    ⌚ ab 8:30 Uhr ist jemand da
    📍 Allee am Röthelheimpark 3B, #Erlangen (direkt durch die Drehtüren an der Bushaltestelle; ja, Drehtüren; nein, nicht die Bäckerei 😉)

  23. Dein persönlicher KI-Chatbot für Blogs: Open Source & lokal

    Immer wieder stoße ich im Internet auf das Angebot, mir eine ‚eigene KI‘ zu programmieren. Dahinter verbergen sich allerdings höchst unterschiedliche Dinge. In den meisten Fällen wird nicht tatsächlich ein KI-Modell programmiert. Stattdessen werden bestimmte Einstellungen zum Chatten festgelegt (z.B. ‚Gib möglichst kurze Antworten‘ oder ‚Sprich mich mit Du und Nele an‘) und/oder bestimmte Quellen festgelegt, auf die sich ein genutzter Chatbot in der Antwort beziehen soll.

    Der Fachbegriff für letzteres lautet: Retrieval Augmented Generation, abgekürzt RAG. Solch eine RAG-Herangehensweise ermöglicht es, einem KI-Modell eine bestimmte Datenbasis zur Verfügung zu stellen, auf die sich der Chatbot in seinen Antworten dann vorrangig beziehen soll.

    Ich habe RAG bereits vielfach auf meinem eigenen KI-Server ausprobiert. Meistens habe ich das aber auf einzelne Inhalte (z.B. auf einen bestimmten Blogbeitrag oder ein Transkript) bezogen, nicht auf umfangreichere Quellen wie z.B. alle Beiträge eines bestimmten Blogs. Genau dafür suchte ich jetzt nach einer Lösung. In diesem Zusammenhang wollte ich zugleich eine Lösung entwickeln, die auch andere möglichst ohne Kosten und umfangreiche technische Vorkenntnisse für sich nutzen können und die mit Open Source Modellen sowie unabhängig von proprietären KI-Plattformen funktioniert. Das Vorhaben ist somit – neben dem praktischen Nutzen – vor allem auch ein Projekt für mehr digitale Mündigkeit. Mein Vorgehen habe ich als Schritt-für Schritt Anleitung aufgeschrieben.

    Das klingt für dich interessant? Dann lies weiter und probiere die Anleitung sehr gerne für dich aus. Vielleicht hast du ja auch Lust, sie weiter zu verbessern!

    Grundsätzliche Schritte

    Unser Ziel ist ein RAG-Chatbot für Blog-Websites im Terminal deines Rechners (= dem schwarzen Fenster, in das sich Befehle eintippen lassen). Du kannst den Chatbot auch dann bauen, wenn du bisher noch nicht mit dem Terminal gearbeitet hast.

    Wir gehen in mehreren Schritten vor: Nach ein paar Vorbereitungen nutzen wir zuerst ein Programm, mit dem wir alle Beiträge von den von uns gewünschten Blogs herunterladen. Dabei überprüfen wir natürlich zunächst, ob die Blog-Inhaber*innen solch ein Scraping untersagen. Wenn nein, dann versuchen wir die Beiträge entweder über die REST-API (das funktioniert oft bei WordPress-Blogs; es ist ein maschinenlesbarer Zugang zu den Daten der Website) oder ansonsten über den RSS-Feed oder die Sitemap zu erhalten. Wir müssen dazu lediglich die URL (= die Internetadresse) der gewünschten Blogs eingegeben.

    Aus den eingesammelten Beiträgen gestalten wir dann – mit einem weiteren Open Source Programm – eine Vektor-Datenbank. Das ist eine komprimierte und maschinenlesbare Variante der Inhalte, die als Datenbasis von KI-Sprachmodellen genutzt werden kann. Diese Datenbank verbinden wir mit dem Open Source KI-Modell Mistral.

    Im letzten Schritt nutzen wir dann ein weiteres Programm – den eigentlichen Chatbot – um in die Kommunikation über die Beiträge in den Blogs zu gehen. Das funktioniert dann weiterhin über das Terminal, aber du wirst sehen, dass du im Ergebnis dann einen Bot gestaltet hast, der ähnlich wie andere KI-Chatbots menschliche Sprache auswerten und mit passenden Reaktionen – in unserem Fall mit den Inhalten basierend auf den eingepflegten Blogbeiträgen – antworten kann.

    Die folgende Anleitung stellt dir den Code für das ‚Beitragseinsammel-Programm‘ und das ‚Chatbot-Programm‘ zum direkten Weiternutzen zur Verfügung. Ich empfehle dir, erst einmal damit zu arbeiten. Später kannst du aber natürlich diese Programme auch anpassen und deinen Chatbot so noch sehr viel spezifischer für deine Bedürfnisse gestalten.

    Wozu das Ganze?

    Ich finde dieses Projekt aus mehreren Gründen ziemlich cool:

    1. Es ist ein offenes Projekt, das dir die Potenziale von Open Source Software zeigt und dir eine Alternative zu den proprietären KI-Plattformen ermöglicht.
    2. Es ist ein Projekt für mehr digitale Mündigkeit. Du verstehst und kannst erkunden, wie KI-Chatbots unter der Haube funktionieren.
    3. Du bekommst eine sehr nützliche Anwendung, mit der du Online-Inhalte aus von dir ausgewählten Blogs über eine Chatoberfläche in einem vernetzten Sinne ‚lesen‘ kannst.

    Schritt-für-Schritt Anleitung

    Insgesamt wirst du für die folgenden Schritte wahrscheinlich ungefähr eine Stunde Zeit brauchen. Du kannst jederzeit zwischendrin aufhören und wieder neu einsteigen.

    (Einschränkend möchte ich anmerken, dass ich die Schritte auf meinem Linux-Laptop durchgeführt habe. Ich gebe auch die entsprechenden Befehle für Windows und Mac an, aber habe diese nicht selbst getestet. Entstanden ist die Anleitung basierend auf meiner Ideen dazu, allgemeiner Internet-Recherche und Interaktion mit KI-Chatbots)

    Schritt 1: Vorbereitungen

    Um solch einen RAG-Chatbot für Blog-Websites im Terminal selbst zu basteln, sind zunächst drei Vorbereitungen nötig:

    1. Du solltest grundlegende Befehle im Terminal kennen.
    2. Du solltest dir Python installieren.
    3. Du solltest dir einen Mistral-API-Key besorgen.

    1. Grundlegende Befehle im Terminal kennen

    Zunächst zu den grundlegenden Befehlen im Terminal: Diese unterscheiden sich, je nachdem, ob du Linux, Windows oder einen Mac nutzt. Du findest das Terminal mit diesen Eingaben – oder auch einfach über eine Programmsuche:

    Linux:

    • Tastenkombination Strg + Alt + T oder
    • Suche nach „Terminal/ Konsole“ in deinen Anwendungen

    Windows:

    • Tastenkombination Windows-Taste + R, dann cmd eingeben und Enter drücken oder
    • Suche nach „Eingabeaufforderung“ bzw. „PowerShell“ im Startmenü

    Mac:

    • Tastenkombination Cmd + Leertaste, dann „Terminal“ eingeben oder
    • Gehe zu Programme → Dienstprogramme → Terminal

    Es öffnet sich dann ein kleines Konsolen-Fenster, über das du an deinen Rechner bestimmte Befehle senden kannst.

    (Ich habe die Terminal-Nutzung in den letzten Monaten übrigens sehr viel in Interaktion mit KI-Chatbots gelernt. Vor allem die Anthropic-Modelle funktionieren dazu aus meiner Sicht gut. Du kannst dann einfach im KI-Chat fragen, was der richtige Befehl für das Terminal ist, diesen dann im Zweifel noch einmal im Internet gegenchecken, dann eingeben – und wenn du dann einen irritierenden Output bekommst oder irgend etwas nicht funktioniert, diesen wiederum kopieren, mit dem KI-Chatbot teilen und dir erklären lassen.)

    Hier kommt eine kleine Basis-Übung, um das Prinzip des Terminals zu verstehen.

    Du brauchst dazu diese Befehle:

    Linux/Mac:

    • mkdir ~/Verzeichnis – um ein Verzeichnis zu erstellen
    • cd ~/Verzeichnis – um in das Verzeichnis zu wechseln
    • nano Dateiname – um eine Datei zu erstellen und/oder zu öffnen
    • Nach dem Eintragen dann Strg+O und Enter und Strg+X, um das Programm zu speichern und zu schließen

    Windows (PowerShell):

    • mkdir ~/Verzeichnis – um ein Verzeichnis zu erstellen
    • cd ~/Verzeichnis – um in das Verzeichnis zu wechseln
    • notepad Dateiname.txt – um eine Datei zu erstellen und/oder zu öffnen
    • Nach dem Eintragen über Datei → Speichern und dann Fenster schließen

    Windows (CMD):

    • mkdir %USERPROFILE%\Verzeichnis – um ein Verzeichnis zu erstellen
    • cd %USERPROFILE%\Verzeichnis – um in das Verzeichnis zu wechseln
    • notepad Dateiname.txt – um eine Datei zu erstellen und/oder zu öffnen

    Mit diesen Befehlen kannst du die Terminal-Nutzung testen:

    Für Linux/Mac gib im Terminal ein:

    mkdir ~/mein-testverzeichnis
    mkdir ~/mein-testverzeichnis

    Dann drücke Enter.

    cd ~/mein-testverzeichnis
    cd ~/mein-testverzeichnis

    Dann drücke Enter.

    nano testdatei.txt
    nano testdatei.txt

    Dann drücke Enter.

    Für Windows (PowerShell) gib im Terminal ein:

    mkdir ~/mein-testverzeichnis
    mkdir ~/mein-testverzeichnis

    Dann drücke Enter.

    cd ~/mein-testverzeichnis
    cd ~/mein-testverzeichnis

    Dann drücke Enter.

    notepad testdatei.txt
    notepad testdatei.txt

    Dann drücke Enter.

    Für Windows (CMD) gib im Terminal ein:

    mkdir %USERPROFILE%\mein-testverzeichnis
    mkdir %USERPROFILE%\mein-testverzeichnis

    Dann drücke Enter.

    cd %USERPROFILE%\mein-testverzeichnis
    cd %USERPROFILE%\mein-testverzeichnis

    Dann drücke Enter.

    notepad testdatei.txt
    notepad testdatei.txt

    Dann drücke Enter.

    Es öffnet sich ein Eingabefeld. Bei Linux/Mac ist das direkt im Terminal (nano-Editor), bei Windows öffnet sich der Notepad-Editor. Schreibe irgend etwas rein. Zum Beispiel:

    Hallo, ich erstelle eine Datei mithilfe des Terminals :-)

    Bei Linux/Mac: Dann Strg+O und Enter und Strg+X

    Bei Windows: Speichere über Datei → Speichern und schließe das Notepad-Fenster

    Nach dem Schließen gelangst du wieder zum ursprünglichen Terminal-Fenster zurück. Dass deine Befehle erfolgreich waren, siehst du, wenn du deine Ordnerverwaltung öffnest und darin tatsächlich den erstellten Ordner ‚mein-testverzeichnis‘ mit der Datei testdatei.txt und deinem Inhalt darin findest.

    (Ich fand das ziemlich großartig, als ich das zum ersten Mal gemacht habe. Wenn es auch dein erstes Mal ist, dann kannst du dich erst einmal freuen, dass du jetzt einen ziemlich coolen Weg kennst, um mit deinem Gerät zu kommunizieren! Wir werden das im Folgenden nutzen!)

    2. Python installieren

    Mit diesem Basiswissen können wir uns dann direkt an die Installation von Python machen. Das ist eine Programmiersprache, in der die Programme geschrieben sein werden, mit denen wir arbeiten.

    Ob Python bei dir ohnehin schon installiert ist, kannst du überprüfen mit diesem Befehl im Terminal:

    python --version
    python --version

    oder

    python3 --version
    python3 --version

    Wenn dann eine Versionsnummer zurückkommt (z.B. Python 3.13.11), ist Python installiert.

    Wenn nicht, dann kannst du es folgendermaßen installieren:

    Linux (Ubuntu/Debian):

    sudo apt update
    sudo apt install python3 python3-pip
    sudo apt updatesudo apt install python3 python3-pip

    Mac:

    brew install python3
    brew install python3

    (Falls Homebrew nicht installiert ist, folge dieser Anleitung.)

    Windows:

    1. Gehe auf https://www.python.org/downloads/
    2. Lade die neueste Version herunter
    3. Führe den Installer aus und setze unbedingt den Haken bei „Add Python to PATH“
    4. Klicke auf „Install Now“

    3. Mistral API-Key besorgen

    Als letztes benötigst du noch einen Mistral API Key. Mistral ist ein europäisches Open Source KI-Modell. Wir nutzen im Folgenden Mistral-small, was in einem begrenzten, aber für den persönlichen Gebrauch erfahrungsgemäß mehr als ausreichendem Umfang für Entwickler*innen kostenfrei zur Verfügung steht.

    (Mit dieser sehr umfangreichen, kostenfreien Entwicklungsmöglichkeit mit der Mistral-API verfolgt das Unternehmen übrigens eine aus meiner Sicht sehr stimmige Open Source Strategie: Je mehr Menschen mit der Mistral-API erkunden und ausprobieren, desto mehr Ideen und Produkte werden auf dieser Basis auch entwickelt, von denen einige dann später einen kostenpflichtigen Plan in Anspruch nehmen werden.)

    Um dir einen Mistral-API-Key zu besorgen, öffnest du diese Website, registrierst dich, gehst auf API und erstellst dir einen API-Key und speicherst ihn ab. Du kannst ihn z.B. „Blog-Chatbot“ nennen. Den API Key speicherst du dir ab, so dass du ihn später nutzen kannst.

    Wichtig: Du solltest den API-Key nicht öffentlich teilen!

    Schritt 2: Projekt aufsetzen

    In diesem Schritt sind wir weiter vorbereitend tätig, aber du kannst direkt deine Learnings aus Schritt 1 anwenden. Wir benötigen nämlich eine Projektumgebung (= einen Ordner auf deinem Rechner, in dem du deinen KI-Chatbot und die Inhalte speicherst). In diesem Ordner speicherst du dann deinen Mistral-API-Key und die weiteren, benötigten Programme.

    1. Projektverzeichnis erstellen

    Zunächst erstellen wir die Projektumgebung:

    Linux/Mac:

    mkdir ~/blog-chatbot-projekt
    cd ~/blog-chatbot-projekt
    mkdir ~/blog-chatbot-projektcd ~/blog-chatbot-projekt

    Windows (PowerShell):

    mkdir ~/blog-chatbot-projekt
    cd ~/blog-chatbot-projekt
    mkdir ~/blog-chatbot-projektcd ~/blog-chatbot-projekt

    Windows (CMD):

    mkdir %USERPROFILE%\blog-chatbot-projekt
    cd %USERPROFILE%\blog-chatbot-projekt
    mkdir %USERPROFILE%\blog-chatbot-projektcd %USERPROFILE%\blog-chatbot-projekt

    2. Virtuelle Umgebung erstellen

    Dann erstellen wir eine virtuelle Umgebung. Das ist sinnvoll, weil damit alle installierten Programme nur für dieses Projekt gelten und nicht mit anderen Python-Projekten auf deinem Rechner in Konflikt kommen können.

    Linux/Mac:

    python3 -m venv venv
    source venv/bin/activate
    python3 -m venv venvsource venv/bin/activate

    Windows (PowerShell):

    python -m venv venv
    .\venv\Scripts\Activate.ps1
    python -m venv venv.\venv\Scripts\Activate.ps1

    (Falls du eine Fehlermeldung bekommst, führe einmalig aus: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser)

    Windows (CMD):

    python -m venv venv
    venv\Scripts\activate.bat
    python -m venv venvvenv\Scripts\activate.bat

    Nach der Aktivierung siehst du (venv) am Anfang deiner Kommandozeile – das zeigt, dass die virtuelle Umgebung aktiv ist.

    3. API-Key speichern

    Jetzt speichern wir deinen Mistral-API-Key in einer Datei, die wir so erstellen, wie du es eingangs mit der Testdatei gelernt hast:

    Linux/Mac:

    nano .env
    nano .env

    Windows:

    notepad .env
    notepad .env

    Trage dann folgendes ein (ersetze YOUR_API_KEY durch deinen tatsächlichen Key, den du dir auf der Mistral-Website erstellt hast):

    MISTRAL_API_KEY=dein_api_key_hier
    MISTRAL_API_KEY=dein_api_key_hier

    Bei Linux/Mac: Speichere mit Strg+O, Enter, Strg+X

    Bei Windows: Speichere über Datei → Speichern und schließe Notepad

    4. Benötigte Programme installieren

    Jetzt installieren wir die Programme, die wir für unseren Chatbot brauchen:

    • chromadb – Die Vektor-Datenbank, in der die Blog-Beiträge gespeichert werden
    • sentence-transformers – Für die semantische Suche und Einbettung der Texte
    • requests – Um Webseiten abzurufen
    • mistralai – Das Programm, um mit der Mistral-API zu kommunizieren
    • python-dotenv – Um den API-Key aus der .env-Datei zu laden
    • feedparser – Um RSS-Feeds zu lesen
    • beautifulsoup4 – Um HTML-Inhalte zu verarbeiten

    Bei all diesen Programmen handelt es sich um Open Source Programme. Die Installation funktioniert über eine Befehlseingabe zur Installation (und etwas Zeit).

    Für alle Betriebssysteme (wenn virtuelle Umgebung aktiviert ist) gib diesen Befehl im Terminal ein:

    pip install chromadb sentence-transformers requests mistralai python-dotenv feedparser beautifulsoup4
    pip install chromadb sentence-transformers requests mistralai python-dotenv feedparser beautifulsoup4

    Dieser Installationsvorgang kann einige Minuten dauern. Lass das Terminal einfach arbeiten, bis du wieder die ursprüngliche Eingabeaufforderung siehst.

    Schritt 3: Blogs einsammeln und Vektordatenbank erstellen

    Mit der eingerichteten Basis aus Schritt 2 können wir jetzt das Blog-Einsammel-Programm erstellen und ausführen, so dass damit unsere Vektor-Datenbank erstellt wird. Ich nenne dieses Programm im Folgenden ‚Verwaltungsprogramm‘.

    1. Das Verwaltungsprogramm erstellen

    Du gehst wie folgt vor:

    Linux/Mac:

    nano blog_verwalten.py
    nano blog_verwalten.py

    Windows:

    notepad blog_verwalten.py
    notepad blog_verwalten.py

    Dann trägst du diesen Inhalt ein:

    import requests
    import chromadb
    from chromadb.utils import embedding_functions
    from bs4 import BeautifulSoup
    import feedparser
    from urllib.parse import urlparse
    from urllib.robotparser import RobotFileParser
    
    # Vektordatenbank-Setup
    client = chromadb.PersistentClient(path="./chroma_db")
    embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(
        model_name="paraphrase-multilingual-MiniLM-L12-v2"
    )
    collection = client.get_or_create_collection(
        name="blog_posts",
        embedding_function=embedding_fn
    )
    
    def ist_gueltige_wahl(eingabe, optionen):
        """Prüft ob Eingabe eine gültige Menü-Option ist"""
        return eingabe in optionen
    
    def blog_existiert(blog_url):
        """Prüft ob Blog bereits in Datenbank ist"""
        alle_daten = collection.get()
        for meta in alle_daten['metadatas']:
            if meta['blog_url'] == blog_url:
                return True
        return False
    
    def pruefe_robots_txt(blog_url):
        """Prüft, ob Scraping erlaubt ist"""
        print("[1/5] Prüfe robots.txt... ", end="", flush=True)
        try:
            rp = RobotFileParser()
            rp.set_url(f"https://{blog_url}/robots.txt")
            rp.read()
            if rp.can_fetch("*", f"https://{blog_url}/"):
                print("✅ Scraping erlaubt")
                return True
            else:
                print("❌ Blog erlaubt kein automatisches Auslesen")
                print("\n💡 Respektiere die Vorgaben des Blogs!")
                print("   Alternative: XML-Export hochladen (falls du Zugriff hast)\n")
                return False
        except:
            # Keine robots.txt = erlaubt
            print("✅ Keine robots.txt (= erlaubt)")
            return True
    
    def hole_via_wordpress_api(blog_url):
        """Versucht Beiträge über WordPress REST API zu holen"""
        print("[2/5] WordPress REST API... ", end="", flush=True)
        alle_posts = []
        seite = 1
        try:
            while True:
                url = f"https://{blog_url}/wp-json/wp/v2/posts?per_page=100&page={seite}"
                response = requests.get(url, timeout=10)
                if response.status_code != 200 or not response.json():
                    break
                alle_posts.extend(response.json())
                seite += 1
    
            if alle_posts:
                print(f"✅ {len(alle_posts)} Beiträge gefunden")
                return [(p['title']['rendered'],
                        BeautifulSoup(p['content']['rendered'], 'html.parser').get_text(),
                        p['link'])
                       for p in alle_posts]
            else:
                print("❌ nicht verfügbar")
                return []
        except:
            print("❌ nicht verfügbar")
            return []
    
    def hole_via_rss(blog_url):
        """Versucht Beiträge über RSS-Feed zu holen"""
        print("[3/5] RSS-Feed Standard... ", end="", flush=True)
        feed_urls = [
            f"https://{blog_url}/feed/",
            f"https://{blog_url}/rss/",
            f"https://{blog_url}/feed.xml",
            f"https://{blog_url}/rss.xml"
        ]
    
        for feed_url in feed_urls:
            try:
                feed = feedparser.parse(feed_url)
                if feed.entries:
                    print(f"✅ {len(feed.entries)} Beiträge gefunden")
                    return [(e.title,
                            BeautifulSoup(e.get('content', [{}])[0].get('value', e.get('summary', '')), 'html.parser').get_text(),
                            e.link)
                           for e in feed.entries]
            except:
                continue
    
        print("❌ nicht verfügbar")
        return []
    
    def hole_via_rss_pagination(blog_url):
        """Versucht RSS mit Pagination"""
        print("[4/5] RSS mit Pagination... ", end="", flush=True)
        alle_posts = []
        seite = 2  # Seite 1 hatten wir schon
        try:
            while seite <= 50:  # Max 50 Seiten
                feed_url = f"https://{blog_url}/feed/?paged={seite}"
                feed = feedparser.parse(feed_url)
                if not feed.entries:
                    break
                alle_posts.extend(feed.entries)
                seite += 1
    
            if alle_posts:
                print(f"✅ weitere {len(alle_posts)} Beiträge")
                return [(e.title,
                        BeautifulSoup(e.get('content', [{}])[0].get('value', e.get('summary', '')), 'html.parser').get_text(),
                        e.link)
                       for e in alle_posts]
            else:
                print("❌ nicht verfügbar")
                return []
        except:
            print("❌ nicht verfügbar")
            return []
    
    def blog_hinzufuegen(blog_url):
        """Holt alle Beiträge von einem Blog"""
        # Prüfen ob Blog schon existiert
        if blog_existiert(blog_url):
            print(f"\n⚠️  Blog {blog_url} ist bereits gespeichert!")
            print("💡 Tipp: Erst löschen (Option 3), dann neu hinzufügen.\n")
            return
    
        print(f"\n📥 Versuche Beiträge von {blog_url} zu holen...\n")
    
        # 1. robots.txt prüfen
        if not pruefe_robots_txt(blog_url):
            return
    
        # 2-4. Verschiedene Methoden probieren
        alle_beitraege = []
    
        beitraege = hole_via_wordpress_api(blog_url)
        if beitraege:
            alle_beitraege.extend(beitraege)
        else:
            beitraege = hole_via_rss(blog_url)
            if beitraege:
                alle_beitraege.extend(beitraege)
                # Versuche noch mehr zu holen
                mehr = hole_via_rss_pagination(blog_url)
                if mehr:
                    alle_beitraege.extend(mehr)
    
        print(f"[5/5] Zusammenfassung... ", end="", flush=True)
    
        if not alle_beitraege:
            print("❌")
            print("\n❌ Keine Beiträge gefunden!\n")
            print("Mögliche Gründe:")
            print("• API/Feed sind deaktiviert")
            print("• URL ist nicht erreichbar")
            print("• Blog nutzt ungewöhnliche Struktur")
            print("\n💡 Alternative: XML-Export hochladen\n")
            return
    
        print(f"✅ {len(alle_beitraege)} Beiträge insgesamt")
        print("\n💾 Speichere in Datenbank...")
    
        for i, (titel, inhalt, link) in enumerate(alle_beitraege):
            collection.add(
                documents=[inhalt],
                metadatas=[{
                    "title": titel,
                    "link": link,
                    "blog_url": blog_url
                }],
                ids=[f"{blog_url}_{i}"]
            )
            if (i+1) % 50 == 0:
                print(f"  {i+1} Beiträge verarbeitet...")
    
        print(f"✓ Fertig! {len(alle_beitraege)} Beiträge von {blog_url} gespeichert.\n")
    
    def blogs_anzeigen():
        """Zeigt alle gespeicherten Blogs"""
        alle_daten = collection.get()
        if not alle_daten['metadatas']:
            print("\n❌ Noch keine Blogs gespeichert!\n")
            return
    
        blogs = {}
        for meta in alle_daten['metadatas']:
            blog = meta['blog_url']
            blogs[blog] = blogs.get(blog, 0) + 1
    
        print(f"\n📚 Gespeicherte Blogs ({len(blogs)}):")
        for blog, anzahl in sorted(blogs.items()):
            print(f"  • {blog} ({anzahl} Beiträge)")
        print()
    
    def blog_loeschen(blog_url):
        """Löscht alle Beiträge eines Blogs"""
        alle_daten = collection.get()
        ids_to_delete = [
            alle_daten['ids'][i] 
            for i, meta in enumerate(alle_daten['metadatas']) 
            if meta['blog_url'] == blog_url
        ]
    
        if not ids_to_delete:
            print(f"\n❌ Blog {blog_url} nicht gefunden!\n")
            return
    
        collection.delete(ids=ids_to_delete)
        print(f"\n✓ {len(ids_to_delete)} Beiträge von {blog_url} gelöscht.\n")
    
    def menu():
        while True:
            print("=" * 50)
            print("BLOG-CHATBOT VERWALTUNG")
            print("=" * 50)
            print("1 - Blog hinzufügen")
            print("2 - Blogs anzeigen")
            print("3 - Blog löschen")
            print("0 - Beenden")
            print("=" * 50)
    
            wahl = input("\nDeine Wahl: ").strip()
    
            if not ist_gueltige_wahl(wahl, ['0', '1', '2', '3']):
                print("\n❌ Ungültige Eingabe! Bitte wähle eine der Optionen (0-3).\n")
                continue
    
            if wahl == "1":
                url = input("Blog-URL (z.B. ebildungslabor.de): ").strip()
                blog_hinzufuegen(url)
            elif wahl == "2":
                blogs_anzeigen()
            elif wahl == "3":
                url = input("Welchen Blog löschen? ").strip()
                blog_loeschen(url)
            elif wahl == "0":
                print("\nTschüss! 👋\n")
                break
    
    if __name__ == "__main__":
        menu()
    import requestsimport chromadbfrom chromadb.utils import embedding_functionsfrom bs4 import BeautifulSoupimport feedparserfrom urllib.parse import urlparsefrom urllib.robotparser import RobotFileParser# Vektordatenbank-Setupclient = chromadb.PersistentClient(path="./chroma_db")embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(    model_name="paraphrase-multilingual-MiniLM-L12-v2")collection = client.get_or_create_collection(    name="blog_posts",    embedding_function=embedding_fn)def ist_gueltige_wahl(eingabe, optionen):    """Prüft ob Eingabe eine gültige Menü-Option ist"""    return eingabe in optionendef blog_existiert(blog_url):    """Prüft ob Blog bereits in Datenbank ist"""    alle_daten = collection.get()    for meta in alle_daten['metadatas']:        if meta['blog_url'] == blog_url:            return True    return Falsedef pruefe_robots_txt(blog_url):    """Prüft, ob Scraping erlaubt ist"""    print("[1/5] Prüfe robots.txt... ", end="", flush=True)    try:        rp = RobotFileParser()        rp.set_url(f"https://{blog_url}/robots.txt")        rp.read()        if rp.can_fetch("*", f"https://{blog_url}/"):            print("✅ Scraping erlaubt")            return True        else:            print("❌ Blog erlaubt kein automatisches Auslesen")            print("\n💡 Respektiere die Vorgaben des Blogs!")            print("   Alternative: XML-Export hochladen (falls du Zugriff hast)\n")            return False    except:        # Keine robots.txt = erlaubt        print("✅ Keine robots.txt (= erlaubt)")        return Truedef hole_via_wordpress_api(blog_url):    """Versucht Beiträge über WordPress REST API zu holen"""    print("[2/5] WordPress REST API... ", end="", flush=True)    alle_posts = []    seite = 1    try:        while True:            url = f"https://{blog_url}/wp-json/wp/v2/posts?per_page=100&page={seite}"            response = requests.get(url, timeout=10)            if response.status_code != 200 or not response.json():                break            alle_posts.extend(response.json())            seite += 1        if alle_posts:            print(f"✅ {len(alle_posts)} Beiträge gefunden")            return [(p['title']['rendered'],                    BeautifulSoup(p['content']['rendered'], 'html.parser').get_text(),                    p['link'])                   for p in alle_posts]        else:            print("❌ nicht verfügbar")            return []    except:        print("❌ nicht verfügbar")        return []def hole_via_rss(blog_url):    """Versucht Beiträge über RSS-Feed zu holen"""    print("[3/5] RSS-Feed Standard... ", end="", flush=True)    feed_urls = [        f"https://{blog_url}/feed/",        f"https://{blog_url}/rss/",        f"https://{blog_url}/feed.xml",        f"https://{blog_url}/rss.xml"    ]    for feed_url in feed_urls:        try:            feed = feedparser.parse(feed_url)            if feed.entries:                print(f"✅ {len(feed.entries)} Beiträge gefunden")                return [(e.title,                        BeautifulSoup(e.get('content', [{}])[0].get('value', e.get('summary', '')), 'html.parser').get_text(),                        e.link)                       for e in feed.entries]        except:            continue    print("❌ nicht verfügbar")    return []def hole_via_rss_pagination(blog_url):    """Versucht RSS mit Pagination"""    print("[4/5] RSS mit Pagination... ", end="", flush=True)    alle_posts = []    seite = 2  # Seite 1 hatten wir schon    try:        while seite <= 50:  # Max 50 Seiten            feed_url = f"https://{blog_url}/feed/?paged={seite}"            feed = feedparser.parse(feed_url)            if not feed.entries:                break            alle_posts.extend(feed.entries)            seite += 1        if alle_posts:            print(f"✅ weitere {len(alle_posts)} Beiträge")            return [(e.title,                    BeautifulSoup(e.get('content', [{}])[0].get('value', e.get('summary', '')), 'html.parser').get_text(),                    e.link)                   for e in alle_posts]        else:            print("❌ nicht verfügbar")            return []    except:        print("❌ nicht verfügbar")        return []def blog_hinzufuegen(blog_url):    """Holt alle Beiträge von einem Blog"""    # Prüfen ob Blog schon existiert    if blog_existiert(blog_url):        print(f"\n⚠️  Blog {blog_url} ist bereits gespeichert!")        print("💡 Tipp: Erst löschen (Option 3), dann neu hinzufügen.\n")        return    print(f"\n📥 Versuche Beiträge von {blog_url} zu holen...\n")    # 1. robots.txt prüfen    if not pruefe_robots_txt(blog_url):        return    # 2-4. Verschiedene Methoden probieren    alle_beitraege = []    beitraege = hole_via_wordpress_api(blog_url)    if beitraege:        alle_beitraege.extend(beitraege)    else:        beitraege = hole_via_rss(blog_url)        if beitraege:            alle_beitraege.extend(beitraege)            # Versuche noch mehr zu holen            mehr = hole_via_rss_pagination(blog_url)            if mehr:                alle_beitraege.extend(mehr)    print(f"[5/5] Zusammenfassung... ", end="", flush=True)    if not alle_beitraege:        print("")        print("\n❌ Keine Beiträge gefunden!\n")        print("Mögliche Gründe:")        print("• API/Feed sind deaktiviert")        print("• URL ist nicht erreichbar")        print("• Blog nutzt ungewöhnliche Struktur")        print("\n💡 Alternative: XML-Export hochladen\n")        return    print(f"✅ {len(alle_beitraege)} Beiträge insgesamt")    print("\n💾 Speichere in Datenbank...")    for i, (titel, inhalt, link) in enumerate(alle_beitraege):        collection.add(            documents=[inhalt],            metadatas=[{                "title": titel,                "link": link,                "blog_url": blog_url            }],            ids=[f"{blog_url}_{i}"]        )        if (i+1) % 50 == 0:            print(f"  {i+1} Beiträge verarbeitet...")    print(f"✓ Fertig! {len(alle_beitraege)} Beiträge von {blog_url} gespeichert.\n")def blogs_anzeigen():    """Zeigt alle gespeicherten Blogs"""    alle_daten = collection.get()    if not alle_daten['metadatas']:        print("\n❌ Noch keine Blogs gespeichert!\n")        return    blogs = {}    for meta in alle_daten['metadatas']:        blog = meta['blog_url']        blogs[blog] = blogs.get(blog, 0) + 1    print(f"\n📚 Gespeicherte Blogs ({len(blogs)}):")    for blog, anzahl in sorted(blogs.items()):        print(f"  • {blog} ({anzahl} Beiträge)")    print()def blog_loeschen(blog_url):    """Löscht alle Beiträge eines Blogs"""    alle_daten = collection.get()    ids_to_delete = [        alle_daten['ids'][i]         for i, meta in enumerate(alle_daten['metadatas'])         if meta['blog_url'] == blog_url    ]    if not ids_to_delete:        print(f"\n❌ Blog {blog_url} nicht gefunden!\n")        return    collection.delete(ids=ids_to_delete)    print(f"\n{len(ids_to_delete)} Beiträge von {blog_url} gelöscht.\n")def menu():    while True:        print("=" * 50)        print("BLOG-CHATBOT VERWALTUNG")        print("=" * 50)        print("1 - Blog hinzufügen")        print("2 - Blogs anzeigen")        print("3 - Blog löschen")        print("0 - Beenden")        print("=" * 50)        wahl = input("\nDeine Wahl: ").strip()        if not ist_gueltige_wahl(wahl, ['0', '1', '2', '3']):            print("\n❌ Ungültige Eingabe! Bitte wähle eine der Optionen (0-3).\n")            continue        if wahl == "1":            url = input("Blog-URL (z.B. ebildungslabor.de): ").strip()            blog_hinzufuegen(url)        elif wahl == "2":            blogs_anzeigen()        elif wahl == "3":            url = input("Welchen Blog löschen? ").strip()            blog_loeschen(url)        elif wahl == "0":            print("\nTschüss! 👋\n")            breakif __name__ == "__main__":    menu()

    Bei Linux/Mac: Speichere mit Strg+O, Enter, Strg+X

    Bei Windows: Speichere über Datei → Speichern und schließe Notepad

    2. Programm ausführen

    Jetzt kannst du das Programm starten:

    Für alle Betriebssysteme (virtuelle Umgebung muss aktiv sein):

    python blog_verwalten.py
    python blog_verwalten.py

    Mit der Eingabe dieses Befehls braucht es nur ein paar Sekunden bis das Verwaltungsprogramm im Terminal aktiv wird. Du wirst dann gefragt, was du machen willst. Am sinnvollsten ist es, hier jetzt erst einmal Blogs hinzuzufügen (Option 1).

    Wenn du diese Option auswählst, wirst du aufgefordert, die URL des gewünschten Blogs einzugeben, von dem die Inhalte geholt und gespeichert werden sollen.

    Manchmal wirst du die Meldung bekommen, dass Scraping bei diesem Blog nicht erlaubt ist. Das solltest du respektieren.

    Du kannst so viele Blogs einsammeln, wie du möchtest. Ich würde an deiner Stelle erst einmal mit 3-5 Blogs beginnen.

    Insgesamt ist dieser Schritt eher langweilig, weil du nicht siehst, was im Hintergrund passiert. Wenn du neugierig bist, kannst du aber über den Datei-Manager deine angelegte Projektumgebung öffnen. Darin siehst du den Ordner chroma_db mit einer SQLite-Datenbank und einem Ordner mit mehreren Vektoren, was aber für dich alles nicht direkt lesbar und verwendbar ist. Ich fand es trotzdem spannend, mir mal direkt anzuschauen, wie so etwas aussieht.

    Schritt 4: Deinen Chat-Bot gestalten

    Die angelegte Vektor-Datenbank und der eingetragene Mistral-API-Key sind nun die Basis, mit der du deinen Blog-Chatbot erstellst. Grundsätzlich lässt sich dieser sehr unterschiedlich gestalten. Im Bot-Programm, das ich dir im folgenden vorschlage, wirst du beim Start des Chats immer erst gefragt, auf welche Blogs du dich bei deiner Frage beziehen willst. Dann kannst du einen oder mehrere der eingespeicherten Blogs auswählen, dann eine Frage stellen und daraufhin dann eine möglichst hilfreiche Antwort erhalten. Mit dem Befehl ‚quellen‘ erreichst du, dass die Links zu den durchsuchten Beiträgen angezeigt werden. Mit dem Befehl ‚mehr‘ werden nicht nur 3, sondern 10 Beiträge für die Antwort verwendet. (Du kannst diese Zahlen natürlich auch hochsetzen, dann kostet dich das mehr Tokens. Für mich passt es so ganz gut).

    In dem Chatbot-Programm ist auch ein Systemprompt enthalten, den du ebenfalls ändern kannst, wenn du das möchtest. Aber auch hier ist es wahrscheinlich ganz sinnvoll, erst einmal diese Vorlage auszuprobieren. Ich habe eine ganze Weile experimentiert und war dann mit der jetzt entstandenen Version recht zufrieden!

    So gehst du vor, um das Chat-Programm einzutragen:

    Linux/Mac:

    nano chatbot.py
    nano chatbot.py

    Windows:

    notepad chatbot.py
    notepad chatbot.py

    Du trägst diesen Inhalt ein:

    import os
    from dotenv import load_dotenv
    import chromadb
    from chromadb.utils import embedding_functions
    from mistralai import Mistral
    
    # Lade API-Key
    load_dotenv()
    api_key = os.getenv("MISTRAL_API_KEY")
    client_mistral = Mistral(api_key=api_key)
    
    # Lade Vektordatenbank
    client_chroma = chromadb.PersistentClient(path="./chroma_db")
    embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(
        model_name="paraphrase-multilingual-MiniLM-L12-v2"
    )
    collection = client_chroma.get_collection(
        name="blog_posts",
        embedding_function=embedding_fn
    )
    
    # Speichere letzte Quellen und Frage
    letzte_quellen = []
    letzte_frage = ""
    
    def hole_verfuegbare_blogs():
        """Zeigt alle gespeicherten Blogs"""
        alle_daten = collection.get()
        if not alle_daten['metadatas']:
            return []
    
        blogs = set(meta['blog_url'] for meta in alle_daten['metadatas'])
        return sorted(list(blogs))
    
    def blog_auswahl():
        """Lässt Nutzer*in Blogs auswählen"""
        blogs = hole_verfuegbare_blogs()
    
        if not blogs:
            print("\n❌ Keine Blogs gespeichert!")
            print("💡 Führe erst 'python blog_verwalten.py' aus.\n")
            return None
    
        print("\n📚 Verfügbare Blogs:")
        print("0 - Alle Blogs durchsuchen")
        for i, blog in enumerate(blogs, 1):
            print(f"{i} - {blog}")
    
        while True:
            wahl = input("\nWelche Blogs durchsuchen? (Zahl oder mehrere mit Komma, z.B. 1,3): ").strip()
    
            if wahl == "0":
                return None  # None = alle Blogs
    
            try:
                nummern = [int(n.strip()) for n in wahl.split(",")]
                ausgewaehlte = [blogs[n-1] for n in nummern if 1 <= n <= len(blogs)]
                if ausgewaehlte:
                    return ausgewaehlte
                else:
                    print("❌ Ungültige Auswahl!")
            except:
                print("❌ Ungültige Eingabe!")
    
    def extrahiere_keywords(frage):
        """Extrahiert wichtige Schlüsselwörter aus der Frage"""
        stopwords = ['was', 'ist', 'sind', 'der', 'die', 'das', 'ein', 'eine', 'mit', 'zu', 'im', 'in',
                     'von', 'für', 'und', 'oder', 'wie', 'wo', 'wann', 'warum', 'welche', 'welcher',
                     'gibt', 'es', 'dazu', 'darüber', 'findest', 'du', 'infos', 'informationen',
                     'schreibt', 'blog', 'beitrag', 'dem', 'den', 'des', 'an', 'auf', 'bei',
                     'nach', 'über', 'aus', 'hier', 'da', 'haben', 'hat', 'wird', 'werden', 'kann',
                     'können', 'soll', 'sollen', 'muss', 'müssen']
    
        woerter = frage.lower().split()
        keywords = [w.strip('?.,!') for w in woerter if w.lower() not in stopwords]
        return keywords
    
    def keyword_suche(keywords, blog_filter=None):
        """Sucht direkt nach Keywords in Titeln und Texten"""
        alle_daten = collection.get()
        treffer = []
    
        for i, meta in enumerate(alle_daten['metadatas']):
            # Blog-Filter anwenden
            if blog_filter and meta['blog_url'] not in blog_filter:
                continue
    
            titel_lower = meta['title'].lower()
            text_lower = alle_daten['documents'][i].lower()
    
            # Zähle Keyword-Matches
            titel_matches = sum(1 for kw in keywords if kw in titel_lower)
            text_matches = sum(1 for kw in keywords if kw in text_lower)
    
            if titel_matches > 0 or text_matches > 1:  # Mind. 1 im Titel ODER 2 im Text
                treffer.append({
                    'id': alle_daten['ids'][i],
                    'doc': alle_daten['documents'][i],
                    'meta': meta,
                    'score': titel_matches * 3 + text_matches
                })
    
        # Nach Score sortieren
        treffer.sort(key=lambda x: x['score'], reverse=True)
        return treffer
    
    def hybrid_suche(frage, blog_filter=None, anzahl_beitraege=3):
        """Kombiniert Keyword-First mit semantischer Suche"""
        # 1. Keywords extrahieren
        keywords = extrahiere_keywords(frage)
    
        # 2. Keyword-Suche
        keyword_treffer = keyword_suche(keywords, blog_filter)
    
        # 3. Semantische Vektorsuche
        if blog_filter:
            vektor_results = collection.query(
                query_texts=[frage],
                n_results=anzahl_beitraege * 2,
                where={"blog_url": {"$in": blog_filter}}
            )
        else:
            vektor_results = collection.query(
                query_texts=[frage],
                n_results=anzahl_beitraege * 2
            )
    
        # 4. Kombiniere: Keyword-Treffer zuerst, dann Vektor-Results
        finale_results = []
        verwendete_ids = set()
    
        # Keyword-Treffer haben Priorität
        for treffer in keyword_treffer[:anzahl_beitraege]:
            finale_results.append({
                'doc': treffer['doc'],
                'meta': treffer['meta'],
                'ist_keyword_match': True
            })
            verwendete_ids.add(treffer['id'])
    
        # Fülle auf mit Vektor-Results
        if vektor_results and vektor_results['documents'][0]:
            for i in range(len(vektor_results['documents'][0])):
                if len(finale_results) >= anzahl_beitraege:
                    break
    
                meta = vektor_results['metadatas'][0][i]
    
                # Prüfe ob schon dabei
                if any(r['meta']['link'] == meta['link'] for r in finale_results):
                    continue
    
                finale_results.append({
                    'doc': vektor_results['documents'][0][i],
                    'meta': meta,
                    'ist_keyword_match': False
                })
    
        if not finale_results:
            return None
    
        return {
            'documents': [[r['doc'] for r in finale_results]],
            'metadatas': [[r['meta'] for r in finale_results]],
            'keyword_flags': [r['ist_keyword_match'] for r in finale_results]
        }
    
    def chat(frage, blog_filter=None, konversation_history=None, anzahl_beitraege=3):
        """Beantwortet Frage basierend auf Blog-Inhalten"""
        global letzte_quellen, letzte_frage
    
        if konversation_history is None:
            konversation_history = []
    
        # Frage speichern
        letzte_frage = frage
    
        # Hybrid-Suche
        results = hybrid_suche(frage, blog_filter, anzahl_beitraege)
    
        if not results or not results['documents'][0]:
            return "❌ Keine passenden Beiträge gefunden!", konversation_history
    
        # Quellen speichern
        letzte_quellen = []
        for i, meta in enumerate(results['metadatas'][0], 1):
            marker = "🎯" if results['keyword_flags'][i-1] else ""
            letzte_quellen.append(f"   {marker}{i}. {meta['title']}\n      {meta['link']}")
    
        # Kontext zusammenbauen
        kontext_teile = []
        for i, doc in enumerate(results['documents'][0], 1):
            meta = results['metadatas'][0][i-1]
            kontext_teile.append(f"[Beitrag {i}: {meta['title']}]\n{doc[:2000]}")
    
        kontext = "\n\n---\n\n".join(kontext_teile)
    
        # System-Prompt
        system_prompt = """Du bist ein hilfreicher Assistent, der auf Basis von Blogbeiträgen antwortet.
    
    REGELN:
    1. Nutze ALLE Informationen aus den gegebenen Texten
    2. Lies die Texte VOLLSTÄNDIG und GENAU
    3. Wenn ein Text die Antwort enthält, NUTZE sie
    4. Antworte natürlich und gesprächig
    5. KEINE Quellenangaben in der Antwort (nur auf explizite Nachfrage)
    6. Wenn du etwas nicht weißt: Sage es ehrlich"""
    
        # Konversationshistorie aufbauen
        messages = [{"role": "system", "content": system_prompt}]
    
        # Bisherige Konversation
        for msg in konversation_history:
            messages.append(msg)
    
        # Aktuelle Frage mit Kontext
        user_message = f"""VERFÜGBARE BLOGBEITRÄGE:
    {kontext}
    
    ---
    
    FRAGE: {frage}"""
    
        messages.append({"role": "user", "content": user_message})
    
        # API-Aufruf
        response = client_mistral.chat.complete(
            model="mistral-small-latest",
            messages=messages,
            temperature=0.3
        )
    
        antwort = response.choices[0].message.content
    
        # Konversation aktualisieren
        konversation_history.append({"role": "user", "content": frage})
        konversation_history.append({"role": "assistant", "content": antwort})
    
        return antwort, konversation_history
    
    def zeige_quellen():
        """Zeigt die durchsuchten Beiträge"""
        global letzte_quellen
    
        if not letzte_quellen:
            print("\n❌ Keine Quellen verfügbar (stelle erst eine Frage).\n")
            return
    
        print("\n📖 Diese Beiträge wurden als relevant erachtet und durchsucht:")
        print("   (🎯 = Keyword-Match im Titel oder Text)\n")
        for quelle in letzte_quellen:
            print(quelle)
        print()
    
    def main():
        global letzte_frage
    
        print("\n" + "=" * 50)
        print("BLOG-CHATBOT")
        print("=" * 50)
    
        # Blog-Auswahl
        blog_filter = blog_auswahl()
    
        if blog_filter is None:
            print("\n🔍 Durchsuche: ALLE Blogs")
        else:
            print(f"\n🔍 Durchsuche: {', '.join(blog_filter)}")
    
        print("\n💬 Stelle deine Fragen!")
        print("\n📋 Befehle:")
        print("   • 'mehr'     → Durchsucht 10 statt 3 Beiträge zur letzten Frage")
        print("   • 'quellen'  → Zeigt die durchsuchten Beiträge")
        print("   • 'wechseln' → Ändert die Blog-Auswahl")
        print("   • 'exit'     → Beendet das Programm\n")
    
        # Konversationshistorie
        konversation = []
    
        # Chat-Loop
        while True:
            eingabe = input("❓ ")
    
            if eingabe.lower() in ['exit', 'quit', 'tschüss', 'bye']:
                print("\nBis bald! 👋\n")
                break
    
            if eingabe.lower() == 'quellen':
                zeige_quellen()
                continue
    
            if eingabe.lower() == 'mehr':
                if not letzte_frage:
                    print("\n❌ Stelle erst eine Frage!\n")
                    continue
                print(f"\n🔎 Durchsuche nun 10 Beiträge zur Frage: '{letzte_frage}'\n")
                antwort, konversation = chat(letzte_frage, blog_filter, konversation, anzahl_beitraege=10)
                print(f"\n💡 {antwort}\n")
                continue
    
            if eingabe.lower() == 'wechseln':
                blog_filter = blog_auswahl()
                konversation = []
                letzte_frage = ""
                if blog_filter is None:
                    print("\n🔍 Durchsuche: ALLE Blogs\n")
                else:
                    print(f"\n🔍 Durchsuche: {', '.join(blog_filter)}\n")
                continue
    
            if not eingabe.strip():
                continue
    
            antwort, konversation = chat(eingabe, blog_filter, konversation, anzahl_beitraege=3)
            print(f"\n💡 {antwort}\n")
    
    if __name__ == "__main__":
        main()
    import osfrom dotenv import load_dotenvimport chromadbfrom chromadb.utils import embedding_functionsfrom mistralai import Mistral# Lade API-Keyload_dotenv()api_key = os.getenv("MISTRAL_API_KEY")client_mistral = Mistral(api_key=api_key)# Lade Vektordatenbankclient_chroma = chromadb.PersistentClient(path="./chroma_db")embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(    model_name="paraphrase-multilingual-MiniLM-L12-v2")collection = client_chroma.get_collection(    name="blog_posts",    embedding_function=embedding_fn)# Speichere letzte Quellen und Frageletzte_quellen = []letzte_frage = ""def hole_verfuegbare_blogs():    """Zeigt alle gespeicherten Blogs"""    alle_daten = collection.get()    if not alle_daten['metadatas']:        return []    blogs = set(meta['blog_url'] for meta in alle_daten['metadatas'])    return sorted(list(blogs))def blog_auswahl():    """Lässt Nutzer*in Blogs auswählen"""    blogs = hole_verfuegbare_blogs()    if not blogs:        print("\n❌ Keine Blogs gespeichert!")        print("💡 Führe erst 'python blog_verwalten.py' aus.\n")        return None    print("\n📚 Verfügbare Blogs:")    print("0 - Alle Blogs durchsuchen")    for i, blog in enumerate(blogs, 1):        print(f"{i} - {blog}")    while True:        wahl = input("\nWelche Blogs durchsuchen? (Zahl oder mehrere mit Komma, z.B. 1,3): ").strip()        if wahl == "0":            return None  # None = alle Blogs        try:            nummern = [int(n.strip()) for n in wahl.split(",")]            ausgewaehlte = [blogs[n-1] for n in nummern if 1 <= n <= len(blogs)]            if ausgewaehlte:                return ausgewaehlte            else:                print("❌ Ungültige Auswahl!")        except:            print("❌ Ungültige Eingabe!")def extrahiere_keywords(frage):    """Extrahiert wichtige Schlüsselwörter aus der Frage"""    stopwords = ['was', 'ist', 'sind', 'der', 'die', 'das', 'ein', 'eine', 'mit', 'zu', 'im', 'in',                 'von', 'für', 'und', 'oder', 'wie', 'wo', 'wann', 'warum', 'welche', 'welcher',                 'gibt', 'es', 'dazu', 'darüber', 'findest', 'du', 'infos', 'informationen',                 'schreibt', 'blog', 'beitrag', 'dem', 'den', 'des', 'an', 'auf', 'bei',                 'nach', 'über', 'aus', 'hier', 'da', 'haben', 'hat', 'wird', 'werden', 'kann',                 'können', 'soll', 'sollen', 'muss', 'müssen']    woerter = frage.lower().split()    keywords = [w.strip('?.,!') for w in woerter if w.lower() not in stopwords]    return keywordsdef keyword_suche(keywords, blog_filter=None):    """Sucht direkt nach Keywords in Titeln und Texten"""    alle_daten = collection.get()    treffer = []    for i, meta in enumerate(alle_daten['metadatas']):        # Blog-Filter anwenden        if blog_filter and meta['blog_url'] not in blog_filter:            continue        titel_lower = meta['title'].lower()        text_lower = alle_daten['documents'][i].lower()        # Zähle Keyword-Matches        titel_matches = sum(1 for kw in keywords if kw in titel_lower)        text_matches = sum(1 for kw in keywords if kw in text_lower)        if titel_matches > 0 or text_matches > 1:  # Mind. 1 im Titel ODER 2 im Text            treffer.append({                'id': alle_daten['ids'][i],                'doc': alle_daten['documents'][i],                'meta': meta,                'score': titel_matches * 3 + text_matches            })    # Nach Score sortieren    treffer.sort(key=lambda x: x['score'], reverse=True)    return trefferdef hybrid_suche(frage, blog_filter=None, anzahl_beitraege=3):    """Kombiniert Keyword-First mit semantischer Suche"""    # 1. Keywords extrahieren    keywords = extrahiere_keywords(frage)    # 2. Keyword-Suche    keyword_treffer = keyword_suche(keywords, blog_filter)    # 3. Semantische Vektorsuche    if blog_filter:        vektor_results = collection.query(            query_texts=[frage],            n_results=anzahl_beitraege * 2,            where={"blog_url": {"$in": blog_filter}}        )    else:        vektor_results = collection.query(            query_texts=[frage],            n_results=anzahl_beitraege * 2        )    # 4. Kombiniere: Keyword-Treffer zuerst, dann Vektor-Results    finale_results = []    verwendete_ids = set()    # Keyword-Treffer haben Priorität    for treffer in keyword_treffer[:anzahl_beitraege]:        finale_results.append({            'doc': treffer['doc'],            'meta': treffer['meta'],            'ist_keyword_match': True        })        verwendete_ids.add(treffer['id'])    # Fülle auf mit Vektor-Results    if vektor_results and vektor_results['documents'][0]:        for i in range(len(vektor_results['documents'][0])):            if len(finale_results) >= anzahl_beitraege:                break            meta = vektor_results['metadatas'][0][i]            # Prüfe ob schon dabei            if any(r['meta']['link'] == meta['link'] for r in finale_results):                continue            finale_results.append({                'doc': vektor_results['documents'][0][i],                'meta': meta,                'ist_keyword_match': False            })    if not finale_results:        return None    return {        'documents': [[r['doc'] for r in finale_results]],        'metadatas': [[r['meta'] for r in finale_results]],        'keyword_flags': [r['ist_keyword_match'] for r in finale_results]    }def chat(frage, blog_filter=None, konversation_history=None, anzahl_beitraege=3):    """Beantwortet Frage basierend auf Blog-Inhalten"""    global letzte_quellen, letzte_frage    if konversation_history is None:        konversation_history = []    # Frage speichern    letzte_frage = frage    # Hybrid-Suche    results = hybrid_suche(frage, blog_filter, anzahl_beitraege)    if not results or not results['documents'][0]:        return "❌ Keine passenden Beiträge gefunden!", konversation_history    # Quellen speichern    letzte_quellen = []    for i, meta in enumerate(results['metadatas'][0], 1):        marker = "🎯" if results['keyword_flags'][i-1] else ""        letzte_quellen.append(f"   {marker}{i}. {meta['title']}\n      {meta['link']}")    # Kontext zusammenbauen    kontext_teile = []    for i, doc in enumerate(results['documents'][0], 1):        meta = results['metadatas'][0][i-1]        kontext_teile.append(f"[Beitrag {i}: {meta['title']}]\n{doc[:2000]}")    kontext = "\n\n---\n\n".join(kontext_teile)    # System-Prompt    system_prompt = """Du bist ein hilfreicher Assistent, der auf Basis von Blogbeiträgen antwortet.REGELN:1. Nutze ALLE Informationen aus den gegebenen Texten2. Lies die Texte VOLLSTÄNDIG und GENAU3. Wenn ein Text die Antwort enthält, NUTZE sie4. Antworte natürlich und gesprächig5. KEINE Quellenangaben in der Antwort (nur auf explizite Nachfrage)6. Wenn du etwas nicht weißt: Sage es ehrlich"""    # Konversationshistorie aufbauen    messages = [{"role": "system", "content": system_prompt}]    # Bisherige Konversation    for msg in konversation_history:        messages.append(msg)    # Aktuelle Frage mit Kontext    user_message = f"""VERFÜGBARE BLOGBEITRÄGE:{kontext}---FRAGE: {frage}"""    messages.append({"role": "user", "content": user_message})    # API-Aufruf    response = client_mistral.chat.complete(        model="mistral-small-latest",        messages=messages,        temperature=0.3    )    antwort = response.choices[0].message.content    # Konversation aktualisieren    konversation_history.append({"role": "user", "content": frage})    konversation_history.append({"role": "assistant", "content": antwort})    return antwort, konversation_historydef zeige_quellen():    """Zeigt die durchsuchten Beiträge"""    global letzte_quellen    if not letzte_quellen:        print("\n❌ Keine Quellen verfügbar (stelle erst eine Frage).\n")        return    print("\n📖 Diese Beiträge wurden als relevant erachtet und durchsucht:")    print("   (🎯 = Keyword-Match im Titel oder Text)\n")    for quelle in letzte_quellen:        print(quelle)    print()def main():    global letzte_frage    print("\n" + "=" * 50)    print("BLOG-CHATBOT")    print("=" * 50)    # Blog-Auswahl    blog_filter = blog_auswahl()    if blog_filter is None:        print("\n🔍 Durchsuche: ALLE Blogs")    else:        print(f"\n🔍 Durchsuche: {', '.join(blog_filter)}")    print("\n💬 Stelle deine Fragen!")    print("\n📋 Befehle:")    print("   • 'mehr'     → Durchsucht 10 statt 3 Beiträge zur letzten Frage")    print("   • 'quellen'  → Zeigt die durchsuchten Beiträge")    print("   • 'wechseln' → Ändert die Blog-Auswahl")    print("   • 'exit'     → Beendet das Programm\n")    # Konversationshistorie    konversation = []    # Chat-Loop    while True:        eingabe = input("")        if eingabe.lower() in ['exit', 'quit', 'tschüss', 'bye']:            print("\nBis bald! 👋\n")            break        if eingabe.lower() == 'quellen':            zeige_quellen()            continue        if eingabe.lower() == 'mehr':            if not letzte_frage:                print("\n❌ Stelle erst eine Frage!\n")                continue            print(f"\n🔎 Durchsuche nun 10 Beiträge zur Frage: '{letzte_frage}'\n")            antwort, konversation = chat(letzte_frage, blog_filter, konversation, anzahl_beitraege=10)            print(f"\n💡 {antwort}\n")            continue        if eingabe.lower() == 'wechseln':            blog_filter = blog_auswahl()            konversation = []            letzte_frage = ""            if blog_filter is None:                print("\n🔍 Durchsuche: ALLE Blogs\n")            else:                print(f"\n🔍 Durchsuche: {', '.join(blog_filter)}\n")            continue        if not eingabe.strip():            continue        antwort, konversation = chat(eingabe, blog_filter, konversation, anzahl_beitraege=3)        print(f"\n💡 {antwort}\n")if __name__ == "__main__":    main()

    Bei Linux/Mac: Speichere mit Strg+O, Enter, Strg+X

    Bei Windows: Speichere über Datei → Speichern und schließe Notepad

    Damit hast du es geschafft und kannst deinen Chatbot jetzt nutzen.

    Schritt 5: Deinen Chatbot nutzen!

    Mit diesem Befehl startest du deinen Chatbot:

    Für alle Betriebssysteme (virtuelle Umgebung muss aktiv sein):

    python chatbot.py
    python chatbot.py

    Es braucht wahrscheinlich ein paar Sekunden. Wie oben beschrieben stellt der Chatbot dir dann in der oben geteilten Version des Bot-Programms zunächst die Frage, welche eingespeicherten Blogs du als Basis nutzen willst. Dann kannst du deine Frage eingeben. Wenn du noch tiefer recherchieren willst, dann gib mehr ein. Wenn du andere Blogs als Grundlage nehmen willst, dann nutze den Befehl wechseln. Mit quellen siehst du, welche Beiträge der Bot durchsucht hat.

    Hier ist ein exemplarischer Chatverlauf, bei dem ich den Bot auf die eBildungslabor-Beiträge als RAG fokussiert habe:

    ❓ Wie definiert Nele Kreativität?

    💡 Nele definiert Kreativität im pädagogischen Kontext als die Fähigkeit, Neues denken zu können. Dabei geht es nicht primär um künstlerisches Tätigsein, sondern darum, über das Bestehende hinauszudenken und innovative Lösungen zu finden. Diese Definition steht im Rahmen der 4K-Kompetenzen, die auch Kommunikation, Kollaboration und kritisches Denken umfassen. Kreativität wird hier also als eine Schlüsselkompetenz für den digitalen Wandel und die aktive Gestaltung unserer Gesellschaft verstanden.

    ❓ Was schreibt Nele zu H5P?

    💡 Nele schreibt über H5P, dass es ein großartiges und offenes Tool zur Gestaltung von interaktiven Online-Materialien zum Lernen und Lehren ist. Sie schätzt besonders, dass es immer wieder neue Inhaltstypen gibt, die viel Raum für eine gezielte Nutzung im jeweiligen pädagogischen Setting bieten. Nele erwähnt, dass viele ihrer Lieblings-Inhaltstypen von Oliver, einem freiberuflichen Programmierer für H5P, entwickelt wurden.

    Sie stellt verschiedene Anwendungen und Möglichkeiten von H5P vor, wie den Phrase-Randomizer, der für kreative Ideenentwicklung genutzt werden kann, oder die Game Map, mit der interaktive Karten gestaltet werden können. Nele beschreibt auch, wie sie H5P genutzt hat, um aus Fotokollen interaktive Lerninhalte zu erstellen, indem sie den Inhaltstyp „Image Hotspots“ verwendet hat. Dabei werden Hintergrundbilder mit zusätzlichen Informationen und Erläuterungen versehen, um so einen vertiefenden Lerninhalt zu schaffen.

    Insgesamt zeigt Nele auf, wie vielseitig und nützlich H5P für die Gestaltung interaktiver und kreativer Bildungsmaterialien sein kann.

    ❓ quellen

    📖 Diese Beiträge wurden als relevant erachtet und durchsucht:
    (🎯 = Keyword-Match im Titel oder Text)

    🎯1. Praxis-Tipp: Inspirationsduschen mit H5P
    ebildungslabor.de/blog/praxis-
    🎯2. H5P-Hacking: Mit der Game Map interaktive Online-Karten gestalten
    ebildungslabor.de/blog/h5p-hac
    🎯3. Schnelle Idee für H5P: Image Hotspots statt ‚Fotokoll‘
    ebildungslabor.de/blog/schnell

    Ich finde: Ziemlich gut und nützlich!

    Mit exit kommst du aus dem Bot wieder raus und kannst dich dann daran machen, z.B. die Bot-Datei zu überarbeiten. (Du weißt ja jetzt, wie es geht: nano chatbot.py (Linux/Mac) bzw. notepad chatbot.py (Windows) eingeben und Änderungen vornehmen.)

    Wenn du das Terminal geschlossen hast und irgendwann später den Bot wieder öffnen willst, dann öffnest du wie in Schritt 2 beschrieben mit dem cd Befehl wieder das Verzeichnis, aktivierst anschließend die virtuelle Umgebung und startest dann das Botprogramm (mit dem Befehl: python chatbot.py)

    Fazit

    Ich habe mir erste Blogs eingespeichert und mit dem entwickelten Bot eine Weile gechattet. Komplexere Anfragen (Wie definiert Melanie im Vergleich zu Nele den Begriff Kreativität?) sind mit diesem Basis-Setup nicht möglich. Um sich aber einen Überblick über Blog-Inhalte zu verschaffen und zusammenfassende Verbindungen zu nutzen sowie Hinweise auf weiterführende Quellen zu erhalten, finde ich diese selbst gebastelte Anwendung richtig hilfreich. Ich kann dir das Nachbasteln somit sehr empfehlen.

    Viel Freude beim Erkunden und Ausprobieren!

    Bonus: Einen RAG-Chatbot online bringen!

    So wie du einen RAG-Chatbot in deinem Terminal gestalten kannst, kannst du solch eine Anwendung natürlich auch auf einen Online-Server übertragen und dann anderen öffentlich zur Verfügung stellen. Das wird im Internet ja zuhauf angeboten. Man kann es sich eben aber auch selbst gestalten.

    Ich habe das mit einer leicht angepassten Version des obigen Bot-Programms ausprobiert, in dem ich darin nur die Inhalte von meiner eigenen Website eingespeist habe und dazu einen Bot erstellt habe. Der Server kostet ca. 4 Euro / Monat. Ich lasse ihn auf eine Subdomain meiner Website verweisen. Ich habe außerdem (um meine Mistral-Tokens nicht alle direkt aufzubrauchen) eine Begrenzung auf 25 Fragen bei der öffentlichen Nutzung eingestellt. Als Interface habe ich die Open Source Software Streamlit genutzt (anstelle des Terminals auf dem jeweils eigenen Rechner). Das Ergebnis kannst du auf bot.ebildungslabor.de ausprobieren.

    (Wenn wir mit einer lokalen und damit dezentralen Nutzung vorankommen, so wie ich es in meinem obigen Blogbeitrag beschrieben habe, dann sind solche Website-Bots bald überflüssig. Schließlich ist es ja viel sinnvoller, sich selbst genau die Anwendung mit den Inhalten, Einstellungen und Systemprompts zu bauen, die man gerade braucht!)

    #DigitaleMündigkeit #KünstlicheIntelligenzKI
  24. Dieser Fragebogen bietet ein Selbstreflexions-Instrument für Lernende, um den eigenen Umgang mit generativer Künstlicher Intelligenz kritisch zu hinterfragen.
    Mehr bei: bit.ly/4sd7Ibl

    #GenAI, #chatbot, #lernenmitki, #kiimunterricht, #kikompetenz, #digitalemündigkeit, #ailiteracy, #aireadiness, #deskilling, #skillskipping

  25. Algorithmische Kompetenz junger Menschen auf TikTok

    In diesem Podcast wird eine Studie des Hans-Bredow-Instituts aus dem Jahr 2025 mit dem Titel „Zwischen Wert-schätzung und Widerstand: Algorithmische Kompetenz junger Menschen am Beispiel der Kurzvideo-plattform TikTok” thematisiert.

    bit.ly/4psbYlG

    #tiktok, #tiktokAlgorithmus, #doomscrolling, #lernenmitki, #kiimunterricht, #medienkompetenz, #ditialekomptetenz, #digitalemündigkeit, #kikompetenz

  26. Erster Sonntag im Monat - da berichten wir, was wir #DUTgemacht haben. Also: Das Forschungswerk hatte noch *nie* einen eigenen Account auf einer #BigTech-Plattform. Nur im Fediverse fühlt sich das richtig an. :fediverse:
    Privat war ich bei #Facebook, als es dort noch nett war - also vor der #Enshittification und den #SocialBots und vermüllten Timelines mit #AISlop. Konto ist aber bereits seit einigen Jahren gelöscht... ❌ Nie bereut.

    Nun versuche ich, das Fediverse bekannter zu machen und noch mehr nette Leute, tolle #Vereine und #Organisationen sowie #Universitäten hierher zu holen... Zudem versuche ich, mit #Workshops, #Eltern|abenden und #Fortbildungen mehr Menschen für #digitaleMündigkeit zu sensibilisieren, und Wissen rund um digitale #Medien zu vermitteln. Immer mit dem Ziel, gute Entscheidungen treffen zu können.

    Ich habe nach nicht mal einem Jahr hier heute meinen 200. #QualitätsFollower begrüßen dürfen und freue mich mega darüber! :mastogrin: 🎉 #EchteReichweite

    #UnplugTrump

  27. Praxiswerkstatt „Fediverse“

    Am 11.11 dreht sich alles um das Fediverse – ein dezentrales Netzwerk, das neue Wege für Austausch und Vernetzung eröffnet.

    In der Praxiswerkstatt gibt Anja Obermüller (@DresdnerForschungswerk) einen Einblick in Grundlagen, Anmeldung und Nutzung – mit Fokus auf Mastodon.

    📅 Datum: 11.11. 10-12:30 Uhr (online)
    🕒 Zeit: 10:00 – 12:30 Uhr
    💻 Anmeldung per Email an [email protected]

    #Fediverse #SocialMedia #Sachsen #Medienbildung #DigitaleMündigkeit

  28. Statische Website-Tools als hilfreiche Alternative

    Vor kurzem war eine Unterseite der eBildungslabor-Website gehackt – und auch bei vielen Kolleg*innen nehme ich zunehmend wahr, dass sie mit Malware-Angriffen konfrontiert sind. Diese Situation brachte mich dazu, mich mal wieder mit statischen Website-Tools zu beschäftigen.

    Was sind statische Website-Tools?

    Ein klassisches Content Management System als Installation auf einer Website sieht so aus, dass ich eine Software auf meinen Server hochlade, diese mit einer Datenbank verbinde und mich dann auf der Website ins Backend einloggen kann, wo ich Beiträge schreiben und auch ansonsten die Website gestalten kann. Für meine eBildungslabor-Website nutze ich hierfür WordPress. Früher hatte ich Drupal verwendet, was ähnlich funktioniert.

    Anders als solch ein klassisches Content Management System funktionieren statische Website-Tools so, dass ich mir eine Software auf meinem Rechner installiere – und dort dann (in unterschiedlichen Formaten) meine Beiträge schreiben kann, die dann von der Software so umgewandelt werden, dass ich sie danach auf meinen Server hochladen kann. Das bedeutet dann im Ergebnis, dass auf meinem Server lauter einzelne Dateien sind. Es handelt sich um eine statische Website.

    Der klare Vorteil dieser Herangehensweise ist, dass die Website oft deutlich schneller und sicherer ist, weil ja nur einzelne Dateien aufgerufen werden müssen. Der Nachteil ist, dass es zum Teil weniger Funktionalitäten geben kann. Zum Beispiel kann ich über meine WordPress-Website auch H5P-Inhalte erstellen und direkt in Beiträge einfügen. Außerdem habe ich eine gut funktionierende Suche, kann meinen Newsletter versenden, bin ans Fediverse angeschlossen, integriere einen Podcast und habe Spielereien, wie z.B. ein Plugin, das Zufallsbeiträge anzeigt zur Verfügung …

    Genau bei solchen Funktionalitäten scheinen mir statische Website-Tools inzwischen aber aufzuholen. Eine Suche gibt es zum Beispiel immer häufiger. Beim Tool Ghost kann auch ein Newsletter versendet werden und es gibt eine Fediverse-Anbindung.

    Wozu lassen sich statische Website-Tools nutzen?

    Ich habe bisher überwiegend zwei Herangehensweisen bei der Gestaltung von Websites:

    1. Ich nutze WordPress und baue damit automatisch sehr aufwendige Websites, auch wenn ich viele Funktionalitäten vielleicht gar nicht immer brauche.
    2. Ich erstelle statische Websites in Handarbeit unter Nutzung von CSS-Systemen, wie dem Pico.CSS oder Simple.CSS oder – etwas aufwendiger – mit den Templates von HTML5Up. Das mache ich vor allem bei kleineren Websites, die ich möglichst wartungsfrei ins Internet stellen will. Oft verbreite ich diese direkt über Codeberg oder Github Pages.

    Statische Websites-Tools können aus meiner Sicht nun eine schöne Zwischen-Variante darstellen: Sobald eine Website ein bisschen aufwändiger wird, so dass es nervig wird, z.B. Footer und Navigation auf allen einzelnen Seiten manuell einzutragen, kann ich stattdessen zu Website-Tools wechseln. Ebenso kann ich Websites, die ich mit WordPress angelegt habe, aber die eigentlich nur aus ein paar Seiten und Beiträgen bestehen, zu einem statischen Website-Tool umziehen. Da die meisten statischen Website-Tools über eine WordPress-Import-Funktion verfügen, ist das sehr niederschwellig realisierbar.

    Ich finde an statischen Website-Tools sehr sympathisch, dass ich verstehe und direkt sehe, was alles auf meinen Server hochgeladen wird. Das ist gerade in digitalen Zeiten, in denen immer mehr nicht sichtbar und verstehbar entsteht, ein hilfreicher Blick ‚unter die Haube‘, was Gestaltbarkeit und digitale Mündigkeit ermöglicht.

    Beispiel: Umzug von internetquatsch.de

    Mithilfe eines WordPress-Import-Tools habe ich zum Beispiel heute Nachmittag die frühere WordPress-Internetquatsch-Website zu Publii umgezogen. Das hat insgesamt nicht mal eine Stunde Zeit gebraucht. Diese Schritte waren nötig:

    1. Das Tool auf meinem Laptop installieren.
    2. Die Internetquatsch-Beiträge aus dem WordPress-Backend exportieren (= Tools -> Export)
    3. Die Beiträge bei Publii importieren.
    4. Ein Theme auswählen, installieren und einrichten.
    5. Website-Dateien generieren.
    6. Website-Dateien auf den Server hochladen.

    Hier kannst du dir das Ergebnis anschauen.

    Welche statischen Website-Tools sind empfehlenswert?

    Ich werde in der nächsten Zeit sicherlich mit weiteren statischen Website-Tools experimentieren. Im Fediverse habe ich nach Empfehlungen gefragt. Der Thread eignet sich sicherlich für alle, die gerade auch auf der Suche sind. Danke für die Empfehlungen.

    Meine (vorläufige) Einordnung ist:

    • Publii scheint mir am wenigsten nerdig zu sein. Ich bekomme auf meinem Laptop ein Interface, das wie ein ganz normales Backend aussieht, in dem ich auch direkt meine Beiträge mit einem ganz normalen WYSIWYG-Editor schreiben kann.
    • Ghost scheint sehr mächtig zu sein – also wahrscheinlich immer dann eine gute Wahl, wenn es eine aufwändigere Website ist. (Vielleicht irgendwann mal eine gute Wahl, wenn ich auch mit der eBildungslabor-Website umziehen will).
    • Hugo hatte ich früher, was ich schön fand, weil ich das Schreiben von Beiträgen mit Markdown sehr mochte. In diese Richtung wurde mir nun auch Zola empfohlen, was ich mir ansehen werde.

    Einen guten Überblick über diese und weitere Möglichkeiten bietet neben dem oben verlinkten Thread auch dieser Beitrag

    Fazit

    Für mich eröffnen sich mit statischen Website-Tools gerade sehr viele, neue Möglichkeiten, um Inhalte sicher und schnell ins Internet zu bringen, ohne danach dann mit viel Wartungsaufwand konfrontiert zu sein. Besonders spannend wird das Ganze glaube ich dann, wenn man selbst anfängt an Themes und Plugins für die Website-Tools zu basteln und so zu sehr individuellen und spezifischen Lösungen kommt.

    Ich werde weiter experimentieren und berichten; und ich freue mich, auch von deinen Erfahrungen zu lesen.

    #DigitaleMündigkeit

  29. Was für ein Abend!
    Rund 100 Menschen waren gestern bei der Lesung von @reticuleena in der @zlb_berlin dabei und haben über digitale Mündigkeit, analoge Rechte und gesellschaftliche Werte diskutiert. Für uns zeigt sich: Das Thema bewegt und betrifft uns alle!

    Wir bleiben dran und setzen uns weiter für einen fairen und inklusiven Zugang zu digitalen Angeboten ein.

    #DigitalZebra #VÖBB #DigitaleMündigkeit #Inklusion #digitalzwang

  30. Erster Tag auf der Frankfurter #Buchmesse nähert sich dem Ende. Viele spannende Gespräche und reger Austausch über #KurzUndMündig und #DigitaleMündigkeit geführt. Nur Buchhändler machen sich rar. Dabei wollen wir denen doch unsere kurz&mündig-Ständer vorstellen. Wenn ihr welche seht, schickt sie zu uns: Halle 3.1 K66

    #FBM #FBM25

  31. Gehackte Website am Montagmorgen 😟

    Als ich heute morgen meine Mails öffnete, hatte ich eine Nachricht von Hetzner, wo meine Websites gehostet sind, mit der Information, dass auf meinem Server Malware gefunden wurde. Zum Glück war bisher nur eine Unterseite betroffen, nicht die eBildungslabor-Website selbst. Ich weiß aber von anderen, dass das relativ schnell dann auch andere Installationen betreffen kann.

    Ich habe jetzt erst einmal gemacht, was in der Mail vorgeschlagen wurde:

    1. Alle Malware gelöscht.
    2. Mich mit den einmaligen Zugangsdaten auf die Website eingeloggt und ein BackUp gezogen.
    3. Dann die Unter-Website erst einmal gelöscht.

    Dann habe ich geschaut, ob ich auf anderen Websites auch verdächtige Dateien finde. Zum Glück bisher noch nichts.

    Jetzt warte ich erst einmal ab und versuche dann, die einzelnen Installationen auf unterschiedliche Server-Pakete zu verteilen. Wenn dann einmal etwas angegriffen wird, ist immer nicht gleich der ganze Rest mit betroffen.

    Perspektivisch überlege ich mir, ob ich wirklich bei WordPress bleiben will. Mindestens kleinere Projekte setze ich bereits jetzt in den meisten Fällen als statische Websites um. Für die Umgestaltung meiner eBildungslabor-Website wäre da aber eine größere Anpassung notwendig. Mal sehen!

    #DigitaleMündigkeit

  32. Ich finde, nicht nur, hier wird viel zu wenig über das #Angebot DigitalZebra
    in Berliner #Bibliotheken gesprochen und diskutiert.

    Wie kann das Angebot bekannter werden?

    Es ist ja sozusagen #cryptoparty in deiner Bibliothek. Ein Projekt was gefördert werden sollte damit es beständig bleibt.

    #DigitalZebra #DigitaleSelbstbestimmung
    #DigitaleMündigkeit #Digitalzwang #Berlin #DigitaleFreiheit #Bibliothek

  33. Adventskalender-Vorlage zum eigenen Gestalten

    In den letzten Jahren fand ich es immer wieder schön, dass sehr viele Menschen und Organisationen im Bildungsbereich zum Jahresende hin Online-Adventskalender gestaltet haben. Hinter jedem Türchen fand sich dann eine Bildungsinspiration.

    Im Kontext von KI wäre es nun sicherlich ein leichtes, ein beliebiges Sprachmodell zu öffnen und sinngemäß zu prompten: „Erstelle mir einen Adventskalender als Web-App. Hinter jedem Türchen soll ein möglichst kreativer und spannender Denkanstoß zu Bildung und Digitalisierung zu finden sein.“

    Viel mehr Freude als solch ein KI-Slop (= schnell gepromptete Inhalte, die Qualität, Weiterdenken, Hinterfragen sowie gemeinsames Nachdenken und ein spezifisches Anliegen vermissen lassen), dürfte aber eine eigene Gestaltung von Inhalten (egal ob mit oder ohne KI-Interaktion) machen. Dazu teile ich in diesem Blogbeitrag eine einfache Vorlage.

    In den Vorjahren konnte hierfür z.B. eine Vorlage auf der Plattform Glitch genutzt werden. Glitch bietet inzwischen aber kein Hosting mehr an. Darum gibt es nun diese Alternative.

    Zu den Vorzügen von KI gehört, dass man in Interaktion mit KI-Sprachmodellen eigene Anliegen besser verfolgen kann. Somit konnte ich die frühere Vorlage benutzerfreundlicher gestalten. Sie ist nun Markdown-basiert, was hoffentlich die Gestaltung von Inhalten vereinfacht.

    Vorlage und Anleitung

    Meine (unter Nutzung von KI-Sprachmodellen) gestaltete Vorlage findest du unter diesem Link. Am 24. Dezember wird der Adventskalender dann so aussehen:

    Adventskalender mit geöffneten Türchen

    Wenn du mit dieser Vorlage einen Online-Adventskalender gestalten und teilen möchtest, dann kannst du folgendermaßen vorgehen:

    Schritt 1: Registrierung bei Codeberg

    Du richtest dir einen kostenfreien Account auf Codeberg an. Das ist eine offene Infrastruktur zum gemeinsamen Coding. Wenn du den Dienst sympathisch findest, kannst du ihn mit einer Spende unterstützen.

    Schritt 2: Vorlage kopieren

    Du klickst rechts oben auf das Plus-Menü und wählst neue Migration aus:

    Du klickst auf Git.

      Du gibst als Klon/Migrations-URL ein:

      https://codeberg.org/neleh/adventskalender-vorlage.git

      Dann gibst du deinem Verzeichnis einen Namen. Zum Beispiel: mein-adventskalender.

      Ausgefülltes Formular zum Migrieren der Vorlage

      Zuletzt klickst du auf Repository migrieren.

      Schritt 3: Vorlage verstehen und anpassen

      Es braucht ein paar Sekunden Zeit. Dann ist dein Verzeichnis fertig erstellt.

      Du findest darin:

      • Eine index.html Datei. Das ist die Startseite deines Adventskalenders. Darin findest du ein Grid mit 24 Türchen, die im Dezember nacheinander öffnen.
      • Einen Ordner ‚content‘, in dem 24 Türchen zu finden sind – nummeriert miz 01.md bis 24.md
      • Einen Ordner ‚Bilder‘, in den du weitere Bilder hochladen kannst, wenn du welche in deinem Adventskalender nutzen willst.
      • Die Datei tag.html. Hier ist der ‚Rahmen‘ für deine Türchen gespeichert.

      Am wichtigsten ist für dich nun der Ordner ‚Content‘. Hier kannst du nacheinander die Türchen öffnen und bearbeiten. Dazu klickst du rechts oben auf das Stift-Symbol und gelangst dann in einen Editor. Geschrieben wird mit Markdown, was nicht zu kompliziert zur Formatierung ist. Du kannst dich an dem Beispielinhalt orientieren, in dem du Regeln für Überschriften, Bilder. Links, Videos … findest und damit dann einfach deine Inhalte gestalten kannst. Wenn du speicherst (= Änderungen committen), dann siehst du deinen Inhalt schon relativ realitätsnah, aber noch nicht so, wie später im Kalender. Denn erstens werden z.B. Bilder und Videos hier noch nicht dargestellt (das ist also kein Fehler!). Zweitens wird dein Inhalt noch um den ‚Rahmen‘ aus der Datei tag.html ergänzt. Das bedeutet, dass immer Türchen #Nummer drüber stehen wird und es einen Link zurück zur Übersicht gibt.

      So sieht Türchen 1 später im veröffentlichten Adventskalender mit dem unveränderten Beispielsinhalt aus:

      Bei der Bearbeitung kannst du dir unter dieser URL einen Eindruck von deinem Adventskalender verschaffen: deinbenutzername.codeberg.page/deinverzeichnisname

      Bitte beachte: Wenn du Änderungen vornimmst, kann es bis zu 5 Minuten dauern, bis diese auch auf der ‚richtigen‘ Website sichtbar werden.

      Schritt 4: Weitere Anpassungen vornehmen

      Wenn du bei der Rahmengestaltung weitere Änderungen vornehmen willst, dann kannst du dazu die Dateien index.html und tag.html öffnen und bearbeiten. Sehr einfach wäre es z.B. die Überschrift und Unterüberschrift deines Adventskalender zu verändern. Dazu suchst du in der index.html Datei den <header> und änderst den Text darin:

       <header>        <h1>🎄 Adventskalender 🎄</h1>        <p>Am jeweiligen Tag im Dezember, kannst du auf die Türchen klicken, um sie zu öffnen!</p>    </header>

      Darüber hinaus kannst du im <style>-Bereich z.B. Farben anpassen. Hier kann ein KI-Sprachmodell hilfreich sein und dich bei gewünschten Änderungen im Code unterstützen.

      (Auch hier wieder beachten: Es braucht bis zu 5 Minuten bis die Änderungen sichtbar werden.)

      Schritt 5: Testmodus ausstellen

      Wenn dein Adventskalender fertig ist, möchtest du sicherlich die Türchen erst einmal alle schließen. Sie sollen ja erst im Dezember eines nach dem anderen geöffnet werden können. Dazu öffnest du die index.html Datei und stellst den Test-Modus aus.

      Dazu suchst du diesen Code in Zeile 120ff:

       // ⚙️ TEST-MODUS: Setze testMode auf true zum Testen und auf false fürs Teilen    const testMode = true;    const testDay = 24;    // Wieviele Türchen sollen im Testmodus geöffnet sein?

      Hier änderst du jetzt true in false (also: const testMode = false;) Damit wird der Test-Modus deaktiviert. Nach spätestens 5 Minuten sollten alle Türchen geschlossen sein. Du kannst deinen Adventskalender teilen. (Änderungen sind natürlich weiterhin noch möglich).

      Adventskalender mit geschlossenen Türchen

      Feedback und Weiternutzung

      Die Vorlage steht unter der Lizenz CC0 1.0. Du kannst sie also beliebig weiternutzen und anpassen ohne Notwendigkeit von Lizenzhinweisen. Wenn du Vorschläge zur Verbesserung der Vorlage hast, dann freue ich mich, von dir zu lesen. Du kannst diese natürlich auch direkt auf Codeberg vorschlagen.

      Ich freue mich auf viele spannende und schöne Adventskalender im Dezember! :-)

      PS. Wenn du selbst oder deine Institution (z.B. innerhalb von Moodle oder WordPress) über H5P verfügt, dann ist dieser Inhaltstyp eine gute Alternative, um einen eigenen Adventskalender zu gestalten.

      #DigitaleMündigkeit #Tools

    1. Digitaler Zwang? Muss nicht sein.
      Leena Simon liest in der Amerika-Gedenkbibliothek (PopUp-Saal) aus ihrem Buch „Digitale Mündigkeit“ – das Kapitel über Digitalzwang – und diskutiert Alternativen zu App-Pflicht, E-Ticket & Co.

      📅 23.10.2025, 18:00 – 19.30 Uhr
      📍 Blücherplatz 1, 10961 Berlin

      Kommt offline vorbei und redet mit!

      Eine Kooperation des VÖBB-Projekts Digital-Zebra in Kooperation mit der ZLB und Digitalcourage.

      #DigitaleMündigkeit #Digitalzwang #Berlin #Lesung #ZLB #DigitaleFreiheit #DigitaleSelbstbestimmung #AGB #DigitalZebra

      zlb.de/veranstaltungsuebersich

    2. Diesen Freitag ist der 14. März, oder in US-Schreibweise 3/14 👉 der #PiTag.

      Wann denn bitte sonst wäre Zeit für ein neues Treffen? Eben. Tun wir was für #digitaleMündigkeit und gegen leere Mägen. 🤓

      📅 Freitag, 14.3.2025
      ⌚ ab 19:00 Uhr
      📍 Restaurant „Thalermühle“ auf der Wöhrmühlinsel in #Erlangen

    3. @nicolas_woehrl Danke für die gelegentliche Erwähnung von #Mastodon bei deinem Talk auf der #subscribe11. 🙇

      Es braucht wesentlich mehr davon von einflußreichen Leuten wie dir, wenn wir die Leute vermehrt zu nicht-algorithmusgetriebenen sozialen Netzwerken bringen wollen. Das ist IMHO ein wichtiger Baustein gegen #Schwurbel aller Art!

      Hintergründe:
      karl-voit.at/2024/06/18/Fedive

      #publicvoit #health #Gesundheit #fakenews #Bildung #sozialeNetzwerke #digitaleMündigkeit #endlessscrolling #Dezentralität

    4. Die #Leimbachtalschule in #Dielheim empfiehlt sich als Host für #digitaleMündigkeit ab Klasse 4. Das inzwischen zwei Jahre aktive Projekt in #gemeinnützig|er Trägerschaft der "#KraichgUG" freut sich über Spenden auf DE47 4306 0967 1329 2321 00 an die "Kraichgau.Net gemeinnützige UG (haftungsbeschränkt)".

      phenixxenia.org/wiki/Das_%22Di

    5. Obwohl es unsere lose Gruppe erst seit 3 Monaten gibt und wir noch keine Pressearbeit gemacht haben, gibt es schon ein ansehnliches #Medienecho – jetzt auch auf unserer Website aufgelistet: datenfreu.de

      Wenn ihr euch für eins unserer Themen interessiert, dann kommt gern zu unserem nächsten Treffen – diesmal in #Bethel!

      #Digitalpolitik #Feditreff #Datenschutz #Grundrechte #digitalRights #InternetKultur #Mündigkeit #digitaleMündigkeit #Bielefeld #OWL #Westfalen #Ostwestfalen #FediCamp

    6. Ja, natürlich kann man von einem #FotoBug sprechen, den #Apple schnellst möglich schließen wird, um seine Kunden vor dem #GAU zu bewahren. ...

      Was für ein Käse.
      Apple hat wieder einmal bewiesen, dass es sich weder an die eigenen Worte hält (30 Tage Speicherdauer), noch an Gesetze. Apple ist erwiesenermaßen eine #Datenkrake, die einmal erhobene Daten wie einen #Schatz hütet und den Kunden über die Existenz belügt. Das ist ein offener #Vertrauensbruch.

      Apple ist #intransparent und #nichtVertrauenswürdig.
      Apple ist kein Stück besser als #Microsoft #Google #Meta #Amazon & Co.

      Ich bin mal gespannt, welche Fragen das @bsi an Apple richten wird und was aus der #VS_NfD Zertifizierung wird. ...

      Zeit für #digitaleSouveränität #digitaleMündigkeit
      Zeit für #LinuxOnMobile #PostmarketOS #Mobian #SailfishOS
      Zeit für digitale Verantwortung in Europa!

    7. @bildungsluecken 🤣

      #FDP, #KI, #Eigenverantwortung

      Wie wäre es statt dessen einmal mit #digitaleSouveränität, #digitaleMündigkeit, #Faschismus sicherer Digitalisierung ...

      #Geld, #Geräte, #Weiterbildung, #Lobbyismus, #Bequemlichkeit, ...

      Nein, ich glaube nicht, dass das nochmal gut wird.

      Erst müssen wir mit unserem lauten #Hurra-Geschrei gewaltig auf die Nase fallen.
      #Kakistokratie #Korporokratie
      Vielleicht ist es ja auch schon bald soweit, ... 🤷‍♂️ ..., danach noch so schlappe 10-20 Jahre, dann könnte es passen.

    8. #fediVerse #Klimawandel #CO2
      Na endlich!
      Zu guter letzt bekommen wir doch noch echte Zahle wie sehr uns das Thema CO2 Belastung, #Internet, #bitcoin #blockchain Energieverschwendung, #Verbrennermotoren versus #LetzteGeneration und so weiter und so fort wirklich interessieren.
      Ziemlich genau drei Klicks in einer Woche bei 14 Millionen Nutzern.
      Na wenn das man nich #digitaleMündigkeit ist!

      #fediTips der Woche .. mach 'ne Umfrage draus.

      /sarcasm mode off
      duck und wech

      troet.cafe/@bitpickup/11174419

    9. Interesse?
      "Die #Schulbehörde stellt aus dem Projektfonds „Medien und Bildung #Hamburg“ insgesamt 50.000 € für Medienbildungsprojekte bereit, die sich intensiv mit dem Thema Künstliche Intelligenz (#KI) auseinandersetzen."

      Es ginge um #Medienkompetenz -Förderung, verschiedene Aspekte d KI

      Menschen vom #cccHH vielleicht?

      HIer könnte man etwas aufklären.
      Die maximale Förderhöhe pro Projekt beträgt 5.000 €

      Bewerbungsschluss: 31.01.24
      #digitalemundigkeit #datenschutz

      hamburg.de/bsb/pressemitteilun

    10. Gerade ist ein Paket von @digitalcourage angekommen mit wärmendem Pulli und guter Lektüre 😍
      Danke für die schnelle Lieferung und besonderen Dank an @reticuleena für die schöne Widmung ❤️✊

      #Datenschutz #DigitaleMündigkeit #kurzundmündig #Digitalcourage

    11. Bald ist #Weihnachten. Mein #Buch "Dann haben die halt meine Daten. Na und?!" eignet sich super zum Verschenken. Ihr wisst schon, der eine Onkel, die eine Oma in der Familie, die ja nichts zu verbergen hat ...

      Die 5. Auflage kriegt Ihr druckfrisch bei shop.tredition.com/booktitle/D, im Shop der @digitalcourage & beim Buchhändler Eures Vertrauens.

      Mehr Info & Leseprobe: zotzmann-koch.com/buecher/na-u

      #NaUndDasBuch #Datenschutz #Privatsphäre #Privacy #DigitaleMündigkeit #DigitalKompetenz #NichtsZuVerbergen

    12. @OSM_tourism
      Wir müssen uns (ja, aus politischen Gründen!) noch viel mehr zurück holen:

      ❤ wir müssen uns den Messenger zurück holen (no #WhatsApp, z.B. mit #Matrix oder #XMPP)
      ❤ wir müssen uns die #Videokonferenzen zurück holen (no #Zoom, no #MSTeams, z.B. mit #BBB oder #Jitsie)
      ❤ wir müssen uns die Cloud zurück holen (z.B. mit #Nextcloud)
      ❤ wir müssen uns das Computing zurück holen (no #Windows, z.B. mit #Linux)
      ❤ wir müssen uns die #Office-Programme zurückholen (no #MS365, z.B. mit #LibreOffice und #Collabora)
      ❤ wir müssen uns die Mobilgeräte zurück holen (no #iOS, no #Android)
      ❤ wir müssen uns die #AppStore s zurück holen
      ❤ wir müssen uns den #Wirtschaftsstandort zurück holen
      ❤ wir müssen uns die #Medienkompetenz zurück holen
      ❤ wir müssen uns die #digitaleMündigkeit zurück holen
      ❤ wir müssen uns die #digitaleSouveränität zurück holen
      ❤ wir müssen uns die #DSGVO zurück holen
      ❤ ...

      ... und das Witzige ist: es geht tatsächlich. Es ist nur eine Frage des politischen Willens. #Chatkontrolle? 🤔
      @eskensaskia

    13. Passend zum diesjährigen Thema der #republica habe ich kürzlich das Kapitel über #DigitalesBargeld aus meinem Buch #DigitaleMündigkeit im Blog von @digitalcourage veröffentlicht:

      digitalcourage.de/blog/2023/di

      Falls ihr das ganze Buch haben wollt: Ich bin heute vor Ort und hab ein paar Exemplare dabei. Pingt mich gerne an.

      #rp23

    14. Das Problem bei #KI und #Chatbots ist, dass man sich beim "Gegenüber" nicht auf #Menschenkenntnis oder ein #Bauchgefühl verlassen kann.

      "Er" hat auch weder ein Gewissen oder ist sonst irgendwie zur Verantwortung zu ziehen. Auch Transparenz und Qualitätssicherung fehlen.

      Es wird nicht allzu lange dauern, bis dieses #Technikwunder viel Unheil angerichtet und Vertrauen verspielt hat.
      Die Frage ist eigentlich nur, ob der bequeme Mensch bereit ist, seine Bequemlichkeit aufzugeben. 🤔

      #Eigenverantwortlichkeit #DerMarktRegeltDas #Demokratie #DigitaleMündigkeit