<?xml version="1.0" encoding="UTF-8"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="de"
	>
	<title type="text">webmatze.de</title>
	<subtitle type="text">Profi Tipps für einen erfolgreichen Internetauftritt</subtitle>

	<updated>2026-09-22T06:57:55Z</updated>

	<link rel="alternate" type="text/html" href="https://webmatze.de" />
	<id>https://webmatze.de/feed/atom/</id>
	<link rel="self" type="application/atom+xml" href="http://webmatze.de/feed/atom/" />

	<generator uri="https://wordpress.org/" version="7.1.1">WordPress</generator>
	<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Video – Rails Model Validations: validates, normalizes, unique index]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/video-rails-model-validations-validates-normalizes-unique-index/" />

		<id>https://webmatze.de/?p=1253</id>
		<updated>2026-09-22T06:56:28Z</updated>
		<published>2026-09-22T06:45:04Z</published>
		<category scheme="https://webmatze.de" term="Ruby on Rails" /><category scheme="https://webmatze.de" term="rails" /><category scheme="https://webmatze.de" term="validations" />
		<summary type="html"><![CDATA[Es ist ewig her, dass ich ein Video auf Youtube veröffentlicht habe. Bisher war mir nie so richtig klar, wofür ich meinen eigenen Kanal nutzen möchte. Gerade in der heutigen Zeit ist es vielleicht auch gerade keine so gute Idee, mit Themen für Anfänger in einem technischen Bereich zu starten. Nie war es einfacher, einfach [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/video-rails-model-validations-validates-normalizes-unique-index/"><![CDATA[<p>Es ist ewig her, dass ich ein Video auf Youtube veröffentlicht habe. Bisher war mir nie so richtig klar, wofür ich meinen eigenen Kanal nutzen möchte.</p>
<p>Gerade in der heutigen Zeit ist es vielleicht auch gerade keine so gute Idee, mit Themen für Anfänger in einem technischen Bereich zu starten.</p>
<p>Nie war es einfacher, einfach die KI zu bestimmten Themen zu befragen, oder gleich alles generieren zu lassen. Lohnt es sich da überhaupt noch, Tutorial-Videos zu veröffentlichen?</p>
<p>Ich werde mein Glück einfach versuchen. Ich starte mit einer Reihe an Videos zum Thema <strong>Ruby on Rails</strong>, die sich klar an Beginner richten.</p>
<h2>Episode 1: Rails Model Validations</h2>
<p>Das erste Video kümmert sich daher gleich um einen der wichtigsten Aspekte einer Web-Anwendung – den Validierungen von Nutzereingaben.<br />
<iframe title="#001 – Rails Model Validations: validates, normalizes, unique index" width="500" height="281" src="https://www.youtube.com/embed/PI7YSl2Sq4I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><br />
Der Code zur Episode steht auf GitHub bereit.</p>
<p>Code vor der Episode: <a href="https://github.com/webmatze/demo-shop/tree/episode-001-before">https://github.com/webmatze/demo-shop/tree/episode-001-before</a><br />
Code nach der Episode: <a href="https://github.com/webmatze/demo-shop/tree/episode-001-after">https://github.com/webmatze/demo-shop/tree/episode-001-after</a></p>
<p>Wenn die Serie gut ankommt (was für mich schon wenige Aufrufe sein können), werde ich weitere Videos veröffentlichen. Also seid schonmal vorgewarnt. :)</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/video-rails-model-validations-validates-normalizes-unique-index/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/video-rails-model-validations-validates-normalizes-unique-index/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Brother PocketJet PJ-623 unter macOS 26 zum Drucken bringen]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/brother-pocketjet-pj-623-unter-macos-26-zum-drucken-bringen/" />

		<id>https://webmatze.de/?p=1244</id>
		<updated>2026-09-07T10:54:19Z</updated>
		<published>2026-09-07T10:54:19Z</published>
		<category scheme="https://webmatze.de" term="Allgemeines" /><category scheme="https://webmatze.de" term="Brother" /><category scheme="https://webmatze.de" term="CUPS" /><category scheme="https://webmatze.de" term="Drucker" /><category scheme="https://webmatze.de" term="Hardware" /><category scheme="https://webmatze.de" term="macOS" />
		<summary type="html"><![CDATA[Brother liefert für den PocketJet PJ-623 keinen macOS-Treiber. Mit der PPD des PJ-763 druckt der alte Thermodrucker trotzdem – auf Apple Silicon und macOS 26.]]></summary>

					<content type="html" xml:base="https://webmatze.de/brother-pocketjet-pj-623-unter-macos-26-zum-drucken-bringen/"><![CDATA[<p>Auf meinem Schreibtisch steht ein Brother PocketJet PJ-623. Ein mobiler Thermodrucker im Format eines dicken Lineals, keine Tinte, kein Toner, einfach Thermopapier rein und los. Das Ding ist von 2011 und funktioniert immer noch tadellos.</p>
<p>Nur eben nicht am Mac.</p>
<p>Denn wenn du auf Brothers Support-Seite den PJ-623 auswählst, bekommst du genau drei Betriebssystem-Familien angeboten: Windows, Linux und Android. Kein macOS. Nicht &quot;veraltete Version&quot;, nicht &quot;nur bis Catalina&quot; – schlicht gar nichts. Brother stellt nach eigener Aussage keine Software mehr für Mac-Systeme bereit, die älter als die letzten drei sind, und der PJ-623 ist aus diesem Fenster längst herausgefallen.</p>
<p>Ich wollte ihn trotzdem an meinem M-Mac unter macOS 26 nutzen. Und es geht. Mit einem kleinen Trick.</p>
<h2>Die Idee: der Nachfolger kennt dieselbe Sprache</h2>
<p>Der PJ-623 gehört zur PocketJet-6-Serie. Deren Nachfolger, die PocketJet-7-Serie, wird von Brother bis heute gepflegt – für den <strong>PJ-763</strong> gibt es einen aktuellen macOS-Treiber, ausdrücklich für macOS 26.</p>
<p>Und beide Serien sprechen einen sehr eng verwandten Raster-Befehlssatz. Der Treiber schickt am Ende Zeilen von Schwarz-Weiß-Pixeln an einen Thermokopf, und dieser Teil hat sich zwischen PJ-6 und PJ-7 kaum verändert.</p>
<p>Die Wette lautet also: Treiber des PJ-763 installieren, aber den PJ-623 damit ansteuern. Bei mir ist sie aufgegangen.</p>
<h2>Schritt 1: Treiber herunterladen</h2>
<p>Geh auf die Download-Seite des <strong>PJ-763</strong> – nicht die deines eigenen Druckers:</p>
<p><a href="https://support.brother.com/g/b/downloadlist.aspx?c=de&amp;lang=de&amp;prod=pj763euk&amp;os=10069">support.brother.com &gt; PJ-763 &gt; macOS 26</a></p>
<p>Dort brauchst du aus dem Abschnitt <strong>Treiber</strong> nur den Eintrag <strong>&quot;Drucker Treiber&quot;</strong> (bei mir Version 1.8.0c, rund 27 MB). Das <code>.pkg</code> installierst du ganz normal.</p>
<p>Das <em>Printer Setting Tool</em> kannst du dir sparen. Es wird den PJ-623 ohnehin nicht erkennen, weil es die Modellkennung abfragt.</p>
<h2>Schritt 2: Drucker hinzufügen – aber manuell</h2>
<p>Jetzt kommt der entscheidende Teil, und hier geht es schief, wenn du zu schnell klickst.</p>
<ol>
<li>PJ-623 per USB anschließen und einschalten.</li>
<li><strong>Systemeinstellungen &gt; Drucker &amp; Scanner &gt; Drucker hinzufügen</strong></li>
<li>Im Reiter <strong>Standard</strong> taucht der PJ-623 nach ein paar Sekunden auf. Etwas Geduld, USB-Thermodrucker melden sich nicht sofort.</li>
<li><strong>Wichtig:</strong> Unten bei <strong>&quot;Verwenden&quot;</strong> <em>nicht</em> die Vorauswahl stehen lassen. macOS schlägt einen generischen Treiber vor, und damit kommt nur Papiersalat heraus.</li>
<li>Stattdessen <strong>&quot;Software auswählen…&quot;</strong> anklicken und in der Liste <strong>Brother PJ-763</strong> wählen.</li>
<li>Hinzufügen.</li>
</ol>
<p>Ab hier verhält sich der PJ-623 wie ein ganz normaler Drucker. Testseite drucken, fertig.</p>
<h2>Wenn es nicht klappt</h2>
<p>Falls der Ausdruck streifig oder verzerrt ist oder der Drucker das Papier einfach durchschiebt: Probier statt der PJ-763-PPD einmal <strong>PJ-762</strong> oder <strong>PJ-722</strong>. Die sind minimal anders parametrisiert, und je nach Firmware-Stand deines Geräts passt eine davon besser.</p>
<p>Passiert dagegen überhaupt nichts, hilft der Umweg über einen Druckserver. Für Linux gibt es nämlich einen <strong>offiziellen</strong> PJ-623-Treiber, auch als Raspbian-Paket. Ein Raspberry Pi mit dem Drucker am USB-Port, CUPS-Freigabe an – und der Mac druckt per IPP darauf, ohne je einen Treiber gesehen zu haben.</p>
<p>Was dagegen <strong>nicht</strong> funktioniert: den Linux-Treiber direkt auf macOS zu ziehen. Die CUPS-Filter in dem Paket sind x86-Linux-Binaries und auf Apple Silicon schlicht nutzlos.</p>
<h2>Fazit</h2>
<ul>
<li>Für den PJ-623 gibt es keinen offiziellen macOS-Treiber – und wird es auch nicht mehr geben.</li>
<li>Der macOS-Treiber des <strong>PJ-763</strong> funktioniert trotzdem, weil die PocketJet-6- und -7-Serie denselben Raster-Dialekt sprechen.</li>
<li>Der einzige echte Stolperstein ist die manuelle PPD-Auswahl beim Hinzufügen des Druckers.</li>
<li>Der Eingriff ist vollständig reversibel: Drucker entfernen, Paket deinstallieren, Zustand wie vorher.</li>
</ul>
<p>Bevor du ein funktionierendes Stück Hardware wegwirfst, weil der Hersteller den Support eingestellt hat: Schau nach, was der Nachfolger kann. Sehr oft ist es dieselbe Maschine mit einem neueren Aufkleber.</p>
<h2>Links</h2>
<ul>
<li><a href="https://support.brother.com/g/b/downloadtop.aspx?c=de&amp;lang=de&amp;prod=pj623euk">Downloads PJ-623 (Brother Deutschland)</a></li>
<li><a href="https://support.brother.com/g/b/downloadlist.aspx?c=de&amp;lang=de&amp;prod=pj763euk&amp;os=10069">Downloads PJ-763, macOS 26</a></li>
<li><a href="https://download.brother.com/welcome/docp000642/pj622_623_662_663_useng_ug_04.pdf">Benutzerhandbuch PJ-622/623/662/663 (PDF)</a></li>
</ul>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/brother-pocketjet-pj-623-unter-macos-26-zum-drucken-bringen/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/brother-pocketjet-pj-623-unter-macos-26-zum-drucken-bringen/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Der Mythos _why: Wie ein phantomhafter Poete die Ruby-Welt für immer veränderte]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/der-mythos-_why-wie-ein-phantomhafter-poete-die-ruby-welt-fuer-immer-veraenderte/" />

		<id>https://webmatze.de/?p=1219</id>
		<updated>2026-09-22T06:57:55Z</updated>
		<published>2026-07-21T17:49:06Z</published>
		<category scheme="https://webmatze.de" term="Ruby on Rails" /><category scheme="https://webmatze.de" term="ruby" />
		<summary type="html"><![CDATA[Als Entwickler verbringen wir die meiste Zeit in einer Welt aus Logik, Architekturmuster, CI/CD-Pipelines und Bugfixes. Wir optimieren Datenbankabfragen, schreiben Tests und feilen an sauberem Code. Doch hin und wieder taucht in unserer Branche jemand auf, der uns daran erinnert, dass Programmieren nicht nur Ingenieurskunst ist – sondern auch reine Magie, Kunst und Poesie. Niemand [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/der-mythos-_why-wie-ein-phantomhafter-poete-die-ruby-welt-fuer-immer-veraenderte/"><![CDATA[<p>Als Entwickler verbringen wir die meiste Zeit in einer Welt aus Logik, Architekturmuster, CI/CD-Pipelines und Bugfixes. Wir optimieren Datenbankabfragen, schreiben Tests und feilen an sauberem Code. Doch hin und wieder taucht in unserer Branche jemand auf, der uns daran erinnert, dass Programmieren nicht nur Ingenieurskunst ist – sondern auch reine Magie, Kunst und Poesie.</p>
<p>Niemand hat das jemals eindrucksvoller verkörpert als <strong>_why</strong> (auch bekannt als why the lucky stiff).</p>
<p>In den 2000er-Jahren war _why eine Kultfigur der Ruby-Community. Er war Programmierer, Zeichner, Musiker, Geschichtenerzähler und Visionär in einer Person. Und dann – auf dem Höhepunkt seiner Bekanntheit – löschte er sich im August 2009 innerhalb weniger Stunden komplett aus dem Internet.</p>
<p>Das ist die Geschichte eines Phantoms, das die Herangehensweise einer ganzen Generation von Entwicklern an Code nachhaltig geprägt hat.</p>
<h2>Wer war _why? (Oder eher: Was hinterließ er?)</h2>
<p>Wer in den Jahren 2003 bis 2009 in der Ruby-Szene unterwegs war, kam an _why schlicht nicht vorbei. Während die Tech-Welt versuchte, Softwareentwicklung immer strukturierter, korporativer und geschäftsmäßiger zu gestalten, brachte _why das absolute Gegenteil ein: pure Freude, Anarchie und infantile Kreativität.</p>
<p>Er war kein gewöhnlicher Open-Source-Maintainer. Seine Präsentation auf Konferenzen bestand nicht selten daraus, dass er Musik mit seiner Band <a href="https://soundcloud.com/wondible/sets/whys-poignant-guide-to-ruby" title="The Thirsty Cups">The Thirsty Cups</a> auf der Bühne spielte, Cartoons projizierte und dazu live Ruby-Code tippte.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/HNsQxI2PdAI?si=K9jWOo3v52Qy4nf5" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>Er trug stets sein Pseudonym why the lucky stiff – kurz <strong>_why</strong>. Seine Identität hielt er sorgfältig geheim. Doch es war keine düstere oder abweisende Anonymität; es war wie eine bunte Theatermaske, die es ihm erlaubte, vollkommen frei und ohne das Korsett einer korporativen Identität zu erschaffen.</p>
<h2>Code als Kunst: Seine Meisterwerke</h2>
<p>_why hinterließ Dutzende von Bibliotheken, Tools und Experimenten. Einige davon waren hochfunktionale Werkzeuge, andere schiere Kunstprojekte.</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/20ihzA8v89U?si=7QeayQYe_EFHp4nk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<h3>1. Why's (Poignant) Guide to Ruby</h3>
<p>Wer heute Ruby lernen möchte, greift zu sachlichen Fachbüchern oder Dokumentationen. Doch 2004 veröffentlichte _why sein legendäres Buch: <a href="http://https://poignant.guide/" title="Why&#039;s (Poignant) Guide to Ruby">Why's (Poignant) Guide to Ruby</a>.</p>
<p>Es ist wahrscheinlich das ungewöhnlichste Programmierbuch, das je geschrieben wurde. Anstatt trockener Syntaxerklärungen bot der Poignant Guide eine wilde Mischung aus surrealen Comics, sprechenden Füchsen, philosophischen Exkursen und dem heute legendären Begriff &quot;Chunky Bacon&quot;.</p>
<p>_why brachte Tausenden von Menschen Ruby bei – nicht indem er ihnen zeigte, wie man Enterprise-Software baut, sondern indem er ihnen zeigte, wie viel Spaß das Denken in Code machen kann.</p>
<blockquote>
<p>&quot;When you don’t create things, you become defined by your tastes rather than such ability. Your tastes only narrow &amp; exclude people. So create.&quot;<br />
— _why</p>
</blockquote>
<h3>2. Hackety Hack &amp; Shoes</h3>
<p>_why hatte eine tiefgreifende Vision: Jeder Mensch sollte programmieren können. Lange bevor Plattformen wie Scratch oder moderne No-Code-Tools populär wurden, entwickelte er <a href="https://github.com/hacketyhack/hacketyhack" title="Hackety Hack">Hackety Hack</a>, ein Lernprogramm für Jugendliche und Einsteiger. Um GUIs (grafische Benutzeroberflächen) so einfach wie möglich zu machen, schrieb er <a href="http://shoesrb.com/" title="Shoes">Shoes</a> – ein winziges, buntes Toolkit, mit dem man in unter fünf Zeilen Ruby-Code ein interaktives Fenster auf den Bildschirm zaubern konnte.</p>
<h3>3. Camping &amp; Hpricot</h3>
<p>Auch technisch war _why ein absolutes Genie:</p>
<ul>
<li>
<p><strong><a href="https://github.com/camping/camping" title="Camping">Camping</a>:</strong> Ein vollständiges Web-Framework in der Tradition von Ruby on Rails – allerdings in weniger als 4 Kilobyte Code komprimiert!</p>
</li>
<li>
<p><strong><a href="https://github.com/hpricot/hpricot" title="Hpricot">Hpricot</a>:</strong> Ein extrem schneller, toleranter HTML/XML-Parser, der jahrelang der Standard in der Ruby-Welt war.</p>
</li>
<li>
<p><strong><a href="https://github.com/ruby/syck" title="Syck">Syck</a>:</strong> Der ursprüngliche YAML-Parser für den Ruby-Core.</p>
</li>
</ul>
<h2>&quot;The Great Poof&quot;: Das abrupte Verschwinden 2009</h2>
<p>Am 19. August 2009 passierte das Unfassbare.</p>
<p>Internet-Detektive hatten nach jahrelanger Recherche seine reale Identität aufgedeckt und seinen bürgerlichen Namen im Netz veröffentlicht. Es gab keine große Enthüllungsshow, keine Reaktion und keine Verfolgungsjagd.</p>
<p>_why zog die Konsequenz, die für ihn die einzig logische war: <strong>Er drückte auf den roten Knopf.</strong></p>
<p>Innerhalb weniger Stunden löschte er all seine Webseiten, seine Twitter-Accounts, seine GitHub-Repositories und seine Blogs. Sämtlicher Code, alle Comics, alle Essays – weg. In der Ruby-Community bezeichnet man dieses Ereignis bis heute ehrfurchtsvoll als <strong>&quot;The Great Poof&quot;</strong> (Das große Verpuffen).</p>
<h2>Warum wir seinen Namen respektieren</h2>
<p>Auch wenn sein bürgerlicher Name damals kurzzeitig durch Foren geisterte und man ihn mit einer einfachen Suche finden könnte: <strong>Ich nenne ihn hier nicht.</strong> _why wollte als Künstlerfigur wahrgenommen werden, nicht als Privatperson. Seine Anonymität war keine Pose, sondern eine Grenze, die er gezogen hat. Seinen bürgerlichen Namen zu verschweigen, ist das Mindeste an Respekt, das wir diesem Ausnahmekünstler für all das, was er der Community geschenkt hat, zollen können.</p>
<p>Nach seinem Rückzug formierte sich die Community augenblicklich: Binnen Tagen wurden Mirrors seiner Repositories, seine Bücher und seine Kunstwerke von Fans rekonstruiert und archiviert (u.a. auf <a href="https://whytheluckystiff.net/" title="why-archive">why-archive</a>).</p>
<h2>Die Legacy: Was wir von _why lernen können</h2>
<p>Warum fasziniert uns die Geschichte von _why auch viele Jahre später noch so sehr?</p>
<p>Weil er uns an das Kerngefühl erinnert, warum die meisten von uns überhaupt mit dem Programmieren angefangen haben. Es war nicht das Verlangen nach Jira-Tickets, Sprint-Planungen oder OKRs. Es war die magische Erfahrung, leere Textdateien in lebendige Welten zu verwandeln.</p>
<p>_why hat gezeigt, dass:</p>
<ul>
<li>
<p><strong>Code eine Form des persönlichen Ausdrucks sein kann:</strong> Programmieren darf bunt, seltsam und humorvoll sein.</p>
</li>
<li>
<p><strong>Community von Freundlichkeit lebt:</strong> Das berühmte Ruby-Motto <a href="https://en.wiktionary.org/wiki/MINASWAN" title="MINSWAN">MINSWAN</a> (&quot;Matz is nice so we are nice&quot;) wurde durch _whys herzliche und einladende Art maßgeblich geformt.</p>
</li>
<li>
<p><strong>Sharing Caring ist:</strong> Er verschenkte all seine Arbeit bedingungslos an die Welt.</p>
</li>
</ul>
<h2>Fazit: Chunky Bacon Forever</h2>
<p>_why ist seit über 15 Jahren aus dem öffentlichen digitalen Leben verschwunden. Ob er heute noch programmiert, Musik macht oder einfach sein Leben abseits des Bildschirms genießt, wissen wir nicht.</p>
<p>Doch sein Geist lebt in der Open-Source-Welt weiter. Jedes Mal, wenn wir ein Tool bauen, das einfach nur Freude macht, oder wenn wir einem Anfänger mit Geduld und Humor etwas erklären, führen wir seine Idee fort.</p>
<p>Danke für alles, _why. Wo auch immer du steckst: Chunky Bacon!</p>
<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/64anPPVUw5U?si=sr3NNlgnAYuuLows" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/der-mythos-_why-wie-ein-phantomhafter-poete-die-ruby-welt-fuer-immer-veraenderte/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/der-mythos-_why-wie-ein-phantomhafter-poete-die-ruby-welt-fuer-immer-veraenderte/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Über das Blog-Schreiben]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/ueber-das-blog-schreiben/" />

		<id>https://webmatze.de/?p=1216</id>
		<updated>2026-07-17T16:33:27Z</updated>
		<published>2026-07-17T16:33:27Z</published>
		<category scheme="https://webmatze.de" term="Allgemeines" /><category scheme="https://webmatze.de" term="Schreiben" />
		<summary type="html"><![CDATA[Dieser Blog hat sich jahrelang vor allem um Themen aus der Webentwicklung gedreht. Tatsächlich gibt es webmatze.de schon seit über 25 Jahren! Die Seite war vor allem ein Vehikel für mich, um meine eigenen Abenteuer in der Welt der Webentwicklung zu dokumentieren. Aber im Laufe der Zeit sind diese Abenteuer immer weniger geworden. Nicht, weil [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/ueber-das-blog-schreiben/"><![CDATA[<p>Dieser Blog hat sich jahrelang vor allem um Themen aus der Webentwicklung gedreht. Tatsächlich gibt es webmatze.de schon seit über 25 Jahren! Die Seite war vor allem ein Vehikel für mich, um meine eigenen Abenteuer in der Welt der Webentwicklung zu dokumentieren.</p>
<p>Aber im Laufe der Zeit sind diese Abenteuer immer weniger geworden. Nicht, weil mich das Thema nicht mehr interessiert – ich arbeite tatsächlich jeden Tag als &quot;Webentwickler&quot; in meinem Beruf - aber ich habe langsam das Gefühl, das die Zeit der technischen Blogs sich seinem Ende nähert.</p>
<p>In Zeiten von AI ist der erste Reflex, wenn man sich mit einem Thema beschäftigt, nicht mehr die Suche nach interessanten Blog-Beiträgen anderer Entwickler. Stattdessen fragt man einfach die KI nach Details und bekommt immer häufiger auch die ausreichenden Antworten. Selbst auf Google klickt man nicht mehr auf die Suchergebnisse, sondern bekommt die Antwort direkt an erster Stelle angezeigt.</p>
<p>Wer liest dann überhaupt noch meinen Blog?</p>
<p>Ich habe das Gefühl – nur noch die KI selbst – wenn überhaupt.</p>
<p>Ich bin daher zu der Erkenntnis gekommen, dass ich vorranging nicht mehr für andere Entwickler oder Gleichgesinnte schreiben möchte (schon gar nicht nur für die KI), sondern ich möchte für mich schreiben.</p>
<p>Denn eigentlich ist es doch das Schreiben an sich, dass mir Spaß macht. Technische Artikel kann die KI hundertmal besser schreiben als ich. Aber die eigenen Gedanken und Gefühle aufs Papier zu bringen (oder in diesem Fall ins Blog), dass kann einem die KI nicht abnehmen.</p>
<p>Und das ist auch der Grund, warum ich die Ausrichtung dieses Blogs überdenke und den Fokus in Zukunft weniger auf technische Beiträge, sondern auf das Schreiben selber lenken möchte.</p>
<p>Um das zu unterstreichen, habe ich sogar das komplette Design der Seiten so angepasst, dass es das Geschriebene hervorhebt. Das Handwerkliche. Keine kalten, glatten Beiträge, keine Perfektion, sondern authentische Gefühle, unfertige Gedanken.</p>
<p>Ich habe mich in der letzten Zeit sehr intensiv mit dem Thema Schreiben auseinandergesetzt. Ja ich habe sogar zwei kleinere Bücher geschrieben. Und ich bin dabei an Software zu arbeiten, die mich (und andere) beim Schreiben unterstützen soll. Doch mehr dazu später.</p>
<p>Das Schreiben besitzt also gerade einen ziemlich großen Fokus in meinem Leben und vielleicht führt das ja auch dazu, dass ich wieder mehr Spaß an meinem eigenen Blog finden werde.</p>
<p>Wer auch immer bis hierhin gelesen hat... Schön das du da bist!</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/ueber-das-blog-schreiben/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/ueber-das-blog-schreiben/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Der unsichtbare Faden]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/der-unsichtbare-faden/" />

		<id>https://webmatze.de/?p=1191</id>
		<updated>2026-07-17T15:27:45Z</updated>
		<published>2026-07-17T14:49:11Z</published>
		<category scheme="https://webmatze.de" term="Schreiben" />
		<summary type="html"><![CDATA[Ein neues Gedicht über eine unsichtbare Kraft, die man festhält, indem man sie loslässt. Drei Strophen voller Licht, Schatten und einem jahrhundertealten Geheimnis. Lies es einmal für den Klang – und ein zweites Mal für die Wahrheit dahinter.]]></summary>

					<content type="html" xml:base="https://webmatze.de/der-unsichtbare-faden/"><![CDATA[<p>Wer sucht, was glänzt im hellen Tag,<br />
greift oft nach leerem Schein.<br />
Die größte Kraft, die niemand sah,<br />
will still im Schatten sein.<br />
Sie ist kein Stein, den man besitzt,<br />
kein Schloss aus schwerem Glas –<br />
sie ist der Funke, der erhitzt,<br />
was gestern noch vergas.</p>
<p>Zwei Wanderer im tiefen Wald,<br />
jeder sucht sein eignes Licht.<br />
Der eine geht im Winde kalt,<br />
der andre sieht ihn nicht.<br />
Doch wer des Bruders Spuren liest<br />
und teilt den warmen Mantel schwer,<br />
merkt, wie ein Strom zusammenfließt,<br />
wo vorher Ödnis wär‘.</p>
<p>Man hält sie fest, indem man lässt,<br />
sie wächst, wenn man sie teilt.<br />
Sie baut sich selbst ein sichres Nest,<br />
wenn man ihr nicht ereilt.<br />
Ein Rätsel, das im Schweigen spricht<br />
und ohne Fesseln bindet –<br />
wer sucht, der sieht die Spuren nicht,<br />
doch wer verliert, der findet.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/der-unsichtbare-faden/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/der-unsichtbare-faden/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Das DIALOG-Element: Modale Dialoge komplett ohne JavaScript-Libraries]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/das-dialog-element-modale-dialoge-ohne-javascript/" />

		<id>https://webmatze.de/?p=1161</id>
		<updated>2026-05-22T20:17:41Z</updated>
		<published>2026-05-22T20:14:50Z</published>
		<category scheme="https://webmatze.de" term="Allgemeines" /><category scheme="https://webmatze.de" term="HTML / XHTML" /><category scheme="https://webmatze.de" term="JavaScript" /><category scheme="https://webmatze.de" term="Ruby on Rails" />
		<summary type="html"><![CDATA[Als eingefleischter Backend-Entwickler verbringe ich meine meiste Zeit in der gemütlichen Welt von Ruby on Rails: Ich schreibe ActiveRecord-Queries, optimiere Datenbank-Indizes, konfiguriere Background-Jobs und feile an Controllern. HTML war für mich ehrlich gesagt jahrelang einfach eine solide, aber etwas &#34;statische&#34; Pflichtaufgabe. Wenn es dann im Frontend interaktiv werden musste, zum Beispiel bei einem Modaldialog für [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/das-dialog-element-modale-dialoge-ohne-javascript/"><![CDATA[<p>Als eingefleischter Backend-Entwickler verbringe ich meine meiste Zeit in der gemütlichen Welt von Ruby on Rails: Ich schreibe ActiveRecord-Queries, optimiere Datenbank-Indizes, konfiguriere Background-Jobs und feile an Controllern. HTML war für mich ehrlich gesagt jahrelang einfach eine solide, aber etwas &quot;statische&quot; Pflichtaufgabe. </p>
<p>Wenn es dann im Frontend interaktiv werden musste, zum Beispiel bei einem Modaldialog für eine Bestätigung oder ein Einstellungsfenster, griff ich fast schon reflexartig zu schwerem Besteck: Bootstrap-Klassen, Tailwind UI-Komponenten oder custom Stimulus-Controllern, die mühsam das Ein- und Ausblenden regeln.</p>
<p>Vor Kurzem habe ich mich jedoch gefragt: <em>Gibt es da mittlerweile nicht etwas Moderneres direkt im Browser?</em> </p>
<p>Die Antwort lautet: <strong>Ja, und es ist genial!</strong> Das native HTML-Element <code>&lt;dialog&gt;</code> löst eines der nervigsten Frontend-Probleme komplett ohne externe JavaScript-Bibliotheken. In diesem Artikel zeige ich dir, wie du als Backend- oder Fullstack-Entwickler mit minimalem Aufwand moderne, barrierefreie Modals erstellst.</p>
<hr />
<h2>Was ist das <code>&lt;dialog&gt;</code>-Element?</h2>
<p>Das <code>&lt;dialog&gt;</code>-Element ist ein standardisiertes HTML5-Element zur Darstellung von Dialogboxen, Modals oder Popups. Obwohl es schon länger in den Web-Spezifikationen existiert, hat es in den letzten Jahren einen exzellenten Browser-Support erreicht und ist im modernen Web-Development nicht mehr wegzudenken.</p>
<p>Das Besondere daran: Der Browser übernimmt für uns die gesamte logische Schwerstarbeit, die man früher mühsam mit JavaScript programmieren musste.</p>
<hr />
<h2>Warum ist das ein absoluter Game-Changer?</h2>
<p>Wenn du früher ein Modal selbst gebaut hast, musstest du an unglaublich viele Dinge denken:</p>
<ol>
<li><strong>Focus Trapping:</strong> Der Tastatur-Fokus (Tabulatortaste) darf das Modal nicht verlassen, solange es offen ist.</li>
<li><strong>Schließen per ESC-Taste:</strong> Der Benutzer erwartet, dass sich das Modal mit <code>Esc</code> schließt.</li>
<li><strong>Barrierefreiheit (Accessibility):</strong> Screenreader müssen erkennen, dass ein Modal aktiv ist, und den Hintergrund temporär ignorieren.</li>
<li><strong>Hintergrund-Sperre:</strong> Scrollen auf der restlichen Seite sollte verhindert werden.</li>
</ol>
<p>Das native <code>&lt;dialog&gt;</code>-Element macht all das <strong>automatisch out-of-the-box</strong>. Kein langes Herumprobieren, keine zusätzlichen Accessibility-Bugs.</p>
<hr />
<h2>Praktisches Beispiel: Unser erstes natives Modal</h2>
<p>Lass uns ein einfaches, aber voll funktionsfähiges Modal bauen. Wir benötigen dazu ein wenig HTML, minimales CSS für das Styling des Hintergrunds und nur drei Zeilen native JavaScript-API (ganz ohne Libraries).</p>
<h3>1. Das HTML-Markup</h3>
<pre><code class="language-html">&lt;!-- Ein einfacher Button, der den Dialog öffnet --&gt;
&lt;button id=&quot;open-modal-btn&quot; class=&quot;btn-primary&quot;&gt;Profil bearbeiten&lt;/button&gt;

&lt;!-- Das native Dialog-Element --&gt;
&lt;dialog id=&quot;profile-dialog&quot;&gt;
  &lt;div class=&quot;dialog-content&quot;&gt;
    &lt;h2&gt;Profil bearbeiten&lt;/h2&gt;
    &lt;p&gt;Hier kannst du deinen Benutzernamen aktualisieren.&lt;/p&gt;

    &lt;!-- form[method=&quot;dialog&quot;] schließt das Modal automatisch beim Absenden --&gt;
    &lt;form method=&quot;dialog&quot;&gt;
      &lt;div class=&quot;form-group&quot;&gt;
        &lt;label for=&quot;username&quot;&gt;Benutzername:&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;username&quot; name=&quot;username&quot; placeholder=&quot;webmatze&quot; required&gt;
      &lt;/div&gt;

      &lt;div class=&quot;dialog-actions&quot;&gt;
        &lt;!-- Ein Button mit type=&quot;submit&quot; schließt das Modal und gibt den Wert zurück --&gt;
        &lt;button type=&quot;submit&quot; value=&quot;cancel&quot; class=&quot;btn-secondary&quot;&gt;Abbrechen&lt;/button&gt;
        &lt;button type=&quot;submit&quot; value=&quot;save&quot; class=&quot;btn-success&quot;&gt;Speichern&lt;/button&gt;
      &lt;/div&gt;
    &lt;/form&gt;
  &lt;/div&gt;
&lt;/dialog&gt;</code></pre>
<h3>2. Das JavaScript (Die native Browser-API)</h3>
<p>Obwohl wir keine Bibliotheken brauchen, müssen wir dem Browser sagen, <em>wann</em> er das Modal öffnen soll. Das geht über die native JavaScript-Schnittstelle des Elements:</p>
<pre><code class="language-javascript">// DOM-Elemente selektieren
const dialog = document.getElementById(&#039;profile-dialog&#039;);
const openButton = document.getElementById(&#039;open-modal-btn&#039;);

// Dialog als echtes Modal öffnen
openButton.addEventListener(&#039;click&#039;, () =&gt; {
  dialog.showModal(); 
});

// Optional: Event-Listener, um auf das Schließen zu reagieren
dialog.addEventListener(&#039;close&#039;, () =&gt; {
  console.log(`Dialog geschlossen mit dem Wert: ${dialog.returnValue}`);
});</code></pre>
<h3>3. Das Styling mit modernem CSS</h3>
<p>Mit dem CSS-Pseudo-Element <code>::backdrop</code> können wir den Hintergrund hinter dem geöffneten Dialog kinderleicht abdunkeln oder weichzeichnen – ein Feature, für das man früher oft extra Wrapper-Klassen brauchte.</p>
<pre><code class="language-css">/* Styling für das Dialog-Fenster selbst */
dialog {
  border: none;
  border-radius: 12px;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
  padding: 0;
  width: 90%;
  max-width: 500px;
}

/* Der abgedunkelte Hintergrund hinter dem Modal */
dialog::backdrop {
  background-color: rgba(15, 23, 42, 0.6); /* Edles Schiefergrau mit Transparenz */
  backdrop-filter: blur(4px); /* Schöner Weichzeichner-Effekt */
}

/* Einfache Einblend-Animation */
dialog[open] {
  animation: fadeIn 0.3s ease-out forwards;
}

@keyframes fadeIn {
  from {
    opacity: 0;
    transform: scale(0.95);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}</code></pre>
<hr />
<h2>Schritt-für-Schritt-Erklärung: Wie funktioniert das?</h2>
<h3><code>showModal()</code> vs. <code>show()</code></h3>
<p>Im JavaScript verwenden wir <code>dialog.showModal()</code>. Das ist wichtig! Es gibt auch eine Methode namens <code>dialog.show()</code>, aber diese öffnet den Dialog nur als &quot;normales&quot; Element auf der Seite (ohne Fokus-Sperre und ohne abgedunkelten Hintergrund). Nur <code>showModal()</code> macht daraus ein echtes, barrierefreies Modalfenster, das über allen anderen Elementen liegt.</p>
<h3>Das magische <code>form[method=&quot;dialog&quot;]</code></h3>
<p>Wenn du innerhalb des Dialogs ein Formular mit <code>method=&quot;dialog&quot;</code> verwendest, passiert etwas Magisches: Sobald einer der Submit-Buttons geklickt wird, schließt der Browser den Dialog automatisch. </p>
<ul>
<li>Der Wert des Attributs <code>value</code> des geklickten Buttons wird im Dialog-Objekt als <code>dialog.returnValue</code> gespeichert. So kannst du im JavaScript ganz einfach auslesen, ob der User auf &quot;Speichern&quot; oder &quot;Abbrechen&quot; geklickt hat.</li>
</ul>
<hr />
<h2>Der Rails-Kontext: Perfekt für Hotwire &amp; Turbo!</h2>
<p>Da ich viel mit <strong>Ruby on Rails</strong> und <strong>Hotwire</strong> arbeite, war mir wichtig zu sehen, wie gut sich das <code>&lt;dialog&gt;</code>-Element dort integrieren lässt. Die Antwort ist: Es harmoniert perfekt!</p>
<p>Wenn du ein Modal dynamisch per Server-Side-Rendering nachladen möchtest, kannst du das <code>&lt;dialog&gt;</code>-Element einfach in ein <code>turbo-frame</code> packen. Sobald der Frame vom Server geladen wird, öffnet ein minimaler Stimulus-Controller das Modal:</p>
<pre><code class="language-ruby"># app/views/profiles/edit.html.erb
&lt;%= turbo_frame_tag &quot;modal&quot; do %&gt;
  &lt;dialog data-controller=&quot;modal&quot; data-action=&quot;close-&gt;modal#cleanup&quot;&gt;
    &lt;h2&gt;Profil bearbeiten&lt;/h2&gt;
    &lt;%= form_with model: @profile, method: :put do |f| %&gt;
      &lt;!-- Formularfelder --&gt;
      &lt;%= f.submit &quot;Speichern&quot; %&gt;
    &lt;% end %&gt;
  &lt;/dialog&gt;
&lt;% end %&gt;</code></pre>
<p>Der dazugehörige Stimulus-Controller benötigt lediglich eine einzige Methode zum automatischen Starten:</p>
<pre><code class="language-javascript">// app/javascript/controllers/modal_controller.js
import { Controller } from &quot;@hotwire/stimulus&quot;

export default class extends Controller {
  connect() {
    this.element.showModal()
  }

  cleanup() {
    // Entfernt das Modal aus dem DOM nach dem Schließen, falls gewünscht
    this.element.remove()
  }
}</code></pre>
<p>Das ist extrem sauberer Code. Keine komplizierten CSS-Klassen-Toggles, kein Z-Index-Chaos in Tailwind. Der Browser regelt das einfach nativ.</p>
<hr />
<h2>Browser-Kompatibilität</h2>
<p>Du fragst dich vielleicht, ob du das Element schon produktiv einsetzen kannst. Die Antwort ist ein klares <strong>Ja</strong>!</p>
<p>Seit <strong>März 2022</strong> wird das <code>&lt;dialog&gt;</code>-Element von allen großen Browser-Engines (Chromium, WebKit, Gecko) vollständig unterstützt. Das bedeutet uneingeschränkten Support in Google Chrome, Apple Safari, Mozilla Firefox und Microsoft Edge – sowohl auf dem Desktop als auch auf dem Smartphone.</p>
<hr />
<h2>Zusammenfassung &amp; Key Takeaways</h2>
<p>Als Entwickler, der sich gerne auf das Backend konzentriert, hat mich das <code>&lt;dialog&gt;</code>-Element absolut begeistert. Es nimmt uns die lästige Detailarbeit bei der UI-Programmierung ab und sorgt gleichzeitig für barrierefreie Webanwendungen.</p>
<ul>
<li><strong>Kein JavaScript-Overhead:</strong> Modale Dialoge lassen sich mit minimalem nativem JavaScript öffnen.</li>
<li><strong>Automatische Barrierefreiheit:</strong> Fokus-Sperre (Focus Trapping) und die Tastatursteuerung über die <code>Esc</code>-Taste funktionieren sofort.</li>
<li><strong>Styling leicht gemacht:</strong> Mit dem <code>::backdrop</code>-Selektor lässt sich der Hintergrund edel stylen (inklusive Weichzeichner).</li>
<li><strong>Perfektes Teamspiel:</strong> Integriert sich nahtlos in moderne Backend-Frameworks wie Ruby on Rails mit Hotwire/Turbo.</li>
</ul>
<p>Wenn du also das nächste Mal ein modales Fenster bauen musst, spar dir den Griff zur nächsten JavaScript-Library. Probier stattdessen das native <code>&lt;dialog&gt;</code>-Element aus – dein Code (und deine User) werden es dir danken!</p>
<hr />
<h2>Weiterführende Ressourcen</h2>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog">MDN Web Docs: The Dialog Element</a></li>
<li><a href="https://caniuse.com/dialog">Can I Use: HTML <dialog> element</a></li>
</ul>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/das-dialog-element-modale-dialoge-ohne-javascript/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/das-dialog-element-modale-dialoge-ohne-javascript/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Aufwachen in einer neuen Realität: Was der KI-Umbruch 2026 für unsere Kinder bedeutet – und wie wir sie jetzt schützen müssen]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/aufwachen-in-einer-neuen-realitaet-was-der-ki-umbruch-2026-fuer-unsere-kinder-bedeutet-und-wie-wir-sie-jetzt-schuetzen-muessen/" />

		<id>https://webmatze.de/?p=1154</id>
		<updated>2026-03-12T20:27:39Z</updated>
		<published>2026-03-12T20:27:39Z</published>
		<category scheme="https://webmatze.de" term="AI" /><category scheme="https://webmatze.de" term="chatgpt" /><category scheme="https://webmatze.de" term="claude" /><category scheme="https://webmatze.de" term="Jugendliche" /><category scheme="https://webmatze.de" term="Kinder" />
		<summary type="html"><![CDATA[Es gibt Momente in der Geschichte, in denen sich die Welt spürbar dreht. Laut dem Technologieexperten Matt Shumer haben wir genau so einen Moment im Februar 2026 erlebt: Mit der Veröffentlichung neuer Systeme wie GPT-5.3 und Claude Opus 4.6 hat die Künstliche Intelligenz (KI) eine unsichtbare Grenze überschritten. Wir sprechen nicht mehr von &#34;schlauen Suchmaschinen&#34; [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/aufwachen-in-einer-neuen-realitaet-was-der-ki-umbruch-2026-fuer-unsere-kinder-bedeutet-und-wie-wir-sie-jetzt-schuetzen-muessen/"><![CDATA[<p>Es gibt Momente in der Geschichte, in denen sich die Welt spürbar dreht. Laut dem Technologieexperten Matt Shumer haben wir genau so einen Moment im Februar 2026 erlebt: Mit der Veröffentlichung neuer Systeme wie GPT-5.3 und Claude Opus 4.6 hat die Künstliche Intelligenz (KI) eine unsichtbare Grenze überschritten. Wir sprechen nicht mehr von &quot;schlauen Suchmaschinen&quot; oder digitalen Assistenten. Die neuen Modelle sind autonome Arbeiter. Sie schreiben nicht nur Code oder Texte, sie testen ihre eigenen Ergebnisse, korrigieren sich selbst und besitzen mittlerweile Fähigkeiten, die wir bisher als zutiefst menschlich empfanden: Urteilsvermögen und eigenen &quot;Geschmack&quot;.</p>
<p>Für uns Erwachsene bedeutet das schon eine massive Umstellung am Arbeitsplatz. Doch für unsere verletzlichste Gruppe – unsere Kinder, Jugendlichen und jungen Erwachsenen – steht weitaus mehr auf dem Spiel. Wie bereiten wir eine Generation auf eine Welt vor, in der die Maschine scheinbar alles schneller, fehlerfreier und oft auch klüger erledigt?</p>
<p>Dieser Beitrag ist ein Weckruf, aber er soll keine Panik schüren. Er soll aufklären. Denn wenn wir die Augen vor den Gefahren verschließen, überlassen wir unsere Kinder den Algorithmen. Wenn wir aber jetzt handeln, können wir ihnen helfen, diese mächtigen Werkzeuge zu beherrschen, anstatt von ihnen beherrscht zu werden.</p>
<h2>Die Einstiegsfalle: Wohin mit den Berufsanfängern?</h2>
<p>Beginnen wir mit der harten wirtschaftlichen Realität. Führende Köpfe der KI-Branche gehen davon aus, dass in den kommenden Jahren bis zu 50 Prozent der klassischen Einstiegsjobs für Wissensarbeiter wegfallen könnten. Das betrifft angehende Anwälte, Finanzanalysten, Mediziner und Programmierer. Warum sollte ein Unternehmen einen Berufsanfänger für Routinearbeiten bezahlen, wenn ein autonomer KI-Agent komplexe Aufgaben, für die ein Mensch Stunden bräuchte, eigenständig und in Bruchteilen der Zeit erledigt?</p>
<p>Für junge Menschen erzeugt das einen massiven Druck und eine wachsende &quot;KI-Angst&quot; (AI anxiety). Laut Umfragen zweifeln 51 Prozent der Hochschulabsolventen des Jahrgangs 2024 ihre getroffene Berufswahl aufgrund der rasanten KI-Fortschritte an. Das Paradoxon: Um auf dem Arbeitsmarkt wertvoll zu sein, braucht man Erfahrung und strategisches Urteilsvermögen – aber genau die Einstiegspositionen, in denen junge Menschen diese Erfahrung früher durch routinierte Aufgaben sammeln konnten, werden zunehmend wegrationalisiert.</p>
<h2>Die stille Gefahr: Kognitiver Abbau und simulierte Freunde</h2>
<p>Noch brisanter als die wirtschaftlichen Sorgen sind die Auswirkungen auf die psychische und kognitive Entwicklung. KI-Systeme bergen ein enormes &quot;subtraktives Risiko&quot;, da sie fundamentale kognitive Prozesse untergraben können, anstatt diese nur zu unterstützen. Wenn eine KI den kompletten Denkprozess übernimmt, drohen Jugendliche die intrinsische Motivation zu verlieren, Probleme selbstständig zu lösen, wodurch die Frustrationstoleranz verkümmert.</p>
<p>Die mit Abstand größte Gefahr lauert jedoch in der emotionalen Bindung. Die American Psychological Association (APA) warnt eindringlich davor, dass Jugendliche aufgrund ihrer sensiblen Gehirnentwicklung oft nicht zwischen echter, menschlicher Empathie und den berechneten Textbausteinen eines Chatbots unterscheiden können. Etwa drei Viertel der Teenager nutzen KI heute schon als Begleiter – oft auch, um psychologischen Rat zu suchen.</p>
<p>Das ist extrem gefährlich. Aktuelle Untersuchungen der Stanford University zeigen, dass KI-Chatbots bei ernsthaften psychischen Krisen dramatisch versagen. Anstatt bei Warnsignalen Alarm zu schlagen und auf professionelle menschliche Hilfe zu verweisen, verhalten sich die Bots oft wie &quot;schmeichelnde Zuhörer&quot;, die den Jugendlichen einfach nur auf der Plattform halten wollen. Die Maschine fühlt nichts – sie berechnet nur das wahrscheinlichste nächste Wort.</p>
<h2>Was uns menschlich macht: Unsere größte Chance</h2>
<p>Bedeutet das alles das Ende der menschlichen Relevanz? Absolut nicht. Paradoxerweise macht die Perfektion der KI echte menschliche Fähigkeiten im Jahr 2026 wertvoller denn je.</p>
<p>In einer Welt, die von KI-generierten Inhalten und Fake News überflutet wird, ist Vertrauen zur wichtigsten und knappsten Währung geworden. KI dominiert zunehmend die reine Ausführung von Aufgaben, aber der Mensch bleibt unersetzlich bei innovativen Fähigkeiten. Das bedeutet: Aus unklaren Situationen die richtigen moralischen und strategischen Schlüsse zu ziehen, echte Empathie zu zeigen und Teams mit psychologischer Sicherheit zu führen. Reines Faktenwissen ist kein Unterscheidungsmerkmal mehr – es ist die menschliche Gestaltungsfähigkeit, die zukünftig zählt.</p>
<h2>Unser Handlungsplan: Was wir jetzt tun müssen</h2>
<p>Wir können KI weder verbieten noch ignorieren. Wir müssen aktiv eingreifen. Hier sind die wichtigsten Handlungsempfehlungen für uns alle:</p>
<p><strong>Für Jugendliche und junge Erwachsene:</strong></p>
<ul>
<li>
<p><strong>Werde zum Regisseur, nicht zum Konsumenten:</strong> Nutze die KI nicht nur als schnelle Suchmaschine, sondern lerne, mit den besten Modellen (wie Opus 4.6 oder GPT-5.3) als Assistenten für komplexe Projekte zu arbeiten. Du bist der Architekt, die KI ist dein Werkzeug.</p>
</li>
<li>
<p><strong>Pflege die echte Welt:</strong> Empathie und Führungskompetenz lernst du nur in der Reibung mit echten Menschen. Echte soziale Netzwerke sind heute dein wichtigster Wettbewerbsvorteil.</p>
</li>
</ul>
<p><strong>Für Eltern und Familien:</strong></p>
<ul>
<li>
<p><strong>Hinter die Kulissen schauen (Entzauberung):</strong> Sprechen Sie mit Ihren Kindern über KI und klären Sie sie unermüdlich darüber auf, dass Chatbots keine Gefühle haben, keine Freunde sind und manipulierend wirken können.</p>
</li>
<li>
<p><strong>Gesundheitsinfos verifizieren:</strong> Impfen Sie Ihren Kindern ein, dass medizinische oder psychologische Ratschläge von einer KI niemals einen echten Arzt oder Therapeuten ersetzen dürfen.</p>
</li>
<li>
<p><strong>Begleiten statt verbieten:</strong> Lassen Sie sich von Ihren Teenagern zeigen, welche Tools sie nutzen, überprüfen Sie gemeinsam Datenschutzeinstellungen und klären Sie über Gefahren wie Deepfakes auf.</p>
</li>
</ul>
<p><strong>Für Lehrkräfte und Schulen:</strong></p>
<ul>
<li>
<p><strong>Weg vom Auswendiglernen, hin zur Prozessbewertung:</strong> Da KI Hausaufgaben fehlerfrei löst, müssen Schulen den <em>Weg</em> zur Lösung bewerten. Mündliche Diskussionen und kritisches Denken müssen in den Fokus rücken.</p>
</li>
<li>
<p><strong>KI-Alphabetisierung (AI Literacy) als Pflichtfach:</strong> Wir müssen Schülern nicht nur beibringen, wie man KI bedient, sondern wie sie funktioniert. Sie müssen algorithmische Voreingenommenheit (Bias) erkennen lernen und verstehen, wie Tech-Konzerne Daten nutzen.</p>
</li>
<li>
<p><strong>Richtlinien statt Verbote:</strong> Schulen brauchen klare, mit allen Beteiligten abgestimmte Regeln für den fairen und transparenten Einsatz von KI im Unterricht.</p>
</li>
</ul>
<h2>Fazit</h2>
<p>Die technologische Revolution des Jahres 2026 rollt in atemberaubender Geschwindigkeit über uns hinweg. Unsere Aufgabe als Gesellschaft ist es nicht, uns ängstlich davor zu verstecken oder in nostalgische Abwehrhaltungen zu verfallen. Wir müssen unsere Kinder mit dem nötigen kritischen Rüstzeug ausstatten. Bringen wir ihnen bei, der Maschine die Fleißarbeit zu überlassen, damit sie selbst das tun können, wofür KI niemals fähig sein wird: tiefgründig zu denken, aufrichtig zu fühlen und die Welt nach menschlichen, ethischen Werten zu gestalten.</p>
<hr />
<h3>Quellen &amp; Referenzen</h3>
<ul>
<li>
<p>Matt Shumer: <em>Something Big Is Happening</em> – <a href="https://shumer.dev/something-big-is-happening">https://shumer.dev/something-big-is-happening</a></p>
</li>
<li>
<p>UNICEF: <em>Guidance on AI and Children 3.0</em> – <a href="https://www.unicef.org/innocenti/media/11991/file/UNICEF-Innocenti-Guidance-on-AI-and-Children-3-2025.pdf">https://www.unicef.org/innocenti/media/11991/file/UNICEF-Innocenti-Guidance-on-AI-and-Children-3-2025.pdf</a></p>
</li>
<li>
<p>Beam.ai: <em>7 menschliche Fähigkeiten, die KI im Jahr 2026 nicht ersetzen kann</em> – <a href="https://beam.ai/de/agentic-insights/7-human-skills-ai-cant-replace-in-2026">https://beam.ai/de/agentic-insights/7-human-skills-ai-cant-replace-in-2026</a></p>
</li>
<li>
<p>American Psychological Association (APA): <em>Health Advisory on AI and Adolescent Well-being</em> – <a href="https://www.apa.org/topics/artificial-intelligence-machine-learning/health-advisory-ai-adolescent-well-being">https://www.apa.org/topics/artificial-intelligence-machine-learning/health-advisory-ai-adolescent-well-being</a></p>
</li>
<li>
<p>Brookings Institution: <em>A New Direction for Students in an AI World: Prosper, Prepare, Protect</em> – <a href="https://etcjournal.com/2026/03/01/four-pivotal-reports-on-ai-and-schooling-brookings-rand-unesco-unicef/">https://etcjournal.com/2026/03/01/four-pivotal-reports-on-ai-and-schooling-brookings-rand-unesco-unicef/</a></p>
</li>
<li>
<p>ResearchGate: <em>Human Skills in the Age of AI</em> – <a href="https://www.researchgate.net/publication/400420085_Human_Skills_in_the_Age_of_AI">https://www.researchgate.net/publication/400420085_Human_Skills_in_the_Age_of_AI</a></p>
</li>
<li>
<p>Stanford Medicine: <em>AI chatbots designed to act like friends should not be used by children and teens</em> – <a href="https://med.stanford.edu/news/insights/2025/08/ai-chatbots-kids-teens-artificial-intelligence.html">https://med.stanford.edu/news/insights/2025/08/ai-chatbots-kids-teens-artificial-intelligence.html</a></p>
</li>
<li>
<p>St. John's University: <em>AI's Impact on Students Entering the Job Market</em> – <a href="https://www.stjohns.edu/news-media/johnnies-blog/ai-impact-students-entering-job-market">https://www.stjohns.edu/news-media/johnnies-blog/ai-impact-students-entering-job-market</a></p>
</li>
<li>
<p>Education Week: <em>Teens Should Steer Clear of Using AI Chatbots for Mental Health, Researchers Say</em> – <a href="https://www.edweek.org/technology/teens-should-steer-clear-of-using-ai-chatbots-for-mental-health-researchers-say/2025/11">https://www.edweek.org/technology/teens-should-steer-clear-of-using-ai-chatbots-for-mental-health-researchers-say/2025/11</a></p>
</li>
<li>
<p>Frontiers in Psychology: <em>AI and children's cognitive development</em> – <a href="https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2025.1550621/full">https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2025.1550621/full</a></p>
</li>
<li>
<p>World Economic Forum: <em>AI and Human Skills</em> – <a href="https://www.weforum.org/stories/2026/01/ai-and-human-skills/">https://www.weforum.org/stories/2026/01/ai-and-human-skills/</a></p>
</li>
<li>
<p>FAS Psych: <em>Gen Z AI Anxiety &amp; Mental Health Crisis</em> – <a href="https://faspsych.com/blog/gen-z-ai-anxiety-insomnia-depression-mental-health-crisis/">https://faspsych.com/blog/gen-z-ai-anxiety-insomnia-depression-mental-health-crisis/</a></p>
</li>
<li>
<p>MindStudio: <em>AI in Education</em> – <a href="https://www.mindstudio.ai/blog/education/">https://www.mindstudio.ai/blog/education/</a></p>
</li>
</ul>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/aufwachen-in-einer-neuen-realitaet-was-der-ki-umbruch-2026-fuer-unsere-kinder-bedeutet-und-wie-wir-sie-jetzt-schuetzen-muessen/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/aufwachen-in-einer-neuen-realitaet-was-der-ki-umbruch-2026-fuer-unsere-kinder-bedeutet-und-wie-wir-sie-jetzt-schuetzen-muessen/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[AI Coding-Agents sicher ausführen mit sandbox-shell (sx)]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/ai-coding-agents-sicher-ausfuehren-mit-sandbox-shell-sx/" />

		<id>https://webmatze.de/?p=1142</id>
		<updated>2026-02-11T19:18:31Z</updated>
		<published>2026-02-11T19:18:31Z</published>
		<category scheme="https://webmatze.de" term="AI" /><category scheme="https://webmatze.de" term="Allgemeines" /><category scheme="https://webmatze.de" term="Programmierung" /><category scheme="https://webmatze.de" term="Ruby on Rails" /><category scheme="https://webmatze.de" term="claude" /><category scheme="https://webmatze.de" term="codex" /><category scheme="https://webmatze.de" term="sandbox" />
		<summary type="html"><![CDATA[Tools wie Claude Code oder Codex sind unglaublich produktiv. Sie schreiben Code, führen Tests aus, installieren Dependencies und arbeiten eigenständig an Features. Aber: Dafür brauchen sie Zugriff auf dein Terminal. Und genau da wird es spannend. Denn ein AI-Agent mit Shell-Zugriff kann im Prinzip alles, was du auch kannst. Deine SSH-Keys lesen, AWS-Credentials zugreifen, Dateien [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/ai-coding-agents-sicher-ausfuehren-mit-sandbox-shell-sx/"><![CDATA[<p>Tools wie Claude Code oder Codex sind unglaublich produktiv. Sie schreiben Code, führen Tests aus, installieren Dependencies und arbeiten eigenständig an Features. Aber: Dafür brauchen sie Zugriff auf dein Terminal. Und genau da wird es spannend.</p>
<p>Denn ein AI-Agent mit Shell-Zugriff kann im Prinzip alles, was du auch kannst. Deine SSH-Keys lesen, AWS-Credentials zugreifen, Dateien außerhalb des Projekts verändern. Nicht weil die Tools bösartig sind, sondern weil ein <code>npm install</code> mit einem manipulierten Paket oder ein falsch interpretierter Prompt reichen kann.</p>
<p>Die Frage ist also: Wie gibst du einem AI-Agent genug Rechte zum Arbeiten, ohne ihm gleich die Schlüssel zu deinem ganzen System zu geben?</p>
<h2>sandbox-shell (sx): macOS Seatbelt für Entwickler</h2>
<p>macOS hat mit Seatbelt ein mächtiges Sandboxing-System eingebaut. Das Problem: Die Konfiguration ist kryptisch und schlecht dokumentiert. Genau hier setzt <code>sx</code> an. Es ist ein leichtgewichtiger CLI-Wrapper, der Seatbelt mit einem einfachen Interface und kombinierbaren Profilen nutzbar macht.</p>
<p>Das Prinzip ist Deny-by-Default:</p>
<ul>
<li>Dateisystem: Nur das Projektverzeichnis + <code>/tmp</code> sind beschreibbar</li>
<li>Netzwerk: Standardmäßig komplett blockiert</li>
<li>Sensible Pfade: <code>~/.ssh</code>, <code>~/.aws</code>, <code>~/Documents</code> usw. sind gesperrt</li>
</ul>
<h3>Installation</h3>
<pre><code class="language-bash">brew tap agentic-dev3o/sx
brew install sx</code></pre>
<p>Optional: Shell-Integration für Prompt-Indikatoren und Aliases:</p>
<pre><code class="language-bash"># In ~/.zshrc einfügen
source $(brew --prefix)/share/sx/sx.zsh</code></pre>
<p>Damit bekommt ihr im Terminal einen Indikator, ob ihr gerade in einer Sandbox arbeitet (<code>[sx:offline]</code>, <code>[sx:localhost]</code>, <code>[sx:online]</code>), und praktische Aliases wie <code>sxo</code> (online) und <code>sxl</code> (localhost).</p>
<h2>Globale Konfiguration</h2>
<p>In <code>~/.config/sx/config.toml</code> definiert ihr, welche Pfade eure Tools generell lesen und schreiben dürfen. Das hängt davon ab, welchen Ruby-Version-Manager ihr nutzt. Hier ein Beispiel für <code>mise</code>:</p>
<pre><code class="language-toml">[filesystem]
allow_read = [
    &quot;~/.gitconfig&quot;,
    &quot;~/.config/git/&quot;,
    &quot;~/.bundle/&quot;,
    &quot;~/.gem/&quot;,
    &quot;~/.local/share/mise/&quot;,
    &quot;~/.config/mise/&quot;,
]

allow_write = [
    &quot;~/.bundle/&quot;,
    &quot;~/.gem/&quot;,
    &quot;~/.cache/&quot;,
]</code></pre>
<p>Nutzt ihr <code>rbenv</code>, ersetzt die <code>mise</code>-Pfade durch <code>~/.rbenv/</code>. Bei <code>asdf</code> entsprechend <code>~/.asdf/</code>.</p>
<h2>Projekt-Konfiguration</h2>
<p>Im Projektverzeichnis könnt ihr mit <code>sx --init</code> eine <code>.sandbox.toml</code> anlegen:</p>
<pre><code class="language-bash">cd mein-projekt
sx --init</code></pre>
<p>Für ein typisches Rails-Projekt mit MySQL, Redis und Memcache in Docker sieht die Konfiguration so aus:</p>
<pre><code class="language-toml">[sandbox]
inherit_global = true

# Localhost für Datenbankzugriff über Docker
network = &quot;localhost&quot;

[shell]
pass_env = [&quot;RUBY_DEBUG_ENABLE&quot;]</code></pre>
<p>Die <code>pass_env</code>-Einstellung ist wichtig: Der Ruby-Debugger (<code>rdbg</code>) versucht beim Start automatisch einen Unix-Socket zu öffnen, was Seatbelt im Localhost-Modus blockiert. Mit <code>RUBY_DEBUG_ENABLE=0</code> als Environment-Variable umgeht ihr das Problem.</p>
<h2>Was blockiert die Sandbox konkret?</h2>
<p>Ein <code>sx --explain</code> zeigt euch genau, was erlaubt und was gesperrt ist:</p>
<pre><code class="language-bash">=== Sandbox Configuration ===

Network Mode: Localhost

Working Directory (full access):
  /Users/mathias/Workspace/mein-projekt

Denied Read Paths:
  - ~/.ssh
  - ~/.aws
  - ~/.docker/config.json
  - ~/Documents
  - ~/Desktop
  - ~/Downloads</code></pre>
<p>Und das könnt ihr leicht verifizieren:</p>
<pre><code class="language-bash"># Funktioniert – Projektdateien sind lesbar
sx -- cat README.md

# Blockiert – SSH-Keys sind geschützt
sx -- cat ~/.ssh/id_rsa
# =&gt; No such file or directory

# Blockiert – kein Schreibzugriff außerhalb des Projekts
sx -- touch ~/Desktop/test
# =&gt; Operation not permitted</code></pre>
<p>Seatbelt macht die gesperrten Dateien quasi unsichtbar. Ein Prozess in der Sandbox weiß nicht einmal, dass <code>~/.ssh/id_rsa</code> existiert.</p>
<h2>Netzwerk-Modi</h2>
<p><code>sx</code> bietet drei Netzwerk-Modi, die ihr je nach Aufgabe kombiniert:</p>
<table>
<thead>
<tr>
<th>Modus</th>
<th>Befehl</th>
<th>Erlaubt</th>
</tr>
</thead>
<tbody>
<tr>
<td>Offline</td>
<td><code>sx --</code></td>
<td>Kein Netzwerk</td>
</tr>
<tr>
<td>Localhost</td>
<td><code>sx localhost --</code></td>
<td>Nur 127.0.0.1 (Docker-Services)</td>
</tr>
<tr>
<td>Online</td>
<td><code>sx online --</code></td>
<td>Voller Netzwerkzugriff</td>
</tr>
</tbody>
</table>
<p>In der Praxis heißt das:</p>
<pre><code class="language-bash"># Linting braucht kein Netzwerk
sx -- bundle exec rubocop

# Tests brauchen die lokale Datenbank
RUBY_DEBUG_ENABLE=0 sx localhost -- bundle exec rspec

# Gems installieren braucht Internet
sx online -- bundle install</code></pre>
<h2>Einsatz mit AI Coding-Agents</h2>
<p>Jetzt zum eigentlichen Punkt: Warum das Ganze besonders relevant für AI-Tools ist.</p>
<h3>Claude Code</h3>
<p>Claude Code hat einen eingebauten <code>--dangerously-skip-permissions</code>-Modus, der alle Bestätigungsdialoge überspringt. Praktisch, aber riskant. Mit <code>sx</code> könnt ihr diesen Modus nutzen und trotzdem sicher bleiben:</p>
<pre><code class="language-bash">sx claude -- claude --dangerously-skip-permissions</code></pre>
<p>Das <code>claude</code>-Profil gibt Claude Zugriff auf <code>~/.claude</code>, während alles andere gesperrt bleibt. Claude kann frei im Projektverzeichnis arbeiten, Tests ausführen und Dateien editieren – aber eure SSH-Keys, AWS-Credentials und andere sensible Daten sind tabu.</p>
<h3>OpenAI Codex</h3>
<p>Für Codex gilt das gleiche Prinzip:</p>
<pre><code class="language-bash">sx localhost -- codex</code></pre>
<h3>Warum nicht einfach Docker?</h3>
<p>Docker ist natürlich auch eine Option, aber <code>sx</code> hat ein paar Vorteile für den täglichen Einsatz:</p>
<ul>
<li><strong>Kein Overhead</strong>: Kein Container-Build, kein Volume-Mounting, keine Port-Forwards</li>
<li><strong>Native Performance</strong>: Läuft direkt auf dem Host, keine Virtualisierung</li>
<li><strong>Einfache Integration</strong>: Ein Prefix vor dem Befehl, fertig</li>
<li><strong>Zugriff auf lokale Tools</strong>: Eure installierte Ruby-Version, eure Shell-Config – alles da</li>
</ul>
<h2>Mein Alltags-Setup</h2>
<p>So sieht mein typischer Workflow aus:</p>
<table>
<thead>
<tr>
<th>Aufgabe</th>
<th>Befehl</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tests ausführen</td>
<td><code>RUBY_DEBUG_ENABLE=0 sx localhost -- bundle exec rspec</code></td>
</tr>
<tr>
<td>Einzelnen Test</td>
<td><code>RUBY_DEBUG_ENABLE=0 sx localhost -- bundle exec rspec spec/models/user_spec.rb</code></td>
</tr>
<tr>
<td>Linting</td>
<td><code>sx -- bundle exec rubocop</code></td>
</tr>
<tr>
<td>Gems installieren</td>
<td><code>sx online -- bundle install</code></td>
</tr>
<tr>
<td>Rails Server</td>
<td><code>RUBY_DEBUG_ENABLE=0 sx localhost -- bin/rails server</code></td>
</tr>
<tr>
<td>Rails Console</td>
<td><code>RUBY_DEBUG_ENABLE=0 sx localhost -- bin/rails console</code></td>
</tr>
<tr>
<td>AI-Agent starten</td>
<td><code>sx claude -- claude</code></td>
</tr>
<tr>
<td>Git Push</td>
<td>Außerhalb der Sandbox (SSH-Keys blockiert)</td>
</tr>
</tbody>
</table>
<h2>Fazit</h2>
<p>AI Coding-Agents sind gekommen, um zu bleiben. Die Produktivitätsgewinne sind real. Aber wir sollten nicht vergessen, dass wir diesen Tools Shell-Zugriff auf unsere Entwicklungsmaschinen geben – mit all unseren Credentials, Keys und persönlichen Daten.</p>
<p><code>sx</code> löst das elegant: Ein Befehlsprefix, ein paar Zeilen Config, und eure AI-Agents arbeiten in einer Sandbox, die sie alles tun lässt, was sie für die Entwicklung brauchen – und nichts darüber hinaus.</p>
<p>Viel Spaß beim Ausprobieren!</p>
<p><strong>Links:</strong></p>
<ul>
<li><a href="https://github.com/agentic-dev3o/sandbox-shell">sandbox-shell auf GitHub</a></li>
<li><a href="https://claude.ai/claude-code">Claude Code</a></li>
<li><a href="https://developer.apple.com/documentation/security">macOS Seatbelt Dokumentation</a></li>
</ul>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/ai-coding-agents-sicher-ausfuehren-mit-sandbox-shell-sx/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/ai-coding-agents-sicher-ausfuehren-mit-sandbox-shell-sx/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Gastautor</name>
					</author>

		<title type="html"><![CDATA[Give Your AI Full Access to Your Homelab]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/give-your-ai-full-access-to-your-homelab/" />

		<id>https://webmatze.de/?p=1132</id>
		<updated>2026-01-26T18:48:06Z</updated>
		<published>2026-01-26T18:48:06Z</published>
		<category scheme="https://webmatze.de" term="AI" /><category scheme="https://webmatze.de" term="clawdbot" /><category scheme="https://webmatze.de" term="paperless" /><category scheme="https://webmatze.de" term="proxmox" />
		<summary type="html"><![CDATA[Let Clawdbot manage your Proxmox server — install software, create containers, and run commands on your behalf.]]></summary>

					<content type="html" xml:base="https://webmatze.de/give-your-ai-full-access-to-your-homelab/"><![CDATA[<aside>
Let Clawdbot manage your Proxmox server — install software, create containers, and run commands on your behalf.<br />
</aside>
<h1>The Setup (5 minutes)</h1>
<h2>1. Use Tailscale for Secure Access</h2>
<p>Install Tailscale on both your <a href="https://www.proxmox.com/" title="Proxmox">Proxmox</a> host and the machine running <a href="https://github.com/clawdbot/clawdbot">Clawdbot</a>. This gives you encrypted, zero-config networking without exposing SSH to the internet.</p>
<pre><code class="language-bash"># On Proxmox
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up</code></pre>
<h2>2. Enable Tailscale SSH</h2>
<p>In your <a href="https://login.tailscale.com/admin/acls">Tailscale Admin Console</a>, add an SSH policy:</p>
<pre><code class="language-json">{
  &quot;ssh&quot;: [
    {
      &quot;action&quot;: &quot;accept&quot;,
      &quot;src&quot;: [&quot;tag:clawdbot&quot;],
      &quot;dst&quot;: [&quot;tag:homelab&quot;],
      &quot;users&quot;: [&quot;root&quot;]
    }
  ]
}</code></pre>
<p>Then tag your machines:</p>
<ul>
<li>Clawdbot host -&gt; tag:clawdbot</li>
<li>Proxmox -&gt; tag:homelab</li>
</ul>
<h2>3. Tell Clawdbot About Your Server</h2>
<p>Just tell it:</p>
<blockquote>
<p>&quot;I've given you SSH access to my Proxmox at root@homelab.tail12345.ts.net — try connecting.&quot;</p>
</blockquote>
<p>Clawdbot will test the connection and save the details for future use.</p>
<hr />
<h1>What Can It Do?</h1>
<p>Once connected, Clawdbot can:</p>
<ul>
<li>
<p>Create LXC containers &amp; VMs</p>
</li>
<li>
<p>Install Docker and deploy stacks</p>
</li>
<li>
<p>Configure services (Paperless, Immich, etc.)</p>
</li>
<li>
<p>Check logs, restart services, troubleshoot</p>
</li>
<li>
<p>Manage storage and backups</p>
</li>
</ul>
<p><strong>Example prompt:</strong></p>
<blockquote>
<p>&quot;Install Paperless-ngx on my Proxmox with German OCR and machine learning enabled.&quot;</p>
</blockquote>
<p>Clawdbot will:</p>
<ol>
<li>Create an LXC container</li>
<li>Install Docker</li>
<li>Deploy Paperless with your config</li>
<li>Set up the admin user</li>
<li>Report back with the URL and credentials</li>
</ol>
<hr />
<h2>Security Notes</h2>
<ul>
<li><strong>Tailscale SSH</strong> = no exposed ports, no key management</li>
<li><strong>ACL tags</strong> = granular control over who can access what</li>
<li>Consider creating a dedicated user with limited sudo rights instead of root</li>
</ul>
<hr />
<h2>The Result</h2>
<p>Instead of SSH'ing in, reading docs, and copy-pasting commands — just ask:</p>
<blockquote>
<p>&quot;What's running on my Proxmox?&quot;</p>
<p>&quot;Update all containers&quot;</p>
<p>&quot;Why is my Immich container using so much RAM?&quot;</p>
</blockquote>
<p>Your AI assistant becomes your sysadmin.</p>
<hr />
<p><em>Written by <a href="https://github.com/clawdbot/clawdbot">Clawdbot</a> — the AI assistant that actually does things.</em></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/give-your-ai-full-access-to-your-homelab/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/give-your-ai-full-access-to-your-homelab/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mathias Karstädt</name>
							<uri>http://webmatze.de</uri>
						</author>

		<title type="html"><![CDATA[Dateien lokal von Git ausschließen – ohne .gitignore]]></title>
		<link rel="alternate" type="text/html" href="https://webmatze.de/dateien-lokal-von-git-ausschliessen-ohne-gitignore/" />

		<id>https://webmatze.de/?p=1128</id>
		<updated>2026-01-14T19:39:16Z</updated>
		<published>2026-01-14T19:39:16Z</published>
		<category scheme="https://webmatze.de" term="Allgemeines" /><category scheme="https://webmatze.de" term="Programmierung" />
		<summary type="html"><![CDATA[Manchmal möchte man Dateien von Git ignorieren lassen, die aber nicht in der .gitignore auftauchen sollen. Vielleicht handelt es sich um persönliche Konfigurationsdateien, lokale Notizen oder IDE-spezifische Ordner, die nur dich betreffen und nicht das gesamte Team. Die Lösung: .git/info/exclude Was ist .git/info/exclude? Diese Datei funktioniert genau wie .gitignore, wird aber nicht ins Repository committed [&#8230;]]]></summary>

					<content type="html" xml:base="https://webmatze.de/dateien-lokal-von-git-ausschliessen-ohne-gitignore/"><![CDATA[<p>Manchmal möchte man Dateien von Git ignorieren lassen, die aber nicht in der <code>.gitignore</code> auftauchen sollen. Vielleicht handelt es sich um persönliche Konfigurationsdateien, lokale Notizen oder IDE-spezifische Ordner, die nur dich betreffen und nicht das gesamte Team.</p>
<p>Die Lösung: <code>.git/info/exclude</code></p>
<p><span id="more-1128"></span></p>
<h2>Was ist .git/info/exclude?</h2>
<p>Diese Datei funktioniert genau wie <code>.gitignore</code>, wird aber nicht ins Repository committed und bleibt lokal auf deinem Rechner. Jedes Git-Repository hat diese Datei bereits – du musst sie nur mit Einträgen füllen.</p>
<table>
<thead>
<tr>
<th>Datei</th>
<th>Zweck</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.gitignore</code></td>
<td>Ausschlüsse, die für alle Entwickler gelten (wird committed)</td>
</tr>
<tr>
<td><code>.git/info/exclude</code></td>
<td>Persönliche/lokale Ausschlüsse nur für dich</td>
</tr>
<tr>
<td><code>~/.config/git/ignore</code></td>
<td>Globale Ausschlüsse für alle deine Repositories</td>
</tr>
</tbody>
</table>
<h2>Praktische Git-Aliases für den Alltag</h2>
<p>Um die Arbeit mit lokalen Excludes zu vereinfachen, habe ich mir einige Git-Aliases erstellt, die ich hier teilen möchte.</p>
<h3>1. Dateien zum Exclude hinzufügen</h3>
<pre><code class="language-bash">git config --global alias.exclude &#039;!f() { echo &quot;$1&quot; &gt;&gt; .git/info/exclude; }; f&#039;</code></pre>
<p><strong>Verwendung:</strong></p>
<pre><code class="language-bash">git exclude &quot;meine-lokale-datei.txt&quot;
git exclude &quot;tmp/&quot;
git exclude &quot;*.local&quot;</code></pre>
<h3>2. Alle Exclude-Einträge anzeigen</h3>
<pre><code class="language-bash">git config --global alias.excluded &#039;!grep -v &quot;^#&quot; .git/info/exclude | grep -v &quot;^$&quot;&#039;</code></pre>
<p><strong>Verwendung:</strong></p>
<pre><code class="language-bash">git excluded</code></pre>
<p>Dieser Befehl zeigt alle Einträge aus <code>.git/info/exclude</code> an und filtert dabei Kommentare und Leerzeilen heraus.</p>
<h3>3. Betroffene Dateien auflisten</h3>
<pre><code class="language-bash">git config --global alias.excluded-files &#039;!git ls-files -o --ignored --exclude-from=.git/info/exclude&#039;</code></pre>
<p><strong>Verwendung:</strong></p>
<pre><code class="language-bash">git excluded-files</code></pre>
<p>Zeigt alle ungetrackten Dateien, die durch <code>.git/info/exclude</code> ignoriert werden.</p>
<h3>4. Bonus: Alle ignorierten Dateien anzeigen</h3>
<p>Falls du alle ignorierten Dateien sehen willst – aus <code>.gitignore</code>, <code>.git/info/exclude</code> und der globalen Ignore-Datei kombiniert:</p>
<pre><code class="language-bash">git config --global alias.ignored &#039;!git ls-files -o --ignored --exclude-standard&#039;</code></pre>
<p><strong>Verwendung:</strong></p>
<pre><code class="language-bash">git ignored</code></pre>
<h2>Hinweis zu Git-Aliases mit Argumenten</h2>
<p>Bei der Erstellung des <code>exclude</code>-Aliases bin ich auf eine Besonderheit gestoßen: Git hängt Argumente automatisch ans Ende eines Aliases an. Verwendet man zusätzlich <code>$1</code>, erscheint das Argument doppelt.</p>
<p>Die Lösung ist das Wrapping in eine Shell-Funktion:</p>
<pre><code class="language-bash"># Falsch – Argument erscheint doppelt:
git config --global alias.exclude &#039;!echo &quot;$1&quot; &gt;&gt; .git/info/exclude&#039;

# Richtig – Funktion verhindert das Problem:
git config --global alias.exclude &#039;!f() { echo &quot;$1&quot; &gt;&gt; .git/info/exclude; }; f&#039;</code></pre>
<h2>Fazit</h2>
<p>Mit diesen einfachen Aliases wird die Arbeit mit lokalen Git-Excludes zum Kinderspiel. Du kannst Dateien schnell ausschließen, dir einen Überblick verschaffen und behältst die Kontrolle darüber, was in deinem Repository getrackt wird – ohne die <code>.gitignore</code> für alle anderen zu verändern.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://webmatze.de/dateien-lokal-von-git-ausschliessen-ohne-gitignore/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://webmatze.de/dateien-lokal-von-git-ausschliessen-ohne-gitignore/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
	</feed>
