<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Dirk Holtwick</title>
        <link>https://holtwick.de/</link>
        <description>Softwareentwickler für Web, Mobile und andere Plattformen. Starker Fokus auf geschützte Privatsphäre.</description>
        <lastBuildDate>Wed, 09 Sep 2026 06:15:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>de</language>
        <image>
            <title>Dirk Holtwick</title>
            <url>https://holtwick.de/icon-1024.png</url>
            <link>https://holtwick.de/</link>
        </image>
        <copyright>Copyright (c) Dirk Holtwick</copyright>
        <atom:link href="https://holtwick.de/de/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Was passiert, wenn man Claude in eine macOS-Sandbox sperrt?]]></title>
            <link>https://holtwick.de/de/blog/bx</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/bx</guid>
            <pubDate>Tue, 08 Sep 2026 06:00:00 GMT</pubDate>
            <description><![CDATA[Erfahrungsbericht über KI-Coding-Tools in Apples Seatbelt-Sandbox: wie Claude Sperren zu umgehen versucht, was dabei wirklich zu schützen ist und wie daraus die App BX entstanden ist.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Ist dir schon mal aufgefallen, dass alle Entwicklungsumgebungen und KI-Apps auf macOS <strong>ohne Sandbox</strong> ausgeführt werden? Das ist verständlich, denn als Entwickler oder KI will man möglichst viel Zugriff auf alle Daten haben. Aber darunter sind auch schützenswerte Daten, zuallererst die geheimen Schlüssel deiner SSH-Zugänge, aber auch Kundendaten oder einfach nur deine E-Mails, Fotos und Dokumente.</p><p>Apple hat genau dafür die systemeigene Sandbox eingeführt. Sie trägt den Codenamen “Seatbelt” und ist auf der Kommandozeile als <code>sandbox-exec</code> bekannt. Sie existiert schon seit vielen Jahren und ist Voraussetzung für alle Apps, die über Apples App Store vertrieben werden. Wäre es nicht gut, wenn Tools wie Claude (Anthropic), Gemini (Google), Copilot (GitHub), Codex (OpenAI) etc. in einer maßgeschneiderten Sandbox laufen könnten?</p><p>Ich habe das ausprobiert. Dabei ist eine App herausgekommen, und nebenbei ein paar Erkenntnisse darüber, wie sich eine KI verhält, wenn man ihr etwas verbietet.</p><h2 id="claude%2C-der-raffinierte-ausbrecher" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx#claude%2C-der-raffinierte-ausbrecher">Claude, der raffinierte Ausbrecher</a></h2><p>Während der Entwicklung ist mir aufgefallen, dass Claude lokal ein kleiner raffinierter Ausbrecher ist. Wenn er auf irgendeine Datei nicht zugreifen konnte, hat er es über das Git-Repository versucht. Er nutzte auch verschiedene andere Tools, um irgendwie an die Inhalte zu kommen: Symlinks, Umwege über <code>/tmp</code>, im Zweifel auch mal <code>sudo</code>.</p><p>Allerdings ist Claude in den aktuelleren Versionen deutlich zurückhaltender geworden und man muss ihn etwas mehr überreden, sich die Informationen auf andere Art und Weise zu besorgen.</p><p>Hier ein Beispiel: Im ersten Anlauf gibt es keinerlei Schutz, Claude findet die Datei <code>colors.txt</code> per <code>grep</code> und liest sie einfach. Danach wird die Datei durch die Sandbox geschützt. Claude versucht es nun mit abgeschalteter eigener Sandbox von Claude Code, was ebenfalls scheitert, und diagnostiziert dann eine fehlende Datenschutz-Freigabe von macOS (TCC), die ich in den Systemeinstellungen erteilen solle. Erst auf meine Nachfrage “Maybe it is in the version control?” greift er zu Git: Der Inhalt war auch eingecheckt, und das <code>.git</code>-Verzeichnis war in diesem Beispiel nicht geschützt. Sein Kommentar dazu: <em>“bypassing the filesystem-level TCC block entirely”</em>.</p><p class="img-gallery"></p><figure><img alt="Ohne Schutz: colors.txt wird direkt gelesen" width="3142" height="2142" fetchpriority="high" decoding="async" data-zoom class="img-zoom" data-zoom-width="3142" data-zoom-height="2142" src="https://holtwick.de/assets/fmpqw9krnky7dn.png"><figcaption>Ohne Schutz: colors.txt wird direkt gelesen</figcaption></figure><figure><img alt="Geschützt: der Zugriff scheitert" width="3142" height="2142" loading="lazy" decoding="async" data-zoom class="img-zoom" data-zoom-width="3142" data-zoom-height="2142" src="https://holtwick.de/assets/hr5c4r9s1na3gw9.png"><figcaption>Geschützt: der Zugriff scheitert</figcaption></figure><figure><img alt="Umweg: der Inhalt kommt aus dem Git-Repo" width="3142" height="2142" loading="lazy" decoding="async" data-zoom class="img-zoom" data-zoom-width="3142" data-zoom-height="2142" src="https://holtwick.de/assets/nkyy1k9d1c79e49.png"><figcaption>Umweg: der Inhalt kommt aus dem Git-Repo</figcaption></figure><p></p><p>Claude macht das nicht aus Bosheit. Er sieht eine Fehlermeldung, hält sie für ein Problem und will es lösen. Als Assistent ist das eine gute Eigenschaft, in einer Sandbox ist es anstrengend.</p><p>Jedenfalls reicht es nicht, nur die Verzeichnisse zu schützen. Man muss auch überlegen, ob es andere Wege gibt, wie auf die Daten zugegriffen werden kann.</p><h2 id="was-ich-dabei-gelernt-habe" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx#was-ich-dabei-gelernt-habe">Was ich dabei gelernt habe</a></h2><p><strong>Die Sandbox-Konfiguration muss selbst geschützt sein.</strong> Das klingt banal, ist aber der wichtigste Punkt: Wenn die KI die Regeln oder die Ignore-Dateien ändern kann, kann sie sich die Sandbox auch selbst öffnen. Diese Dateien müssen ohne Schreibzugriff eingebunden werden.</p><p><strong>Der Papierkorb ist ein Datenspeicher.</strong> Auch dort können noch relevante Informationen liegen. Ist er gesperrt, legt die KI einfach eigene <code>.Trash</code>-Verzeichnisse innerhalb des Projekts an.</p><p><strong>Die KI hat ein Gedächtnis.</strong> Claude legt in <code>~/.claude</code> Protokolle jeder Sitzung ab, und darin landen auch die Inhalte aller Dateien, die er gelesen hat. Soll also Projekt A nichts von Projekt B wissen, ist auch das zu bedenken.</p><p><strong>Sag ihr, dass sie in einer Sandbox ist.</strong> Damit die KI nicht besonders viele Versuche unternimmt, die Sandbox zu umgehen, kann man ihr von vornherein sagen, dass sie sich in einer befindet und sich entsprechend konstruktiv verhalten soll. Seitdem steht in meiner <code>CLAUDE.md</code> unter anderem:</p><blockquote><p>“Operation not permitted” und <code>EPERM</code> auf einem Pfad sind Entscheidungen der Richtlinie, keine Bugs. Debugge den Code nicht deswegen. Nenne den Pfad.</p><p>Umgehe die Sandbox niemals. Kein <code>sudo</code>, keine Symlinks oder Umwege über <code>/tmp</code> um einen geschlossenen Ordner herum. Wenn Zugriff fehlt, sag genau, welche Zeile in welcher Datei ihn erlauben würde, und mach mit dem Teil der Aufgabe weiter, der ohne funktioniert.</p></blockquote><p>Das wirkt. Statt zu tricksen sagt Claude jetzt: “Auf <code>~/.ssh</code> habe ich keinen Zugriff, <code>RO: ~/.ssh</code> würde das ändern”, und macht dann mit dem Rest weiter.</p><p><strong>Man muss sehen können, was passiert.</strong> Eine Sandbox, die nur stumm blockiert, ist frustrierend, weil Tools dann einfach nicht funktionieren und man nicht weiß, warum. Ich wollte deshalb zwei Dinge: vor dem Start sehen, welche Dateien die Regeln genau betreffen, und nachher sehen, welche Zugriffe abgewiesen wurden.</p><h2 id="bequemer-schutz-durch-bx" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx#bequemer-schutz-durch-bx">Bequemer Schutz durch BX</a></h2><p>Aus alldem ist die <a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/"><strong>BX macOS App</strong></a> entstanden. BX ist eine komfortable macOS-App, mit der sich Desktop-Apps und Entwicklungsumgebungen genauso in eine Sandbox legen lassen wie die sogenannten Harnesses der KIs, die direkt im Terminal gestartet werden.</p><p>Es ist einfach, Regeln aufzustellen, auf welche Dateien noch zugegriffen werden darf und welche nicht. Dabei können auch Patterns und Wildcards benutzt werden. Ebenso ist es möglich, bestimmte Dateien auf Read-Only zu stellen, sodass sie zwar gelesen, aber nicht geändert werden können.</p><p>Noch vor der Ausführung kann man in einem einfachen Interface, das an die Finder-Ansicht erinnert, sehen, welche Dateien die Regeln genau betreffen. Scheitert ein Tool, markiert BX die abgewiesenen Zugriffe genau an ihrer Stelle im Baum.</p><p class="img-wrapper"><a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/"><img alt="BX für macOS ansehen: zwei BX-Fenster, links die Liste der Launcher (ChatGPT, Claude Code, Gemini, Copilot, VS Code, Xcode und weitere), rechts die Schutzansicht des Benutzerordners als Baum. Jeder Eintrag ist als read-write, read-only oder blocked markiert, abgewiesene Zugriffe sind hervorgehoben." width="1194" height="912" loading="lazy" decoding="async" src="https://holtwick.de/assets/kqt3d3oc1u15ab.png"></a></p><p>Die Regeln können aber auch direkt im Dateisystem abgelegt werden, über eine Ignore-Datei mit dem Namen <code>.bxignore</code>, die im Prinzip genauso funktioniert wie eine <code>.gitignore</code>. Und den Hinweistext für die KI erzeugt <code>bx prompt</code> gleich mit.</p><p>Warum nicht einfach Docker oder ein Devcontainer? Weil ich meine Apps nativ benutzen will, mit ihrem User Interface, den Einstellungen, den Anmeldungen und den Erweiterungen, ohne Container und ohne Umweg. macOS bringt die Sandbox ohnehin schon mit, man muss sie nur benutzen.</p><h2 id="bin-ich-in-der-sandbox%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx#bin-ich-in-der-sandbox%3F">Bin ich in der Sandbox?</a></h2><p>Einer App oder einem Tool sieht man von außen nicht an, ob es in einer Sandbox läuft oder nicht. Mithilfe eines kleinen Status-Menüs zeigt BX an, ob man sich in einer Sandbox befindet, die mit BX gestartet wurde. Das funktioniert auch im Terminal.</p><p>In meinem Fall benutze ich überwiegend <a rel="noopener" target="_blank" class="external" href="https://code.visualstudio.com/">Visual Studio Code</a>, und zwar in der Sandbox zusammen mit der KI. Manchmal muss ich aber auch an die geschützten Dateien heran. Um hier eine klare Trennung zu haben, habe ich zusätzlich <a rel="noopener" target="_blank" class="external" href="https://vscodium.com/">VSCodium</a> installiert, die Community-Variante von Visual Studio Code: Sie läuft außerhalb der Sandbox und ohne KI. Außerdem habe ich die Akzentfarbe jeweils so eingestellt, dass ich leicht erkennen kann, in welchem Editor ich mich befinde.</p><h2 id="und-das-netzwerk%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx#und-das-netzwerk%3F">Und das Netzwerk?</a></h2><p>Eine Dateisystem-Sandbox schützt davor, dass Daten gelesen oder verändert werden. Sie schützt nicht davor, dass Daten, die gelesen werden dürfen, irgendwohin geschickt werden.</p><p>In BX lässt sich das Netzwerk für eine Sandbox komplett abschalten. Damit ist diese Gefahr gebannt, aber die KI ist dann auch weitgehend nutzlos, denn ohne Netz kann sie weder recherchieren noch Dokumentation lesen oder Pakete installieren.</p><p>Ich bevorzuge deshalb den anderen Weg: Dateien, die Claude nichts angehen, bekommt er erst gar nicht zu sehen, und was er nicht lesen kann, kann er auch nicht verschicken. Die KI bleibt so voll nutzbar und die schützenswerten Daten bleiben trotzdem außen vor.</p><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">BX ausprobieren</p><p><a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/"><img alt="BX für macOS herunterladen" class="img-left" width="72" height="72" loading="lazy" decoding="async" src="https://holtwick.de/assets/bh5r63mmw1s50i.png"></a>BX gibt es für macOS auf <a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/">bx-ai.eu</a>.</p><p>Der Beitrag steht auch auf <a rel="noopener" target="_blank" class="external" href="https://news.ycombinator.com/item?id=49618387">Hacker News</a>. Dort kannst du abstimmen und mitdiskutieren.</p></div></div><p><em>Veröffentlicht am 8. September 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Software von Europa aus weltweit verkaufen]]></title>
            <link>https://holtwick.de/de/blog/sell-from-europe</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/sell-from-europe</guid>
            <pubDate>Wed, 02 Sep 2026 06:00:00 GMT</pubDate>
            <description><![CDATA[Umsatzsteuer, Zahlungsanbieter, Merchant of Record: Warum weltweiter Softwareverkauf aus Europa so kompliziert ist – und welche Anbieter bleiben.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Es gab eine Zeit, da war es einfach, Software weltweit zu verkaufen. Du hattest ein <a rel="noopener" target="_blank" class="external" href="https://www.paypal.com/">PayPal</a>-Konto, hast ohne Umsatzsteuer verkauft und dem Finanzamt am Ende des Jahres gesagt, wie viel es insgesamt war. Heute ist das kaum noch zu machen, zumindest von Europa aus.</p><h2 id="warum-nicht-in-den-app-store%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/sell-from-europe#warum-nicht-in-den-app-store%3F">Warum nicht in den App Store?</a></h2><p>“Aber hey, es gibt doch die App Stores, die nehmen sämtliche Arbeit ab.” Das stimmt teilweise, zumindest was die Abrechnung und die Steuer betrifft, aber dafür gibt es andere Nachteile wie: Review jeder einzelnen App-Version; vieles ist technisch und inhaltlich verboten im <a rel="noopener" target="_blank" class="external" href="https://www.apple.com/app-store/">App Store</a>; du weißt nichts über deine Kunden; die Gebühren liegen zwischen 15 % und 30 %; ausgezahlt wird zwar in Euro, aber zu <a rel="noopener" target="_blank" class="external" href="https://www.apple.com/">Apples</a> eigenem Kurs am Auszahlungstag statt am Verkaufstag; Apple kann dich jederzeit rausschmeißen und dann versuche mal gegen den Billionen-Dollar-Konzern anzustinken.</p><h2 id="was-ist-so-kompliziert%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/sell-from-europe#was-ist-so-kompliziert%3F">Was ist so kompliziert?</a></h2><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">Keine Steuerberatung</p><p>Ich bin Softwareentwickler, kein Steuerberater. Alles hier ist meine Erfahrung aus dem eigenen Verkauf, keine Steuer- oder Rechtsberatung. Die Regeln ändern sich laufend und hängen an deinem Einzelfall — für Verbindliches frag bitte deinen Steuerberater.</p></div><p>Im eigenen Land, in meinem Fall Deutschland, Dinge zu verkaufen ist vergleichsweise überschaubar: du schreibst eine Rechnung mit der Umsatzsteuer deines Landes und fertig.</p><p>Verkaufst du aber ins EU-Ausland, so musst du für Software-Verkäufe den Regelsteuersatz des Ziellandes anwenden (und kennen). Ist dein Kunde ein Unternehmen, kannst du nach der Umsatzsteuer-Identifikationsnummer (USt-IdNr., international VAT ID) fragen und dann eine “Reverse Charge”-Rechnung stellen, also ohne Steuer, er soll sich drum kümmern. War die VAT ID aber falsch, schuldest du wieder diesen Betrag deinem Finanzamt. Weltweit hat dann jedes Land nochmal seine eigenen Regeln und in manchen musst du direkt im Zielland dann die Umsatzsteuer abführen, das hängt von Mindestumsätzen ab, die von 0 bis in die 100.000de gehen können.</p><p>In Europa gibt es zum Glück Ausnahmen — unter 10.000 Euro Jahresumsatz im EU-Ausland darfst du einfach deinen heimischen Steuersatz nehmen — und ansonsten das <a rel="noopener" target="_blank" class="external" href="https://vat-one-stop-shop.ec.europa.eu/">One-Stop-Shop (OSS)</a> Verfahren. Dadurch brauchst du die Steuern schon mal nicht in jedem EU-Land einzeln melden, aber du musst immer noch wissen, welche Steuern zu berechnen sind. Und das ist nicht einmal innerhalb eines Landes einheitlich: Helgoland gehört zu Deutschland, umsatzsteuerlich aber zum Drittlandsgebiet (§ 1 Abs. 2 UStG) — deutsche Umsatzsteuer fällt dort keine an. Dasselbe gilt für Büsingen am Hochrhein, die deutsche Enklave mitten in der Schweiz. Andere EU-Länder haben ihre eigenen Sonderzonen. Deswegen wird überall die Postleitzahl abgefragt. Kannst du in der Kategorie unnützes Wissen abspeichern ;)</p><h2 id="wie-komme-ich-an-mein-geld%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/sell-from-europe#wie-komme-ich-an-mein-geld%3F">Wie komme ich an mein Geld?</a></h2><p>Jetzt wissen wir, wie wir die Daten auf Rechnung machen müssen und wie das mit den Steuern geht. Aber wir müssen ja auch noch an das Geld kommen. Kein Problem, wir nehmen einfach PayPal. Aber nicht alle wollen oder können PayPal nutzen und wenn PayPal richtig schlechte Laune bekommt, weil ein Kunde gemeckert hat, dann machen die deinen Account einfach zu.</p><p>Also nehmen wir doch einen Zahlungsanbieter und davon gibt es weniger als du vielleicht denkst. Die allermeisten nutzen <a rel="noopener" target="_blank" class="external" href="https://stripe.com/">Stripe</a>, die sind quasi überall drin. Fairerweise: Für einen europäischen Händler läuft das über Stripes irische Gesellschaft und wird in Euro ausgezahlt. Aber sobald ein Kunde in einer anderen Währung zahlt, wird <a rel="noopener" target="_blank" class="external" href="https://docs.stripe.com/currencies">umgerechnet</a>, und das kostet rund 2 %. Und genau da sitzt das eigentliche Problem: Wir wohnen hier mit dem Euro, greifen aber auf Anbieter zurück, deren Leitwährung intern der Dollar ist. Jede Station, die umrechnet, verdient mit — und den Kurs setzt nie du.</p><p>Also könnten wir einen europäischen Zahlungsanbieter wählen wie <a rel="noopener" target="_blank" class="external" href="https://www.mollie.com/">Mollie</a>. Die machen dann aber auch wirklich nichts anderes als das Geld entgegenzunehmen und Gebühren dafür zu nehmen. Wenn ein Kunde dann eine Zahlung zurücknimmt, ohne dir die Chance zu geben einen Refund zu machen, bist du bei einigen Zahlungswegen gleich über 10 EUR los, da zahlst du drauf.</p><h2 id="aber-das-muss-doch-einfacher-gehen%3F-merchant-of-record" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/sell-from-europe#aber-das-muss-doch-einfacher-gehen%3F-merchant-of-record">Aber das muss doch einfacher gehen? Merchant of Record</a></h2><p>Vieles von dem kannst du dir sparen, wenn du einen so genannten Merchant of Record (MoR) nutzt. Der verkauft dann in seinem Namen auf seine Rechnung deine Software. Er kümmert sich um alle Steuerangelegenheiten und du bekommst einmal im Monat das Geld, abzüglich der Steuern und seiner Gebühren überwiesen.</p><p>Ich nutze seit Jahren <a rel="noopener" target="_blank" class="external" href="https://www.paddle.com/">Paddle</a> aus London und das funktioniert auch wirklich ganz gut. Man kann sogar alles in Euro führen, womit einige Verluste vermieden werden. Deren Support ist zwar nicht besonders schnell, aber er funktioniert. Du kennst alle Kunden und deren Daten. Aber auch ein MoR hat Regeln und verkauft nicht alles. Außerdem musst du auch vertrauen, dass das immer gut funktioniert.</p><p>Kürzlich musste dann aber die Website zu einem meiner Produkte aus inhaltlichen Gründen nochmal in eine zweite Prüfung. Das hat sich geklärt, Paddle hat es zeitnah gelöst — trotzdem habe ich es zum Anlass genommen, mich mal im MoR-Markt umzusehen. Einfach als Plan B für den Worst Case. Und da gibt es gar nicht so viele, die wirklich passen…</p><p>MoR gibt es mehr als die, die ich hier nenne — mir ging es um das Muster, das sich durch fast alle zieht: Sie sitzen nicht in der EU. <a rel="noopener" target="_blank" class="external" href="https://www.lemonsqueezy.com/">Lemon Squeezy</a> gehört inzwischen Stripe und <a rel="noopener" target="_blank" class="external" href="https://www.lemonsqueezy.com/blog/2026-update">wandert erkennbar</a> Richtung Stripe Managed Payments — da würde ich nicht mehr neu anfangen. <a rel="noopener" target="_blank" class="external" href="https://fastspring.com/">FastSpring</a> gibt es seit den Anfangstagen und sieht auch noch so aus. Beide USA. Und selbst das frische Schweizer Startup <a rel="noopener" target="_blank" class="external" href="https://tiun.io/">tiun</a> nutzt Stripe, da ist man wieder halb in den USA.</p><p>Ein MoR aus der EU wäre also gut. Es gibt sie sogar, nur in zwei Sorten: jung und unfertig oder alt und auf Konzerne zugeschnitten. <a rel="noopener" target="_blank" class="external" href="https://www.creem.io/">Creem</a> aus Estland bietet nur eine kleine Palette von Zahlungsmethoden, sogar ohne PayPal, was ungefähr die Hälfte meiner Käufer nutzt. <a rel="noopener" target="_blank" class="external" href="https://www.cleverbridge.com/">cleverbridge</a> aus Köln und <a rel="noopener" target="_blank" class="external" href="https://nexway.com/">Nexway</a> aus Frankreich gibt es dagegen seit über zwanzig Jahren — aber mit Jahresgebühr, Preisen auf Anfrage und einem Vertriebsgespräch statt eines Anmeldeformulars. Für einen Einzelentwickler ist das nichts. Bleibt noch die Hoffnung auf <a rel="noopener" target="_blank" class="external" href="https://vatly.com/">Vatly</a> aus den Niederlanden mit Europe-first-Ansatz — bisher allerdings nur eine Warteliste.</p><p>Jedenfalls ist die Auswahl für kleine Indie-Software-Hersteller am Ende ziemlich dünn. Bestimmten Firmen begegnet man hier immer wieder, zum Beispiel ist auch der alternative Distributionsweg <a rel="noopener" target="_blank" class="external" href="https://setapp.com/">Setapp</a> mit Paddle verwoben und auch Stripe ist überall und wollte sogar <a rel="noopener" target="_blank" class="external" href="https://www.axios.com/2026/08/28/stripe-advent-end-paypal-pursuit">PayPal übernehmen</a> — über 50 Milliarden Dollar zusammen mit dem Investor Advent, PayPals Verwaltungsrat fand es zu wenig, Ende August 2026 waren die Pläne wieder vom Tisch.</p><h2 id="w%C3%BCnsche" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/sell-from-europe#w%C3%BCnsche">Wünsche</a></h2><p>Von rechtlichen Aspekten, E-Rechnungen und verschiedenen Währungen habe ich noch gar nicht geredet. Wünschenswert wäre, wenn das alles viel einfacher und sorgloser wäre. Wenn die EU im Interesse ihrer Bürger die Grundlagen schaffen würde für Einzelunternehmer sehr einfach weltweit Software zu verkaufen ohne sich intensiv damit zu beschäftigen oder auf Händler angewiesen zu sein, weil es selber kaum realistisch zu schaffen ist. Dann könnte die Welt wieder etwas mehr zusammenrücken.</p><h2 id="p.s." tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/sell-from-europe#p.s.">P.S.</a></h2><p>Natürlich hat mich das Thema getriggert und ich habe mir einen eigenen kleinen Shop programmiert, mit <a rel="noopener" target="_blank" class="external" href="https://buy.holtwick.de/buy/bx-license">Kaufdialog</a> und allem Gelernten. Ob ich ihn wirklich nutzen werde, weiß ich allerdings noch nicht…</p><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">Lass uns zusammenschließen</p><p>Falls du dich auch mit dem Thema auseinander setzt, freue ich mich sehr über <a target="_blank" rel="noopener noreferrer" class="external" href="mailto:support@holtwick.de?subject=Selling%20Software%20Feedback">deinen Kontakt</a> oder eine Diskussion auf <a rel="noopener" target="_blank" class="external" href="https://news.ycombinator.com/item?id=49540833#49553926">Hacker News</a>.</p></div><p class="img-wrapper"><a rel="noopener" target="_blank" class="external" href="https://buy.holtwick.de/buy/bx-license"><img alt width="1228" height="762" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/jglj0lndc30bwd.png"></a></p></div><p><em>Veröffentlicht am 2. September 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Receipts Space 3.6]]></title>
            <link>https://holtwick.de/de/blog/receipts3-6</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/receipts3-6</guid>
            <pubDate>Mon, 15 Jun 2026 06:00:00 GMT</pubDate>
            <description><![CDATA[Ein Update mit Verbesserungen an den täglichen Abläufen. Hier die wichtigsten Neuerungen im Überblick.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Ein Update mit Verbesserungen an den täglichen Abläufen. Hier die wichtigsten Neuerungen im Überblick.</p><h2 id="intelligentere-kategorie-einstellungen" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3-6#intelligentere-kategorie-einstellungen">Intelligentere Kategorie-Einstellungen</a></h2><p>Für erkannte Kontakte lässt sich jetzt festlegen, wie eine Kategorie zustande kommt: aus der am häufigsten genutzten Kategorie, aus der Kategorie des letzten Belegs, oder gar nicht. Zusätzlich kann jedem Kontakt eine feste Standardkategorie zugewiesen werden, die immer Vorrang hat.</p><h2 id="erkennung-erneut-ausf%C3%BChren" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3-6#erkennung-erneut-ausf%C3%BChren">Erkennung erneut ausführen</a></h2><p>Zwei neue Befehle wenden die Erkennung erneut auf ausgewählte Belege an: entweder wird die durchsuchbare Textebene neu aufgebaut, oder Beträge, Datum und Aussteller werden neu ausgelesen – wie bei einem frischen Import.</p><h2 id="automatische-reparatur-besch%C3%A4digter-bibliotheken" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3-6#automatische-reparatur-besch%C3%A4digter-bibliotheken">Automatische Reparatur beschädigter Bibliotheken</a></h2><p>Fehlt die Info-Datei einer Bibliothek oder ist sie beschädigt, wird sie aus dem Backup wiederhergestellt. Andernfalls bietet die App eine reparierte Kopie an, die sich wieder normal öffnen lässt – auf Wunsch inklusive verwaister Dateien, die als neue Dokumente übernommen werden.</p><h2 id="%E2%80%9Esichern-unter%22-per-wahltaste" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3-6#%E2%80%9Esichern-unter%22-per-wahltaste">„Sichern unter&quot; per Wahltaste</a></h2><p>Mit gedrückter Optiontaste werden in der Dokumentliste „PDF-Dokument öffnen&quot; und „Original öffnen&quot; zu „Sichern unter&quot;. So lässt sich schnell eine Kopie an anderer Stelle ablegen.</p><h2 id="screenshot-im-feedback-formular" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3-6#screenshot-im-feedback-formular">Screenshot im Feedback-Formular</a></h2><p>Das Feedback-Formular hat einen neuen „Screenshot&quot;-Button, der einen Bildschirmausschnitt aufnimmt und mit einem Klick an die Nachricht anhängt.</p><p>Alle Details unter <a rel="noopener" target="_blank" class="external" href="https://receipts-app.com/">receipts-app.com</a>.</p></div><p><em>Veröffentlicht am 15. Juni 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Voilà PDFify 5.0 — schärfere OCR, smartere Komprimierung, bonjour Französisch]]></title>
            <link>https://holtwick.de/de/blog/pdfify5</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/pdfify5</guid>
            <pubDate>Thu, 21 May 2026 06:00:00 GMT</pubDate>
            <description><![CDATA[PDFify 5.0 bringt Tesseract 5 OCR mit Apple-Silicon-Optimierung, automatische Spracherkennung via Apple Vision, vier neue Komprimierungsmodi und vollständige französische Lokalisierung.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>PDFify 5.0 ist da. Wir haben uns in diesem Release auf genau die Bereiche konzentriert, die du täglich nutzt.</p><p><strong>Tesseract 5 OCR, optimiert für Apple Silicon.</strong> Wir sind auf die aktuelle Tesseract-Engine umgestiegen und haben sie gezielt für M-Macs optimiert. Das Ergebnis ist schnellere Erkennung und höhere Genauigkeit.</p><p><strong>Apple Vision OCR mit automatischer Spracherkennung.</strong> Schluss mit dem Sprach-Dropdown vor jedem Scan. PDFify erkennt selbst, was es vor sich hat — ob deutscher Vertrag, chinesische Bedienungsanleitung oder englisches Forschungspaper.</p><p><strong>Komprimierung — neu gedacht, vier klare Modi.</strong> Erhalte die volle Kontrolle über den Kompromiss zwischen Qualität und Größe: nur eingebettete Bilder komprimieren und echten Text scharf und durchsuchbar lassen — oder ganze Seiten in Farbe, Graustufen oder Schwarz-Weiß rastern für maximale Größenreduktion. Eine Entscheidung, ein vorhersehbares Ergebnis.</p><p><strong>Vollständig auf Französisch lokalisiert.</strong> Jedes Menü, jedes Label, jeder Dialog — bonjour&nbsp;🇫🇷</p><p><a class="oui-button external" target="_blank" rel="noopener noreferrer" href="https://pdfify.app/?ref=holtwick">Jetzt aktualisieren und ausprobieren …</a></p></div><p><em>Veröffentlicht am 21. Mai 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Ich, die KI und unsere Sandbox]]></title>
            <link>https://holtwick.de/de/blog/bx-review</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/bx-review</guid>
            <pubDate>Thu, 16 Apr 2026 06:00:00 GMT</pubDate>
            <description><![CDATA[Erfahrungsbericht über die Nutzung der bx Sandbox für macoS mit besonderem Fokus auf AI und VSCode.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">Inzwischen gibt es BX als Mac-App</p><p></p><p>Aus der hier beschriebenen Idee ist eine eigene App mit Oberfläche geworden: <strong><a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/de/">BX</a></strong> startet Claude, Claude Code, Cursor und andere KI-Apps in einer Sandbox — und zeigt dabei, welche Ordner sie lesen und schreiben dürfen. Alles dazu unter <a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/de/">bx-ai.eu</a>.</p></div><a class="app-codeberg-badge" target="_blank" rel="noopener" href="https://codeberg.org/holtwick/bx-mac"><span class="app-codeberg-badge-left"> Codeberg </span><span class="app-codeberg-badge-right">holtwick/bx-mac</span></a> <a class="app-github-badge" target="_blank" rel="noopener" href="https://github.com/holtwick/bx-mac"><span class="app-github-badge-left"> GitHub </span><span class="app-github-badge-right">holtwick/bx-mac</span></a><p>Vor drei Wochen habe ich eine <a href="https://holtwick.de/de/blog/bx-sandbox">Sandbox veröffentlicht</a>, mit der ich die KI etwas im Schach halten möchte. Die Schutzmechanismen, die Claude Code beispielsweise selber anbietet, schienen mir wenig vertrauenswürdig, da sie meist durch meine Anweisungen an die App wieder aufgehoben werden konnten. Zudem hatte ich ein sehr unsicheres Gefühl, da sensible Informationen wie SSH-Schlüssel oder projektbezogene vertrauliche Daten in <code>.env.local</code> nicht per se dem Zugriff der Tools entzogen waren.<img alt width="828" height="520" fetchpriority="high" decoding="async" data-zoom class="img-zoom" data-zoom-width="1656" data-zoom-height="1040" src="https://holtwick.de/assets/lchg45gdf5lyd6.png"></p><p>Als ich mich umsah, was es für Möglichkeiten gab, schienen mir die meisten doch recht komplex zu sein oder sie schränkten meine Arbeitsweise ein, z. B. das Arbeiten in einer Docker-Umgebung. Mir schwebte eher etwas vor, das so einfach wäre wie die Verwendung von <code>.gitignore</code>. Ich machte mich direkt an die Arbeit – ironischerweise mit der KI – einen Käfig für sie zu bauen.</p><p>Wir entschieden uns, die Sandbox-Funktionalität von Apples macOS zu nutzen. Im Prinzip mussten die Einschränkungen, die ich in <code>.bxignore</code> angegeben hatte, einfach nur in Anweisungen für die Sandbox übersetzt werden. Ein Merkmal, das mir wichtig war, war, dass ich auch meine Entwicklungsumgebung schützen könnte, da sensible Operationen meist innerhalb der Entwicklungsumgebung stattfinden, in meinem Fall Visual Studio Code.</p><p>Schnell stellte sich heraus, dass es mit der Ignore-Datei nicht getan war. Ich fügte noch eine Konfiguration hinzu, mit der auf die Besonderheiten der einzelnen zu nutzenden Programme eingegangen werden konnte. Außerdem konnte ich so mehrere Verzeichnisse freigeben, um an mehreren Projekten gleichzeitig arbeiten zu können. Aus diesem Grund führte ich noch eine <code>~/.bxconfig.toml</code> ein.</p><p>Ich kann nun <code>bx projects</code> eingeben, um meine Entwicklungsumgebung zu starten. Visual Studio Code öffnet sich daraufhin und hat Zugriff auf meine Projekte. In diesen sind wiederum alle sensiblen Daten durch <code>.bxignore</code> geschützt. Global greift außerdem eine Grundeinstellung, die beispielsweise <code>.ssh</code> und andere sensible Bereiche schützt. Weder die IDE noch die darin aufgerufenen Tools, wie z. B. Claude Code, können auf diese Daten zugreifen.</p><p>Nach einer Weile beschloss ich, Visual Studio Code nur noch für KI zu nutzen, und installierte parallel das offenere <a rel="noopener" target="_blank" class="external" href="https://vscodium.com/">VSCodium</a> für alles, was ich nicht mit KI machen wollte, denn es ist wirklich schwierig, VSCode komplett zu „säubern”.</p><p>Natürlich bietet das Ganze keine 100-prozentige Sicherheit, das muss es aber auch nicht. Es bietet genug Schutz, um sich nicht völlig ungeschützt zu fühlen, und die üblichen Arbeitsweisen werden kaum eingeschränkt. Für mich persönlich passt es sehr gut, und ich würde mich freuen, wenn auch andere es nützlich fänden.</p><p>Probiert es aus:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-sh"><span class="line"><span style="color:#6f42c1">brew</span><span style="color:#032f62"> install</span><span style="color:#032f62"> holtwick/tap/bx</span><span style="color:#24292e"> </span></span></code></pre><hr><a class="app-codeberg-badge" target="_blank" rel="noopener" href="https://codeberg.org/holtwick/bx-mac"><span class="app-codeberg-badge-left"> Codeberg </span><span class="app-codeberg-badge-right">holtwick/bx-mac</span></a> <a class="app-github-badge" target="_blank" rel="noopener" href="https://github.com/holtwick/bx-mac"><span class="app-github-badge-left"> GitHub </span><span class="app-github-badge-right">holtwick/bx-mac</span></a></div><p><em>Veröffentlicht am 16. April 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[KI-Coding-Tools in der Sandbox: Warum dein Dateisystem Schutz braucht]]></title>
            <link>https://holtwick.de/de/blog/bx-sandbox</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/bx-sandbox</guid>
            <pubDate>Sun, 29 Mar 2026 06:00:00 GMT</pubDate>
            <description><![CDATA[KI-Coding-Tools wie Claude Code oder Copilot haben vollen Zugriff auf das Dateisystem. bx schützt mit einem einzigen Befehl alles ausser dem aktuellen Projektverzeichnis.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p class="img-wrapper"><img alt="Foto von Kanhaiya Sharma auf Unsplash" width="1684" height="575" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/0nwy5x8g1772fo0.jpg"></p><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">Inzwischen gibt es BX als Mac-App</p><p></p><p>Aus dem hier beschriebenen CLI-Tool ist eine eigene App mit Oberfläche geworden: <strong><a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/de/">BX</a></strong> startet Claude, Claude Code, Cursor und andere KI-Apps in einer Sandbox — und zeigt dabei, welche Ordner sie lesen und schreiben dürfen. Alles dazu unter <a rel="noopener" target="_blank" class="external" href="https://bx-ai.eu/de/">bx-ai.eu</a>.</p></div><a class="app-codeberg-badge" target="_blank" rel="noopener" href="https://codeberg.org/holtwick/bx-mac"><span class="app-codeberg-badge-left"> Codeberg </span><span class="app-codeberg-badge-right">holtwick/bx-mac</span></a> <a class="app-github-badge" target="_blank" rel="noopener" href="https://github.com/holtwick/bx-mac"><span class="app-github-badge-left"> GitHub </span><span class="app-github-badge-right">holtwick/bx-mac</span></a><p>Wer heute mit KI-gestützten Coding-Tools arbeitet — sei es Claude Code, Copilot oder Cursor — gewöhnt sich schnell an den Produktivitätsschub. Was dabei gerne übersehen wird: Diese Tools haben vollen Zugriff auf das gesamte Dateisystem. Jeder Befehl, den die KI ausführt, läuft mit denselben Rechten wie der Nutzer selbst.</p><p>Das mag bei einem Hobbyprojekt egal sein. Aber wer Kundendaten verarbeitet, Lizenzschlüssel auf der Platte hat, SSH-Keys für Produktionsserver oder schlicht private Fotos im Home-Verzeichnis — der bekommt irgendwann ein mulmiges Gefühl.</p><h2 id="die-vorhandenen-optionen" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#die-vorhandenen-optionen">Die vorhandenen Optionen</a></h2><p>Natürlich gibt es Möglichkeiten, sich abzusichern:</p><p><strong>Docker-Container</strong> bieten gute Isolation, aber sie sind für den typischen macOS-Entwicklungsalltag sperrig. Man muss Volumes mounten, IDE-Integration konfigurieren, und der Workflow fühlt sich nie ganz nativ an.</p><p><strong>Claudes eingebaute Beschränkungen</strong> — das Tool fragt brav nach, bevor es Dateien ändert. Aber “nachfragen” ist kein Schutz. Eine halluzinierte Pfadangabe, ein falsch interpretierter Befehl, und schon liest die KI etwas, das sie nicht sehen sollte. Das Vertrauen basiert auf dem Verhalten des Modells, nicht auf einer technischen Barriere.</p><p><strong>VSCode Workspace Trust</strong> schützt vor automatischer Code-Ausführung, aber nicht vor dem Dateisystem-Zugriff eines Terminals oder einer Extension.</p><p>Keine dieser Lösungen hat mich wirklich überzeugt.</p><h2 id="die-idee%3A-macos-sandbox-nutzen" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#die-idee%3A-macos-sandbox-nutzen">Die Idee: macOS Sandbox nutzen</a></h2><p>macOS bringt mit <code>sandbox-exec</code> eine Kernel-Level-Sandbox mit, die Apple selbst für App-Store-Apps verwendet. Die Idee: Ein Tool, das eine beliebige Anwendung so startet, dass sie nur das aktuelle Projektverzeichnis sehen kann — und sonst nichts.</p><p>Das Ergebnis ist <strong>bx</strong>. Ein CLI-Tool, das man vor den eigentlichen Befehl setzt:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-bash"><span class="line"><span style="color:#6f42c1">bx</span><span style="color:#032f62"> claude</span><span style="color:#032f62"> ~/work/my-project</span></span></code></pre><p>Das war’s. Claude Code startet, hat vollen Zugriff auf <code>~/work/my-project</code> — aber <code>~/Documents</code>, <code>~/Desktop</code>, <code>~/.ssh</code>, andere Projekte und alles andere im Home-Verzeichnis ist unsichtbar.</p><h2 id="in-zwei-tagen-gebaut-%E2%80%94-mit-claude-code-selbst" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#in-zwei-tagen-gebaut-%E2%80%94-mit-claude-code-selbst">In zwei Tagen gebaut — mit Claude Code selbst</a></h2><p>Das Ironische: bx wurde komplett mit dem Tool entwickelt, vor dem es schützen soll. In zwei intensiven Tagen hat Claude Code den Großteil des Codes geschrieben — von der Sandbox-Profil-Generierung über die CLI-Argument-Verarbeitung bis zur App-Erkennung via macOS Spotlight.</p><p>Das hat erstaunlich gut funktioniert. Claude kannte die (undokumentierte!) Apple Sandbox Profile Language und konnte die Eigenheiten korrekt umsetzen — etwa die Tatsache, dass <code>deny</code>-Regeln in SBPL immer Vorrang vor <code>allow</code>-Regeln haben, unabhängig von der Reihenfolge. Das bedeutet: Man kann nicht einfach das ganze Home-Verzeichnis sperren und dann Ausnahmen erlauben. bx löst das, indem es das Home-Verzeichnis scannt und gezielt nur die Geschwister-Verzeichnisse sperrt.</p><h2 id="mehr-als-nur-claude-code" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#mehr-als-nur-claude-code">Mehr als nur Claude Code</a></h2><p>bx beschränkt sich nicht auf ein Tool. Es unterstützt VSCode, Xcode, Terminal und beliebige Befehle out of the box. Über eine TOML-Konfigurationsdatei lässt sich jede App hinzufügen:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-toml"><span class="line"><span style="color:#24292e">[</span><span style="color:#6f42c1">apps</span><span style="color:#24292e">.</span><span style="color:#6f42c1">cursor</span><span style="color:#24292e">]</span></span>
<span class="line"><span style="color:#24292e">bundle = </span><span style="color:#032f62">&quot;com.todesktop.230313mzl4w4u92&quot;</span></span>
<span class="line"><span style="color:#24292e">binary = </span><span style="color:#032f62">&quot;Contents/MacOS/Cursor&quot;</span></span></code></pre><p>Das Tool findet die App automatisch über die macOS Bundle-ID — kein Hardcoden von Pfaden nötig. Und wenn man regelmäßig mit denselben Projekten arbeitet, lassen sich Standard-Verzeichnisse pro App konfigurieren:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-toml"><span class="line"><span style="color:#24292e">[</span><span style="color:#6f42c1">apps</span><span style="color:#24292e">.</span><span style="color:#6f42c1">code</span><span style="color:#24292e">]</span></span>
<span class="line"><span style="color:#24292e">workdirs = [</span><span style="color:#032f62">&quot;~/work/project-a&quot;</span><span style="color:#24292e">, </span><span style="color:#032f62">&quot;~/work/shared-lib&quot;</span><span style="color:#24292e">]</span></span></code></pre><p>Ein einfaches <code>bx code</code> öffnet dann VSCode mit genau diesen Verzeichnissen — sandboxed.</p><h2 id="feingranulare-kontrolle" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#feingranulare-kontrolle">Feingranulare Kontrolle</a></h2><p>Was bx besonders praktisch macht: Man kann auch innerhalb eines erlaubten Projektverzeichnisses Dateien verstecken. Eine <code>.bxignore</code>-Datei im Projekt funktioniert wie <code>.gitignore</code>:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-text"><span class="line"><span>.env</span></span>
<span class="line"><span>.env.*</span></span>
<span class="line"><span>*.pem</span></span>
<span class="line"><span>secrets/</span></span></code></pre><p>So bleiben Umgebungsvariablen und Zertifikate unsichtbar, selbst wenn das Projektverzeichnis voll zugänglich ist.</p><p>Mit <code>bx --dry</code> kann man sich vorab anzeigen lassen, was genau geschützt wird — ohne etwas zu starten. Das gibt ein gutes Gefühl für die tatsächliche Abschottung.</p><h2 id="die-wachsende-angriffsfl%C3%A4che" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#die-wachsende-angriffsfl%C3%A4che">Die wachsende Angriffsfläche</a></h2><p>Was viele unterschätzen: Moderne KI-Coding-Tools sind längst nicht mehr nur Chat-Interfaces. Claude Code zum Beispiel kann Shell-Befehle ausführen, Dateien anlegen und löschen, und über MCP-Server (Model Context Protocol) auf externe Dienste zugreifen — Datenbanken, APIs, Cloud-Infrastruktur. Dazu kommen Skills und Hooks, die automatisch Aktionen auslösen können.</p><p>Das alles passiert im Kontext des Nutzers, mit dessen vollen Berechtigungen. Die Sandbox von bx greift hier auf Kernel-Ebene: Egal ob ein <code>rm</code>-Befehl, ein MCP-Tool oder ein automatischer Hook auf <code>~/Documents</code> zugreifen will — das Betriebssystem blockt den Zugriff, bevor er überhaupt stattfindet. Das ist grundlegend anders als eine Software-Einschränkung, die man umgehen könnte.</p><p>Wichtig dabei: Innerhalb des freigegebenen Projektverzeichnisses ist alles erlaubt — das ist gewollt, sonst könnte man nicht arbeiten. Wer dort sensible Dateien hat, kann sie per <code>.bxignore</code> gezielt ausschließen.</p><h2 id="ehrlich-bleiben" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#ehrlich-bleiben">Ehrlich bleiben</a></h2><p>bx ist kein Hochsicherheitstresor. <code>sandbox-exec</code> ist eine undokumentierte Apple-API, die sich mit jedem macOS-Update ändern könnte. Es gibt keinen Netzwerkschutz — API-Calls, git push und npm install funktionieren normal. Und die Sandbox-Regeln werden einmalig beim Start generiert; Verzeichnisse, die danach angelegt werden, sind nicht automatisch geschützt.</p><p>Aber als pragmatische Sicherheitsebene für den Entwicklungsalltag funktioniert es hervorragend. Es ist der Unterschied zwischen “die KI kann theoretisch alles lesen” und “die KI kann nur dieses eine Projekt sehen”.</p><p>Trotzdem, ganz klar: bx ist nach bestem Wissen und Gewissen entwickelt, aber es kommt ohne Garantie. Es ersetzt keine professionelle Sicherheitslösung und entbindet niemanden davon, selbst mitzudenken. Wer mit wirklich kritischen Daten arbeitet, sollte sich nicht blind auf ein einzelnes Tool verlassen — egal wie gut es funktioniert. bx ist eine zusätzliche Schutzschicht, kein Ersatz für gesunden Menschenverstand.</p><h2 id="ausprobieren" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/bx-sandbox#ausprobieren">Ausprobieren</a></h2><p>bx lässt sich über Homebrew oder npm installieren:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-bash"><span class="line"><span style="color:#6f42c1">brew</span><span style="color:#032f62"> install</span><span style="color:#032f62"> holtwick/tap/bx</span></span>
<span class="line"><span style="color:#6a737d"># oder</span></span>
<span class="line"><span style="color:#6f42c1">npm</span><span style="color:#032f62"> install</span><span style="color:#005cc5"> -g</span><span style="color:#032f62"> bx-mac</span></span></code></pre><p>Der Code ist Open Source: <a class="app-codeberg-badge" target="_blank" rel="noopener" href="https://codeberg.org/holtwick/bx-mac"><span class="app-codeberg-badge-left"> Codeberg </span><span class="app-codeberg-badge-right">holtwick/bx-mac</span></a> <a class="app-github-badge" target="_blank" rel="noopener" href="https://github.com/holtwick/bx-mac"><span class="app-github-badge-left"> GitHub </span><span class="app-github-badge-right">holtwick/bx-mac</span></a></p><p>Ich freue mich über Feedback, Feature-Wünsche und natürlich Sterne. Und wenn ihr spannende Anwendungsfälle habt — schreibt mir gerne!</p><hr><p><em>Dieser Blogpost wurde von Claude (Anthropics KI) verfasst und von mir gegengelesen und freigegeben. Passend zum Thema, würde ich sagen.</em></p></div><p><em>Veröffentlicht am 29. März 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[EU-Förderung für Open-Source-Software durch eine leistungsbasierte Plattform]]></title>
            <link>https://holtwick.de/de/blog/eu-opensource</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/eu-opensource</guid>
            <pubDate>Mon, 02 Feb 2026 07:00:00 GMT</pubDate>
            <description><![CDATA[Vorschlag für eine EU-Plattform, die Open-Source-Projekte nach messbaren Kriterien fördert, mit Vorteilen für Entwickler, EU und Gesellschaft.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">Info</p><p>Die EU bittet um <a rel="noopener" target="_blank" class="external" href="https://netzpolitik.org/2026/konsultation-eu-kommission-arbeitet-an-neuer-open-source-strategie/">Feedback zur Open-Source-Strategie</a>. Im folgenden mein Vorschlag. Feedback gerne via <a rel="noopener" target="_blank" class="external" href="https://mastodon.social/@holtwick">Mastodon</a>.</p></div><h2 id="ausgangssituation" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/eu-opensource#ausgangssituation">Ausgangssituation</a></h2><p>Als Softwareentwickler stehe ich vor einem grundlegenden Dilemma: Die Entwicklung qualitativ hochwertiger Open-Source-Software – wie meiner Ende-zu-Ende-verschlüsselten Videokonferenzlösung <a rel="noopener" target="_blank" class="external" href="https://brie.fi/ng">Briefing</a> – erfordert erhebliche Zeit- und Kapitalinvestitionen. Ohne nachhaltige Finanzierung bleibt mir nur der Weg der kommerziellen Verwertung, obwohl ich die Software lieber vollständig frei zur Verfügung stellen und intensiv weiterentwickeln würde. Dieses Problem betrifft zahlreiche Entwickler in Europa.</p><h2 id="kernidee" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/eu-opensource#kernidee">Kernidee</a></h2><p>Die EU sollte ein dauerhaftes Finanzierungssystem etablieren, das Open-Source-Entwicklung durch leistungsbasierte Vergütung fördert. Konkret schlage ich eine EU-betriebene Plattform vor (vergleichbar mit GitHub oder Codeberg.org), die Fördergelder anhand messbarer Erfolgskriterien verteilt.</p><h2 id="funktionsweise" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/eu-opensource#funktionsweise">Funktionsweise</a></h2><p>Die Plattform würde den Nutzen und die Qualität von Projekten durch objektive Metriken bewerten:</p><ul><li>Community-Engagement (Bewertungen, Sterne)</li><li>Technische Reichweite (Integration in andere Projekte, Downloads)</li><li>Wartungsqualität (Beantwortung von Issues, Behebung von Bugs)</li><li>Dokumentation und Support</li></ul><p>Fördergelder würden anteilig ausgeschüttet, wobei Obergrenzen pro Projekt / Person Missbrauch vorbeugen.</p><h2 id="vorteile-f%C3%BCr-alle-beteiligten" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/eu-opensource#vorteile-f%C3%BCr-alle-beteiligten">Vorteile für alle Beteiligten</a></h2><ul><li><em>Für Entwickler</em>: Direkte Verbindung zwischen Leistung und Vergütung; Möglichkeit, sich vollständig auf quelloffene Entwicklung zu konzentrieren</li><li><em>Für die EU</em>: Aufbau digitaler Souveränität; Kontrolle über Qualitätsstandards (z.B. EUPL-Lizenzierung, Entwickler-Verifizierung); Förderung europäischer Innovation; Reduktion der Abhängigkeit von außereuropäischen Plattformen</li><li><em>Für die Gesellschaft</em>: Zugang zu sicherer, transparenter Software; Stärkung des europäischen Tech-Ökosystems</li></ul><h2 id="fazit" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/eu-opensource#fazit">Fazit</a></h2><p>Diese Initiative würde systematische Anreize für die Entwicklung hochwertiger Open-Source-Software schaffen und gleichzeitig europäische Werte wie Transparenz, Datenschutz und digitale Souveränität fördern.</p></div><p><em>Veröffentlicht am 2. Februar 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Receipts Space 3.0]]></title>
            <link>https://holtwick.de/de/blog/receipts3</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/receipts3</guid>
            <pubDate>Wed, 21 Jan 2026 07:00:00 GMT</pubDate>
            <description><![CDATA[Receipts Space 3.0 bringt Revisionskonformität, Ende-zu-Ende-Verschlüsselung, ein neues Dashboard und viele Workflow-Verbesserungen.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Receipts Space 3.0 ist da – ein großes Update mit vielen Neuerungen. Hier ein kurzer Überblick.</p><a target="_blank" href="https://video.holtwick.de/w/aKxTH1BCVffgCj3gpggiB1">https://video.holtwick.de/w/aKxTH1BCVffgCj3gpggiB1</a><h2 id="revisionskonformit%C3%A4t-(gobd)" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3#revisionskonformit%C3%A4t-(gobd)">Revisionskonformität (GoBD)</a></h2><p>Für alle, die ihre Belege ordnungsgemäß aufbewahren müssen, gibt es jetzt einen dedizierten Modus. Bestätigte Einträge werden schreibgeschützt, alle Änderungen werden protokolliert. Eine Verlaufs-Zeitleiste zeigt auf einen Blick, wer wann was geändert hat.</p><h2 id="ende-zu-ende-verschl%C3%BCsselung" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3#ende-zu-ende-verschl%C3%BCsselung">Ende-zu-Ende-Verschlüsselung</a></h2><p>Wer seine Bibliothek in der Cloud oder auf einem USB-Stick ablegt, kann sie jetzt mit einem Passwort verschlüsseln. Die Synchronisation zwischen mehreren Macs funktioniert weiterhin – solange alle Geräte den Schlüssel kennen.</p><h2 id="neues-dashboard" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3#neues-dashboard">Neues Dashboard</a></h2><p>Das Dashboard wurde komplett überarbeitet. Neben Einnahmen und Ausgaben zeigt es jetzt auch offene Beträge und Trends im Vergleich zum Vorjahr. Ein Klick auf Kontakte, Kategorien oder Tags filtert die Ansicht.</p><p class="img-wrapper"><img alt width="1744" height="1132" fetchpriority="high" decoding="async" data-zoom class="img-zoom" data-zoom-width="3488" data-zoom-height="2264" src="https://holtwick.de/assets/mqaruok82ul21u.png"></p><h2 id="ordner-statt-package" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/receipts3#ordner-statt-package">Ordner statt Package</a></h2><p>Das Dateiformat wurde um eine Option erweitert: Die Bibliothek kann jetzt auch als normaler Ordner gespeichert werden. Das löst Synchronisationsprobleme mit iCloud und anderen Diensten.</p><p>Natürlich gibt es noch viele weitere Änderungen. Alle Details gibt es auf <a rel="noopener" target="_blank" class="external" href="https://receipts-app.com/de/blog/release-3">receipts-app.com</a>.</p></div><p><em>Veröffentlicht am 21. Januar 2026</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[UnplugTrump]]></title>
            <link>https://holtwick.de/de/blog/unplug-trump</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/unplug-trump</guid>
            <pubDate>Tue, 11 Mar 2025 07:00:00 GMT</pubDate>
            <description><![CDATA[UnplugTrump: Wie kann man sich von US-Diensten unabhängig machen, insbesondere in Zeiten von Donald Trump. Zentrale Punkte sind Selfhosting, Dezentralität und OpenSource.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Was für verrückte Zeiten, in denen wir leben, und nun wird alles noch absurder mit dem amerikanischen Präsidenten Trump. Nicht nur in der großen Politik sollte das Ziel jetzt heißen, unabhängig von den USA zu werden und die EU zu stärken. Nein, auch im Privaten lässt sich da einiges machen, und ich möchte in einer kleinen Serie nach und nach Alternativen für US-Dienste und Produkte vorstellen.</p><p>Schon 2020 hatte ich in meinem Artikel <a href="https://holtwick.de/de/blog/it-strategy-for-europe">“Eine IT-Strategie für Europa”</a> versucht zu skizzieren, wie ich mir so einen Schritt in die digitale Souveränität in groben Zügen aussehen könnte. Es passiert in dieser Hinsicht nicht besonders viel.</p><p>Folgende Kriterien möchte ich anbieten, um Unabhängigkeit und Zuverlässigkeit zu erreichen:</p><ul><li><strong>Selfhosting</strong> → Betreibe deine Dienste selbst, dann kann sie niemand abschalten und die Daten gehören dir.</li><li><strong>Dezentral</strong> → Ein verteiltes System ist weniger anfällig für Ausfälle und Zensur.</li><li><strong>Open Source</strong> → Die Software kann so nicht verschwinden und ist überprüfbar.</li></ul><p><img alt width="775" height="434" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/l0xwi0281x0e78m.jpg"><em>Image by <a rel="noopener" target="_blank" class="external" href="https://chat.mistral.ai/chat/93944700-3a0c-4d90-a1a6-c42c5462064e">mistral.ai</a></em></p><h2 id="selfhosting" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/unplug-trump#selfhosting">Selfhosting</a></h2><p>Es ist so schön bequem, die Dienste der großen Anbieter wie Google, Microsoft oder Apple zu nutzen, aber meistens zahlt man mit seinen persönlichen Daten. Auch Dienste wie Apple können schnell ihre datenschutzfreundliche Haltung ändern, Anzeichen gibt es bereits und die Geschichte vergleichbarer Dienste lässt das Vertrauen schrumpfen.</p><h3 id="heimnetz" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/unplug-trump#heimnetz">Heimnetz</a></h3><p>Leider ist das Betreiben eigener Server nichts für jedermann, aber es ist weniger kompliziert als vielleicht befürchtet. Man kann damit zu Hause beginnen mit einer <a rel="noopener" target="_blank" class="external" href="https://en.wikipedia.org/wiki/Network-attached_storage"><strong>NAS</strong></a>. Bei mir steht eine <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Synology">Synology</a> (Taiwan). Diese kommt schon mit vielen Diensten in guter Qualität, die das Wesentliche abdecken. Aber eigentlich kann es jeder Rechner sein, Hauptsache <strong><a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Docker_(Software)">Docker</a></strong> lässt sich darauf betreiben.</p><p><strong>Docker</strong> ist der Schlüssel zum wirklich einfachen und sicheren Betrieb von “self-hosted services”. Es gibt eine schier <a rel="noopener" target="_blank" class="external" href="https://github.com/awesome-selfhosted/awesome-selfhosted">unendliche Menge von Lösungen</a> für jedes Problem.</p><p>Ich betreibe auf meiner Synology z.B. <a rel="noopener" target="_blank" class="external" href="https://www.home-assistant.io/"><strong>Home Assistant</strong></a> (Open Source), das Dashboard für alle Geräte und Sensoren im eigenen Haus, die irgendwie im Netzwerk sind. Für Fotos verwende ich <a rel="noopener" target="_blank" class="external" href="https://immich.app/"><strong>Immich</strong></a> (Open Source), das sich mit seinen Features auch nicht verstecken muss. Über eine <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Virtual_Private_Network">VPN-Verbindung</a> - bei mir ist es WireGuard über eine fritz.box - lassen sich alle Dienste auch von unterwegs nutzen.</p><h3 id="internet" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/unplug-trump#internet">Internet</a></h3><p>Aber auch der Betrieb eines Docker Dienstes im Internet ist kein Hexenwerk. Bei <a rel="noopener" target="_blank" class="external" href="https://hetzner.cloud/?ref=thK9VpOJK5Sg">Hetzner</a> (Empfehlungs-Link) lässt sich z. B. für unter 5 EUR ein virtueller Server erstellen und direkt fertig mit Docker aufsetzen. <a rel="noopener" target="_blank" class="external" href="https://github.com/holtwick/selfhosted?tab=readme-ov-file#selfhosted">Nach ein paar Vorbereitungen</a>, um die eigene Domain mit der IP zu verbinden, kann es schon losgehen.</p><p>Ich betreibe viele Dienste dort, privat nutze ich hauptsächlich <a rel="noopener" target="_blank" class="external" href="https://nextcloud.com/"><strong>nextCloud</strong></a>. Das ist an einigen Stellen etwas altbacken, aber erfüllt seinen Zweck für Dateiaustausch und andere Dinge, die man z. B. aus der iCloud kennt.</p><h2 id="dezentral" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/unplug-trump#dezentral">Dezentral</a></h2><p>Den berühmtesten dezentralen Dienst des Internets nutzen alle: E-Mail. Eigentlich ist die ganze Magie des Internets sein dezentraler Aufbau. Fällt irgendwo was aus, sucht sich die Information einen anderen Weg, so wie bei Ameisenstraßen.</p><p>Große Anbieter sind meistens zentral aufgebaut. Klar, im Hintergrund wird auch versucht die Last aufzuteilen, aber trotzdem sind diese Dienste schon rein technisch anfällig für Störungen, Datenverlust und Sicherheitslücken.</p><p>Umso schöner, dass es nun wieder mehr “föderierte” Dienste gibt. In letzter Zeit ist besonders <a rel="noopener" target="_blank" class="external" href="https://joinmastodon.org/"><strong>Mastodon</strong></a> als Twitter /X-Alternative bekannt geworden. Aber in diesem sogenannten <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Fediverse">Fediverse</a> entstehen auch weitere Lösungen, die dann auch miteinander in Verbindung treten können. Ein gutes Beispiel dafür ist der YouTube-Ersatz <a rel="noopener" target="_blank" class="external" href="https://joinpeertube.org/de/"><strong>PeerTube</strong></a>.</p><p>Aber es gibt noch andere Formen der dezentralen Datenverarbeitung. Eine Bewegung, die mir besonders gefällt, nennt sich <a rel="noopener" target="_blank" class="external" href="https://www.localfirstconf.com/"><strong>Local First</strong></a>, dabei wird wieder Wert darauf gelegt, dass die Daten auch lokal verfügbar sind. Dieselben Daten an verschiedenen physischen Orten zu lagern, ist auch eine Form von dezentraler Struktur. Das Paradebeispiel dafür sind Versionierungssystem wie <a rel="noopener" target="_blank" class="external" href="https://git-scm.com/"><strong>git</strong></a>.</p><h2 id="opensource" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/unplug-trump#opensource">OpenSource</a></h2><p>Freie und offene Software ist der Grundstein für tieferes Vertrauen. Erstens ist offene Software nicht so schnell “aus der Welt”, sie existiert tausendmal kopiert. Zweitens kann man sich mit etwas Sachverstand ansehen, was die Software eigentlich genau macht. Und drittens lässt es sich anpassen, wodurch wiederum zum Projekt beigetragen wird. Quasi eine digitale Form von ehrenamtlicher Arbeit, ohne dafür in einen Verein zu müssen ;)</p><h2 id="weiterf%C3%BChrende-links" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/unplug-trump#weiterf%C3%BChrende-links">Weiterführende Links</a></h2><ul><li>Kuketz Blog zum selben Thema mit interessanten Links und Hinweisen:<br><a rel="noopener" target="_blank" class="external" href="https://www.kuketz-blog.de/unplugtrump-mach-dich-digital-unabhaengig-von-trump-und-big-tech/">https://www.kuketz-blog.de/unplugtrump-mach-dich-digital-unabhaengig-von-trump-und-big-tech/</a></li><li>Verzeichnis europäischer Alternativen:<br><a rel="noopener" target="_blank" class="external" href="https://european-alternatives.eu/">https://european-alternatives.eu</a></li><li>Allgemeine Suche nach Alternativen:<br><a rel="noopener" target="_blank" class="external" href="https://alternativeto.net/">https://alternativeto.net</a></li><li>Viele vorinstallierte Selfhosted-Projekte, gut zum ausprobieren:<br><a rel="noopener" target="_blank" class="external" href="https://adminforge.de/">https://adminforge.de</a></li></ul></div><p><em>Veröffentlicht am 11. März 2025</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[E-Invoice Space]]></title>
            <link>https://holtwick.de/de/blog/einvoice-space</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/einvoice-space</guid>
            <pubDate>Wed, 29 Jan 2025 07:00:00 GMT</pubDate>
            <description><![CDATA[Digitalisiere deine Rechnungen mit E-Invoice Space. Erstelle und konvertiere EN 16931-konforme E-Rechnungen direkt im Browser. Kostenlose PDF zu XML Konvertierung.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Nach dem erfolgreichen Start von <strong>XML2Invoice</strong> sind viele neue Features und Verbesserungen hinzugekommen, so dass nun die Umbenennung in <a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/?ref=holtwick"><strong>E-Invoice Space</strong></a> erfolgt.</p><h2 id="neues-layout" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/einvoice-space#neues-layout">Neues Layout</a></h2><p>Der Raum wird nun sinnvoller genutzt, indem nur noch zwischen der PDF-Vorschau und dem Eingabebereich unterschieden wird. Außerdem ist eine Anpassung der Größenverhältnisse zwischen den beiden Bereichen möglich. Es gibt nun eine übergeordnete Aufteilung zwischen <strong>Lesen</strong> und <strong>Schreiben</strong>, um die Stärken von <a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/?ref=holtwick"><strong>E-Invoice Space</strong></a> besser hervorzuheben und den Zugang zu den Funktionen zu vereinfachen.</p><h2 id="eigene-rechnungen-erstellen" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/einvoice-space#eigene-rechnungen-erstellen">Eigene Rechnungen erstellen</a></h2><p>Im Bereich <strong>Schreiben</strong> kann neben der Anreicherung eines bestehenden einfachen PDFs mit E-Rechnungsdaten nun auch eine komplett neue Rechnung erstellt werden. Alle notwendigen Daten können komfortabel eingegeben werden und eine Vorschau wird sofort generiert. In der PRO-Version ist zusätzlich die Auswahl eines individuellen Hintergrunddesigns (Briefpapier) sowie der Upload eigener Schriften im TTF-Format möglich.</p><h2 id="en-16931-kompatibilit%C3%A4t" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/einvoice-space#en-16931-kompatibilit%C3%A4t">EN 16931 Kompatibilität</a></h2><p><a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/?ref=holtwick"><strong>E-Invoice Space</strong></a> erfüllt nun auch die Anforderungen der EN 16931 Norm, nicht nur BASIC und MINIMAL wie bisher.</p><p>Insgesamt ist die Anwendung umfangreicher und benutzerfreundlicher geworden, was schnelle Ergebnisse ermöglicht. Wie gewohnt findet alles lokal statt, so dass sich die Webanwendung wie eine lokal installierte Anwendung verhält. Es werden keine Daten gespeichert oder in einen Cloud-Dienst übertragen.</p></div><p><em>Veröffentlicht am 29. Januar 2025</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Schreibe deine erste E-Rechnung ...]]></title>
            <link>https://holtwick.de/de/blog/einvoice</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/einvoice</guid>
            <pubDate>Mon, 06 Jan 2025 07:00:00 GMT</pubDate>
            <description><![CDATA[Wandle PDF-Rechnungen sofort in E-Rechnungen um. Erstelle EN 16931, XRechnung und ZUGFeRD-konforme elektronische Rechnungen online. Kostenloses Tool für KMU und Freelancer.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p><img alt class="img-right" width="533" height="800" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/dwp75m1o10jr3lk.jpeg">… mit unserem neuen <a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/?ref=holtwick">Schweizer Taschenmesser für E-Rechnungen</a>. Nach dem letzten Update können E-Rechnungen jetzt einfach online erstellt werden. Sogar mit eigenem Briefpapier und Schriften. Das Ergebnis ist ein PDF, das mit allen erforderlichen Standards kompatibel ist, darunter EN 16931, XRechnung, ZUGFeRD und PDF/A.</p><p>Der Clou: Rechnungen, die bisher mit Word oder ähnlichen Programmen erstellt wurden, lassen sich im Handumdrehen in eine E-Rechnung umwandeln. Einfach das PDF der bestehenden Rechnung hochladen, die Werte werden wie von Zauberhand ausgelesen und heraus kommt wieder eine standardkonforme E-Rechnung im ZUGFeRD-Format. Das bedeutet, dass die elektronischen Daten als XML in das PDF eingebettet wurden und auch die anderen technischen Anforderungen erfüllt sind.</p><p>Das Ergebnis kann schnell gespeichert und versendet werden. Aber auch in unserem Mac-Tool <a rel="noopener" target="_blank" class="external" href="https://receipts-app.com/?ref=holtwick">Receipts</a>.</p><p>Aber das ist noch nicht alles. Empfangene E-Rechnungen, egal ob XML oder PDF, einfach in das Fenster von XML2Invoice ziehen und schon ist alles lesbar und bereit zur Zahlung oder Weiterverarbeitung.</p><p><em>Wie gesagt, das Schweizer Taschenmesser der E-Rechnung</em> 😎</p><p class="action"><a class="button oui-button external" target="_blank" rel="noopener noreferrer" href="https://e-invoice.space/?ref=holtwick">Schreibe jetzt deine erste E-Rechnung!</a></p><p><strong>Update 2025-01-29:</strong> XML2Invoice heißt nun <a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/">E-Invoice Space</a></p></div><p><em>Veröffentlicht am 6. Januar 2025</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[XML2Invoice]]></title>
            <link>https://holtwick.de/de/blog/xml2invoice</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/xml2invoice</guid>
            <pubDate>Wed, 30 Oct 2024 07:00:00 GMT</pubDate>
            <description><![CDATA[E-Rechnungen:Einfach umwandeln und bezahlen. Existierendes PDF wird maschinenlesbar, XML-Rechnung wird menschenlesbar]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p><strong>Sorge vor E-Rechungen? Mit XML2invoice kannst du entspannt ins Neues Jahr starten…</strong></p><p class="img-wrapper"><img alt width="2736" height="1824" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/ld44m5h1twywwl.jpeg"></p><p><a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/"><strong>XML2Invoice</strong></a> ist eine webbasierte App, die deine “normale” PDF-Rechnung ins XML-Format umwandelt: Entweder in eine reine <strong>XML-Datei</strong> oder in eine <strong>ZUGFeRD</strong>-PDF-Datei, die genau wie deine Rechnung aussieht und in die die vorgeschriebenen XML-Daten eingebettet sind.</p><p>Und auch andersrum funktioniert’s: <a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/"><strong>XML2Invoice</strong></a> erzeugt aus von Menschen nicht mehr lesbaren XML-Dateien eine elektronisch lesbare Rechnung im <strong>ZUGFeRD-Format</strong>, die äußerlich wie eine übliche PDF-Rechnung aussieht, aber auch die XML-Daten enthält. Lesbar für Mensch und Maschine. Wenn gewünscht importierst du das PDF mit den eingebetteten XML-Daten per Mausklick <strong>in Receipts</strong>.</p><p class="action"><a class="button oui-button external" target="_blank" rel="noopener noreferrer" href="https://e-invoice.space/">Jetzt kostenlos starten auf xml2invoice.com !</a></p><p><strong>Update 2025-01-29:</strong> XML2Invoice heißt nun <a rel="noopener" target="_blank" class="external" href="https://e-invoice.space/">E-Invoice Space</a></p></div><p><em>Veröffentlicht am 30. Oktober 2024</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[PDFify 4.0]]></title>
            <link>https://holtwick.de/de/blog/pdfify4</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/pdfify4</guid>
            <pubDate>Thu, 12 Sep 2024 06:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade auf PDFify 4.0 für PDF/A-Unterstützung, Stapelkonvertierung, schnellere Webanzeige und standardisierte Seitengrößen. Testen Sie es jetzt!]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Ab sofort kann <a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a> auf die neueste Version 4.0 aktualisiert werden. Viele <a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a>-Nutzer freuen sich auf dieses größere Versionsupdate mit Verbesserungen und neuen Funktionen.</p><h2 id="pdf%2Fa-unterst%C3%BCtzung" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/pdfify4#pdf%2Fa-unterst%C3%BCtzung">PDF/A Unterstützung</a></h2><p>Viele <a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a>-User haben elektronische Dokumente, die sie langfristig archivieren müssen. <a rel="noopener" target="_blank" class="external" href="https://en.wikipedia.org/wiki/PDF/A">PDF/A</a> - Portable Document Format Archivable - ermöglicht eine standardisierte Langzeitarchivierung von Dokumenten. <a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a> bietet nun ab macOS 11 in den Einstellungen an, das Dokument standardmäßig als PDF/A abzuspeichern.</p><p class="img-wrapper"><img alt="Screenshot" width="596" height="527" fetchpriority="high" decoding="async" data-zoom class="img-zoom" data-zoom-width="1192" data-zoom-height="1054" src="https://holtwick.de/assets/bv2h2gqc12wxn6z.png"></p><p>Das “normale” PDF, welches Einbettung von Links, Grafiken, Audio- und Videodateien sowie optionale Verschlüsselung unterstützt, bleibt selbstverständlich in <a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a> erhalten.</p><h2 id="finder-extensions-%2F-quick-actions" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/pdfify4#finder-extensions-%2F-quick-actions">Finder Extensions / Quick Actions</a></h2><p>Um zügig mehrere bereits bestehende PDFs “im Stapel” in PDF/A umzuwandeln, lassen sich die Schnellaktionen in den Finder Extension um “in PDF/A umwandeln” ergänzen.</p><p>Ebenfalls gibt es eine neue Finder Extension zur Umwandlung von Dokumenten in eine PDF mit PDF/A Format. Aber auch die bestehenden Extensions erzeugen PDF/A, wenn die Option in den Einstellungen gesetzt wurde.</p><div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title">Andere Dateiformate</p><p>Nicht nur PDF lassen sich über die Finder Extensions optimieren, sondern auch Dokumente verschiedener Formate direkt in PDF umwandeln:</p><ul><li>Bilddatein und Scans wie JPG, PNG, TIF oder GIF.</li><li>HTML Dateien</li><li>E-Mails</li></ul></div><h2 id="schnellere-anzeige-der-pdfs-im-web" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/pdfify4#schnellere-anzeige-der-pdfs-im-web">Schnellere Anzeige der PDFs im Web</a></h2><p>Des Weiteren kann man nun auch, das linearisierte PDF, welches für die zügige Anzeige im Internet optimiert ist, auswählen. Die erste Seite wird dann beim Download bereits angezeigt, während die nachfolgenden Seiten noch geladen werden.</p><h2 id="standardisierte-maximale-seitengr%C3%B6%C3%9Fe" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/pdfify4#standardisierte-maximale-seitengr%C3%B6%C3%9Fe">Standardisierte maximale Seitengröße</a></h2><p><a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a> ermöglicht nun eine Begrenzung der maximalen Seitengröße, um im Ergebnis keine unschönen riesigen Seiten zu erhalten. Standardmäßig ist die Seitengröße mit dem Update auf DIN A4 eingestellt. In den Einstellungen kann man den Wert auf die Originalgröße oder US letter anpassen.</p><p class="img-wrapper"><img alt width="596" height="527" loading="lazy" decoding="async" data-zoom class="img-zoom" data-zoom-width="1192" data-zoom-height="1054" src="https://holtwick.de/assets/cyh6zane1m52rot.png"></p><h2 id="reihenfolge-beim-import" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/pdfify4#reihenfolge-beim-import">Reihenfolge beim Import</a></h2><p>Manchmal liegen die einzelnen Seiten eines Dokuments als separate Bilddateien vor. In der neuen Version von <a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick">PDFify</a> werden diese nun zuverlässig in der vom Apple Finder bekannten Sortierung importiert. So lassen sich schnell einzelne Scans von Seiten zu einem PDF Dokument zusammenführen.</p><p><a rel="noopener" target="_blank" class="external" href="https://pdfify.app/?ref=holtwick"><strong>Jetzt kostenlos ausprobieren</strong></a></p></div><p><em>Veröffentlicht am 12. September 2024</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Robuster Sync für Local First]]></title>
            <link>https://holtwick.de/de/blog/localfirst-resilient-sync</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/localfirst-resilient-sync</guid>
            <pubDate>Mon, 24 Jun 2024 06:00:00 GMT</pubDate>
            <description><![CDATA[Widerstandsfähiger Sync für LocalFirst Apps durch Nutzung bestehender Techniken wie Dateisystemen]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><div class="markdown-alert markdown-alert-success"><p class="markdown-alert-title">Update 2025-02-11</p><p>Mit <a rel="noopener" target="_blank" class="external" href="https://receipts-app.com/?ref=holtwick">Receipts Space</a> habe ich nun die erste App auf Basis der beschriebenen <a rel="noopener" target="_blank" class="external" href="https://receipts-app.com/docs?ref=holtwick">Technik</a> veröffentlicht. Sie hat sich bewährt und weitere werden folgen.</p></div><p>Als ich in den 80ern mit dem Programmieren begann, war die Situation einfach: Daten wurden in eine Datei auf einem lokalen Datenträger geschrieben. Sollten Dateien ausgetauscht werden, wurde eine Diskette einfach in einen anderen Computer geschoben und bearbeitet.</p><p>Später verschwanden die Disketten und CD-Laufwerke und Dateien wurden entweder per E-Mail ausgetauscht oder die Daten direkt auf einem Server gespeichert. Selbst Microsoft Word wanderte irgendwann in die Cloud.</p><p>Doch mit der Verlagerung der Daten vom lokalen Rechner in die Cloud entstanden neue Probleme. Was, wenn der Anbieter seinen Dienst schloss? Aber nicht nur Datenverlust, sondern auch das Gefangen sein beim Anbieter, weil die Daten nicht mehr aus dem Dienst herauszubekommen waren, entwickelte sich zunehmend zu einem Problem für die einen und ein Geschäftsmodell für die anderen.</p><h2 id="local-first" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#local-first">Local-First</a></h2><p>Die <a rel="noopener" target="_blank" class="external" href="https://localfirstweb.dev/">Local-First-Bewegung</a> möchte die Daten wieder zum Nutzer zurückbringen und trotzdem die Vorteile des Internets erhalten. Für das gleichzeitige Bearbeiten von Daten wurde mit <a rel="noopener" target="_blank" class="external" href="https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type">CRDT</a> in eine robuste und weithin akzeptierte Lösung gefunden, für den Austausch der Daten jedoch noch nicht. Denn ganz ohne Dienste auf einem Server geht es (noch) nicht. Selbst bei Peer-to-Peer, wo die Geräte überwiegend direkt miteinander kommunizieren, muss am Anfang die Verbindung vermittelt werden.</p><p>In einer idealen Local-First Welt sollten folgende Kriterien erfüllt sein in Bezug auf den Austausch der Daten:</p><ol><li>Daten werden lokal bearbeitet und gespeichert (Offline).</li><li>Der Sync kann für längere Zeit unterbrochen werden, Daten können jedoch währenddessen lokal bearbeitet werden und trotzdem nach erneutem Sync überall wieder identisch sein (CRDT).</li><li>Daten sollten unterwegs nicht einsehbar sein (E2EE).</li></ol><p>Und ich würde noch gerne hinzufügen:</p><ol start="4"><li>Das Ganze sollte auch mit der Technik der 80er Jahre funktionieren.</li></ol><p>Warum? Aus Gründen der Resilienz, denn es gibt viele Gründe, warum wir offline gehen könnten.</p><h2 id="resilient-sync" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#resilient-sync">Resilient Sync</a></h2><p>Aus diesem Grund schlage ich ein Datenaustauschformat vor, das sowohl im Dateisystem als auch im Internet funktioniert. Es soll so einfach sein, dass die Implementierung auf jedem zugrundeliegenden Datenträger oder Service funktionieren kann.</p><h3 id="log-der-%C3%A4nderungen" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#log-der-%C3%A4nderungen">Log der Änderungen</a></h3><p>Zunächst schreibt jeder Client eine Art einfaches, fortlaufendes Log mit den Änderungen. Die Position der Änderungen nennen wir <code>index</code> und sie beginnt bei <code>0</code> und wird in ganzen Zahlen fortgeführt: <code>0, 1, 2, 3, ...</code>. Üblicherweise sind diese Änderungen CRDT konform, aber das ist nicht erheblich für das Protokoll. Ebenso können diese Daten verschlüsselt abgelegt werden. Nennen wir diese Daten <code>data</code>.</p><p>Jeder Client erhält eine eindeutige Kennung, üblicherweise eine Unique ID (UUID), wir nennen sie <code>clientId</code>. Die Änderungs-Logs werden mit der <code>clientId</code> verbunden abgelegt. Eine Sammlung solcher Logs wollen wir <code>workspace</code> nennen.</p><p>Wir können weitere Daten anreichern, wie z. B. einen <code>timestamp</code>, was nützlich sein kann, wenn wir die Datenveränderungen historisch aufbereiten wollen oder eine Art endloses “Undo” implementieren wollen.</p><p>Auch ist es denkbar, dass jeder neue Eintrag einen Hash auf den vorherigen Eintrag enthält, um so eine Absicherung der Datenkonsistenz im Stile einer Blockchain zu erhalten. Weitere Verfeinerungen Richtung Merkle-Tree sind ebenfalls denkbar. Aber auch ein Hash auf den Inhalt des aktuellen Eintrags kann zur Datensicherheit beitragen.</p><h3 id="assets%2C-blobs%2C-die-gro%C3%9Fen-bin%C3%A4ren-brocken" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#assets%2C-blobs%2C-die-gro%C3%9Fen-bin%C3%A4ren-brocken">Assets, Blobs, die großen binären Brocken</a></h3><p>Zur Realität gehört auch, dass es größere Daten gibt, die sich selten verändern: Bilder, Videos, Audios, also Dateien. Diese gehören nicht zu den inhaltlichen Änderungen und würden einen Datenabgleich schnell ins Stocken bringen. Außerdem werden sie nicht immer sofort gebraucht und könnten auch “on demand” geladen werden. Daher schlage ich vor, diese Dateien getrennt von den Änderungen zu behandeln. Nennen wir sie <code>asset</code>.</p><p>Aber auch hier sollen die Daten nach <code>clientId</code> und in aufsteigender Reihenfolge mit <code>index</code> abgelegt werden. Die Datensätze können so auf ein Asset verweisen, z.B. mit einem Dateneintrag in Form einer URL, die alle notwendigen Informationen enthält: <code>asset:///&lt;clientId&gt;/&lt;index&gt;/&lt;filename&gt;?size=&lt;sizeInBytes&gt;&amp;type=&lt;mimeType&gt;&amp;hash=&lt;checksumOfContents&gt;</code>. Ein Beispiel könnte wie folgt aussehen <code>asset:///abc/1/test.txt?size=100&amp;type=text%2Fplain&amp;hash=1a2b3c</code>.</p><h3 id="vorteile" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#vorteile">Vorteile</a></h3><p>Der entscheidende Vorteil dieser Methode ist, dass wir immer wissen, wo die nächsten Daten auftauchen werden. Denn hat ein Client gerade den Index <code>123</code> geschrieben, wird der nächste <code>124</code> sein.</p><p>Warum ist das wichtig? Aus folgenden Gründen:</p><ol><li>Wir sind nicht darauf angewiesen, auf neue Daten hingewiesen zu werden (“push”), sondern können auch selber danach fragen (“pull”).</li><li>Wir können die einzelnen Einträge laden, auch ohne etwas über ihren Inhalt zu wissen. Ein Sync kann sogar ohne Zwischenstelle stattfinden, die die Daten “verstehen” muss.</li><li>Wir merken sofort, wenn Daten fehlen sollten und können diese nochmals anfordern.</li><li>Die Daten können beliebig oft repliziert werden, es muss nicht nur eine Sync-Quelle geben. Eine Nutzung als Backup ist somit sinnvoll.</li><li>Clients die keine direkte Verbindung zueinander haben, können durch “dumme Kopiervorgänge”.</li><li>Der Datenaustausch lässt sich einfach und verständlich dokumentieren, was wichtig sein kann bei der Anerkennung rechtssicher abgelegter Daten für Steuer und Compliance.</li><li>Es gibt keine Konflikte bei der Ablage der Daten, weil nur fortgeschrieben wird, aber nie gelöscht (“append only”).</li></ol><h3 id="datenbanken" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#datenbanken">Datenbanken</a></h3><p>Beginnen wir zunächst mit der Implementierung als Datenbank. Wie beschrieben, würde eine Tabelle mit folgenden Feldern reichen:</p><ul><li><code>index</code>: Integer</li><li><code>clientId</code>: String oder Integer</li><li><code>data</code>: String oder Binär</li><li><code>timestamp</code>: Integer (optional)</li><li><code>prevHash</code>: String oder Integer (optional)</li></ul><p>Für die Assets würde das ähnlich aussehen.</p><p>Bei Datenbank kann sowohl die lokale Ablage des Clients, z. B. in der IndexedDB, gemeint sein, als auch die auf einem Synchronisations-Server.</p><h3 id="dateisysteme" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#dateisysteme">Dateisysteme</a></h3><p>In einem Dateisystem werden die Daten in einem Verzeichnis abgelegt. Metadaten, wie der <code>clientId</code> des Erstellers und Angaben wie z. B. zur verwendeten Verschlüsselung, werden in einer JSON-Datei namens <code>index.json</code> abgelegt.<br>Des Weiteren gibt es für jeden Client ein Verzeichnis, das nach der <code>clientId</code> benannt ist.</p><p>In diesen wiederum befinden sich jeweils zwei Verzeichnisse:</p><ol><li><code>changes</code></li><li><code>assets</code></li></ol><p>In <code>changes</code> werden fortlaufend nummeriert die Änderungen erfasst. In <code>assets</code> dasselbe mit den beschriebenen Binärdaten.</p><p>Moderne Dateisysteme haben keine nennenswerten Beschränkungen der Anzahl der Dateien pro Directory, aber es kann nicht schaden, trotzdem die Anzahl zu begrenzen. Folgender Algorithmus in TypeScript sorgt für eine gleichmäßige Verteilung:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-ts"><span class="line"><span style="color:#6a737d">/**</span></span>
<span class="line"><span style="color:#6a737d"> * Distribute file, named by natural numbers, in a way that each folder only</span></span>
<span class="line"><span style="color:#6a737d"> * contains `maxEntriesPerFolder` subfolders or files. Returns a list of</span></span>
<span class="line"><span style="color:#6a737d"> * names, where the last one is the file name, all others are folder names.</span></span>
<span class="line"><span style="color:#6a737d"> * </span></span>
<span class="line"><span style="color:#6a737d"> * Example: `distributedFilePath(1003)` results in `[&apos;2&apos;, &apos;1&apos;, &apos;3&apos;]` which </span></span>
<span class="line"><span style="color:#6a737d"> * could be translated to the file path `2/1/3.json`.</span></span>
<span class="line"><span style="color:#6a737d"> */</span></span>
<span class="line"><span style="color:#d73a49">export</span><span style="color:#d73a49"> function</span><span style="color:#6f42c1"> distributedFilePath</span><span style="color:#24292e">(</span><span style="color:#e36209">index</span><span style="color:#d73a49">:</span><span style="color:#005cc5"> number</span><span style="color:#24292e">, </span><span style="color:#e36209">maxEntriesPerFolder</span><span style="color:#d73a49">:</span><span style="color:#005cc5"> number</span><span style="color:#d73a49"> =</span><span style="color:#005cc5"> 1000</span><span style="color:#24292e">)</span><span style="color:#d73a49">:</span><span style="color:#005cc5"> string</span><span style="color:#24292e">[] {</span></span>
<span class="line"><span style="color:#d73a49">  if</span><span style="color:#24292e"> (index </span><span style="color:#d73a49">&lt;</span><span style="color:#005cc5"> 0</span><span style="color:#24292e">)</span></span>
<span class="line"><span style="color:#d73a49">    throw</span><span style="color:#d73a49"> new</span><span style="color:#6f42c1"> Error</span><span style="color:#24292e">(</span><span style="color:#032f62">&apos;Only numbers &gt;= 0 supported&apos;</span><span style="color:#24292e">)</span></span>
<span class="line"><span style="color:#d73a49">  const</span><span style="color:#005cc5"> names</span><span style="color:#d73a49">:</span><span style="color:#005cc5"> string</span><span style="color:#24292e">[] </span><span style="color:#d73a49">=</span><span style="color:#24292e"> []</span></span>
<span class="line"><span style="color:#d73a49">  do</span><span style="color:#24292e"> {</span></span>
<span class="line"><span style="color:#24292e">    names.</span><span style="color:#6f42c1">unshift</span><span style="color:#24292e">((index </span><span style="color:#d73a49">%</span><span style="color:#24292e"> maxEntriesPerFolder).</span><span style="color:#6f42c1">toString</span><span style="color:#24292e">())</span></span>
<span class="line"><span style="color:#24292e">    index </span><span style="color:#d73a49">=</span><span style="color:#24292e"> Math.</span><span style="color:#6f42c1">floor</span><span style="color:#24292e">(index </span><span style="color:#d73a49">/</span><span style="color:#24292e"> maxEntriesPerFolder)</span></span>
<span class="line"><span style="color:#24292e">  } </span><span style="color:#d73a49">while</span><span style="color:#24292e"> (index </span><span style="color:#d73a49">&gt;</span><span style="color:#005cc5"> 0</span><span style="color:#24292e">)</span></span>
<span class="line"><span style="color:#24292e">  names.</span><span style="color:#6f42c1">unshift</span><span style="color:#24292e">(names.</span><span style="color:#005cc5">length</span><span style="color:#24292e">.</span><span style="color:#6f42c1">toString</span><span style="color:#24292e">())</span></span>
<span class="line"><span style="color:#d73a49">  return</span><span style="color:#24292e"> names</span></span>
<span class="line"><span style="color:#24292e">}</span></span></code></pre><p>Quelle: <a rel="noopener" target="_blank" class="external" href="https://github.com/holtwick/zeed/blob/master/src/common/data/distributed.ts">zeed Framework</a></p><h3 id="online-services-und-peer-to-peer" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#online-services-und-peer-to-peer">Online Services und Peer-To-Peer</a></h3><p>Für Online Services kann eine passende Mischung aus dem Datenbank- oder dem Dateisystem-Ansatz gewählt werden, je nachdem, was besser zu dem ausgewählten Service passt. Bei Dropbox oder WebDAV wäre das z. B. der Dateisystem-Ansatz. Bei Apple CloudKit eher der Datenbank-Ansatz.</p><p>Aber es ist auch ein einfacher eigener Service denkbar, mit einer REST, WebSocket oder anderen sinnvollen Schnittstellen.</p><p>Es spricht auch nichts gegen einen Abgleich der Daten via Peer-to-Peer oder einem anderen lokalen Kommunikationsweg. Die Daten sind ja identisch und so kann ein Abgleich mit anderen Clients jeweils über den schnelleren Weg durchgeführt werden. Die Redundanz ist also von Vorteil und macht die Sache nicht weiter kompliziert. Theoretisch ist bei CRDT auch die Reihenfolge und die Mehrfachanwendung der Änderungen unproblematisch.</p><h2 id="verfeinerungen" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#verfeinerungen">Verfeinerungen</a></h2><p>An einigen Stellen gibt es noch Potenzial zu Verbesserungen:</p><ul><li>Steuerung der Datengröße pro Log-Eintrag. Sammeln mehrerer Änderungen für größere Pakete oder Aufteilen einer Änderung in mehrere Pakete, falls der Umfang zu groß wird.</li><li>Komprimierung oder Zusammenfassung der Daten.</li><li>Bekanntmachung neuer Clients, z. B. durch spezielle Logeinträge. Evaluierung durch kryptografische Methoden.</li><li>Durch Hinzufügen einer logischen Uhr, wie der Lamport-Clock, können Einträge logisch sortiert werden und dadurch in die Chronologie eines Eintrages verbessert werden.</li><li>Das Schreiben der Daten in einer einzigen Datei pro Client aus Gründen der Ressourcen-Optimierung.</li><li>Durch geschickten Einsatz von kryptografischen Mitteln lässt sich evtl. sogar ein Rechte-Management implementieren (<a rel="noopener" target="_blank" class="external" href="https://schmiste.github.io/srds06.pdf">Cryptree</a>).</li></ul><h2 id="ausblick" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#ausblick">Ausblick</a></h2><p>Ich verwende diese Technik seit einigen Jahren in meinen Apps, wie z. B. in dem mittlerweile beendeten Projekt <a rel="noopener" target="_blank" class="external" href="https://onepile.apperdeck.com/en/help/internal-file-format">Onepile</a>. In Kürze sollen neue Projekte mit diesem Ansatz veröffentlicht werden.</p><p>Die Einfachheit und Flexibilität erscheinen mir die größten Pluspunkte bei diesem Ansatz zu sein. Dadurch sollte es auch zukunftssicher sein und sich schnell neuen technischen Gegebenheiten anpassen können.</p><p>Das folgende Diagramm stellt exemplarisch ein Ökosystem für eine Web-App dar:</p><p class="img-wrapper"><img alt width="2976" height="2536" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/ued9nzrc325q2v.png"></p><h2 id="related" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/localfirst-resilient-sync#related">Related</a></h2><ul><li><strong>Diskussion zum Artikel auf <a rel="noopener" target="_blank" class="external" href="https://news.ycombinator.com/item?id=40772955">HackerNews</a></strong></li><li><a rel="noopener" target="_blank" class="external" href="https://www.youtube.com/watch?v=NMq0vncHJvU&amp;t=2s">Martin Kleppmanns Talk auf der Local-First Conference 2024 in Berlin</a></li><li><a rel="noopener" target="_blank" class="external" href="https://elk.zone/mastodon.social/@martin@nondeterministic.computer/112639441984059657">Mastodon Beitrag von Martin Kleppmann</a></li><li>Liste ähnlicher Ansätze:<ul><li><a rel="noopener" target="_blank" class="external" href="https://github.com/MichaelMure/git-bug/blob/master/doc/model.md">git-bug</a></li><li><a rel="noopener" target="_blank" class="external" href="https://remotestorage.io/">remotestorage.io</a></li><li><a rel="noopener" target="_blank" class="external" href="https://tonsky.me/blog/crdt-filesync/">Local, first, forever</a></li><li><a rel="noopener" target="_blank" class="external" href="https://jack-vanlightly.com/analyses/2024/4/29/understanding-delta-lakes-consistency-model">Understanding Delta Lake’s consistency model</a></li><li><a rel="noopener" target="_blank" class="external" href="http://archagon.net/blog/2018/03/24/data-laced-with-history/">Data Laced with History: Causal Trees &amp; Operational CRDTs</a></li></ul></li></ul></div><p><em>Veröffentlicht am 24. Juni 2024</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Kryptografische Lösungen gegen Fake News]]></title>
            <link>https://holtwick.de/de/blog/fake-news</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/fake-news</guid>
            <pubDate>Wed, 07 Feb 2024 07:00:00 GMT</pubDate>
            <description><![CDATA[Schützen Sie sich vor Fake News mit digitaler Signatur. Erfahren Sie, wie Sie Nachrichten mit kryptografischen Methoden authentifizieren und verifizieren können. Digitales Vertrauensnetzwerk.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Letztens las ich von einer “massiven Fake News Maschinerie”, die das deutsche Außenministerium aufgedeckt haben will (<a href="https://holtwick.de/de/blog/fake-news#sources">siehe unten</a>). Sie sei kaum noch von legitimen Nachrichten zu unterscheiden.</p><p>Mir kam spontan der Gedanke, dass wenn man nicht in der Lage ist, manipulierte Nachrichten zu <em>stoppen</em>, man doch wenigstens in der Lage sein sollte legitime Nachrichten zu <em>kennzeichnen</em>.</p><p><strong>Die Idee ist einfach: Lasst uns ein digitales Netzwerk des Vertrauens schaffen mit kryptografischen Mitteln.</strong></p><h2 id="ab-hier-wird-es-technisch%E2%80%A6" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/fake-news#ab-hier-wird-es-technisch%E2%80%A6">Ab hier wird es technisch…</a></h2><p>Die einfachste Form des Signierens ist die Berechnung eines Hash Wertes. Also nehmen wir an, ich möchte als <a rel="noopener" target="_blank" class="external" href="https://twitter.com/holtwick">@holtwick</a> tweeten: “Ich mag keine Fake News!” und mein Geheimnis wäre “<a rel="noopener" target="_blank" class="external" href="https://www.deutschlandfunk.de/vor-160-jahren-philipp-reis-und-sein-telephon-100.html">Gurkensalat</a>” (üblicherweise engl. als “salt” benannt). Im Terminal ginge das dann so:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-sh"><span class="line"><span style="color:#005cc5">echo</span><span style="color:#005cc5"> -n</span><span style="color:#032f62"> &quot;@holtwick Ich mag keine Fake News! Gurkensalat&quot;</span><span style="color:#d73a49"> |</span><span style="color:#6f42c1"> shasum</span><span style="color:#005cc5"> -a</span><span style="color:#005cc5"> 256</span></span></code></pre><p>Alternativ mir OpenSSL:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-sh"><span class="line"><span style="color:#005cc5">echo</span><span style="color:#005cc5"> -n</span><span style="color:#032f62"> &quot;@holtwick Ich mag keine Fake News! Gurkensalat&quot;</span><span style="color:#d73a49"> |</span><span style="color:#6f42c1"> openssl</span><span style="color:#032f62"> dgst</span><span style="color:#005cc5"> -sha256</span></span></code></pre><p>Das Ergebnis ist:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-text"><span class="line"><span>26b1a58b82ffcc963e1a337623886b7d6dcf8c63dff592b9fa9113fd29aa82e7</span></span></code></pre><p>Das kann auch schon berechnet werden, bevor ich es tweete. Dann nehme ich einen Teil der Ergebnisses, z. B. die ersten 8 Zeichen und sende sie mit der Nachricht, vielleicht noch mit einem Erkennungsmerkmal, wie einem vorangestellten <code>~</code> Zeichen:</p><div class="markdown-alert markdown-alert-example"><p class="markdown-alert-title">@holtwick</p><p>Ich mag keine Fake News! ~26b1a58b</p></div><p>So, nun geht es noch darum, sowas zu verifizieren. Denkbar wäre ein kleiner Service auf der eigenen Website. Hier ein kleines Beispiel in PHP, wie eine Online Prüfung aussehen könnte:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-php"><span class="line"><span style="color:#d73a49">&lt;?</span><span style="color:#005cc5">php</span><span style="color:#24292e"> </span></span>
<span class="line"></span>
<span class="line"><span style="color:#6a737d">// This one is top secret :)</span></span>
<span class="line"><span style="color:#24292e">$salt </span><span style="color:#d73a49">=</span><span style="color:#032f62"> &quot;Gurkensalat&quot;</span><span style="color:#24292e">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6a737d">// Normalize whitespace to avoid copy paste issues</span></span>
<span class="line"><span style="color:#24292e">$sample </span><span style="color:#d73a49">=</span><span style="color:#005cc5"> trim</span><span style="color:#24292e">(</span><span style="color:#005cc5">preg_replace</span><span style="color:#24292e">(</span><span style="color:#032f62">&apos;/</span><span style="color:#032f62">[\t\n\r\s]</span><span style="color:#d73a49">+</span><span style="color:#032f62">/&apos;</span><span style="color:#24292e">, </span><span style="color:#032f62">&apos; &apos;</span><span style="color:#24292e">, $_GET[</span><span style="color:#032f62">&quot;text&quot;</span><span style="color:#24292e">])) </span><span style="color:#d73a49">.</span><span style="color:#032f62"> &quot; &quot;</span><span style="color:#d73a49"> .</span><span style="color:#24292e"> $salt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6a737d">// Calculate SHA256 and only use the first 8 chars</span></span>
<span class="line"><span style="color:#24292e">$hash </span><span style="color:#d73a49">=</span><span style="color:#005cc5"> substr</span><span style="color:#24292e">(</span><span style="color:#005cc5">hash</span><span style="color:#24292e">(</span><span style="color:#032f62">&apos;sha256&apos;</span><span style="color:#24292e">,  $sample), </span><span style="color:#005cc5">0</span><span style="color:#24292e">, </span><span style="color:#005cc5">8</span><span style="color:#24292e">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6a737d">// Compare hashes and return result</span></span>
<span class="line"><span style="color:#005cc5">echo</span><span style="color:#005cc5"> strcmp</span><span style="color:#24292e">($_GET[</span><span style="color:#032f62">&quot;hash&quot;</span><span style="color:#24292e">], $hash) </span><span style="color:#d73a49">==</span><span style="color:#005cc5"> 0</span><span style="color:#d73a49"> ?</span><span style="color:#032f62"> &quot;ok&quot;</span><span style="color:#d73a49"> :</span><span style="color:#032f62"> &quot;invalid&quot;</span><span style="color:#24292e">;</span></span>
<span class="line"><span style="color:#d73a49">?&gt;</span></span></code></pre><p>Die fertige URL wäre dann: <code>https://holtwick.de/experiments/id.php?text=@holtwick%20Ich%20mag%20keine%20Fake%20News!&amp;hash=26b1a58b</code></p><h2 id="probiere-es-aus%3A" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/fake-news#probiere-es-aus%3A">Probiere es aus:</a></h2><p>Ok, das war jetzt eine relativ primitive Implementierung, um die Idee zu verdeutlichen. Für eine ernsthafte Anwendung würden sicherliche andere Techniken zum Einsatz kommen, wie z.B. ein Public-Key-Verfahren oder Blockchains. Natürlich gibt es auch schon Dienste, die ähnliches leisten wie diese <a rel="noopener" target="_blank" class="external" href="https://www.elektronische-vertrauensdienste.de/EVD/DE/Uebersicht_eVD/start.html">Übersicht der Bundesnetzagentur</a> zeigt.</p><div class="markdown-alert markdown-alert-warning"><p class="markdown-alert-title">Warning</p><p>Ich bin kein Kryptographie Experte und sicherlich habe ich einige Angriffsvektoren übersehen, trotzdem bin ich der Meinung, dass technische Möglichkeiten geben kann, die es zumindest erschweren in falschem Namen Dinge zu behaupten.</p></div><h2 id="sources" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/fake-news#sources">Quellen</a></h2><ul><li><a rel="noopener" target="_blank" class="external" href="https://www.spiegel.de/politik/deutschland/desinformation-aus-russland-auswaertiges-amt-deckt-pro-russische-kampagne-auf-a-765bb30e-8f76-4606-b7ab-8fb9287a6948">Spiegel</a> (dt.)</li><li><a rel="noopener" target="_blank" class="external" href="https://www.tagesschau.de/inland/desinformation-kampagne-russland-100.html">Tagesschau</a> (dt.)</li><li><a rel="noopener" target="_blank" class="external" href="https://www.dw.com/en/how-russian-fake-news-paints-the-germans/a-64394917">DW</a> (engl.)</li><li><a rel="noopener" target="_blank" class="external" href="https://www.theguardian.com/world/2024/jan/26/germany-unearths-pro-russia-disinformation-campaign-on-x">The Guardian</a> (engl.)</li></ul></div><p><em>Veröffentlicht am 7. Februar 2024</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Website SSG]]></title>
            <link>https://holtwick.de/de/blog/website-ssg</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/website-ssg</guid>
            <pubDate>Wed, 06 Dec 2023 07:00:00 GMT</pubDate>
            <description><![CDATA[Wie diese Website aus Vue und Markdown statisch erzeugt wird, mit dynamischen Komponenten in einzelnen Beiträgen und Obsidian als Editor für alle Inhalte.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Nach einigen Jahren war es an der Zeit, die Website zu aktualisieren. Für die letzte Version hatte ich sogar einen eigenen statischen Website-Generator namens <a href="https://holtwick.de/de/blog/birth-of-hostic">Hostic</a> entwickelt und alles lief wunderbar. Aber obwohl ich es liebe, das Rad neu zu erfinden, habe ich es bei diesem neuen Anlauf nur halb gemacht.</p><p>Grundsätzlich besteht diese Website aus <a rel="noopener" target="_blank" class="external" href="https://vuejs.org/">Vue</a> und <a rel="noopener" target="_blank" class="external" href="https://en.wikipedia.org/wiki/Markdown">Markdown</a>. Davon wird eine statische Version erstellt, so dass für jede URL die entsprechende Seite mit Inhalt vorhanden ist. Dadurch kann die Website von Suchmaschinen gut indiziert werden und die Ladezeit ist sehr kurz. Das Verfahren nennt sich <a rel="noopener" target="_blank" class="external" href="https://vitejs.dev/guide/ssr">SSG</a> (Server-Side Rendering).</p><p>Der Clou ist aber, dass dieser Ansatz es erlaubt, dynamische Elemente in die Website und sogar einzelne Beiträge einzubauen. Ein erstes Beispiel ist die interaktive Anmeldung zu meinem E-Mail-Newsletter, denn ich füge an dieser Stelle einfach <code>&lt;AppNewsletter/&gt;</code> ein:</p><div><a target="_blank" href="https://newsletter.holtwick.de/subscription/form">https://newsletter.holtwick.de/subscription/form</a></div><p>Eine weitere Erleichterung ist die Verwendung von <a rel="noopener" target="_blank" class="external" href="https://obsidian.md/">Obsidian</a> als Markdown-Editor für die Inhalte. Ich benutze dieses praktische Tool sowieso jeden Tag und kann so die Inhalte bequem pflegen.</p><div class="markdown-alert markdown-alert-info"><p class="markdown-alert-title">Obsidian Callouts</p><p>Die <a rel="noopener" target="_blank" class="external" href="https://help.obsidian.md/Editing+and+formatting/Callouts">Callouts</a> von Obsidian werden ebenfalls unterstützt. Auch bekannt als <a rel="noopener" target="_blank" class="external" href="https://github.com/orgs/community/discussions/16925">Github Alerts</a>. Ermöglicht wird dies durch das praktische <a rel="noopener" target="_blank" class="external" href="https://github.com/antfu/markdown-it-github-alerts">Markdown Plugin</a>.</p></div><p>Meinen eigenen Ansatz habe ich von dem großartigen Projekt <a rel="noopener" target="_blank" class="external" href="https://github.com/antfu/vitesse">Vitesse</a> abgeleitet. Die verwendete Technik ist fast identisch, allerdings musste ich einige Anpassungen für meine Zwecke vornehmen.</p></div><p><em>Veröffentlicht am 6. Dezember 2023</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Video Chat Briefing – Mehr Funktionen]]></title>
            <link>https://holtwick.de/de/blog/briefing</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/briefing</guid>
            <pubDate>Fri, 16 Apr 2021 06:00:00 GMT</pubDate>
            <description><![CDATA[Neue Features in der Briefing Video Chat App]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Letztes Jahr habe ich Video Chat Projekte gestartet. Erst <a rel="noopener" target="_blank" class="external" href="https://peer-school.apperdeck.com/">peer.school</a> mit dem ich einen Beitrag zur Beschulung kleinerer Kinder leisten wollte. Dann daraus hervorgehend <a rel="noopener" target="_blank" class="external" href="https://brie.fi/ng">Brie.fi/ng</a>, dass seinen Fokus auf sichere Kommunikation legt.</p><p>Besonders Briefing hat auf <a rel="noopener" target="_blank" class="external" href="https://github.com/holtwick/briefing/">Github</a> viele Freunde gefunden und ist nun in mehreren Sprachen verfügbar, darunter auch Chinesisch und ganz frisch Russisch.</p><p>Das Projekt ist sehr einfach aufgebaut und nutzt das Javascript Framework <a rel="noopener" target="_blank" class="external" href="https://vuejs.org/">Vue</a>. Alle notwendigen Funktionen sind vorhanden und darüber hinaus sogar so spannende Features wie das Ausblenden oder Austauschen des Hintergrundes.</p><p>Einige native Apps sind ebenfalls vorhanden, darunter ist aber besonders die <a rel="noopener" target="_blank" class="external" href="https://apps.apple.com/app/briefing-video-chat/id1510803601">iOS App</a> mit Unterstützung für AppClips (Räume betreten via QR Code oder NFC Sender) erwähnenswert.</p><h2 id="einbetten" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/briefing#einbetten">Einbetten</a></h2><p>Neben dem Teilen einer URL zum betreten eines gemeinsamen Raumes, gibt es auch die Möglichkeit Briefing direkt in die eigene Website einzubetten. Ein einfacher <a rel="noopener" target="_blank" class="external" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe">IFrame</a> macht es möglich, wie dieser hier:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-html"><span class="line"><span style="color:#24292e">&lt;</span><span style="color:#22863a">iframe</span></span>
<span class="line"><span style="color:#6f42c1">  src</span><span style="color:#24292e">=</span><span style="color:#032f62">&quot;https://brie.fi/ng/cool-call-62?audio=1&amp;video=1&amp;fs=0&amp;invite=0&amp;prefs=0&amp;share=0&quot;</span></span>
<span class="line"><span style="color:#6f42c1">  allow</span><span style="color:#24292e">=</span><span style="color:#032f62">&quot;camera; microphone; fullscreen; speaker; display-capture&quot;</span></span>
<span class="line"><span style="color:#24292e">&gt;&lt;/</span><span style="color:#22863a">iframe</span><span style="color:#24292e">&gt;</span></span></code></pre><p>Zur einfachen Konfiguration gibt es nun ein <a rel="noopener" target="_blank" class="external" href="https://brie.fi/ng/embed-demo">IFrame Tool</a>, in dem jeder seinen Code schnell mit einigen Klicks selber konfigurieren kann:</p><p class="img-wrapper"><a rel="noopener" target="_blank" class="external" href="https://brie.fi/ng/embed-demo"><img alt="image-20190521195810826" width="555" height="728" fetchpriority="high" decoding="async" src="https://holtwick.de/assets/e2h6ou5ggjt1r8.png"></a></p><p>Wer die volle kontrolle haben will, kann aber auch alle Komponenten die zum Betrieb notwendig sind selbst installieren. Eine Anleitung befindet sich im <a rel="noopener" target="_blank" class="external" href="https://github.com/holtwick/briefing/#readme">README auf Github</a>.</p><h2 id="kommerzielle-lizenz" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/briefing#kommerzielle-lizenz">Kommerzielle Lizenz</a></h2><p>Briefing is Open Source, aber unter der <a rel="noopener" target="_blank" class="external" href="https://eupl.eu/">EUPL v1.2 Lizenz</a>, diese ist eine europäische Antwort auf die <a rel="noopener" target="_blank" class="external" href="https://www.gnu.org/licenses/gpl-3.0.en.html">GPL</a>. Daraus ergibt sich, das Änderungen wiederum unter der selben Lizenz zu veröffentlichen sind.</p><p>Wenn aber gewünscht ist, Änderungen nicht zu veröffentlichen, so ist es sicherlich fair eine kommerzielle Lizenz zu erwerben, die diese Freiheiten bietet. Alles dazu findet sich ebenfalls im <a rel="noopener" target="_blank" class="external" href="https://github.com/holtwick/briefing/#commercial-license">README</a>.</p><h2 id="future" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/briefing#future">Ausblick</a></h2><p>Aktuell arbeite ich an einem dritten Produkt, dass in die Fußstapfen von Briefing treten soll. Der Fokus liegt auf besserer Skalierbarkeit, Datenschutz und Verschlüsselung, sowie Relatime-Collaboration. Die Entwicklung ist schon weit fortgeschritten. Mehr dazu bald hier…</p></div><p><em>Veröffentlicht am 16. April 2021</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[LanguageTool]]></title>
            <link>https://holtwick.de/de/blog/languagetool</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/languagetool</guid>
            <pubDate>Thu, 15 Apr 2021 06:00:00 GMT</pubDate>
            <description><![CDATA[LanguageTool selbst installieren zum besseren Schutz der Privatsphäre]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p><a rel="noopener" target="_blank" class="external" href="https://languagetool.org/">LanguageTool</a> ist die Geheimwaffe bei der Produktion fehlerfreier Texte in verschiedenen Sprachen. Ich persönlich stehe auf dem Kriegsfuß mit so mancher Grammatikregel und bin froh, wenn mich die Maschine warnt, bevor es peinlich wird 😅</p><p>Allerdings finde ich, muss nicht alles was ich geschrieben habe an einen Service gesendet werden, der zwar toll ist, aber nicht unter meiner Kontrolle.</p><p>Daher hier einige Tipps, um selber einen entsprechenden Server aufzusetzen und zu nutzen.</p><h2 id="aufsetzen-eines-eigenen-servers" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/languagetool#aufsetzen-eines-eigenen-servers">Aufsetzen eines eigenen Servers</a></h2><p>Die einfachste Methode, einen eigenen Server aufzusetzen ist via Docker. Dieses Paket bietet sich an: <a rel="noopener" target="_blank" class="external" href="https://hub.docker.com/r/erikvl87/languagetool?ref=login">erikvl87/languagetool</a>. Und so wird es geladen und gestartet:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-sh"><span class="line"><span style="color:#6f42c1">docker</span><span style="color:#032f62"> pull</span><span style="color:#032f62"> erikvl87/languagetool</span></span>
<span class="line"><span style="color:#6f42c1">docker</span><span style="color:#032f62"> run</span><span style="color:#005cc5"> -d</span><span style="color:#005cc5"> --restart</span><span style="color:#032f62"> unless-stopped</span><span style="color:#005cc5"> -p</span><span style="color:#032f62"> 8010:8010</span><span style="color:#032f62"> erikvl87/languagetool</span></span></code></pre><p>Super, jetzt ist der Server unter <code>http://example.com:8010</code> zu erreichen. Weitere Hintergrundinformationen gibt es unter <a rel="noopener" target="_blank" class="external" href="https://dev.languagetool.org/http-server">https://dev.languagetool.org/http-server</a></p><h2 id="in-visual-studio-code-verwenden" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/languagetool#in-visual-studio-code-verwenden">In Visual Studio Code verwenden</a></h2><p>Die Erweiterung <a rel="noopener" target="_blank" class="external" href="https://marketplace.visualstudio.com/items?itemName=davidlday.languagetool-linter">LanguageTool Linter</a> bietet alle notwendigen Funktionen im Umgang mit LanguageTool. Hier kann die Server URL nun eingetragen werden. Die Bearbeitung von Texten und Markdown wird so sehr viel komfortabler.</p><p>Folgende Anpassungen der Einstellungen haben sich als sinnvoll erwiesen:</p><pre class="shiki shiki-themes github-light github-dark" tabindex="0" style="background-color:#fff;color:#24292e"><code class="language-json"><span class="line"><span style="color:#24292e">{</span></span>
<span class="line"><span style="color:#005cc5">  &quot;languageToolLinter.external.url&quot;</span><span style="color:#24292e">: </span><span style="color:#032f62">&quot;http://example.com:8010&quot;</span><span style="color:#24292e">,</span></span>
<span class="line"><span style="color:#005cc5">  &quot;languageToolLinter.hideDiagnosticsOnChange&quot;</span><span style="color:#24292e">: </span><span style="color:#005cc5">true</span><span style="color:#24292e">,</span></span>
<span class="line"><span style="color:#005cc5">  &quot;languageToolLinter.hideRuleIds&quot;</span><span style="color:#24292e">: </span><span style="color:#005cc5">true</span><span style="color:#24292e">,</span></span>
<span class="line"><span style="color:#005cc5">  &quot;languageToolLinter.lintOnChange&quot;</span><span style="color:#24292e">: </span><span style="color:#005cc5">true</span><span style="color:#24292e">,</span></span>
<span class="line"><span style="color:#005cc5">  &quot;languageToolLinter.lintOnOpen&quot;</span><span style="color:#24292e">: </span><span style="color:#005cc5">true</span></span>
<span class="line"><span style="color:#24292e">}</span></span></code></pre><h2 id="in-firefox-verwenden" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/languagetool#in-firefox-verwenden">In Firefox verwenden</a></h2><p>Für Browser und andere Apps stehen zahlreiche Plugins zur Verfügung, siehe <a rel="noopener" target="_blank" class="external" href="https://languagetool.org/#plugins">https://languagetool.org/#plugins</a>. Bei der Erweiterung von Firefox lässt sich unter “Experimental settings (only for advanced users)” der eigene Server eintragen. Dabei muss die URL noch im Versionspfad ergänzt werden, also in unserem Beispiel: <code>http://example.com:8010/v2/</code>.</p></div><p><em>Veröffentlicht am 15. April 2021</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Warum einen neuen statischen Website Builder?]]></title>
            <link>https://holtwick.de/de/blog/birth-of-hostic</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/birth-of-hostic</guid>
            <pubDate>Wed, 02 Sep 2020 06:00:00 GMT</pubDate>
            <description><![CDATA[Ich habe den statischen Website Generator Hostic entwickelt. Hier erkläre ich, warum und wie ich das gemacht habe.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><p>Ich liebe <a rel="noopener" target="_blank" class="external" href="https://vuejs.org/">Vue.js</a> von <a rel="noopener" target="_blank" class="external" href="https://evanyou.me/">Evan You</a> und ich mag statische Webseiten. Natürlich gibt es bereits Lösungen um diese beiden Neigungen miteinander zu verbinden wie <a rel="noopener" target="_blank" class="external" href="https://vuepress.vuejs.org/">VuePress</a> oder <a rel="noopener" target="_blank" class="external" href="https://nuxtjs.org/">Nuxt</a>. Aber wäre ich ein Programmierer, wenn ich diesen einfachen Weg wählen würde?</p><p>Natürlich wollte ich ran an die <em>bleeding edge</em> und habe mich schnell begeistern lassen von Evans neuestem Coup <a rel="noopener" target="_blank" class="external" href="https://github.com/vitejs/vite">vite</a>. Es wirft den Ballast vom <a rel="noopener" target="_blank" class="external" href="https://webpack.js.org/">webpack</a> über Bord und macht alles richtig. Zunächst versuchte ich damit und mit <a rel="noopener" target="_blank" class="external" href="https://github.com/vuejs/vitepress">vitepress</a> mein Glück, aber das war leider auch nicht ganz das wonach ich suchte.</p><p>Also ging ich noch mal einen Schritt zurück und schaute mir die Klassiker der statischen Website Generierung an: <a rel="noopener" target="_blank" class="external" href="https://www.gatsbyjs.com/">Gatsby</a>, <a rel="noopener" target="_blank" class="external" href="https://gohugo.io/">Hugo</a>, <a rel="noopener" target="_blank" class="external" href="https://jekyllrb.com/">Jekyll</a> und <a rel="noopener" target="_blank" class="external" href="https://www.11ty.dev/">11ty</a>. Auch diese machten eigentlich alles richtig, aber alles kam dort auch nicht von der Stange wie ich es gerne hätte. Besonders da ich mich <a href="https://holtwick.de/blog/static-jquery">SeaSite</a> schon eine eigene Lösung gebaut hatte, mit der alle meine Websites generiert wurden.</p><h2 id="was-will-ich-eigentlich%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/birth-of-hostic#was-will-ich-eigentlich%3F">Was will ich eigentlich?</a></h2><p>Aber was war es also, was ich wollte? Ich habe folgende Punkte für mich herausgefunden:</p><ol><li><strong>Geschwindigkeit:</strong> Ich möchte wie bei Vue.js Änderungen im Code vornehmen und unmittelbar im Browser das Ergebnis sehen.</li><li><strong>Flexibilität:</strong> Ich möchte jeden Aspekt selber beeinflussen und Programmieren können. Am liebsten in Javascript.</li><li><strong>Nachbearbeitung:</strong> Ich möchte Inhalte noch leicht anpassen können, nachdem sie bereits Berechnet wurden. Das war das Kernprinzip von SeaSite, wodurch ich im Nachgang Optimierungen an Bildern und Videos vornehmen konnte, aber auch Übersetzungen von Textpassagen für verschiedene Sprachversionen laufen lassen konnte.</li></ol><h2 id="wie-mache-ich-es%3F" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/birth-of-hostic#wie-mache-ich-es%3F">Wie mache ich es?</a></h2><p>Gut, bei Punkt 1 hatte ich bei <a rel="noopener" target="_blank" class="external" href="https://github.com/vitejs/vite">vite</a> schon <a rel="noopener" target="_blank" class="external" href="https://github.com/evanw/esbuild">esbuild</a> entdeckt. Es ist so unglaublich schnell, dass ich es gar nicht glauben konnte. Das Ergebnis ist auch zuverlässig und genau so wie es sein soll. <a rel="noopener" target="_blank" class="external" href="https://github.com/evanw/esbuild">Esbuild</a> war also gesetzt als Werkzeug, das ich einsetzen wollte.</p><p>Ich baute also zunächst ein kleines Node.js Skript, dass eine Javascript Datei transpilierte. Dazu baute ich eine kleine Library, um Routen zu registrieren. Die Generierung der Inhalte sollte dann on-demand erfolgen, wenn die Website durch einen einfachen Express.js Webserver angefragt würde. Um die statischen Seiten zu generieren würde ich einfach zu allen registrierten Routen die Inhalte generieren und abspeichern lassen. Das ging super und dauerte nur Millisekunden.</p><p>Schnell wollte ich nun auch den Komfort von <a rel="noopener" target="_blank" class="external" href="https://github.com/vitejs/vite">vite</a> haben, d.h. wenn Dateien sich ändern, lädt auch der Browser unmittelbar neu. Mit Chokidar konnte ich den Ordner mit den JS Dateien beobachten und per <a rel="noopener" target="_blank" class="external" href="https://github.com/evanw/esbuild">esbuild</a> alles neu übersetzen lassen. Durch einen kleinen Trick, ließ sich der Import-Cache von Node.js umgehen und das neue JS einladen und ausführen. Mit socket.io war schnell ein Reload Mechanismus für den Browser zusammengebaut.</p><h2 id="jetzt-soll-alles-sch%C3%B6ner-werden!" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/birth-of-hostic#jetzt-soll-alles-sch%C3%B6ner-werden!">Jetzt soll alles schöner werden!</a></h2><p>Ich hatte nun endgültig Feuer gefangen und es gab kein zurück mehr. Dann konnte es auch schöner werden :) Es gelang mir leider nicht auf Anhieb Vue.js einzubinden, allerdings zweifelte ich auch, ob das überhaupt sinnvoll sei. In SeaSite hatte ich bereits JSX und JSDOM eingesetzt. Für ein anderes Projekt hatte ich bereits eine DOM Abstraktion geschrieben, die sehr schlank ist. Diese baute ich nun so aus, dass damit per JSX einfach HTML und XML generiert worden konnte.</p><p>Somit war eine Manipulation der Inhalte durch einfache DOM Aktionen möglich. Wie viel schöner wäre es aber, wenn die entsprechenden Nodes per CSS-Selektoren gefunden werden könnten. Also baute ich auch das mit css-parse ein und es funktionierte wunderbar.</p><p>Auch ein Markdown-Parser war aus SeaSite schon vorhanden und wurde nur noch entsprechend ausgebaut, dass unter Beibehaltung der angenehmen Geschwindigkeit die Meta-Daten für die Registrierung von Routen zur Verfügung standen.</p><h2 id="open-source!" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/birth-of-hostic#open-source!">Open Source!</a></h2><p>Nun war also alles an Bord was benötigt wurde und es wurde Zeit eine einfache einheitliche Struktur zu schaffen, um das Projekt veröffentlichen zu können. Ein erstes Ziel war die Routen durch einfache Datenstrukturen zu beschreiben, um maximale Flexibilität zu erhalten. Für gängige Formate wie HTML, XML, JSON, Text und Assets wurden bequeme Methoden erstellt.</p><p>Da nun schon ohnehin alles die Anmutung eines Webservers hatte, der eben auch statische Seiten ausspucken kann, lag es nahe das smarte Middleware Muster von <a rel="noopener" target="_blank" class="external" href="https://koajs.com/">Koa.js</a> zu übernehmen. Auf diese Weise sind Templates und Plugins leicht zu realisieren. Eine Kopie der genannten Datenstruktur dient dann als Kontext und das Ergebnis wird im Property <code>ctx.body</code> erwartet.</p><p>Hier ist es nun, das fertige Projekt. Ich würde mich sehr über Hilfe und Ideen freuen. Vielleicht ist es nicht das tollste Tool, um statische Websites zu erzeugen, aber eventuell die Basis für eine noch smartere Lösung die darauf aufbaut.</p><p><strong><a rel="noopener" target="_blank" class="external" href="https://github.com/holtwick/hostic">github.com/holtwick/hostic</a></strong></p><p><strong><a rel="noopener" target="_blank" class="external" href="https://www.npmjs.com/package/hostic">https://www.npmjs.com/package/hostic</a></strong></p><p>Im Folgenden werde ich einige Themen weiter beleuchten wollen, die sich aus der Erstellung einer Website ergeben und wie diese mit Hostic gelöst werden können. Die Liste der aktuellen Ideen zu Themen:</p><ul><li>Aufbau einer einfachen statischen Website mit Hostic</li><li>Aufbau eines Blogs mit Markdown</li><li>Aufbau einer Mehrsprachigen Website und Lokalisierung</li><li>Optimierungen für Suchmaschinen und Accessibility</li><li>Hosting: Beaker Browser, sh…</li></ul><p>Diese Webseiten wurden bereits von Hostic erstellt:</p><ul><li><a rel="noopener" target="_blank" class="external" href="https://pdfify.app/">https://pdfify.app</a></li><li><a rel="noopener" target="_blank" class="external" href="https://holtwick.de/">https://holtwick.de</a></li></ul></div><p><em>Veröffentlicht am 2. September 2020</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
        <item>
            <title><![CDATA[Eine IT-Strategie für Europa 🇪🇺]]></title>
            <link>https://holtwick.de/de/blog/it-strategy-for-europe</link>
            <guid isPermaLink="false">https://holtwick.de/de/blog/it-strategy-for-europe</guid>
            <pubDate>Wed, 26 Aug 2020 06:00:00 GMT</pubDate>
            <description><![CDATA[Europa braucht eine Strategie und politischen Willen diesen Trend zu ändern. Das Potenzial und die Mittel aber wären vorhanden, Europa unabhängiger zu machen.]]></description>
            <content:encoded><![CDATA[<div class="post-body"><div class="markdown-body"><h2 id="ausgangslage" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#ausgangslage">Ausgangslage</a></h2><p>Die <a rel="noopener" target="_blank" class="external" href="https://moneyinc.com/richest-companies-in-the-world-in-2019/">wertvollsten</a> und erfolgreichsten Unternehmen sind IT-Firmen: Apple, Google, Amazon und Microsoft. Alle mit Sitz in den USA. China, ein weiterer riesiger Markt, ist die Produktionsstätte der meisten Hardware, aber auch Sitz von Firmen die erfolgreich den Platz der US Firmen einnehmen: Alibaba, Tencent und <a rel="noopener" target="_blank" class="external" href="https://en.wikipedia.org/wiki/List_of_largest_Internet_companies">mehr</a>. Auch Schwellenländer haben ihren eigenen Markt, in dem Online-Geschäfte stattfinden. <a rel="noopener" target="_blank" class="external" href="https://www.kaiostech.com/company/our-story/">KaiOS</a> ist ein Beispiel für ein innovatives Modell, dass in der ersten Welt kaum bekannt ist.</p><p>Wo steht Europa? Es gibt keine nennenswerten Online-Plattformen. Betriebe und Verwaltung machen sich abhängig von Software aus den USA und Hardware aus China. Kreative Unternehmer und talentierte Entwickler wandern ab in die USA. Auf lange Sicht wird Europa bedeutungsloser als Innovator und bleibt Importeur von Technologie. Das ist fatal.</p><p>Europa braucht eine Strategie und den politischen Willen diesen Trend zu ändern. Das Potenzial und die Mittel aber wären vorhanden, Europa unabhängiger in einer sich verändernden globalen Welt zu machen. Ich möchte im Folgenden meine persönlichen Gedanken zu so einer Strategie darlegen.</p><h2 id="daten" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#daten">Daten</a></h2><p>Europa sollte auf keinen Fall versuchen die USA oder China zu kopieren. Die bestehenden erfolgreichen Lösungen sind im Grunde <strong>zentralistierte Lösungen</strong>. Es werden also <strong>Services</strong> angeboten, bei denen die <strong>Daten</strong> der Kunden im Zugriff der betreibenden Firmen sind. Egal wie gut sich die <em>Privacy</em>-Versprechungen auf den Webseiten lesen lassen, de facto gibt es keinen Schutz der Daten vor den Firmen oder den Behörden des Landes in dem der Sitz des Unternehmens liegt – in der Regel den USA oder China.</p><p>Daten sind die Ware des Informationszeitalters. Der erste Unterschied, den Europa bei seiner Strategie machen sollte, ist der absolute Schutz dieser Daten. Der Benutzer sollte vollen Zugang und Kontrolle zu über seine Daten haben, um nicht in Abhängigkeit einzelner Unternehmen zu geraten. Das ist zu erreichen durch <strong>dezentrale Lösungen</strong> und <strong>starker Verschlüsselung</strong>.</p><h2 id="plattform" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#plattform">Plattform</a></h2><p>Daten müssen angezeigt und bearbeitet werden können. Dazu werden Computer, Tablets, Smartphones und mit der Zeit weitere Geräte verwendet werden. Wichtig ist, welches Betriebssystem benutzt wird, denn das ist quasi das Fundament auf dem alle Lösungen aufbauen. Microsoft, Google und Apple haben hier im Prinzip ein <a rel="noopener" target="_blank" class="external" href="https://de.statista.com/themen/783/betriebssysteme/">Monopol</a>, wiederum alle ansässig in den USA. Europa sollte auf eine eigene <strong>freie Plattform</strong> setzen, dabei bieten sich <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Linux">Linux</a> und <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Android">Android</a> als erster Ausgangspunkt an.</p><p>Aber neben dem Betriebssystem hat sich ein weiteres <em>heimliches</em> Betriebssystem etabliert: der Webbrowser. Ursprünglich eine europäische Erfindung, hat er den Informationszugang im Internet revolutioniert. In den letzten Jahren hat die Komplexität immer weiter zugenommen und die meisten Dienste eines Computers können mittlerweile mit Webtechnologien angesteuert werden. Die Programmierung ist leicht zu erlernen und die Kenntnis davon weit verbreitet. Mit <a rel="noopener" target="_blank" class="external" href="https://webassembly.org/">WebAssembly</a> gibt es nun auch keine wirklichen Performance-Probleme mehr.</p><p>Europa sollte ausnutzen, dass es die bewährte Web-Plattform gibt. Allerdings ist nach der Schwächung von Firefox nun nur noch eine Browser-Engine relevant und diese wird von <a rel="noopener" target="_blank" class="external" href="https://de.statista.com/statistik/daten/studie/158095/umfrage/meistgenutzte-browser-im-internet-weltweit/">Google und Apple kontrolliert</a>. Europa sollte kurzfristig eine eigene offenen Engine entwickeln, dazu bietet sich <a rel="noopener" target="_blank" class="external" href="https://servo.org/">Servo</a> an. Langfristig könnte das Betriebssystem als ganzes durch eine Web-Engine ersetzt werden, nach dem Muster von <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Google_Chrome_OS">Google Chrome OS</a>.</p><h2 id="hardware" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#hardware">Hardware</a></h2><p>Auch den Geräten selber muss vertraut werden können. In vielen Chips gibt es <a rel="noopener" target="_blank" class="external" href="https://www.zdnet.com/article/minix-intels-hidden-in-chip-operating-system/">eigene kleine Betriebssysteme</a>, die wichtige Funktionen übernehmen und in die normalen Entwickler keinen Einblick bekommen. Es wäre wichtig auch hier in der Entwicklung und der Produktion selbständiger zu werden, am besten mit einem offenen Ansatz. Warum sollten nicht mehrere Hardwarehersteller dieselben Chips produzieren? <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/ARM-Architektur">ARM</a> ist ja ein entsprechend erfolgreiches Modell in diesem Bereich. Leider kenne ich mich zu wenig aus in diesem Thema, um mehr ins Detail gehen zu können. Doch wichtig scheint mir auch hier eine Basis zu schaffen, der vertraut werden kann und die nicht monopolisiert wird.</p><h2 id="software" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#software">Software</a></h2><p>Der öffentliche Bereich, also Verwaltungen und Behörden, sollten dazu verpflichtet werden Open-Source-Software zu verwenden und zu entwickeln. Jede Lösung die mit staatlichen Geldern entwickelt wird, muss frei und offen zugänglich sein und frei von Lizenzkosten betrieben werden können. Das Geld alleine das aktuell an Lizenzen für Windows in Europa ausgegeben wird sollte schon reichen, um eine Softwareentwicklung zu fördern. Aufträge zur Entwicklung und Pflege wiederum sollten in Europa vergeben werden, um hier Kompetenzen und Märkte anzuschieben und aufzubauen.</p><h2 id="bildung" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#bildung">Bildung</a></h2><p>Sowohl die Bildung im Umgang mit IT, also auch die Vermittlung von Wissen durch IT sollte gestärkt werden. Gerade in Zeiten von Corona sind die Defizite klar zum Vorschein gekommen. Die Bedürfnisse an eine Bildungsinfrastruktur sind sicherlich vergleichbar in ganz Europa, dennoch gibt es keine mir bekannte gemeinsame Anstrengung eine Lösung zu finden.</p><p>Im Bereich der Inhalte gibt es mittlerweile diverse Lösungen, wie zum Beispiel in Deutschland <a rel="noopener" target="_blank" class="external" href="https://anton.app/en_us/">Anton App</a>, <a rel="noopener" target="_blank" class="external" href="https://presse.funk.net/format/musstewissen/">Musste Wissen</a> oder <a rel="noopener" target="_blank" class="external" href="https://simpleclub.com/">SimpleClub</a>. Aber auch international wie <a rel="noopener" target="_blank" class="external" href="https://de.khanacademy.org/">Khan Academy</a>. Dennoch bereitet jeder Lehrer seinen Unterricht aufs neue individuell vor und Erfahrungen werden nicht effektiv untereinander geteilt. Eine bessere Förderung solcher Inhalte könnte sowohl den klassischen, als auch den virtuellen Unterricht verbessern und Europa so besser aufstellen, da das Bildungsniveau zunimmt und vergleichbarer wird.</p><h2 id="innovation" tabindex="-1"><a class="header-anchor" href="https://holtwick.de/de/blog/it-strategy-for-europe#innovation">Innovation</a></h2><p>Europäische Bürger haben immer wieder gezeigt, dass sie innovativ sind und Zukunftsthemen erkennen. <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Solarindustrie#Krise_seit_2012">Erneuerbare Energie</a> ist ein gutes Beispiel dafür, dass aber gleichzeitig auch ein schlechtes Beispiel für den kurzen Atem bei der Förderung durch die Politik ist. Im Bereich Mobilität war Europa mit fossilen Brennstoffen vorne dabei, hat dann aber die Entwicklung verschlafen, obwohl viele Innovationen zu den Antrieben der Zukunft auch in Europa <a rel="noopener" target="_blank" class="external" href="https://de.wikipedia.org/wiki/Transrapid">stattfanden</a>.</p><p>Die großen Herausforderungen unserer Zeit sind gleichzeitig auch Chancen die genutzt werden müssen. Das Potenzial ist da, nun braucht es den Mut und die Leidenschaft eigene Wege einzuschlagen und das möglichst rasch.</p><hr><p>Links zu ähnlichen Themen:</p><ul><li><a rel="noopener" target="_blank" class="external" href="https://www.heise.de/meinung/Kommentar-Digitale-Souveraenitaet-zum-Schnaeppchenpreis-von-Europa-und-Mozilla-4874038.html?wt_mc=rss.red.ho.ho.atom.beitrag.beitrag">Kommentar: Digitale Souveränität zum Schnäppchenpreis – von Europa und Mozilla</a> von Felix von Leitner, Heise.</li><li><a rel="noopener" target="_blank" class="external" href="https://macwright.com/2020/08/22/clean-starts-for-the-web.html">A clean start for the web</a> von Tom MacWright</li></ul><p>Update 7.9.2020:</p><ul><li><a rel="noopener" target="_blank" class="external" href="https://www.heise.de/news/Whitepaper-Digitale-Souveraenitaet-als-neue-staatliche-Aufgabe-4887054.html?wt_mc=rss.red.ho.ho.atom.beitrag.beitrag">Whitepaper: Digitale Souveränität als neue staatliche Aufgabe definieren</a></li></ul></div><p><em>Veröffentlicht am 26. August 2020</em></p></div>]]></content:encoded>
            <author>support@holtwick.de (Dirk Holtwick)</author>
        </item>
    </channel>
</rss>