<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Marco</title>
    <description>The latest articles on Forem by Marco (@disane).</description>
    <link>https://forem.com/disane</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F249730%2F92323ac8-4d59-44c0-846b-c356782ae1ff.jpg</url>
      <title>Forem: Marco</title>
      <link>https://forem.com/disane</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/disane"/>
    <language>en</language>
    <item>
      <title>CSS variables: Flexible styling for your components 🎨</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Fri, 28 Mar 2025 09:03:59 +0000</pubDate>
      <link>https://forem.com/disane/css-variables-flexible-styling-for-your-components-29ba</link>
      <guid>https://forem.com/disane/css-variables-flexible-styling-for-your-components-29ba</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi91mea8m8wcy2p2ld0i7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi91mea8m8wcy2p2ld0i7.jpeg" alt="CSS variables: Flexible styling for your components 🎨" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CSS has evolved mightily in recent years. In the past, stylesheets were often an endless copy and paste of the same colors, font sizes or spacing. This made maintaining huge projects a nightmare. But since &lt;strong&gt;CSS custom properties&lt;/strong&gt; - better known as &lt;strong&gt;CSS variables&lt;/strong&gt; - have become available, this chaos is history.&lt;/p&gt;

&lt;p&gt;With CSS variables, you can not only make your code more structured and maintainable, but also style complex components dynamically and flexibly without having to constantly change classes or selectors. In this article, I'll show you step by step how to use CSS variables, what advantages they have and how you can even use them in scoped components.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are CSS variables? 🤔
&lt;/h2&gt;

&lt;p&gt;CSS variables are named values that you can define within your stylesheets. Unlike preprocessor-based variables (such as SASS or LESS), CSS variables are &lt;strong&gt;available at runtime&lt;/strong&gt; and respond to the context in which they are used.&lt;/p&gt;

&lt;p&gt;A CSS variable is always defined with two hyphens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
  --primary-color: #3498db;
  --spacing: 16px;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then call the variable anywhere in the CSS with &lt;code&gt;var()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.button {
  background-color: var(--primary-color);
  padding: var(--spacing);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; CSS variables are part of the DOM and can even be changed via JavaScript at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benefits of CSS variables 🚀
&lt;/h2&gt;

&lt;p&gt;Why should you use CSS variables? Here are the most important reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reusability:&lt;/strong&gt; Colors, sizes and spacing don't have to appear multiple times in the CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier maintenance:&lt;/strong&gt; Changes to a central variable affect all elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamics:&lt;/strong&gt; You can adjust variables in JavaScript at runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoping:&lt;/strong&gt; Variables can be defined globally or locally within a selector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better performance:&lt;/strong&gt; Unlike with SASS, you don't have to recompile every time you make a change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to use CSS variables in the project ✏️
&lt;/h2&gt;

&lt;p&gt;The easiest way is to define your variables in the global context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
  --font-size: 18px;
  --border-radius: 8px;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use it in any elements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.card {
  font-size: var(--font-size);
  border-radius: var(--border-radius);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to access it dynamically in JavaScript, it works like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document.documentElement.style.setProperty('--primary-color', '#e74c3c');

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Scoped variables: Overwrite variables locally 🪄
&lt;/h2&gt;

&lt;p&gt;The real gamechanger is the ability to overwrite variables &lt;strong&gt;within components&lt;/strong&gt;. You can define a global variable and reset it within an element or component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
  --button-bg: #3498db;
}

.button {
  background-color: var(--button-bg);
}

.button.secondary {
  --button-bg: #2ecc71;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This automatically turns the &lt;code&gt;.button.secondary&lt;/code&gt; class green without you having to change the background color manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamically style components with CSS variables 🧩
&lt;/h2&gt;

&lt;p&gt;CSS variables offer enormous flexibility, especially for reusable components such as buttons, cards or modals. You can set your own variables for each component, which change depending on the context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.card {
  --card-padding: 20px;
  padding: var(--card-padding);
}

.card.small {
  --card-padding: 10px;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This even works &lt;strong&gt;nested&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.theme-dark {
  --background: #222;
  --text-color: #eee;
}

.theme-light {
  --background: #fff;
  --text-color: #000;
}

body {
  background: var(--background);
  color: var(--text-color);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to easily implement themes or mode changes, for example, without changing a single class in your HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fallbacks and special features 🧩
&lt;/h2&gt;

&lt;p&gt;You can also add a fallback to variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.title {
  color: var(--title-color, #333);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;--title-color&lt;/code&gt; is not defined, &lt;code&gt;#333&lt;/code&gt; is used. Practical for older browsers or if you deliberately want to allow optional values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attention:&lt;/strong&gt; CSS variables do not work in Internet Explorer. However, all modern browsers support them (see Can I use).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just SASS or LESS? 🤨
&lt;/h2&gt;

&lt;p&gt;In the past, you may have written variables with SASS or LESS. The problem: these variables only exist at compile time. They no longer exist in your final CSS - so you can't change or overwrite them at runtime.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;CSS variables&lt;/strong&gt; , however, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build dynamic themes&lt;/li&gt;
&lt;li&gt;Adjust elements live based on user interaction&lt;/li&gt;
&lt;li&gt;Make styling context-dependent (e.g. different colours in a modal). e.g. different colors in a modal)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical example: Color themes via CSS variable 🧩
&lt;/h2&gt;

&lt;p&gt;A simple dark/light mode example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
  --bg-color: #fff;
  --text-color: #000;
}

[data-theme="dark"] {
  --bg-color: #000;
  --text-color: #fff;
}

body {
  background-color: var(--bg-color);
  color: var(--text-color);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can switch the mode with JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document.documentElement.setAttribute('data-theme', 'dark');

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Without having to change a line of additional CSS.&lt;/strong&gt; This used to be impossible with SASS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;CSS variables are one of the most underrated features in modern stylesheets. They not only bring structure and readability to your CSS, but also enable flexible components, dynamic themes and centralized control of your styles. Especially for larger projects, you save a lot of time in the long term and avoid unnecessary code duplication.&lt;/p&gt;

&lt;p&gt;If you haven't used CSS variables before - give them a try! You'll wonder why you've done without them for so long.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you already used CSS variables in your project or are you planning to do so now? Feel free to write me in the comments how you want to use them or where you still have questions!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>styling</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CSS-Variablen: Flexibles Styling für deine Komponenten 🎨</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Fri, 28 Mar 2025 09:01:46 +0000</pubDate>
      <link>https://forem.com/disane/css-variablen-flexibles-styling-fur-deine-komponenten-2f2e</link>
      <guid>https://forem.com/disane/css-variablen-flexibles-styling-fur-deine-komponenten-2f2e</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fph5z2vhi1n4lq63ktr7q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fph5z2vhi1n4lq63ktr7q.jpeg" width="800" height="450"&gt;&lt;/a&gt;CSS-Variablen machen dein Styling flexibler 🎯 Wie du sie nutzt, scopst und in Komponenten überschreibst, erkläre ich dir in diesem Guide! 🌈&lt;/p&gt;




&lt;p&gt;CSS hat sich in den letzten Jahren mächtig weiterentwickelt. Früher waren Stylesheets oft ein endloses Kopieren und Einfügen gleicher Farben, Schriftgrößen oder Abstände. Das machte die Pflege riesiger Projekte zum Albtraum. Doch seitdem &lt;strong&gt;CSS Custom Properties&lt;/strong&gt; – besser bekannt als &lt;strong&gt;CSS-Variablen&lt;/strong&gt; – verfügbar sind, ist dieses Chaos Geschichte.&lt;/p&gt;

&lt;p&gt;Du kannst mit CSS-Variablen nicht nur deinen Code strukturierter und wartbarer machen, sondern auch komplexe Komponenten dynamisch und flexibel stylen, ohne ständig Klassen oder Selektoren ändern zu müssen. In diesem Artikel zeige ich dir Schritt für Schritt, wie du CSS-Variablen nutzt, welche Vorteile sie haben und wie du sie sogar in Komponenten scoped verwenden kannst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was sind CSS-Variablen? 🤔
&lt;/h2&gt;

&lt;p&gt;CSS-Variablen sind benannte Werte, die du innerhalb deiner Stylesheets definieren kannst. Im Gegensatz zu präprozessorbasierten Variablen (wie bei SASS oder LESS) sind CSS-Variablen &lt;strong&gt;zur Laufzeit verfügbar&lt;/strong&gt; und reagieren auf den Kontext, in dem sie verwendet werden.&lt;/p&gt;

&lt;p&gt;Eine CSS-Variable wird immer mit zwei Bindestrichen definiert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3498db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Du kannst die Variable dann überall im CSS mit &lt;code&gt;var()&lt;/code&gt; aufrufen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--spacing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; CSS-Variablen sind Teil des DOM und können sogar über JavaScript zur Laufzeit geändert werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Vorteile von CSS-Variablen 🚀
&lt;/h2&gt;

&lt;p&gt;Warum solltest du CSS-Variablen nutzen? Hier die wichtigsten Gründe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wiederverwendbarkeit:&lt;/strong&gt; Farben, Größen und Abstände müssen nicht mehrfach im CSS stehen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leichtere Wartung:&lt;/strong&gt; Änderungen an einer zentralen Variable wirken sich auf alle Elemente aus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamik:&lt;/strong&gt; Du kannst Variablen im JavaScript zur Laufzeit anpassen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoping:&lt;/strong&gt; Variablen können global oder lokal innerhalb eines Selektors definiert werden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bessere Performance:&lt;/strong&gt; Anders als bei SASS musst du nicht bei jeder Änderung neu kompilieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So verwendest du CSS-Variablen im Projekt ✏️
&lt;/h2&gt;

&lt;p&gt;Die einfachste Möglichkeit ist, deine Variablen im globalen Kontext zu definieren:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dann nutzt du sie in beliebigen Elementen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--border-radius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wenn du in JavaScript dynamisch darauf zugreifen möchtest, funktioniert das so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--primary-color&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#e74c3c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Scoped Variablen: Variablen lokal überschreiben 🪄
&lt;/h2&gt;

&lt;p&gt;Der wahre Gamechanger ist die Möglichkeit, Variablen &lt;strong&gt;innerhalb von Komponenten zu überschreiben&lt;/strong&gt;. Du kannst eine globale Variable definieren und sie innerhalb eines Elements oder einer Komponente neu setzen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--button-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3498db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--button-bg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button.secondary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--button-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#2ecc71&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Klasse &lt;code&gt;.button.secondary&lt;/code&gt; wird dadurch automatisch grün, ohne dass du die Hintergrundfarbe manuell ändern musst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Komponenten dynamisch stylen mit CSS-Variablen 🧩
&lt;/h2&gt;

&lt;p&gt;Gerade bei wiederverwendbaren Komponenten wie Buttons, Cards oder Modals bieten CSS-Variablen eine enorme Flexibilität. Du kannst pro Komponente eigene Variablen setzen, die sich je nach Kontext ändern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--card-padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--card-padding&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card.small&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--card-padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das funktioniert sogar &lt;strong&gt;verschachtelt&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.theme-dark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#222&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.theme-light&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So kannst du z. B. Themes oder Modus-Wechsel sehr leicht implementieren, ohne eine einzige Klasse in deinem HTML zu verändern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fallbacks und Besonderheiten 🧩
&lt;/h2&gt;

&lt;p&gt;Du kannst Variablen auch mit einem Fallback versehen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--title-color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wenn &lt;code&gt;--title-color&lt;/code&gt; nicht definiert ist, wird &lt;code&gt;#333&lt;/code&gt; genutzt. Praktisch für ältere Browser oder wenn du bewusst optional Werte zulassen willst.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; CSS-Variablen funktionieren nicht in Internet Explorer. Alle modernen Browser unterstützen sie jedoch (siehe Can I use).&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum nicht einfach SASS oder LESS? 🤨
&lt;/h2&gt;

&lt;p&gt;Früher hast du vielleicht Variablen mit SASS oder LESS geschrieben. Das Problem: Diese Variablen existieren nur zur Kompilierzeit. In deinem finalen CSS gibt es sie nicht mehr – du kannst sie also nicht zur Laufzeit ändern oder überschreiben.&lt;/p&gt;

&lt;p&gt;Mit &lt;strong&gt;CSS-Variablen&lt;/strong&gt; hingegen kannst du:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamische Themes bauen&lt;/li&gt;
&lt;li&gt;Elemente basierend auf Benutzerinteraktion live anpassen&lt;/li&gt;
&lt;li&gt;Styling kontextabhängig machen (z. B. in einem Modal andere Farben)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Praxisbeispiel: Farbthemen per CSS-Variable 🧩
&lt;/h2&gt;

&lt;p&gt;Ein einfaches Dark/Light-Mode Beispiel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bg-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"dark"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bg-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bg-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mit JavaScript kannst du den Modus umschalten:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ohne eine Zeile zusätzliches CSS ändern zu müssen.&lt;/strong&gt; Das war früher mit SASS unmöglich.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit 🎯
&lt;/h2&gt;

&lt;p&gt;CSS-Variablen sind eines der unterschätztesten Features in modernen Stylesheets. Sie bringen nicht nur Struktur und Lesbarkeit in dein CSS, sondern ermöglichen flexible Komponenten, dynamische Themes und eine zentrale Steuerung deiner Styles. Gerade für größere Projekte sparst du langfristig extrem viel Zeit und vermeidest unnötige Code-Duplikate.&lt;/p&gt;

&lt;p&gt;Wenn du CSS-Variablen bisher noch nicht genutzt hast – probier es aus! Du wirst dich fragen, warum du so lange darauf verzichtet hast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hast du schon CSS-Variablen in deinem Projekt genutzt oder planst du, es jetzt zu tun? Schreib mir gerne in die Kommentare, wie du sie einsetzen willst oder wo du noch Fragen hast!&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>css</category>
      <category>styling</category>
      <category>frontend</category>
      <category>webentwicklung</category>
    </item>
    <item>
      <title>Elon Musks "Gruß" bei Trumps Vereidigung – Ein gefährliches Zeichen für die Zukunft der USA</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Tue, 21 Jan 2025 10:00:22 +0000</pubDate>
      <link>https://forem.com/disane/elon-musks-gruss-bei-trumps-vereidigung-ein-gefahrliches-zeichen-fur-die-zukunft-der-usa-1k28</link>
      <guid>https://forem.com/disane/elon-musks-gruss-bei-trumps-vereidigung-ein-gefahrliches-zeichen-fur-die-zukunft-der-usa-1k28</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vm2z944chqiwczvd8m1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vm2z944chqiwczvd8m1.jpg" width="800" height="450"&gt;&lt;/a&gt;Elon Musk zeigt bei Trumps Vereidigung eine verstörende Geste – die deutsche Presse verharmlost, rechte Kreise relativieren. Warum das brandgefährlich ist. ⚠️&lt;/p&gt;




&lt;p&gt;Die gestrige Vereidigung von Donald Trump als 47. Präsident der Vereinigten Staaten hätte ein symbolischer Moment der Demokratie sein können – stattdessen wurde sie von einem verstörenden Vorfall überschattet: Elon Musk, Tech-Milliardär und Besitzer von X (ehemals Twitter), hob während der Zeremonie seine rechte Hand in einer Art und Weise, die unmissverständlich an den Hitlergruß erinnerte.&lt;/p&gt;

&lt;p&gt;Ob es eine bewusste Provokation war oder ein Moment unfassbarer Ignoranz – das Signal, das Musk damit ausgesandt hat, ist fatal. Die Konsequenzen dieses Moments werden nicht nur die politische Landschaft der USA verändern, sondern auch die Meinungsfreiheit weiter unter Druck setzen und die gesellschaftliche Spaltung vertiefen.&lt;/p&gt;

&lt;p&gt;Für alle die es nicht mitbekommen haben, hier die ganze Rede:&lt;/p&gt;

&lt;h2&gt;
  
  
  Ein Gruß mit historischer Last 🏛️
&lt;/h2&gt;

&lt;p&gt;Es gibt Gesten, die in der Geschichte eine unauslöschliche Bedeutung tragen. Der Hitlergruß gehört dazu. In Deutschland und vielen anderen Ländern ist er nicht nur geächtet, sondern auch strafbar. Doch in den USA, wo Symbole oft als Teil der Meinungsfreiheit betrachtet werden, bleibt die Bedeutung dieses Grußes ambivalent.&lt;/p&gt;

&lt;p&gt;Musk, der sich in den letzten Jahren immer weiter in extrem rechte Kreise bewegt hat, kann kaum behaupten, sich der historischen Konnotation nicht bewusst gewesen zu sein. Gerade in einer Zeit, in der rechte Strömungen weltweit an Einfluss gewinnen, war dieser Moment ein Symbol – und eine gezielte Botschaft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Feigheit der deutschen Presse: Wie Medien den Gruß verharmlosen 📰
&lt;/h2&gt;

&lt;p&gt;Während internationale Medien bereits kritisch über Elon Musks verstörende Geste bei Trumps Vereidigung berichten, zeigt sich die deutsche Presselandschaft einmal mehr als rückgratlos. Besonders auffällig ist das Schweigen oder die Verharmlosung durch große Medienhäuser – allen voran die Springerpresse mit &lt;em&gt;Bild&lt;/em&gt; und &lt;em&gt;Welt&lt;/em&gt;. Anstatt Musks Gruß klar als das zu benennen, was er war, wird er entweder gar nicht thematisiert oder in beschönigende Kontexte gesetzt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bild.de/politik/ausland-und-internationales/auf-der-buehne-vor-trump-anhaengern-aufregung-um-seltsame-musk-geste-678ebf8aedb31a2ece6397ed" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Fe87117ed2d4e7e021008ccd3f74c7f8d-747f84f5-2" alt="Preview image" width="1280" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diese Medien versuchen, den Vorfall als „Missverständnis“ oder „überinterpretierte Handbewegung“ darzustellen, während gleichzeitig alternative Narrative gestreut werden. Genau dieselben Zeitungen, die sonst keine Gelegenheit auslassen, um Linke und progressive Bewegungen mit Diffamierungskampagnen zu überziehen, schweigen nun auffällig, wenn es um die Radikalisierung eines der reichsten Männer der Welt geht. Diese Form der Medienstrategie ist brandgefährlich: Sie trägt dazu bei, dass extrem rechte Symbolik normalisiert wird und sich gesellschaftliche Debatten immer weiter nach rechts verschieben.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.welt.de/politik/ausland/video255191144/War-das-ein-Hitlergruss-Elon-Musk-irritiert-mit-Geste.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokdp6ma9bgqpg0tz0mbw.jpg" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Einzig und alleine der Rollingstone benennt es als das, was es war:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rollingstone.com/politics/politics-news/elon-musk-salute-reaction-right-wing-extremists-1235241866/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86e9q7j65kq1hffnoq1a.jpg" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Die politische Radikalisierung von Elon Musk 🚨
&lt;/h2&gt;

&lt;p&gt;Noch vor wenigen Jahren galt Musk als exzentrischer Visionär, als jemand, der mit Tesla die Automobilbranche revolutionieren wollte und mit SpaceX die Raumfahrt neu definierte. Doch mit dem Kauf von Twitter und seiner zunehmenden Nähe zu ultrakonservativen und reaktionären Ideologien hat sich sein öffentliches Bild drastisch gewandelt.&lt;/p&gt;

&lt;p&gt;Musk gibt vor, ein Verfechter der Meinungsfreiheit zu sein, doch seine Plattform X zeigt eine andere Realität: Accounts, die Desinformation und rechte Hetze verbreiten, werden bevorzugt, während progressive Stimmen zunehmend unterdrückt oder gesperrt werden. Dass er nun ausgerechnet bei Trumps Amtseinführung eine Geste zeigt, die weltweit als Symbol faschistischer Ideologie bekannt ist, kann nicht als Zufall abgetan werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die perfide Strategie rechter Kreise: Relativierung durch Bilderflut 🎭
&lt;/h2&gt;

&lt;p&gt;Seit der Szene, in der Elon Musk seine rechte Hand bei der Vereidigung von Donald Trump hob, versuchen rechte Akteure verzweifelt, die Bedeutung dieses Moments herunterzuspielen. Eine der häufigsten Methoden dabei ist die massenhafte Verbreitung von Bildmontagen: Politiker und Persönlichkeiten aus dem öffentlichen Leben werden in Momentaufnahmen gezeigt, in denen sie während einer Rede gestikulieren oder winken. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.threads.net/@shadowenemy/post/DFFN7oxNmYq?xmt=AQGz7vsQL7ZcB47Yg%5F5jT2BUIZYfLM5kAC4C%5FcIuRmDFvA" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6n8ar8xehzbcoee8u6m1.jpg" alt="Preview image" width="800" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Der Zweck dieser Bilderflut ist klar – sie soll den Eindruck erwecken, als sei jeder willkürliche Handbewegung automatisch mit dem Hitlergruß gleichzusetzen und somit bedeutungslos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzfr20mlr27o6jmqmtz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzfr20mlr27o6jmqmtz0.png" width="800" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bilder die aktuell die sozialen Medien fluten, die auch angebliche Hitlergrüße zeigen.&lt;/p&gt;

&lt;p&gt;Doch das ist eine gezielte Verdrehung der Realität. Der Hitlergruß ist keine zufällige Bewegung, sondern eine spezifische Geste mit eindeutiger historischer Bedeutung. Er wurde bewusst als Symbol der nationalsozialistischen Herrschaft genutzt und bleibt in vielen Ländern strafbar. Kontext ist hier entscheidend: Ein Gruß auf einer Bühne, inmitten eines politisch aufgeladenen Moments, ist nicht mit einer normalen Handbewegung während eines Vortrags gleichzusetzen. Dass rechte Gruppen diese Taktik anwenden, zeigt nur, wie dringend sie versuchen, die Symbolik von Musks Geste zu verwässern – und genau das darf nicht zugelassen werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Symbolik zählt – unabhängig von der Absicht ⚠️
&lt;/h2&gt;

&lt;p&gt;Ein weiteres Argument, das zur Verteidigung von Musk ins Feld geführt wird, ist die Behauptung, dass es sich bei seiner Geste möglicherweise um einen römischen Gruß oder eine zufällige Handbewegung gehandelt haben könnte. Doch diese Erklärungsversuche sind irrelevant. Symbole haben eine Wirkung, unabhängig davon, wie der Einzelne sie meint.&lt;/p&gt;

&lt;p&gt;Das beste Beispiel dafür sind historische Zeichen, die im Laufe der Zeit ihre ursprüngliche Bedeutung verloren haben und für neue Ideologien vereinnahmt wurden. Der Hitlergruß selbst war ursprünglich eine Anlehnung an den römischen Salut – doch nach 1933 wurde er untrennbar mit dem Nationalsozialismus verbunden. Heute kann niemand mehr diese Geste in einem politischen Kontext zeigen, ohne sich ihrer Bedeutung bewusst zu sein.&lt;/p&gt;

&lt;p&gt;Ebenso unsinnig ist der Versuch, Musks Verhalten mit seiner Autismus-Diagnose oder Asperger-Syndrom zu entschuldigen. Eine neurodiverse Person ist genauso in der Lage, gesellschaftliche Normen und historische Symbolik zu verstehen – insbesondere wenn es um eine Geste geht, die weltweit als Inbegriff faschistischer Ideologie bekannt ist. Musk ist ein Milliardär, ein Medienmogul und ein einflussreicher Akteur in der globalen Politik. Ihn als unwissenden Außenseiter darzustellen, wird seiner Verantwortung nicht gerecht.&lt;/p&gt;

&lt;p&gt;Die Realität ist: Musk wusste genau, was er tat – und seine Unterstützer versuchen nun, das Offensichtliche zu verschleiern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was bedeutet das für die Meinungsfreiheit? 🗣️
&lt;/h2&gt;

&lt;p&gt;Ironischerweise stellt Musks Verhalten eine massive Gefahr für die Meinungsfreiheit dar – genau das, was er angeblich schützen will. In dem Moment, in dem extrem rechte Ideologien offen zur Schau gestellt werden, setzt das einen Prozess in Gang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Normalisierung extremistischer Symbolik&lt;/strong&gt;: Was einst als absolut unakzeptabel galt, wird langsam enttabuisiert.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Einschüchterung progressiver Stimmen&lt;/strong&gt;: Wenn Menschen mit Macht und Einfluss solche Signale setzen, hat das eine abschreckende Wirkung auf Kritiker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Veränderung der politischen Diskurse&lt;/strong&gt;: Das, was sagbar ist, verschiebt sich immer weiter nach rechts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Musk nutzt seine Macht über die digitale Kommunikation, um diesen Wandel aktiv voranzutreiben. X hat sich zu einer Plattform entwickelt, auf der Hassrede floriert und demokratische Werte erodieren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Musks rechter Drift: Öffentliche Verschwörungstheorien mit der AfD 📢
&lt;/h2&gt;

&lt;p&gt;Die Geste von Elon Musk bei Trumps Vereidigung war kein isolierter Vorfall – sie fügt sich nahtlos in seine zunehmend rechtsextreme Rhetorik ein. Erst letzte Woche führte Musk ein öffentliches Gespräch auf X (ehemals Twitter) mit Alice Weidel, der Vorsitzenden der rechtsextremen AfD. In diesem Space tauschten Musk und Weidel wilde Verschwörungstheorien aus, die direkt aus der extrem rechten Echokammer stammen. Besonders verstörend: Beide behaupteten, Adolf Hitler sei eigentlich „Kommunist“ gewesen und politisch „links“ einzuordnen – eine altbekannte, vollkommen falsche Erzählung, die von Rechtsextremen genutzt wird, um ihre eigene Ideologie zu verharmlosen.&lt;/p&gt;

&lt;p&gt;Dass Musk einer international als rechtsextrem bekannten Politikerin eine Plattform bietet und gemeinsam mit ihr historische Fakten verdreht, zeigt, wie tief er inzwischen in diesen Kreisen verstrickt ist. Die AfD wird in Deutschland vom Verfassungsschutz als rechtsextremistischer Verdachtsfall beobachtet – und genau mit dieser Partei sympathisiert Musk offen. Wer auf X gezielt Desinformation verbreitet und extremistische Narrative salonfähig macht, kann sich nicht auf Unwissenheit oder Missverständnisse berufen. Seine jüngste Geste bei Trumps Amtseinführung war daher nicht einfach ein Zufall – sie war ein weiteres Symbol für seine gefährliche Radikalisierung.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Destabilisierung der USA durch rechte Symbolik 🇺🇸
&lt;/h2&gt;

&lt;p&gt;Der gestrige Vorfall reiht sich ein in eine Reihe besorgniserregender Entwicklungen in den USA. Mit Trump kehrt nicht nur ein Präsident ins Weiße Haus zurück, der die Demokratie bereits einmal fast zu Fall gebracht hätte, sondern auch eine Bewegung, die offen autoritäre Züge trägt.&lt;/p&gt;

&lt;p&gt;Wenn Menschen wie Elon Musk diese Bewegung nicht nur unterstützen, sondern mit extremistischen Symbolen aktiv verstärken, sind die Konsequenzen kaum absehbar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gewaltbereite Gruppen fühlen sich ermutigt.&lt;/strong&gt; Die rechtsextreme Szene in den USA wächst und wird aggressiver – sie hat jetzt ein weiteres Signal der Unterstützung aus der Elite erhalten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Die politische Mitte wird ausgehöhlt.&lt;/strong&gt; Demokratische Institutionen funktionieren nur, wenn es ein Gleichgewicht zwischen politischen Kräften gibt. Doch mit der zunehmenden Radikalisierung einflussreicher Persönlichkeiten wird dieses Gleichgewicht zerstört.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Das internationale Ansehen der USA leidet.&lt;/strong&gt; Europa und viele andere westliche Staaten sehen den Aufstieg von Trump und die Radikalisierung der US-Elite mit Sorge. Musk hat mit seinem Auftritt ein weiteres Mal gezeigt, dass die USA auf einem gefährlichen Weg sind.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warum das nicht ignoriert werden darf ⚠️
&lt;/h2&gt;

&lt;p&gt;Einige mögen behaupten, es sei nur eine zufällige Handbewegung gewesen oder ein Missverständnis. Doch selbst wenn man Musks Geste als unbedacht ansehen würde – das Problem bleibt bestehen.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wenn ein Mann mit so viel Einfluss eine solche Geste macht, hat das Auswirkungen. Es reicht nicht, dies als Nebensächlichkeit abzutun. Es ist ein weiteres Indiz dafür, wie tief die rechtsextreme Ideologie bereits in die Eliten der USA vorgedrungen ist und ein Vorgeschmack auf das, was noch kommen wird.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Elon Musk hat gestern nicht nur eine Geste gemacht – er hat ein Symbol gesetzt. Ein Symbol für eine Zukunft, in der extrem rechte Ideologien nicht nur toleriert, sondern aktiv gefördert werden.&lt;/p&gt;

&lt;p&gt;Die USA stehen vor einer entscheidenden Phase. Wenn Menschen wie Musk weiterhin ungehindert ihre Macht nutzen können, um demokratische Strukturen zu untergraben, dann droht eine Ära, in der Meinungsfreiheit nicht mehr bedeutet, dass jeder sagen kann, was er denkt – sondern nur noch diejenigen, die sich einer bestimmten Ideologie unterordnen.&lt;/p&gt;

&lt;p&gt;Diese Entwicklung kann und darf nicht ignoriert werden...&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>politik</category>
      <category>elonmusk</category>
      <category>usa</category>
      <category>meinung</category>
    </item>
    <item>
      <title>Landmark ruling for more consumer protection in online coaching 🚀</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Mon, 20 Jan 2025 12:42:03 +0000</pubDate>
      <link>https://forem.com/disane/landmark-ruling-for-more-consumer-protection-in-online-coaching-3l69</link>
      <guid>https://forem.com/disane/landmark-ruling-for-more-consumer-protection-in-online-coaching-3l69</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0hkp3av5j4p8g6g5zcf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0hkp3av5j4p8g6g5zcf.jpeg" width="800" height="450"&gt;&lt;/a&gt;A new ruling strengthens customer rights in online coaching and could change the entire industry ⚖️&lt;/p&gt;




&lt;p&gt;Online coaching is booming - whether for crypto investments, business strategies or personal development. But what happens if the promises are not kept? A recent court ruling is causing a stir: A customer got his money back for crypto coaching because the offer did not meet expectations. This ruling could have far-reaching consequences for the industry. t3n reported on it today:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t3n.de/news/geld-zurueck-fuer-crypto-coaching-dieses-urteil-staerkt-kunden-von-online-coaches-1668889/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8cfz30ddn61vs2hr45d.jpeg" alt="Preview image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why customer judgment is important ⚖️
&lt;/h2&gt;

&lt;p&gt;Many online coaches lure you in with big promises: quick profits, financial freedom or the perfect business. But there is often little substance behind the glossy advertisements. The recent ruling by the Munich Regional Court (judgement of 15.01.2025, ref. 44 O 16944/23, not final) shows that customers are not defenceless if they feel deceived by such offers.&lt;/p&gt;

&lt;p&gt;The following are particularly problematic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exaggerated advertising promises&lt;/strong&gt;: "Earn €10,000 a month with crypto!" - but without guarantee.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of individual support&lt;/strong&gt;: Many coaching sessions consist of ready-made videos instead of real support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intransparent refund conditions&lt;/strong&gt;: Some providers refuse refunds or make contracts complicated, if they have any at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The court ruled: If coaching does not deliver what was advertised, the customer can demand their money back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does coaching count as distance learning? 📚
&lt;/h2&gt;

&lt;p&gt;One particularly exciting aspect of the ruling is the classification of online coaching as &lt;strong&gt;distance learning&lt;/strong&gt;. In this case, the court saw a parallel to traditional educational offers and found that the provider may not have had the necessary authorization.&lt;/p&gt;

&lt;p&gt;In addition, the judges argued that the customer &lt;strong&gt;was not sufficiently informed&lt;/strong&gt; of her right of withdrawal. This could mean that many coaching contracts are invalid if they violate existing consumer protection laws. If this view prevails, affected customers could reclaim their money more easily in future.&lt;/p&gt;

&lt;h2&gt;
  
  
  MLM and snowball systems 🕵️‍♂️
&lt;/h2&gt;

&lt;p&gt;This problem is strongly reminiscent of &lt;strong&gt;multilevel marketing (MLM) and snowball systems&lt;/strong&gt;, which also lure customers with unrealistic promises. Many dubious coaches use the same psychological tricks as MLM distributors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pressure to make a purchase decision quickly&lt;/li&gt;
&lt;li&gt;Exclusive "insider" secrets that are only revealed to paying customers&lt;/li&gt;
&lt;li&gt;Success stories, that are not verifiable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my article on the &lt;strong&gt;dangerous world of multilevel marketing and pyramid schemes&lt;/strong&gt;, I show exactly how such schemes work and how to protect yourself from them 👇🏼&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/the-dangerous-world-of-multilevel-marketing-and-ponzi-systems/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjm974f1c0z4a8y0gd6o.png" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Effects on the coaching industry 🚨
&lt;/h2&gt;

&lt;p&gt;This ruling sends out a signal. Providers will have to be more careful about how they market their programs in future. High-priced coaching programs that cost several thousand euros are particularly affected.&lt;/p&gt;

&lt;p&gt;The following developments are likely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More transparency in advertising promises&lt;/li&gt;
&lt;li&gt;Clear contracts with comprehensible rights of return&lt;/li&gt;
&lt;li&gt;Stricter legal checks of coaching offers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means more security for reputable coaches, as they can clearly distinguish themselves from dubious providers. For customers, it means more protection and a better chance of getting their money back if the coaching does not deliver what it promises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protect yourself from dubious coaching 🛑
&lt;/h2&gt;

&lt;p&gt;If you are considering booking online coaching, pay attention to these points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check reviews&lt;/strong&gt;: Look at independent reviews on Trustpilot or Google.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the contract&lt;/strong&gt;: Is there a money-back guarantee? Are the conditions clearly formulated? Are there clearly formulated terms and conditions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set realistic expectations&lt;/strong&gt;: Nobody gets rich or successful overnight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare alternatives&lt;/strong&gt;: Sometimes there are cheaper or free alternatives with the same added value.&lt;/li&gt;
&lt;li&gt;Is there an &lt;strong&gt;imprint&lt;/strong&gt; and/or a &lt;strong&gt;privacy policy&lt;/strong&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fazit 🫰🏼
&lt;/h2&gt;

&lt;p&gt;The new ruling strengthens the rights of customers and sets limits on dubious coaches. Anyone who has spent their money on an empty promise now has a better chance of getting it back. At the same time, the market for online coaching is likely to become more professional in the long term.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anwalt.de/rechtstipps/vertrag-ueber-online-coaching-nichtig-lg-muenchen-44-o-16944-23-237382.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfhb3strlmrzee7g0j8f.png" alt="Preview image" width="310" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are also affected by this, contact a lawyer specializing in media law. Don't be taken for a ride!&lt;/p&gt;




&lt;p&gt;Have you ever had a bad experience with online coaching? Let us know in the comments! 👇&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>consumerprotection</category>
      <category>mlm</category>
      <category>onlinecoachings</category>
      <category>snowballsystem</category>
    </item>
    <item>
      <title>Wegweisendes Urteil für mehr Verbraucherschutz bei Online-Coachings 🚀</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Mon, 20 Jan 2025 12:39:43 +0000</pubDate>
      <link>https://forem.com/disane/wegweisendes-urteil-fur-mehr-verbraucherschutz-bei-online-coachings-n76</link>
      <guid>https://forem.com/disane/wegweisendes-urteil-fur-mehr-verbraucherschutz-bei-online-coachings-n76</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrpadd1xfrfxh9jmmpup.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrpadd1xfrfxh9jmmpup.jpeg" width="800" height="450"&gt;&lt;/a&gt;Ein neues Urteil stärkt Kundenrechte bei Online-Coachings und könnte die gesamte Branche verändern ⚖️&lt;/p&gt;




&lt;p&gt;Online-Coachings boomen – ob für Krypto-Investments, Business-Strategien oder Persönlichkeitsentwicklung. Doch was passiert, wenn die Versprechen nicht eingehalten werden? Ein aktuelles Gerichtsurteil sorgt für Aufsehen: Ein Kunde erhielt sein Geld für ein Krypto-Coaching zurück, weil das Angebot nicht den Erwartungen entsprach. Dieses Urteil könnte weitreichende Folgen für die Branche haben. t3n berichtete heute darüber:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t3n.de/news/geld-zurueck-fuer-crypto-coaching-dieses-urteil-staerkt-kunden-von-online-coaches-1668889/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8cfz30ddn61vs2hr45d.jpeg" alt="Preview image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum das Urteil für Kunden wichtig ist ⚖️
&lt;/h2&gt;

&lt;p&gt;Viele Online-Coaches locken mit großen Versprechen: schnelle Gewinne, finanzielle Freiheit oder das perfekte Business. Doch oft steckt hinter den Hochglanz-Anzeigen wenig Substanz. Das aktuelle Urteil des Landesgerichts München (Urt. v. 15.01.2025, Az. 44 O 16944/23, nicht nicht rechtskräftig) zeigt, dass Kunden nicht schutzlos sind, wenn sie sich durch solche Angebote getäuscht fühlen.&lt;/p&gt;

&lt;p&gt;Besonders problematisch sind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Überzogene Werbeversprechen&lt;/strong&gt;: „Verdiene 10.000 € im Monat mit Krypto!“ – doch ohne Garantie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fehlender individueller Support&lt;/strong&gt;: Viele Coachings bestehen aus vorgefertigten Videos statt echter Betreuung.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undurchsichtige Rückerstattungsbedingungen&lt;/strong&gt;: Manche Anbieter verweigern Rückzahlungen oder gestalten Verträge kompliziert, wenn sie überhaupt welche haben&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das Gericht entschied: Wenn ein Coaching nicht das liefert, was beworben wurde, kann der Kunde sein Geld zurückverlangen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gilt ein Coaching als Fernunterricht? 📚
&lt;/h2&gt;

&lt;p&gt;Ein besonders spannender Aspekt des Urteils ist die Einordnung von Online-Coachings als &lt;strong&gt;Fernunterricht&lt;/strong&gt;. Das Gericht sah in diesem Fall eine Parallele zu klassischen Bildungsangeboten und stellte fest, dass der Anbieter möglicherweise nicht über die erforderliche Berechtigung verfügte.&lt;/p&gt;

&lt;p&gt;Zusätzlich argumentierten die Richter, dass die Kundin &lt;strong&gt;nicht ausreichend über ihr Widerrufsrecht informiert&lt;/strong&gt; wurde. Das könnte bedeuten, dass viele Coaching-Verträge unwirksam sind, wenn sie gegen bestehende Verbraucherschutzgesetze verstoßen. Falls sich diese Sichtweise durchsetzt, könnten betroffene Kunden künftig leichter ihr Geld zurückfordern.&lt;/p&gt;

&lt;h2&gt;
  
  
  MLM und Schneeballsysteme 🕵️‍♂️
&lt;/h2&gt;

&lt;p&gt;Diese Problematik erinnert stark an &lt;strong&gt;Multilevel-Marketing (MLM) und Schneeballsysteme&lt;/strong&gt;, die ebenfalls mit unrealistischen Versprechen locken. Viele unseriöse Coaches nutzen dieselben psychologischen Tricks wie MLM-Vertriebe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Druck, schnell eine Kaufentscheidung zu treffen&lt;/li&gt;
&lt;li&gt;Exklusive „Insider“-Geheimnisse, die nur zahlenden Kunden offenbart werden&lt;/li&gt;
&lt;li&gt;Erfolgsgeschichten, die nicht überprüfbar sind&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In meinem Artikel über die &lt;strong&gt;gefährliche Welt von Multilevel-Marketing und Schneeballsystemen&lt;/strong&gt; zeige ich genau, wie solche Systeme funktionieren und wie man sich davor schützt 👇🏼&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/die-gefahrliche-welt-von-multilevel-marketing-und-schneeballsystemen/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjm974f1c0z4a8y0gd6o.png" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Auswirkungen auf die Coaching-Branche 🚨
&lt;/h2&gt;

&lt;p&gt;Dieses Urteil setzt ein Zeichen. Anbieter müssen künftig vorsichtiger sein, wie sie ihre Programme vermarkten. Besonders betroffen sind hochpreisige Coachings, die mehrere Tausend Euro kosten.&lt;/p&gt;

&lt;p&gt;Folgende Entwicklungen sind wahrscheinlich:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mehr Transparenz in den Werbeversprechen&lt;/li&gt;
&lt;li&gt;Klare Verträge mit nachvollziehbaren Rückgaberechten&lt;/li&gt;
&lt;li&gt;Strengere rechtliche Prüfungen von Coaching-Angeboten&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Für seriöse Coaches bedeutet das mehr Sicherheit, da sie sich klar von unseriösen Anbietern abgrenzen können. Für Kunden bedeutet es mehr Schutz und eine bessere Chance, ihr Geld zurückzubekommen, wenn das Coaching nicht hält, was es verspricht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schütze Dich vor unseriösen Coachings 🛑
&lt;/h2&gt;

&lt;p&gt;Wenn Du überlegst, ein Online-Coaching zu buchen, achte auf diese Punkte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bewertungen checken&lt;/strong&gt;: Schau Dir unabhängige Rezensionen auf Trustpilot oder Google an.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertrag prüfen&lt;/strong&gt;: Gibt es eine Geld-zurück-Garantie? Sind die Konditionen klar formuliert? Gibt es klar formulierte Geschäftsbedingungen?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realistische Erwartungen setzen&lt;/strong&gt;: Niemand wird über Nacht reich oder erfolgreich.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternativen vergleichen&lt;/strong&gt;: Manchmal gibt es günstige oder kostenlose Alternativen mit gleichem Mehrwert.&lt;/li&gt;
&lt;li&gt;Gibt es ein &lt;strong&gt;Impressum&lt;/strong&gt; und/oder eine &lt;strong&gt;Datenschutzerklärung&lt;/strong&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fazit 🫰🏼
&lt;/h2&gt;

&lt;p&gt;Das neue Urteil stärkt die Rechte von Kunden und setzt unseriösen Coaches Grenzen. Wer sein Geld für ein leeres Versprechen ausgegeben hat, hat nun bessere Chancen, es zurückzubekommen. Gleichzeitig dürfte sich der Markt für Online-Coachings langfristig professionalisieren.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anwalt.de/rechtstipps/vertrag-ueber-online-coaching-nichtig-lg-muenchen-44-o-16944-23-237382.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfhb3strlmrzee7g0j8f.png" alt="Preview image" width="310" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sofern du auch davon betroffen bist, wende dich an an einen Anwalt im Medienrecht. Lass dich nicht verarschen! &lt;/p&gt;




&lt;p&gt;Hast Du schon einmal schlechte Erfahrungen mit Online-Coachings gemacht? Schreib es in die Kommentare! 👇&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>verbraucherschutz</category>
      <category>mlm</category>
      <category>onlinecoachings</category>
      <category>schneeballsystem</category>
    </item>
    <item>
      <title>How I digitized masses of documents 🧻</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Fri, 17 Jan 2025 11:32:59 +0000</pubDate>
      <link>https://forem.com/disane/how-i-digitized-masses-of-documents-5d9l</link>
      <guid>https://forem.com/disane/how-i-digitized-masses-of-documents-5d9l</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76437t0fbx3i4eiqb16l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76437t0fbx3i4eiqb16l.jpeg" width="800" height="450"&gt;&lt;/a&gt;In this article, I'll show you how I digitized masses of documents with the help of DMS Paperless and a few tweaks 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;First of all&lt;/strong&gt;: Unfortunately, toilet paper cannot be digitized yet, but I can help you with everything else! Although, there are also paperless toilets. But that's another topic.&lt;/p&gt;

&lt;p&gt;Invoices, contracts, notes - everything piles up and when you need a document, you spend ages looking for it. The usual paper chaos can be really annoying. The solution? A document management system (&lt;strong&gt;DMS&lt;/strong&gt;)! And with &lt;strong&gt;Paperless&lt;/strong&gt;, a document scanner and the &lt;strong&gt;Patch-T-Pages&lt;/strong&gt;, you can not only efficiently digitize your documents, but also have them sorted automatically. Sounds good? Then let me show you how to set it all up! 💪&lt;/p&gt;

&lt;p&gt;In another article, I've already explained the benefits of DMS Paperless and why you need it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/everyone-needs-a-dms-at-home/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bmm6wkx3unt9jo3iw2n.jpeg" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  New Year's resolutions 🥳
&lt;/h2&gt;

&lt;p&gt;Now, however, I wanted to digitize all(!) my documents over the holidays. Really all of them. I only realized later what I had let myself in for.&lt;/p&gt;

&lt;p&gt;My fiancée works for a German government agency, so everything was neatly sorted in Leitz folders by person, subject and date, and there were also small inserts. Accurately punched and, if necessary, stapled. But after a good 12 years in a relationship, the folders simply become too much.&lt;/p&gt;

&lt;p&gt;Much of it you don't even have to keep. I estimate that you only need to keep 10% of your everyday documents. This includes all documents from authorities, notices, contracts and generally everything from official bodies (notarial deeds, land register extracts, etc.). If you're filing a tax return, then of course everything that's included in it (invoices for business expenses, possibly also proof of payment such as bank statements).&lt;/p&gt;

&lt;p&gt;Now I'm standing there with what feels like 100 folders that I have to digitize. Phew.&lt;/p&gt;

&lt;p&gt;Of course you can do everything manually or with an app for Paperless, but that's not only annoying, it's also miserably inefficient. After all, I have better things to do with my time than spend hours turning pages and taking photos with my cell phone. So there is a great need for optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  But the disillusionment came quickly 🥱
&lt;/h2&gt;

&lt;p&gt;In between the years, my printer also broke down, which is why I was looking for a good replacement that could also scan via a feeder and ideally even on both sides. But as we don't print that much now, I didn't want to spend €600, because such devices are more likely to be found in the professional sector and that's where it gets steep.&lt;/p&gt;

&lt;p&gt;But it can only do ADF (Automatic Document Feeder) and no DADF (Duplex Automatic Document Feeder) and so scanning hundreds of documents would be really tedious. Been there, done that. So it became an HP OfficeJet Pro 8123e, purely for printing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.idealo.de/preisvergleich/OffersOfProduct/203713612%5F-officejet-pro-8132e-40q45b-hp.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3own1eupgmtxxrvbbz5.jpg" alt="Preview image" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For single documents this is okay, but for a large number of documents or an initial digitization, this is nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Document scanners for the win 🏆
&lt;/h2&gt;

&lt;p&gt;Of course, I already knew document scanners from my professional environment. They have the great advantage that they are specialized for exactly these tasks and probably do them better than any consumer multifunction printer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://de.wikipedia.org/wiki/Document-scanner" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F170px-document-scanner.jpg" alt="Preview image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're not using an entry-level version, then it meets my requirements exactly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast and automatic (batch) feeding&lt;/li&gt;
&lt;li&gt;Duplex scan&lt;/li&gt;
&lt;li&gt;Detection of blank pages&lt;/li&gt;
&lt;li&gt;Double sheet detection (detects when more than one page is fed)&lt;/li&gt;
&lt;li&gt;Scanning of various formats (receipts, vouchers, receipts, etc.).)&lt;/li&gt;
&lt;li&gt;Storage of scans in a network share via WLAN or LAN#&lt;/li&gt;
&lt;li&gt;Can be used on its own (computer or cell phone)&lt;/li&gt;
&lt;li&gt;Optional: built-in OCR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After doing some research, I came across a &lt;strong&gt;ScanSnap iX1600&lt;/strong&gt; and bought it straight away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.idealo.de/preisvergleich/OffersOfProduct/201439426%5F-scansnap-ix1600-black-limited-edition-fujitsu.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm0c1g91k4vum35v35fd.jpg" alt="Preview image" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Attach document scanner to Paperless 🔗
&lt;/h2&gt;

&lt;p&gt;As Paperless, as mentioned in the other article, also has the ability to scan documents from a folder, you can have the scanner scan directly into the folder which can then be scanned by Paperless.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/jeder-braucht-ein-dms-zuhause/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtvd9g5tsjrw250rut4y.jpeg" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All you have to do is release the Consume folder in the network and make it known to the ScanSnap. To do this, at least in this model, you can create profiles in the software (not on the device itself). These are quite comprehensive and should actually offer everything you need as a semi-professional digitizer at home. Here is my profile for filing directly to the Paperless network share:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti9l91tm20ydxyf0myr6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti9l91tm20ydxyf0myr6.png" width="544" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most important settings here are that it scans duplex and files as a PDF to a network share so that Paperless can handle it. The profile is then stored in the software and in the device and can be used directly, even without a computer or cell phone.&lt;/p&gt;

&lt;p&gt;But now you're probably asking yourself:&lt;br&gt;&lt;br&gt;
"&lt;em&gt;Yes, but that's all well and good, I can only scan individual documents with it now, what if I want to scan a whole batch and each document should be in its own PDF?&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;Yes, that's possible. Even easier than expected. 👇🏼&lt;/p&gt;
&lt;h2&gt;
  
  
  Separate batch scan into individual PDFs 📖
&lt;/h2&gt;

&lt;p&gt;Paperless can already do this and there is an industry standard for this too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.alliancegroup.co.uk/patch-codes.htm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7grbchjcqrulj7exy1q.jpg" alt="Preview image" width="471" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is called PATCH(-T). This is just a delimiter page that is equipped with a barcode. If Paperless recognizes this page, it separates the documents into individual PDFs. Such a PATCH-T page looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanhsm3ujcdciigxtqw33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanhsm3ujcdciigxtqw33.png" width="800" height="1128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can easily download them here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/content/files/2025/01/PATCH-T-for-printing-on-a4-paper.pdf" rel="noopener noreferrer"&gt;PATCH-T-for-printing-on-a4-paperPATCH-T-for-printing-on-a4-paper.pdf96 KBdownload-circle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/content/files/2025/01/PATCH-T-for-printing-on-a4-paper.pdf" rel="noopener noreferrer"&gt;.a{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5px;}download-circle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But unfortunately that's not it yet. You first have to activate the detection feature in Paperless. However, this is quite simple via the environment variables (if you host Paperless in Docker):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;PAPERLESS_CONSUMER_ENABLE_BARCODES&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's enough. However, you can also define your own strings with &lt;code&gt;PAPERLESS_CONSUMER_BARCODE_STRING&lt;/code&gt;. The documentation says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enables the scanning and page separation based on detected barcodes. This allows for scanning and adding multiple documents per uploaded file, which are separated by one or multiple barcode pages. For ease of use, it is suggested to use a standardized separation page, e.g. &lt;a href="https://www.alliancegroup.co.uk/patch-codes.htm" rel="noopener noreferrer"&gt;here&lt;/a&gt;. If no barcodes are detected in the uploaded file, no page separation will happen.The original document will be removed and the separated pages will be saved as pdf. See additional information in the &lt;a href="https://docs.paperless-ngx.com/advanced%5Fusage/#barcodes" rel="noopener noreferrer"&gt;advanced usage documentation&lt;/a&gt;. Defaults to false.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/configuration/#PAPERLESS%5FCONSUMER%5FENABLE%5FBARCODES" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Flogo.svg" alt="Preview image" width="1000" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So in plain language:&lt;br&gt;&lt;br&gt;
You look for a bunch of documents, separate each document from others with such a PATCH-T page and Paperless does the rest. But you should print out this PATCH-T page a few times.&lt;/p&gt;

&lt;p&gt;The documents are separated exactly at the point of the PATCH-T page and stored in individual PDFs and processed accordingly. Don't worry, the PATCH-T pages don't end up in your scan, Paperless sorts them out nicely.&lt;/p&gt;
&lt;h2&gt;
  
  
  Blank pages are a problem 🪹
&lt;/h2&gt;

&lt;p&gt;After I had scanned the first batch (which was almost 30 documents), I noticed more and more that the ScanSnap recognizes blank pages well, but not always. This apparently has to do with the fact that the PATCH-T pages that I printed at the beginning were of course only printed on one side. As a result, it sometimes happened that the document started with a blank page after the PATCH-T page. This mainly affected pages that were not completely clean and had probably exceeded the threshold of white, so that the ScanSnap thought "Hey, there's something on it, I'll scan that too".&lt;/p&gt;

&lt;p&gt;But there is also a solution for this completely in Paperless. This is where the PreConsume scripts come into play.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/advanced%5Fusage/#pre-consume-script" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Flogo-1.svg" alt="Preview image" width="1000" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allows you to intervene in the process of processing and have things done, in this case a script that recognizes and sorts out empty pages based on a threshold value.&lt;/p&gt;

&lt;p&gt;To do this, you define the path to a script as an environment variable&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;PAPERLESS_PRE_CONSUME_SCRIPT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/paperless/scripts/pre-consume.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script there is just a collection file for all scripts so that I don't have to adapt the container again. The script therefore only integrates other scripts in turn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt;

&lt;span class="c"&gt;# Remove blank pages&lt;/span&gt;
/usr/src/paperless/scripts/remove-blank-pages.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The really exciting thing is the &lt;code&gt;remove-blank-pages.sh&lt;/code&gt; script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;#set -x -e -o pipefail&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; pipefail
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C

&lt;span class="c"&gt;#IN="$1"&lt;/span&gt;
&lt;span class="nv"&gt;IN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DOCUMENT_WORKING_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Check for PDF format&lt;/span&gt;
&lt;span class="nv"&gt;TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;file &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TYPE&lt;/span&gt;&lt;span class="p"&gt;%%,*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"PDF document"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Skipping &lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt; - non PDF [&lt;/span&gt;&lt;span class="nv"&gt;$TYPE&lt;/span&gt;&lt;span class="s2"&gt;]."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# PDF file - proceed&lt;/span&gt;

&lt;span class="c"&gt;#PAGES=$(pdfinfo "$IN" | grep ^Pages: | tr -dc '0-9')&lt;/span&gt;
&lt;span class="nv"&gt;PAGES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pdfinfo &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Pages:/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo &lt;/span&gt;Total pages &lt;span class="nv"&gt;$PAGES&lt;/span&gt;


&lt;span class="c"&gt;# Threshold for HP scanners&lt;/span&gt;
&lt;span class="c"&gt;# THRESHOLD=1&lt;/span&gt;
&lt;span class="c"&gt;# Threshold for Canon MX925&lt;/span&gt;
&lt;span class="nv"&gt;THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1


non_blank&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 &lt;span class="nv"&gt;$PAGES&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;PERCENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;gs &lt;span class="nt"&gt;-o&lt;/span&gt; - &lt;span class="nt"&gt;-dFirstPage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-dLastPage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-sDEVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ink_cov &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;CMYK | nawk &lt;span class="s1"&gt;'BEGIN { sum=0; } {sum += $1 + $2 + $3 + $4;} END { printf "%.5f\n", sum } '&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"Color-sum in page &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; is &lt;/span&gt;&lt;span class="nv"&gt;$PERCENT&lt;/span&gt;&lt;span class="s2"&gt;: "&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s2"&gt;"BEGIN { exit !(&lt;/span&gt;&lt;span class="nv"&gt;$PERCENT&lt;/span&gt;&lt;span class="s2"&gt; &amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$THRESHOLD&lt;/span&gt;&lt;span class="s2"&gt;) }"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;
      &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Page added to document"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Page removed from document"&lt;/span&gt;
    &lt;span class="k"&gt;fi
  done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;NON_BLANK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;non_blank&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NON_BLANK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;NON_BLANK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$NON_BLANK&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  qpdf &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--replace-input&lt;/span&gt; &lt;span class="nt"&gt;--pages&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$NON_BLANK&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 The script was not written by me, the credit for it goes to others, but I have achieved good results with it so far.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/paperless-ngx/paperless-ngx/discussions/668" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F668" alt="Preview image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️&lt;/p&gt;

&lt;p&gt;You should not use the script directly in production. I strongly recommend that you scan a blank page beforehand and adjust the threshold for your printer, otherwise "false positives" may occur and valuable pages may be lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  And if there are several people? 🧑🏼‍👩🏼‍👧🏼
&lt;/h2&gt;

&lt;p&gt;Paperless also has a solution for this. Paperless can run through the Consume folder recursively, i.e. also search through subfolders, and apply tags or owners directly based on this. All you have to do is activate the environment variable &lt;code&gt;PAPERLESS_CONSUMER_RECURSIVE&lt;/code&gt;, store various folders there (e.g. the names of the people receiving the documents) and then create a workflow in Paperless. Alternatively, you could also have the directory names automatically created as tags (using the environment variable &lt;code&gt;PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS&lt;/code&gt; and then place workflows on them, but I didn't want to do that.&lt;/p&gt;

&lt;p&gt;You can then use the workflows to place an "automation" on the path:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefqe2u8kiqped9l8zois.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefqe2u8kiqped9l8zois.png" width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8mtvhkboazax2h6uwab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8mtvhkboazax2h6uwab.png" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I have the document scanner's profile scanned into precisely this path. I have also created a profile and a workflow for my fiancée. If I now scan documents of mine, I select my profile and everything from the folder is automatically assigned an owner and optionally tags and other assignments. It's the same with my fiancée's documents, just in a different folder in the file share.&lt;/p&gt;

&lt;p&gt;Since you can work with regex, you can create quite generous and detailed queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/usage/#workflows" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F26a0.svg" alt="Preview image" width="36" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But there is a problem 🥴
&lt;/h2&gt;

&lt;p&gt;These workflows are not executed if the batch scan runs via PATCH-T pages and pages are to be separated automatically. This doesn't seem to be a bug either, but is, at least currently, "made by intention". I once reported this as a bug at Paperless:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/paperless-ngx/paperless-ngx/issues/8604" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F8604" alt="Preview image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So for you&lt;/strong&gt;: Many documents then have to be manually tagged with owners or other tags, but individual scans work without any problems, so that at least the individual scanning should not cause any problems with the workflows.&lt;/p&gt;

&lt;p&gt;I have helped myself by scanning all documents, separated by person, in a batch, marking them with the multiple selection in Paperless and assigning users. I haven't found a better workflow yet.  &lt;/p&gt;

&lt;p&gt;The only important thing is that you automatically save the documents with a &lt;code&gt;unchecked&lt;/code&gt; or &lt;code&gt;todo&lt;/code&gt; tag so that you can find them again later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflows take work off your hands 🧑🏼‍🏭
&lt;/h2&gt;

&lt;p&gt;In general, however, the workflows are worth their weight in gold. For example, I have created a workflow that reacts to certain document types and tags and adds another tag. This allows me to categorize whether a document could be relevant under tax law and then, at the end of the year, I can narrow it down to one year via a user-defined view and see everything I need to include in my upcoming tax return.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0r0d6923yj9kus3vm68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0r0d6923yj9kus3vm68.png" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcopojws8pju605yokgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcopojws8pju605yokgg.png" width="800" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Goodbye folder 👋🏼
&lt;/h2&gt;

&lt;p&gt;With all the customizations or workflows, I can now digitize all my documents once and throw all folders in the trash. In principle, I can also shred all digitized documents as long as I don't need to keep them.&lt;/p&gt;

&lt;p&gt;Because this definitely makes your folders a lot less cluttered, you can now make use of the &lt;strong&gt;ASN&lt;/strong&gt; in Paperless. The &lt;strong&gt;ASN&lt;/strong&gt; (Archive Serial Number) is basically an archive number for a document so that it can be physically found again quickly. Each document automatically receives one and can also be assigned a different one if necessary. In this way, you can assign this ASN to all physical documents (whether stamped or glued) and then store them in a folder. You could also use inserts to create a certain order and separate the documents thematically.&lt;/p&gt;

&lt;p&gt;This way, if you ever need your physical documents, you can find them quickly and reliably and don't have to search for them.&lt;/p&gt;

&lt;p&gt;I'm not currently using this method, but I'm actually thinking about introducing it at some point. At the moment, however, I'm not yet ready to shred all my documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  No document scanner necessary 🫰🏼
&lt;/h2&gt;

&lt;p&gt;As I found out later, the document scanner would not have been necessary in principle, as Paperless can also automatically merge documents using a single-sided scan. There is the environment variable &lt;code&gt;PAPERLESS_CONSUMER_ENABLE_COLLATE_DOUBLE_SIDED&lt;/code&gt; for this. This allows you to first scan and file all even pages and then turn the stack over and file all odd pages, Paperless then recognizes that they belong together and merges them into one PDF. The process and its pitfalls are described in the Paperless documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/advanced%5Fusage/#collate" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Flogo-2.svg" alt="Preview image" width="1000" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This means that you wouldn't need an expensive document scanner with DADF scanning, but can also use a normal consumer printer with ADF scanning. But the documentation also describes that the process can be quite error-prone and I didn't want to have to check all the scanned documents. The solution with the document scanner was actually worth the money to me because it saves me any headaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 💡
&lt;/h2&gt;

&lt;p&gt;As you can see, it's quite easy to quickly and efficiently store all your previous documents in Paperless and process them (almost) completely automatically. In some areas, you still have to do a bit of work in Paperless or come up with simple solutions. But it's all better than scanning everything manually and you quickly get a status that you can continue working with.&lt;/p&gt;

&lt;p&gt;In 3 evenings, I managed to scan almost 4 Leitz folders with almost 700 documents. What more could you want?&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>paperless</category>
      <category>dms</category>
      <category>ocr</category>
      <category>digitization</category>
    </item>
    <item>
      <title>Wie ich Massen an Dokumenten digitalisiert habe 🧻</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Fri, 17 Jan 2025 11:18:20 +0000</pubDate>
      <link>https://forem.com/disane/wie-ich-massen-an-dokumenten-digitalisiert-habe-4d37</link>
      <guid>https://forem.com/disane/wie-ich-massen-an-dokumenten-digitalisiert-habe-4d37</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhn9o6qkplqs0lsm8uuc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhn9o6qkplqs0lsm8uuc.jpeg" width="800" height="450"&gt;&lt;/a&gt;Wie ich mit Hilfe dem DMS Paperless und einigen Tweaks Massen an Dokumenten digitalisiert habe, zeige ich dir in diesem Artikel 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Vorweg&lt;/strong&gt;: Toilettenpapier kann leider noch nicht digitalisiert werden aber für alles andere kann ich dir helfen! Wobei, es gibt auch papierlose Toiletten. Aber das ist ein anderes Thema. &lt;/p&gt;

&lt;p&gt;Rechnungen, Verträge, Notizen – alles stapelt sich und wenn du mal ein Dokument brauchst, suchst du ewig. Das normale Papierchaos kann schon echt richtig nervig sein. Die Lösung? Ein Dokumenten-Management-System (&lt;strong&gt;DMS&lt;/strong&gt;)! Und mit &lt;strong&gt;Paperless&lt;/strong&gt;, einem Dokumentenscanner und den &lt;strong&gt;Patch-T-Seiten&lt;/strong&gt; kannst du deine Dokumente nicht nur effizient digitalisieren, sondern sie auch direkt automatisch sortieren lassen. Klingt gut? Dann zeige ich dir, wie du das alles einrichtest! 💪&lt;/p&gt;

&lt;p&gt;In einem anderen Artikel habe ich Dir schon mal die Vorteile des DMS Paperless dargelegt und warum Du das auch brauchst:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/jeder-braucht-ein-dms-zuhause/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bmm6wkx3unt9jo3iw2n.jpeg" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Neujahrsvorsätze 🥳
&lt;/h2&gt;

&lt;p&gt;Nun wollte ich über die Feiertage aber alle(!) meine Dokumente digitalisieren. Wirklich alle. Worauf ich mich da eingelassen habe, sollte mir erst später bewusst werden.&lt;/p&gt;

&lt;p&gt;Meine Verlobte arbeitet bei einer deutschen Behörde, daher war alles schön fein säuberlich in Leitz-Ordnern nach Person, Thema und Datum sortiert, auch kleine Einleger gab es. Akkurat gelocht und, wenn nötig, geheftet. Aber nach gut 12 Jahren Beziehung, werden die Ordner einfach zu viel.&lt;/p&gt;

&lt;p&gt;Vieles davon muss man nicht mal aufheben. Ich schätze mal, dass man gerade einmal 10% von den alltäglichen Dokumenten aufheben muss. Dazu zählen alle Schriftstücke von Behörden, Bescheide, Verträge und generell alles von offizieller Stelle (Notarsachen, Grundbuchauszüge etc.). Gibst du eine Steuererklärung ab, dann natürlich auch alles was darin enthalten ist (Rechnungen zu Werbungskosten, eventuell auch noch Zahlungsnachweise wie z.B. Kontoauszüge).&lt;/p&gt;

&lt;p&gt;Jetzt stehe ich da, mit gefühlt 100 Ordnern, die ich digitalisieren muss. Puh.&lt;/p&gt;

&lt;p&gt;Klar kann man alles auch manuell machen oder mit einer App für Paperless, aber das ist nicht nur nervig, sondern auch elendig ineffizient. Schließlich hab ich mit meiner Zeit besseres zutun, als stundenlang Seiten zu drehen und Fotos mit dem Handy zu machen. Da ist also sehr großer Optimierungsbedarf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Ernüchterung kam aber schnell 🥱
&lt;/h2&gt;

&lt;p&gt;Zwischen den Jahren ist auch noch mein Drucker kaputt gegangen, weswegen ich nach einem guten Ersatz gesucht habe, der auch per Einzug scannen und idealerweise das sogar noch beidseitig. Da wir aber jetzt nicht so viel Drucken, wollte ich keine 600€ ausgeben, denn solche Geräte findet man eher im professionellem Bereich und da wird's dann halt happig.&lt;/p&gt;

&lt;p&gt;Der kann aber nur ADF (Automatic Document Feeder) und kein DADF (Duplex Automatic Document Feeder) und somit wäre das Einscannen von hunderten Dokumenten echt sehr langwierig. Been there, done that. Also ist es ein ein HP OfficeJet Pro 8123e geworden, rein zum Drucken.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.idealo.de/preisvergleich/OffersOfProduct/203713612%5F-officejet-pro-8132e-40q45b-hp.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3own1eupgmtxxrvbbz5.jpg" alt="Preview image" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Für einzelne Dokumente ist das okay, für sehr viele oder einer initialen Digitalisierung, ist das aber nix. &lt;/p&gt;

&lt;h2&gt;
  
  
  Dokumentenscanner for the win 🏆
&lt;/h2&gt;

&lt;p&gt;Aus dem beruflichen Umfeld kannte ich natürlich schon Dokumentenscanner. Die haben den großen Vorteil, dass sie genau für diese Aufgaben spezialisiert sind und sie vermutlich besser schaffen, als jeder Consumer-Multifunktionsdrucker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://de.wikipedia.org/wiki/Dokumentenscanner" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hriqltmqdhuqi4gcg6e.jpg" alt="Preview image" width="170" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wenn man nicht gerade eine Einsteigervariante nimmt, dann erfüllt er genau meine Anforderungen: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schneller und automatischer (Batch)-Einzug&lt;/li&gt;
&lt;li&gt;Duplex Scan&lt;/li&gt;
&lt;li&gt;Erkennung von leeren Seiten&lt;/li&gt;
&lt;li&gt;Doppelblatterkennung (Erkennt wenn mehr als eine Seite eingezogen wird)&lt;/li&gt;
&lt;li&gt;Scannen von verschiedenen Formaten (Quittungen, Belege, Kassenbons etc.)&lt;/li&gt;
&lt;li&gt;Ablage der Scans in eine Netzfreigabe via WLAN oder LAN#&lt;/li&gt;
&lt;li&gt;Alleinständig nutzbar (Rechner oder Handy)&lt;/li&gt;
&lt;li&gt;Optional: Eingebaute OCR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nach einer Recherche bin ich dann auf einen &lt;strong&gt;ScanSnap iX1600&lt;/strong&gt; aufmerksam geworden und hab mir den kurzerhand direkt geholt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.idealo.de/preisvergleich/OffersOfProduct/201439426%5F-scansnap-ix1600-black-limited-edition-fujitsu.html" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm0c1g91k4vum35v35fd.jpg" alt="Preview image" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dokumentenscanner an Paperless anbinden 🔗
&lt;/h2&gt;

&lt;p&gt;Da Paperless, wie in dem anderen Artikel erwähnt, auch die Möglichkeit hat Dokumente von einem Ordner zu Scannen, kann man den Scanner direkt in den Ordner scannen lassen der dann von Paperless abgegrast werden kann. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/jeder-braucht-ein-dms-zuhause/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtvd9g5tsjrw250rut4y.jpeg" alt="Preview image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hierfür muss man lediglich den Consume-Order im Netzwerk freigeben und dem ScanSnap bekannt machen. Dafür kann man sich, zumindest in dem Modell, in der Software (nicht am Gerät selbst) Profile anlegen. Die sind recht umfassend und sollten eigentlich alles bieten, was man so als semiprofessioneller Digitalisierer für zuhause braucht. Hier mal mein Profil zur Ablage direkt in die Netzwerkfreigabe von Paperless:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti9l91tm20ydxyf0myr6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti9l91tm20ydxyf0myr6.png" width="544" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wichtig sind hierbei vor allem die Einstellungen, dass er Duplex scannt und als PDF auf eine Netzfreigabe ablegt, damit Paperless damit umgehen kann. Das Profil ist dann in der Software und im Gerät gespeichert und kann direkt, auch ohen Rechner oder Handy, genutzt werden.&lt;/p&gt;

&lt;p&gt;Jetzt stellst du dir aber sicher die Frage:&lt;br&gt;&lt;br&gt;
"&lt;em&gt;Ja aber das ist alles schön und gut, damit kann ich ja jetzt erstmal nur einzelne Dokumente scannen, was ist wenn ich einen ganzen Stapel scannen möchte und jedes Dokument in eine eigene PDF soll?&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;Ja, das geht. Sogar einfacher als erwartet. 👇🏼&lt;/p&gt;
&lt;h2&gt;
  
  
  Batch-Scan in einzelne PDFs trennen 📖
&lt;/h2&gt;

&lt;p&gt;Paperless kann das bereits und auch dafür gibt es einen Branchenstandard. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.alliancegroup.co.uk/patch-codes.htm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7grbchjcqrulj7exy1q.jpg" alt="Preview image" width="471" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dieser nennt sich PATCH(-T). Hierbei handelt es sich nur um eine Delimiter-Seite die mit einem Barcode ausgestattet ist. Erkennt Paperless diese Seite, trennt es die Dokumente in einzelne PDFs. Eine solche PATCH-T-Seite sieht z.B. so aus:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanhsm3ujcdciigxtqw33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanhsm3ujcdciigxtqw33.png" width="800" height="1128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Die kannst du ganz easy hier herunterladen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.disane.dev/content/files/2025/01/PATCH-T-for-printing-on-a4-paper.pdf" rel="noopener noreferrer"&gt;PATCH-T-for-printing-on-a4-paperPATCH-T-for-printing-on-a4-paper.pdf96 KBdownload-circle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Das war's aber leider noch nicht. Du musst das Feature der Erkennung erst einmal in Paperless aktivieren. Das geht aber recht einfach über die Umgebungsvariablen (wenn du Paperless in Docker hostest):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;PAPERLESS_CONSUMER_ENABLE_BARCODES&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das reicht schon aus. Du kannst aber mit &lt;code&gt;PAPERLESS_CONSUMER_BARCODE_STRING&lt;/code&gt; auch eigene Strings definieren. Die Doku sagt dazu:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enables the scanning and page separation based on detected barcodes. This allows for scanning and adding multiple documents per uploaded file, which are separated by one or multiple barcode pages. For ease of use, it is suggested to use a standardized separation page, e.g. &lt;a href="https://www.alliancegroup.co.uk/patch-codes.htm" rel="noopener noreferrer"&gt;here&lt;/a&gt;. If no barcodes are detected in the uploaded file, no page separation will happen.The original document will be removed and the separated pages will be saved as pdf. See additional information in the &lt;a href="https://docs.paperless-ngx.com/advanced%5Fusage/#barcodes" rel="noopener noreferrer"&gt;advanced usage documentation&lt;/a&gt;. Defaults to false.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/configuration/#PAPERLESS%5FCONSUMER%5FENABLE%5FBARCODES" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Flogo.svg" alt="Preview image" width="1000" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hießt also im Klartext:&lt;br&gt;&lt;br&gt;
Du suchst dir einen Haufen an Dokumenten, trennst jedes Dokument miteiner solchen PATCH-T-Seite von anderen und Paperless erledigt den Rest. Dafür solltest du dir diese PATCH-T-Seite aber ein paar mal ausdrucken. &lt;/p&gt;

&lt;p&gt;Die Dokumente werden genau an der Stelle der PATCH-T-Seite getrennt und in einzelne PDFs abgelegt und entsprechend be- und verarbeitet. Keine Sorge, die PATCH-T-Seiten landen nicht in deinem Scan, die sortiert Paperless schön brav aus.&lt;/p&gt;
&lt;h2&gt;
  
  
  Leere Seiten sind ein Problem 🪹
&lt;/h2&gt;

&lt;p&gt;Nach dem ich den ersten Stapel eingescannt hatte (das waren schon knapp 30 Dokumente) fiel mehr aber vermehrt auf, dass die Erkennung von leeren Seiten des ScanSnap gut klappt, aber nicht immer. Das hat offenbar damit zutun, dass die PATCH-T-Seiten, die ich anfangs gedruckt habe, natürlich nur einseitig bedruckt waren. Dadurch kommt es manchmal vor, dass das Dokument nach der PATCH-T-Seite mit einer leeren Seite angefangen hatte. Das betraf vor allem Seiten, die nicht ganz sauber waren und der Threshold an weiß, wohlmöglich überschritten hatten, so dass der ScanSnap dachte "Hey, da ist ja was drauf, das scanne ich mit".&lt;/p&gt;

&lt;p&gt;Aber auch dafür gibt es eine Lösung komplett in Paperless. Hier kommen dann die PreConsume-Scripts zum Tragen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/advanced%5Fusage/#pre-consume-script" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Flogo-1.svg" alt="Preview image" width="1000" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Damit kannst du in den Prozess der Verarbeitung eingreifen und Dinge erledigen lassen, in dem Falle ein Script, was leere Seiten anhand eines Schwellenwertes erkennt und aussortiert.&lt;/p&gt;

&lt;p&gt;Hierzu definierst du den Pfad zu einem Script als Umgebungsvariable&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;PAPERLESS_PRE_CONSUME_SCRIPT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/paperless/scripts/pre-consume.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Script dort ist nur eine Sammeldatei für alle Skripte, damit ich den Container nicht nochmal anpassen muss. Das Skript bindet also nur wiederum andere Skripte ein:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt;

&lt;span class="c"&gt;# Remove blank pages&lt;/span&gt;
/usr/src/paperless/scripts/remove-blank-pages.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das eigentlich spannende ist das &lt;code&gt;remove-blank-pages.sh&lt;/code&gt;-Skript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;#set -x -e -o pipefail&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; pipefail
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C

&lt;span class="c"&gt;#IN="$1"&lt;/span&gt;
&lt;span class="nv"&gt;IN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DOCUMENT_WORKING_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Check for PDF format&lt;/span&gt;
&lt;span class="nv"&gt;TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;file &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TYPE&lt;/span&gt;&lt;span class="p"&gt;%%,*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"PDF document"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Skipping &lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt; - non PDF [&lt;/span&gt;&lt;span class="nv"&gt;$TYPE&lt;/span&gt;&lt;span class="s2"&gt;]."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# PDF file - proceed&lt;/span&gt;

&lt;span class="c"&gt;#PAGES=$(pdfinfo "$IN" | grep ^Pages: | tr -dc '0-9')&lt;/span&gt;
&lt;span class="nv"&gt;PAGES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pdfinfo &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Pages:/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo &lt;/span&gt;Total pages &lt;span class="nv"&gt;$PAGES&lt;/span&gt;


&lt;span class="c"&gt;# Threshold for HP scanners&lt;/span&gt;
&lt;span class="c"&gt;# THRESHOLD=1&lt;/span&gt;
&lt;span class="c"&gt;# Threshold for Canon MX925&lt;/span&gt;
&lt;span class="nv"&gt;THRESHOLD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1  


non_blank&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 &lt;span class="nv"&gt;$PAGES&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;PERCENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;gs &lt;span class="nt"&gt;-o&lt;/span&gt; -  &lt;span class="nt"&gt;-dFirstPage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-dLastPage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-sDEVICE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ink_cov &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;CMYK | nawk &lt;span class="s1"&gt;'BEGIN { sum=0; } {sum += $1 + $2 + $3 + $4;} END {  printf "%.5f\n", sum } '&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"Color-sum in page &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; is &lt;/span&gt;&lt;span class="nv"&gt;$PERCENT&lt;/span&gt;&lt;span class="s2"&gt;: "&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s2"&gt;"BEGIN { exit !(&lt;/span&gt;&lt;span class="nv"&gt;$PERCENT&lt;/span&gt;&lt;span class="s2"&gt; &amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$THRESHOLD&lt;/span&gt;&lt;span class="s2"&gt;) }"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;
      &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Page added to document"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Page removed from document"&lt;/span&gt;
    &lt;span class="k"&gt;fi
  done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;NON_BLANK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;non_blank&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NON_BLANK&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;NON_BLANK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$NON_BLANK&lt;/span&gt;  | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  qpdf &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$IN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--replace-input&lt;/span&gt; &lt;span class="nt"&gt;--pages&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$NON_BLANK&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Das Skript ist nicht auf meinem Mist gewachsen, sondern die Lorbeeren gehen dafür an Andere, aber ich habe damit bisher gute Ergebnisse erzielt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/paperless-ngx/paperless-ngx/discussions/668" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F668" alt="Preview image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️&lt;/p&gt;

&lt;p&gt;Du solltest das Skript nicht direkt produktiv nutzen. Ich rate dringend dazu, dass du vorher eine leere Seite einscannst und den Threshold für deinen Drucker anpasst, da es sonst zu "False positives" kommen kann und so wertvolle Seiten verloren gehen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Und wenn es mehrere Personen gibt? 🧑🏼‍👩🏼‍👧🏼
&lt;/h2&gt;

&lt;p&gt;Auch dafür hat Paperless eine Lösung. Paperless kann nämlich den Consume-Folder rekursiv durchlaufen, also auch Unterordner durchforsten. und anhand dessen direkt Tags oder Besitzer anwenden. Dazu musst du nur die Umgebungsvariable &lt;code&gt;PAPERLESS_CONSUMER_RECURSIVE&lt;/code&gt;aktivieren, verschiedene Ordner dort ablegen (z.B. die Namen der betreffenden Personen die Dokumente erhalten) und dann einen Worflow in Paperless anlegen. Alternativ könntest du auch die Verzeichnisnamen automatisch als Tags anlegen lassen (mit Hilfe der Umgebungsvariable &lt;code&gt;PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS&lt;/code&gt; und darauf dann Workflows legen, aber das wollte ich nicht.&lt;/p&gt;

&lt;p&gt;Mit Hilfe der Workflows kannst du dann eine "Automation" auf den Pfad legen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefqe2u8kiqped9l8zois.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefqe2u8kiqped9l8zois.png" width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8mtvhkboazax2h6uwab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8mtvhkboazax2h6uwab.png" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Und in genau den Pfad lasse ich über das Profil des Dokumentenscanners reinscannen. Für meine Verlobte habe ich ebenfalls ein Profil angelegt und einen Workflow. Scanne ich nun Dokumente von mir, dann wähle ich mein Profil aus und alles aus dem Ordner wird automatisch mit einem Besitzer ausgestattet und wahlweise noch Tags und anderen Zuordnungen. Das selbe Spielchen mit Dokumenten meiner Verlobten, nur halt eben in einen anderen Ordner der Dateifreigabe.&lt;/p&gt;

&lt;p&gt;Da man da mit Regex arbeiten kann, kann man da recht großzügige und detaillierte Abfragen erstellen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/usage/#workflows" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F26a0.svg" alt="Preview image" width="36" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Es gibt da aber ein Problem 🥴
&lt;/h2&gt;

&lt;p&gt;Diese Workflows werden nicht ausgeführt, wenn der Stapelscan via PATCH-T-Seiten läuft und automatisch Seiten getrennt werden sollen. Das scheint offenbar auch kein Bug zu sein, sondern das ist, zumindest aktuell, "made by intention". Ich hatte das mal als Bug bei Paperless gemeldet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/paperless-ngx/paperless-ngx/issues/8604" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2F8604" alt="Preview image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heißt also für dich&lt;/strong&gt;: Viele Dokumente müssen dann manuell mit Besitzern oder weiteren Tags versehen werden, einzelne Scans gehen aber problemlos, so dass hier, zumindest das einzelne Scannen, kein Problem mit den Workflows machen sollte.&lt;/p&gt;

&lt;p&gt;Ich habe mir aber so geholfen, dass ich alle Dokumente, getrennt nach Personen, im Stapel eingescannt habe, diese mit der Mehrfachsleektion in Paperless markiert und Benutzer zugewiesen habe. Bisher habe ich da noch keinen besseren Workflow gefunden.  &lt;/p&gt;

&lt;p&gt;Wichtig ist nur, dass du die Dokumente automatisch mit einem Tag &lt;code&gt;ungeprüft&lt;/code&gt;oder &lt;code&gt;todo&lt;/code&gt;ablegst, damit du sie später auch wiederfindest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflows nehmen dir Arbeit ab 🧑🏼‍🏭
&lt;/h2&gt;

&lt;p&gt;Generell sind die Workflows aber Gold wert. Ich habe zum Beispiel einen Workflow gemacht, der auf bestimmte Dokumenttypen und Tags reagiert und einen weiteren Tag hinzufügt. Damit realisiere ich eine Kategorisierung ob ein Dokument steuerrechtlich relevant sein könnte und kann es mir dann am Ende des Jahres über eine benutzerdefinierte Ansicht auf ein Jahr eingrenzen und so alles sehen, was ich in meine kommende Steuererklärung aufnehmen muss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0r0d6923yj9kus3vm68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0r0d6923yj9kus3vm68.png" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcopojws8pju605yokgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdcopojws8pju605yokgg.png" width="800" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tschüss Ordner 👋🏼
&lt;/h2&gt;

&lt;p&gt;Mit all den Anpassungen oder Workflows kann ich nun meine Dokumente alle einmalig digitalisieren und alle Ordner in den Müll werfen. Alle digitalisierten Dokumente kann ich damit auch prinzipiell schreddern, solange ich sie nicht aufbewahren muss.&lt;/p&gt;

&lt;p&gt;Da man dadurch seine Ordner definitiv sehr viel entschlackt, kann man nun aber von der &lt;strong&gt;ASN&lt;/strong&gt; in Paperless Gebrauch machen. Die &lt;strong&gt;ASN&lt;/strong&gt; (Archive Serial Number) ist prinzipiell eine Archiv-Nummer eines Dokumentes, um es schnell physikalisch wieder zu finden. Jedes Dokument bekommt automatisch eine und kann auch ggf. abweichend vergeben werden. So kannst du alle physikalischen Dokumente, es sollten ja nicht mehr viele sein, mit dieser ASN ausstatten (ob gestempelt oder beklebt spielt keine Rolle) und dann in einen Ordner ablegen. Mit Einlegern könnte man auch eine gewisse Ordnung reinbringen und die Dokumente so thematisch abgrenzen.&lt;/p&gt;

&lt;p&gt;So findest du deine physikalischen Dokumente, wenn du sie mal brauchst, recht schnell und zuverlässig wieder und musst nicht wenig suchen.&lt;/p&gt;

&lt;p&gt;Aktuell nutze ich das Verfahren noch nicht, aber ich überlege tatsächlich, das irgendwann einzuführen. Im Moment bin ich aber noch nicht soweit, dass ich alle Dokumente schreddern will.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kein Dokumentenscanner notwendig 🫰🏼
&lt;/h2&gt;

&lt;p&gt;Wie ich später herausgefunden habe, wäre der Dokumentenscanner prinzipiell nicht notwendig gewesen, da Paperless auch ein automatisches Zusammenfügen von Dokumenten durch einen einseitigen Scan auch beherrscht. Dafür gibt es die Umgebungsvariable &lt;code&gt;PAPERLESS_CONSUMER_ENABLE_COLLATE_DOUBLE_SIDED&lt;/code&gt;. Damit kannst du erst alle geraden Seiten scannen und ablegen lassen und dann den Stapel umdrehen und alle ungeraden Seiten ablegen lassen, Paperless erkennt dann, dass diese zusammengehören und fügt sie ein eine PDF zusammen. Das Verfahren und seine Fallstricke sind bei Paperless in der Doku beschrieben:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.paperless-ngx.com/advanced%5Fusage/#collate" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.disane.dev%2Fcontent%2Fimages%2Fthumbnail%2Flogo-2.svg" alt="Preview image" width="1000" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Damit bräuchte man also auch keine teuren Dokumentenscanner mit DADF-Scan sondern kann auch einen normalen Consumer-Drucker mit ADF-Scan nutzen. Aber in der Doku wird auch beschrieben, dass das Verfahren recht fehleranfällig sein kann und ich wollte nicht noch alle eingescannten Dokumente prüfen müssen. Da war mir die Lösung mit dem Dokumentenscanner tatsächlich das Geld wert, weil es mir eventuelle Kopfschmerzen erspart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit 💡
&lt;/h2&gt;

&lt;p&gt;Wie du siehst ist es recht einfach, schnell und effizient alle deine bisherigen Dokumente in Paperless abzulegen und entsprechend (fast) komplett automatisiert zu bearbeiten. In manchen Punkten muss man noch etwas in Paperless nacharbeiten oder sich mit simplen Lösungen behelfen. Es ist aber alles besser als alles manuell einzuscannen und man bekommt so schnell einen Stand, mit dem man weiter arbeiten kann.&lt;/p&gt;

&lt;p&gt;So habe ich es geschafft in 3 Abenden knapp 4 Leitz-Ordner mit knapp 700 Dokumenten einzuscannen. Was will man mehr?&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>paperless</category>
      <category>dms</category>
      <category>ocr</category>
      <category>digitalisierung</category>
    </item>
    <item>
      <title>Migrating from Nginx Proxy Manager to Traefik 🚀</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Wed, 23 Oct 2024 11:13:20 +0000</pubDate>
      <link>https://forem.com/disane/migrating-from-nginx-proxy-manager-to-traefik-2k07</link>
      <guid>https://forem.com/disane/migrating-from-nginx-proxy-manager-to-traefik-2k07</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxmb6saxqvbxp5b4hd4t.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxmb6saxqvbxp5b4hd4t.jpeg" width="800" height="450"&gt;&lt;/a&gt;Migration from Nginx Proxy Manager to Traefik: What you need to consider and what the benefits are. Discover the differences and advantages! 🚀&lt;/p&gt;




&lt;p&gt;If you are migrating from Nginx Proxy Manager to Traefik, you are facing an exciting task that can bring many improvements to your infrastructure. While Nginx Proxy Manager is a proven solution for routing HTTP(S) traffic, Traefik offers a more modern and flexible alternative, especially for dynamic environments such as Docker- or Kubernetes-based systems.&lt;/p&gt;

&lt;p&gt;This is exactly what I did recently and would like to show you the benefits it brings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://traefik.io/traefik/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc8dfaz6omagadx5l96j.png" alt="Preview image" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the switch makes sense 🤔
&lt;/h2&gt;

&lt;p&gt;Nginx Proxy Manager is ideal for users looking for a simple solution for reverse proxy and SSL management. It has a user-friendly web interface that allows you to conveniently manage domains, SSL certificates and services. For smaller projects and simple setups, it's an excellent choice. However, the more complex your environment becomes, the sooner you reach the limits of flexibility and scalability.&lt;/p&gt;

&lt;p&gt;Traefik, on the other hand, has been specially developed for dynamic environments. It is natively capable of interacting with Docker, Kubernetes, Consul and other orchestration solutions, and can automatically perform routing configurations as new services are brought up. This eliminates the need for manual configuration adjustments and makes it particularly interesting if you run many container services. You no longer have to manually enter IP addresses for new services, Traefik simply does this for you automatically.&lt;/p&gt;

&lt;p&gt;Traefik also offers an API that you can access to automate things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/operations/api/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdoc.traefik.io%2Ftraefik%2Fassets%2Fimages%2Flogo-traefik-proxy-logo.svg" alt="Preview image" width="143" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Important aspects when migrating ⚙️
&lt;/h2&gt;

&lt;p&gt;If you want to switch from Nginx Proxy Manager to Traefik, there are a few points you should keep in mind to ensure a smooth migration.&lt;/p&gt;

&lt;h4&gt;
  
  
  SSL management and Let's Encrypt certificates 🔐
&lt;/h4&gt;

&lt;p&gt;Nginx Proxy Manager offers an easy way to manage SSL certificates via the web interface, especially with Let's Encrypt. Traefik also integrates Let's Encrypt natively and offers similar automation. However, with Traefik, certificate management is done via its dynamic configuration. You must ensure that you set the correct labels in the Docker containers or the corresponding annotations in Kubernetes in order to obtain SSL certificates for your domains.&lt;/p&gt;

&lt;p&gt;Example of Docker labels&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traefik.http.routers.my-app.rule=Host(`my-domain.com`)"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traefik.http.routers.my-app.tls=true"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traefik.http.routers.my-app.tls.certresolver=myresolver"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/https/acme/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdoc.traefik.io%2Ftraefik%2Fassets%2Fimages%2Flogo-traefik-proxy-logo.svg" alt="Preview image" width="143" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Dynamic Service Discovery 🔍
&lt;/h4&gt;

&lt;p&gt;One of the main advantages of Traefik over Nginx Proxy Manager is the dynamic service discovery. Traefik actively monitors your Docker or Kubernetes environment and automatically creates routing rules when new containers or pods are started. This is particularly useful if you run many microservices, as you no longer need to write static proxy configurations. Instead, Traefik does this work for you automatically.&lt;/p&gt;

&lt;p&gt;With Traefik, the setup for Docker containers looks very simple once they are configured with the right labels. As soon as a new service starts up, Traefik immediately recognizes it and makes sure it is available under the right domain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpwbsbrpsclp5x2ztymk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpwbsbrpsclp5x2ztymk.png" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/providers/overview/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsmp1noow2a9sqm5b6mx.png" alt="Preview image" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Authentication and security 🔒
&lt;/h4&gt;

&lt;p&gt;Nginx Proxy Manager offers you options to use basic authentication (Basic Auth) or integrated OAuth solutions such as Google OAuth. Traefik also supports this, often in a deeper and more flexible way. It allows you to add custom middlewares, such as authentication mechanisms, IP whitelisting or rate limiting.&lt;/p&gt;

&lt;p&gt;An example of configuring a middleware in Traefik:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;middlewares&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my-auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;basicAuth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to ensure, for example, that sensitive services are only accessible after entering a password.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integration with monitoring and logging 📊
&lt;/h4&gt;

&lt;p&gt;Another big advantage of Traefik is its close integration with monitoring tools such as Prometheus or Grafana. While you often have to manually integrate additional solutions with the Nginx Proxy Manager, Traefik offers out-of-the-box support for metrics and extended logs. This makes it easier for you to keep an eye on the performance of your services and quickly identify problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/observability/overview/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdoc.traefik.io%2Ftraefik%2Fassets%2Fimages%2Flogo-traefik-proxy-logo.svg" alt="Preview image" width="143" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages-of-traefik-versus-nginx-proxy-manager 🌟
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Automatic certificate renewal and management 📜
&lt;/h4&gt;

&lt;p&gt;Traefik takes over the complete management of your SSL certificates via Let's Encrypt, even for multiple domains at the same time. This runs in the background without your intervention. This means that you no longer have to manually renew or reissue certificates, which saves you a lot of effort.&lt;/p&gt;

&lt;h4&gt;
  
  
  Easier scalability 📈
&lt;/h4&gt;

&lt;p&gt;Since Traefik was developed specifically for containerized and dynamic environments, it scales much better as your infrastructure grows. With Nginx Proxy Manager, you would have to manually add every new domain and every new service. With Traefik, all you have to do is start the service - Traefik automatically recognizes it and makes it available under the desired domain. That was one of the main reasons for me to switch.&lt;/p&gt;

&lt;h4&gt;
  
  
  Seamless integration with Docker and Kubernetes 🐳
&lt;/h4&gt;

&lt;p&gt;One clear advantage of Traefik is its native integration with Docker and Kubernetes. While the Nginx Proxy Manager requires manual configuration, Traefik runs directly in these environments and dynamically adjusts its routing configurations without you having to do anything. Especially with a large number of services or an environment that changes frequently, this is a huge advantage.&lt;/p&gt;

&lt;h4&gt;
  
  
  Modern routing with middleware 🛠️
&lt;/h4&gt;

&lt;p&gt;Traefik offers a variety of middleware options that make the routing of your services more flexible and secure. For example, you can configure authentication mechanisms, rate limiting or caching directly in Traefik, which offers you additional layers of security and performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3en2czxa13zr3n825ir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3en2czxa13zr3n825ir.png" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/middlewares/overview/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22p4o99vn3q2o21u68vg.png" alt="Preview image" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Better support for different protocols 🔄
&lt;/h4&gt;

&lt;p&gt;Traefik supports a variety of protocols, not just HTTP and HTTPS. You can also easily run websockets, gRPC and TCP services with Traefik, which Nginx Proxy Manager does not offer in this depth. This makes it the ideal choice for more modern applications that use multiple protocols simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎉
&lt;/h2&gt;

&lt;p&gt;Migrating from Nginx Proxy Manager to Traefik brings you many benefits, especially if you work in a dynamic environment where services change frequently. Traefik is more flexible, scales better and offers a variety of modern features that make it easier for you to manage your services. If you plan the switch carefully, you will quickly realize that it is worth it in the long run.&lt;/p&gt;

&lt;p&gt;Traefik not only offers you the opportunity to make your infrastructure more flexible, but also ensures more automation and less manual intervention. Especially with growing environments or more complex routing and security requirements, it will save you a lot of work.&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>docker</category>
      <category>reverseproxy</category>
      <category>ssl</category>
    </item>
    <item>
      <title>Migration vom Nginx Proxy Manager zu Traefik 🚀</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Wed, 23 Oct 2024 11:11:04 +0000</pubDate>
      <link>https://forem.com/disane/migration-vom-nginx-proxy-manager-zu-traefik-4j84</link>
      <guid>https://forem.com/disane/migration-vom-nginx-proxy-manager-zu-traefik-4j84</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1xs8nq7mhskqryrehlk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1xs8nq7mhskqryrehlk.jpeg" width="800" height="450"&gt;&lt;/a&gt;Migration von Nginx Proxy Manager zu Traefik: Was Du beachten musst und welche Vorteile es gibt. Entdecke die Unterschiede und Vorteile! 🚀&lt;/p&gt;




&lt;p&gt;Wenn Du von Nginx Proxy Manager zu Traefik migrierst, stehst Du vor einer spannenden Aufgabe, die viele Verbesserungen für Deine Infrastruktur mit sich bringen kann. Während Nginx Proxy Manager eine bewährte Lösung für das Routing von HTTP(S)-Verkehr ist, bietet Traefik eine modernere und flexiblere Alternative, besonders für dynamische Umgebungen wie Docker- oder Kubernetes-basierte Systeme.&lt;/p&gt;

&lt;p&gt;Genau das, habe ich vor Kurzem gemacht und möchte dir zeigen, welche Vorteile es mit sich bringt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://traefik.io/traefik/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc8dfaz6omagadx5l96j.png" alt="Preview image" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum der Wechsel sinnvoll ist 🤔
&lt;/h2&gt;

&lt;p&gt;Nginx Proxy Manager ist ideal für Benutzer, die eine einfache Lösung für Reverse Proxy und SSL-Management suchen. Es verfügt über eine benutzerfreundliche Weboberfläche, mit der Du Domains, SSL-Zertifikate und Dienste bequem verwalten kannst. Für kleinere Projekte und einfache Setups ist es eine hervorragende Wahl. Doch je komplexer Deine Umgebung wird, desto eher kommst Du an die Grenzen der Flexibilität und Skalierbarkeit.&lt;/p&gt;

&lt;p&gt;Traefik hingegen ist speziell für dynamische Umgebungen entwickelt worden. Es ist nativ in der Lage, mit Docker, Kubernetes, Consul und anderen Orchestrierungslösungen zu interagieren, und kann automatisch Routing-Konfigurationen vornehmen, sobald neue Dienste hochgefahren werden. Das eliminiert die Notwendigkeit manueller Konfigurationsanpassungen und macht es besonders interessant, wenn Du viele Container-Dienste betreibst. So musst du bei neuen Diensten keine IP-Adressen mehr manuell eintragen, das macht Traefik dann einfach für dich automatisch.&lt;/p&gt;

&lt;p&gt;Traefik bietet auch eine API an, die man ansteuern kann um Dinge automatisiert zu machen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/operations/api/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdoc.traefik.io%2Ftraefik%2Fassets%2Fimages%2Flogo-traefik-proxy-logo.svg" alt="Preview image" width="143" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wichtige Aspekte bei der Migration ⚙️
&lt;/h2&gt;

&lt;p&gt;Wenn Du von Nginx Proxy Manager zu Traefik wechseln möchtest, gibt es einige Punkte, die Du im Auge behalten solltest, um eine reibungslose Migration zu gewährleisten.&lt;/p&gt;

&lt;h4&gt;
  
  
  SSL-Management und Let's Encrypt Zertifikate 🔐
&lt;/h4&gt;

&lt;p&gt;Nginx Proxy Manager bietet eine einfache Möglichkeit, SSL-Zertifikate über die Weboberfläche zu verwalten, insbesondere mit Let's Encrypt. Auch Traefik integriert Let's Encrypt nativ und bietet ähnliche Automatisierungen an. Allerdings läuft bei Traefik die Zertifikatsverwaltung über seine dynamische Konfiguration. Du musst sicherstellen, dass Du die korrekten Labels in den Docker-Containern oder die entsprechenden Annotationen in Kubernetes setzt, um SSL-Zertifikate für Deine Domains zu erhalten.&lt;/p&gt;

&lt;p&gt;Beispiel für Docker-Labels&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traefik.http.routers.my-app.rule=Host(`meine-domain.de`)"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traefik.http.routers.my-app.tls=true"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traefik.http.routers.my-app.tls.certresolver=myresolver"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/https/acme/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdoc.traefik.io%2Ftraefik%2Fassets%2Fimages%2Flogo-traefik-proxy-logo.svg" alt="Preview image" width="143" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Dynamische Service-Discovery 🔍
&lt;/h4&gt;

&lt;p&gt;Einer der Hauptvorteile von Traefik gegenüber Nginx Proxy Manager ist die dynamische Service-Erkennung. Traefik überwacht aktiv Deine Docker- oder Kubernetes-Umgebung und erstellt automatisch Routing-Regeln, wenn neue Container oder Pods gestartet werden. Das ist besonders nützlich, wenn Du viele Microservices betreibst, da Du keine statischen Proxy-Konfigurationen mehr schreiben musst. Stattdessen erledigt Traefik diese Arbeit für Dich automatisch.&lt;/p&gt;

&lt;p&gt;Mit Traefik sieht das Setup für Docker-Container sehr einfach aus, sobald sie mit den richtigen Labels konfiguriert sind. Sobald ein neuer Dienst hochfährt, erkennt Traefik ihn sofort und sorgt dafür, dass er unter der richtigen Domain verfügbar ist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpwbsbrpsclp5x2ztymk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpwbsbrpsclp5x2ztymk.png" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/providers/overview/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsmp1noow2a9sqm5b6mx.png" alt="Preview image" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Authentifizierung und Sicherheit 🔒
&lt;/h4&gt;

&lt;p&gt;Nginx Proxy Manager bietet Dir Optionen, um grundlegende Authentifizierung (Basic Auth) oder integrierte OAuth-Lösungen wie Google OAuth zu verwenden. Traefik unterstützt dies ebenfalls, oft sogar auf tiefere und flexiblere Weise. Es erlaubt Dir, benutzerdefinierte Middlewares hinzuzufügen, wie z.B. Authentifizierungsmechanismen, IP-Whitelisting oder Ratelimiting.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Konfiguration einer Middleware in Traefik:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;middlewares&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;my-auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;basicAuth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit kannst Du beispielsweise sicherstellen, dass sensible Services nur nach Eingabe eines Passworts zugänglich sind.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integration mit Monitoring und Logging 📊
&lt;/h4&gt;

&lt;p&gt;Ein weiterer großer Pluspunkt von Traefik ist seine enge Integration mit Monitoring-Tools wie Prometheus oder Grafana. Während Du beim Nginx Proxy Manager oft manuell zusätzliche Lösungen einbinden musst, bietet Traefik out-of-the-box Unterstützung für Metriken und erweiterte Logs. Dies macht es Dir leichter, die Performance Deiner Dienste im Blick zu behalten und Probleme schnell zu erkennen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/observability/overview/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdoc.traefik.io%2Ftraefik%2Fassets%2Fimages%2Flogo-traefik-proxy-logo.svg" alt="Preview image" width="143" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vorteile von Traefik gegenüber Nginx Proxy Manager 🌟
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Automatische Zertifikatserneuerung und Verwaltung 📜
&lt;/h4&gt;

&lt;p&gt;Traefik übernimmt die komplette Verwaltung Deiner SSL-Zertifikate über Let's Encrypt, und das sogar für mehrere Domains gleichzeitig. Dies läuft im Hintergrund ohne Dein Eingreifen. Das bedeutet, dass Du nicht mehr manuell Zertifikate verlängern oder neu ausstellen musst, was Dir viel Aufwand erspart.&lt;/p&gt;

&lt;h4&gt;
  
  
  Einfachere Skalierbarkeit 📈
&lt;/h4&gt;

&lt;p&gt;Da Traefik speziell für containerisierte und dynamische Umgebungen entwickelt wurde, skaliert es wesentlich besser mit, wenn Deine Infrastruktur wächst. Bei Nginx Proxy Manager müsstest Du manuell jede neue Domain und jeden neuen Dienst hinzufügen. Mit Traefik reicht es, den Dienst zu starten – Traefik erkennt ihn automatisch und stellt ihn unter der gewünschten Domain bereit. Das war für mich einer der Hauptgründe zum Wechsel.&lt;/p&gt;

&lt;h4&gt;
  
  
  Nahtlose Integration mit Docker und Kubernetes 🐳
&lt;/h4&gt;

&lt;p&gt;Ein klarer Vorteil von Traefik ist seine native Integration mit Docker und Kubernetes. Während der Nginx Proxy Manager eine manuelle Konfiguration erfordert, läuft Traefik direkt in diesen Umgebungen und passt seine Routing-Konfigurationen dynamisch an, ohne dass Du etwas tun musst. Gerade bei einer großen Anzahl an Diensten oder einer Umgebung, die sich häufig ändert, ist das ein enormer Vorteil.&lt;/p&gt;

&lt;h4&gt;
  
  
  Modernes Routing mit Middleware 🛠️
&lt;/h4&gt;

&lt;p&gt;Traefik bietet eine Vielzahl von Middleware-Optionen, die das Routing Deiner Dienste flexibler und sicherer machen. Du kannst z.B. Authentifizierungsmechanismen, Ratelimiting oder Caching direkt in Traefik konfigurieren, was Dir zusätzliche Layer an Sicherheit und Performance bietet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3en2czxa13zr3n825ir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3en2czxa13zr3n825ir.png" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.traefik.io/traefik/middlewares/overview/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22p4o99vn3q2o21u68vg.png" alt="Preview image" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Bessere Unterstützung für verschiedene Protokolle 🔄
&lt;/h4&gt;

&lt;p&gt;Traefik unterstützt eine Vielzahl von Protokollen, nicht nur HTTP und HTTPS. Du kannst auch Websockets, gRPC und TCP-Dienste problemlos mit Traefik betreiben, was Nginx Proxy Manager in dieser Tiefe nicht bietet. Das macht es zur idealen Wahl für modernere Applikationen, die mehrere Protokolle gleichzeitig nutzen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit 🎉
&lt;/h2&gt;

&lt;p&gt;Die Migration von Nginx Proxy Manager zu Traefik bringt Dir viele Vorteile, besonders wenn Du in einer dynamischen Umgebung arbeitest, in der sich Dienste oft ändern. Traefik ist flexibler, skaliert besser und bietet eine Vielzahl an modernen Features, die Dir die Verwaltung Deiner Dienste erleichtern. Wenn Du den Umstieg sorgfältig planst, wirst Du schnell merken, dass sich der Wechsel auf lange Sicht lohnt.&lt;/p&gt;

&lt;p&gt;Traefik bietet Dir nicht nur die Möglichkeit, Deine Infrastruktur flexibler zu gestalten, sondern sorgt auch für mehr Automatisierung und weniger manuelle Eingriffe. Besonders bei wachsenden Umgebungen oder komplexeren Anforderungen an Routing und Sicherheit wird es Dir viel Arbeit abnehmen.&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>docker</category>
      <category>reverseproxy</category>
      <category>ssl</category>
    </item>
    <item>
      <title>DKIM, DMARC and SPF: The protective shield for your email communication 🛡️</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sat, 21 Sep 2024 18:03:20 +0000</pubDate>
      <link>https://forem.com/disane/dkim-dmarc-and-spf-the-protective-shield-for-your-email-communication-56b8</link>
      <guid>https://forem.com/disane/dkim-dmarc-and-spf-the-protective-shield-for-your-email-communication-56b8</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxttjtyh6psyuv5sj1p56.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxttjtyh6psyuv5sj1p56.jpeg" width="" height=""&gt;&lt;/a&gt;Protect your email communication! Find out how DKIM, DMARC and SPF protect against spoofing and phishing. 🌐&lt;/p&gt;




&lt;p&gt;Email communication is an indispensable part of our daily lives, both professionally and privately. But precisely because emails are so widespread, they are also a popular target for cyberattacks. To protect email users from phishing, spoofing and other threats, there are mechanisms such as DKIM, DMARC and SPF. But how exactly do these technologies work? And what do they actually protect against?&lt;/p&gt;

&lt;h3&gt;
  
  
  The background to DKIM, DMARC and SPF 📧
&lt;/h3&gt;

&lt;p&gt;To understand why DKIM, DMARC and SPF are so important, let's take a brief look at the problem they are designed to solve. Emails can be spoofed relatively easily because the Simple Mail Transfer Protocol (SMTP), the underlying protocol for sending emails, has no built-in authentication. As a result, attackers can make emails look like they come from trusted senders, when in fact they come from a completely different source.&lt;/p&gt;

&lt;p&gt;This is where DKIM, DMARC and SPF come into play. These technologies complement SMTP and provide additional layers of authentication and validation to verify the authenticity of emails.&lt;/p&gt;

&lt;h3&gt;
  
  
  SPF: The gatekeeper for your domain 🧑‍✈️
&lt;/h3&gt;

&lt;p&gt;Sender Policy Framework (SPF) is a method for authenticating email senders. It allows the owner of a domain to specify which IP addresses are authorized to send emails on behalf of this domain. This allows recipients to check whether an incoming email actually comes from an authorized server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How SPF works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The domain owner publishes an SPF record in the DNS (Domain Name System) of their domain. This record contains a list of IP addresses or networks that are authorized to send emails for this domain.&lt;/li&gt;
&lt;li&gt;When an email arrives, the receiving mail server checks whether the IP address of the sending server is contained in the domain's SPF record.&lt;/li&gt;
&lt;li&gt;If the IP address is authorized, the email is delivered. If it is not authorized, the email may be rejected or marked as potential spam.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mermaid diagram: SPF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cwziwpb3mcm90nemb9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cwziwpb3mcm90nemb9h.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DKIM: The digital signature of your emails ✍️
&lt;/h3&gt;

&lt;p&gt;DomainKeys Identified Mail (DKIM) provides a method to ensure that an email has not been tampered with during transmission. Every outgoing email is provided with a digital signature that can be verified by the receiving server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How DKIM works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sending mail server adds a digital signature to the email. This signature is based on a private key that is only known to the domain owner.&lt;/li&gt;
&lt;li&gt;The receiving mail server can verify this signature with a public key that is published in the domain's DNS.&lt;/li&gt;
&lt;li&gt;If the signature is valid, it is assumed that the email is unchanged and actually originates from the specified domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mermaid diagram: DKIM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtssdvt9i6ts4jtnyp45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtssdvt9i6ts4jtnyp45.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC: The director of your email authentication 🎬
&lt;/h3&gt;

&lt;p&gt;Domain-based Message Authentication, Reporting &amp;amp; Conformance (DMARC) builds on SPF and DKIM and allows domain owners to set policies on how invalid emails should be handled. In addition, DMARC provides a reporting function that allows domain owners to gain insight into abusive email activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How DMARC works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The domain owner publishes a DMARC policy in the DNS that states how emails that do not pass the SPF or DKIM check should be handled (e.g. reject, move to quarantine, etc.).&lt;/li&gt;
&lt;li&gt;When an email is received, the receiving server checks both the SPF and DKIM checks.&lt;/li&gt;
&lt;li&gt;According to the DMARC policy, the email is either delivered, moved to quarantine or rejected.&lt;/li&gt;
&lt;li&gt;The receiving server sends regular reports to the domain owner to inform them of potential abuse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mermaid diagram: DMARC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24u9asr6gr4sb30aw6zs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24u9asr6gr4sb30aw6zs.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Anlage in the DNS server 🌐
&lt;/h3&gt;

&lt;p&gt;In order to use DKIM, DMARC and SPF effectively, these mechanisms must be configured correctly in the DNS server. Here is a brief guide on how this works for each of the technologies, including practical examples.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create SPF record in DNS 🔧
&lt;/h4&gt;

&lt;p&gt;An SPF record is a TXT record that is created in your domain's DNS. This record contains a list of IP addresses or servers that are authorized to send emails on behalf of your domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of an SPF record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 ip4:192.0.2.0/24 include:spf.example.com -all

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=spf1&lt;/code&gt;: Specifies that this is an SPF record.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ip4:192.0.2.0/24&lt;/code&gt;: Allows all IP addresses in the range 192.0.2.0 to 192.0.2.255.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include:spf.example.com&lt;/code&gt;: Also allows the servers defined in the SPF records of the domain &lt;code&gt;example.com&lt;/code&gt; to send emails on behalf of the domain.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-all&lt;/code&gt;: Means that all servers not listed should be considered unauthorized.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Create DKIM record in DNS ✍️
&lt;/h4&gt;

&lt;p&gt;For DKIM, you need a TXT record that is created for a specific selector and the domain. This selector is used in the signature of the email to find the corresponding public key in the DNS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of a DKIM record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s1._domainkey.example.com IN TXT "v=DKIM1; k=rsa; p=MIGfMA0G...AB"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;s1&lt;/code&gt;: The selector that is used when creating the DKIM signature.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_domainkey&lt;/code&gt;: A fixed component of the DKIM record.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;example.com&lt;/code&gt;: Your domain.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v=DKIM1&lt;/code&gt;: Indicates that this is a DKIM record.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;k=rsa&lt;/code&gt;: Indicates that the key is an RSA key.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=MIGfMA0G...AB&lt;/code&gt;: The public key that is published in the DNS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Create DMARC record in DNS 🛡️
&lt;/h4&gt;

&lt;p&gt;A DMARC record is also a TXT record in DNS and specifies how emails that do not pass the SPF or DKIM check should be handled. It also specifies where reports should be sent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of a DMARC record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.example.com IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:forensic-reports@example.com; fo=1"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=DMARC1&lt;/code&gt;: Specifies that this is a DMARC record.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=reject&lt;/code&gt;: Specifies that all emails that do not pass the checks should be rejected.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rua=mailto:dmarc-reports@example.com&lt;/code&gt;: Specifies the email address to which aggregated reports should be sent.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ruf=mailto:forensic-reports@example.com&lt;/code&gt;: Specifies the email address to which forensic reports should be sent.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fo=1&lt;/code&gt;: Requests reports for each individual message that fails the check.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What do DKIM, DMARC and SPF protect against? 🛡️
&lt;/h3&gt;

&lt;p&gt;DKIM, DMARC and SPF protect against a variety of attacks based on spoofed sender addresses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phishing:&lt;/strong&gt; Attackers attempt to steal sensitive information by impersonating trusted senders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spoofing:&lt;/strong&gt; Attackers pretend to send emails from a legitimate domain in order to deceive the recipient.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, these mechanisms do not prevent emails from being sent from legitimate servers but containing malicious content (e.g. malware). Nor can they prevent emails from being sent from a compromised legitimate account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion 🎉
&lt;/h3&gt;

&lt;p&gt;DKIM, DMARC and SPF are essential tools for ensuring the security and integrity of email communication. They ensure that emails actually originate from the specified sender and have not been manipulated en route. However, they are not a panacea and should always be used in the context of other security measures.&lt;/p&gt;

&lt;p&gt;Do you have any questions about DKIM, DMARC or SPF? Leave a comment below!&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>security</category>
      <category>email</category>
      <category>phishing</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>DKIM, DMARC und SPF: Der Schutzschild deiner E-Mail-Kommunikation 🛡️</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sat, 21 Sep 2024 18:01:00 +0000</pubDate>
      <link>https://forem.com/disane/dkim-dmarc-und-spf-der-schutzschild-deiner-e-mail-kommunikation-33db</link>
      <guid>https://forem.com/disane/dkim-dmarc-und-spf-der-schutzschild-deiner-e-mail-kommunikation-33db</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4az73oj6p4qhtkuhvbfi.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4az73oj6p4qhtkuhvbfi.jpeg" width="" height=""&gt;&lt;/a&gt;Schütze deine E-Mail-Kommunikation! Erfahre, wie DKIM, DMARC und SPF vor Spoofing und Phishing schützen. 🌐&lt;/p&gt;




&lt;p&gt;Die E-Mail-Kommunikation ist ein unverzichtbarer Bestandteil unseres täglichen Lebens, sei es beruflich oder privat. Doch gerade weil E-Mails so weit verbreitet sind, sind sie auch ein beliebtes Ziel für Cyberangriffe. Um E-Mail-Nutzer vor Phishing, Spoofing und anderen Bedrohungen zu schützen, gibt es Mechanismen wie DKIM, DMARC und SPF. Doch wie funktionieren diese Technologien genau? Und wovor schützen sie tatsächlich?&lt;/p&gt;

&lt;h3&gt;
  
  
  Der Hintergrund von DKIM, DMARC und SPF 📧
&lt;/h3&gt;

&lt;p&gt;Um zu verstehen, warum DKIM, DMARC und SPF so wichtig sind, werfen wir einen kurzen Blick auf die Problematik, die sie lösen sollen. E-Mails können relativ leicht gefälscht werden, da das Simple Mail Transfer Protocol (SMTP), das zugrunde liegende Protokoll für den E-Mail-Versand, keine eingebaute Authentifizierung besitzt. Das führt dazu, dass Angreifer E-Mails so aussehen lassen können, als kämen sie von vertrauenswürdigen Absendern, obwohl sie in Wirklichkeit von einer ganz anderen Quelle stammen.&lt;/p&gt;

&lt;p&gt;Hier kommen DKIM, DMARC und SPF ins Spiel. Diese Technologien ergänzen SMTP und bieten zusätzliche Schichten der Authentifizierung und Validierung, um die Echtheit von E-Mails zu überprüfen.&lt;/p&gt;

&lt;h3&gt;
  
  
  SPF: Der Türsteher für deine Domain 🧑‍✈️
&lt;/h3&gt;

&lt;p&gt;Sender Policy Framework (SPF) ist eine Methode zur Authentifizierung von E-Mail-Absendern. Es erlaubt dem Inhaber einer Domain, festzulegen, welche IP-Adressen berechtigt sind, E-Mails im Namen dieser Domain zu versenden. Dadurch können Empfänger überprüfen, ob eine eingehende E-Mail tatsächlich von einem autorisierten Server stammt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So funktioniert SPF:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Der Domain-Inhaber veröffentlicht ein SPF-Record im DNS (Domain Name System) seiner Domain. Dieser Record enthält eine Liste von IP-Adressen oder Netzwerken, die berechtigt sind, E-Mails für diese Domain zu senden.&lt;/li&gt;
&lt;li&gt;Wenn eine E-Mail eingeht, prüft der empfangende Mail-Server, ob die IP-Adresse des absendenden Servers im SPF-Record der Domain enthalten ist.&lt;/li&gt;
&lt;li&gt;Ist die IP-Adresse autorisiert, wird die E-Mail zugestellt. Ist sie nicht autorisiert, kann die E-Mail abgelehnt oder als potenzieller Spam markiert werden.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mermaid-Diagramm: SPF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cwziwpb3mcm90nemb9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cwziwpb3mcm90nemb9h.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DKIM: Die digitale Unterschrift deiner E-Mails ✍️
&lt;/h3&gt;

&lt;p&gt;DomainKeys Identified Mail (DKIM) bietet eine Methode, um sicherzustellen, dass eine E-Mail während der Übertragung nicht manipuliert wurde. Hierbei wird jede ausgehende E-Mail mit einer digitalen Signatur versehen, die vom empfangenden Server überprüft werden kann.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So funktioniert DKIM:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Der absendende Mail-Server fügt eine digitale Signatur zur E-Mail hinzu. Diese Signatur basiert auf einem privaten Schlüssel, der nur dem Domain-Inhaber bekannt ist.&lt;/li&gt;
&lt;li&gt;Der empfangende Mail-Server kann diese Signatur mit einem öffentlichen Schlüssel, der im DNS der Domain veröffentlicht ist, verifizieren.&lt;/li&gt;
&lt;li&gt;Wenn die Signatur gültig ist, wird davon ausgegangen, dass die E-Mail unverändert ist und tatsächlich von der angegebenen Domain stammt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mermaid-Diagramm: DKIM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtssdvt9i6ts4jtnyp45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtssdvt9i6ts4jtnyp45.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC: Der Regisseur deiner E-Mail-Authentifizierung 🎬
&lt;/h3&gt;

&lt;p&gt;Domain-based Message Authentication, Reporting &amp;amp; Conformance (DMARC) baut auf SPF und DKIM auf und ermöglicht Domain-Inhabern, Richtlinien festzulegen, wie ungültige E-Mails behandelt werden sollen. Darüber hinaus bietet DMARC eine Reporting-Funktion, die es Domain-Inhabern ermöglicht, Einblick in missbräuchliche E-Mail-Aktivitäten zu erhalten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So funktioniert DMARC:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Der Domain-Inhaber veröffentlicht eine DMARC-Richtlinie im DNS, die besagt, wie E-Mails behandelt werden sollen, die die SPF- oder DKIM-Prüfung nicht bestehen (z.B. ablehnen, in Quarantäne verschieben, usw.).&lt;/li&gt;
&lt;li&gt;Wenn eine E-Mail eingeht, prüft der empfangende Server sowohl die SPF- als auch die DKIM-Prüfung.&lt;/li&gt;
&lt;li&gt;Entsprechend der DMARC-Richtlinie wird die E-Mail entweder zugestellt, in Quarantäne verschoben oder abgelehnt.&lt;/li&gt;
&lt;li&gt;Der empfangende Server sendet regelmäßig Berichte an den Domain-Inhaber, um ihn über potenziellen Missbrauch zu informieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mermaid-Diagramm: DMARC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24u9asr6gr4sb30aw6zs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24u9asr6gr4sb30aw6zs.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Anlage im DNS-Server 🌐
&lt;/h3&gt;

&lt;p&gt;Um DKIM, DMARC und SPF effektiv nutzen zu können, müssen diese Mechanismen korrekt im DNS-Server konfiguriert werden. Hier eine kurze Anleitung, wie das für jede der Technologien funktioniert, inklusive praktischer Beispiele.&lt;/p&gt;

&lt;h4&gt;
  
  
  SPF-Record im DNS anlegen 🔧
&lt;/h4&gt;

&lt;p&gt;Ein SPF-Record ist ein TXT-Record, der im DNS deiner Domain erstellt wird. Dieser Record enthält eine Liste von IP-Adressen oder Servern, die berechtigt sind, E-Mails im Namen deiner Domain zu versenden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel für einen SPF-Record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 ip4:192.0.2.0/24 include:spf.example.com -all

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Erklärung:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=spf1&lt;/code&gt;: Gibt an, dass es sich um einen SPF-Record handelt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ip4:192.0.2.0/24&lt;/code&gt;: Erlaubt alle IP-Adressen im Bereich 192.0.2.0 bis 192.0.2.255.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include:spf.example.com&lt;/code&gt;: Erlaubt auch die Server, die in den SPF-Records der Domain &lt;code&gt;example.com&lt;/code&gt; definiert sind, E-Mails im Namen der Domain zu senden.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-all&lt;/code&gt;: Bedeutet, dass alle nicht aufgeführten Server als nicht autorisiert betrachtet werden sollen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  DKIM-Record im DNS anlegen ✍️
&lt;/h4&gt;

&lt;p&gt;Für DKIM benötigst du einen TXT-Record, der für einen bestimmten Selector und die Domain erstellt wird. Dieser Selector wird in der Signatur der E-Mail verwendet, um den entsprechenden öffentlichen Schlüssel im DNS zu finden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel für einen DKIM-Record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s1._domainkey.example.com IN TXT "v=DKIM1; k=rsa; p=MIGfMA0G...AB"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Erklärung:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;s1&lt;/code&gt;: Der Selector, der bei der Erstellung der DKIM-Signatur verwendet wird.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_domainkey&lt;/code&gt;: Ein fester Bestandteil des DKIM-Records.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;example.com&lt;/code&gt;: Deine Domain.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v=DKIM1&lt;/code&gt;: Gibt an, dass es sich um einen DKIM-Record handelt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;k=rsa&lt;/code&gt;: Gibt an, dass der Schlüssel ein RSA-Schlüssel ist.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=MIGfMA0G...AB&lt;/code&gt;: Der öffentliche Schlüssel, der im DNS veröffentlicht wird.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  DMARC-Record im DNS anlegen 🛡️
&lt;/h4&gt;

&lt;p&gt;Ein DMARC-Record ist ebenfalls ein TXT-Record im DNS und legt fest, wie E-Mails behandelt werden sollen, die die SPF- oder DKIM-Prüfung nicht bestehen. Er gibt auch an, wohin Berichte gesendet werden sollen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel für einen DMARC-Record:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.example.com IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:forensic-reports@example.com; fo=1"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Erklärung:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=DMARC1&lt;/code&gt;: Gibt an, dass es sich um einen DMARC-Record handelt.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=reject&lt;/code&gt;: Legt fest, dass alle E-Mails, die die Prüfungen nicht bestehen, abgelehnt werden sollen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rua=mailto:dmarc-reports@example.com&lt;/code&gt;: Gibt die E-Mail-Adresse an, an die aggregierte Berichte gesendet werden sollen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ruf=mailto:forensic-reports@example.com&lt;/code&gt;: Gibt die E-Mail-Adresse an, an die forensische Berichte gesendet werden sollen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fo=1&lt;/code&gt;: Fordert Berichte für jede einzelne Nachricht an, die die Prüfung nicht besteht.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wovor schützen DKIM, DMARC und SPF? 🛡️
&lt;/h3&gt;

&lt;p&gt;DKIM, DMARC und SPF schützen vor einer Vielzahl von Angriffen, die auf gefälschte Absenderadressen basieren:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phishing:&lt;/strong&gt; Angreifer versuchen, sensible Informationen zu stehlen, indem sie sich als vertrauenswürdige Absender ausgeben.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spoofing:&lt;/strong&gt; Angreifer täuschen vor, E-Mails von einer legitimen Domain zu senden, um den Empfänger zu täuschen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diese Mechanismen verhindern jedoch nicht, dass E-Mails von legitimen Servern gesendet werden, die jedoch schädliche Inhalte enthalten (z.B. Malware). Auch können sie nicht verhindern, dass E-Mails von einem kompromittierten legitimen Account aus gesendet werden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fazit 🎉
&lt;/h3&gt;

&lt;p&gt;DKIM, DMARC und SPF sind essenzielle Werkzeuge, um die Sicherheit und Integrität der E-Mail-Kommunikation zu gewährleisten. Sie stellen sicher, dass E-Mails tatsächlich von den angegebenen Absendern stammen und unterwegs nicht manipuliert wurden. Allerdings sind sie kein Allheilmittel und sollten immer im Kontext anderer Sicherheitsmaßnahmen eingesetzt werden.&lt;/p&gt;

&lt;p&gt;Hast du Fragen zu DKIM, DMARC oder SPF? Hinterlasse gerne einen Kommentar!&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>sicherheit</category>
      <category>email</category>
      <category>phishing</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>The power of the "+" in your email address ✉️</title>
      <dc:creator>Marco</dc:creator>
      <pubDate>Sat, 14 Sep 2024 18:02:46 +0000</pubDate>
      <link>https://forem.com/disane/the-power-of-the-in-your-email-address-1l74</link>
      <guid>https://forem.com/disane/the-power-of-the-in-your-email-address-1l74</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fzoifhy9887osh0n1oq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fzoifhy9887osh0n1oq.jpeg" width="800" height="450"&gt;&lt;/a&gt;Discover how you can track and organize spam with a simple "+" in your email address! ✉️&lt;/p&gt;




&lt;p&gt;Managing emails can be a challenge, especially when you're trying to keep track of different sign-ups, newsletters or other online services. You often end up creating a new email address for each service to keep track or avoid spam. There is a much simpler method that can help you: Using the "+" in your existing email address. In this article, you will learn how this technique works and why it is so effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "+" in email addresses ➕
&lt;/h2&gt;

&lt;p&gt;Many people do not know that you can add a "+" to your address in most email services without this affecting the receipt of messages. Example:&lt;/p&gt;

&lt;p&gt;Suppose your email address is &lt;code&gt;deinname@example.com&lt;/code&gt;. You can extend it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;filename+news@example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filename+shopping@example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filename+social@example.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All emails sent to these addresses will end up in your regular inbox at &lt;code&gt;deinname@example.com&lt;/code&gt;. The text after the "+" is ignored by most email systems so that the emails are delivered correctly. This technique is called "plus addressing" or "subaddressing".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is the "+" ignored? 🤔
&lt;/h2&gt;

&lt;p&gt;The fact that the part of the email address after the "+" is ignored is due to the email standards defined by the Internet Engineering Task Force (IETF). More specifically, this option is based on &lt;strong&gt;RFC 5233&lt;/strong&gt;, which describes how email servers should handle sub-addresses. According to this RFC, email servers should ignore everything after the "+" up to the "@" and deliver the email to the base address.&lt;/p&gt;

&lt;p&gt;The basic idea behind this is that users should be able to better organize and filter emails without this causing additional work on the mail servers. This feature is available with most major email providers such as Gmail, Yahoo and Outlook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc5233" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jwmif7ly4l8ofkuop8v.png" alt="Preview image" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages of plus addressing ✅
&lt;/h2&gt;

&lt;p&gt;Plus addressing offers you numerous advantages:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Better organization of your inbox 🪄&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can filter emails directly into different folders based on the addition after the "+". For example, you can move all emails sent to &lt;code&gt;yourname+shopping@example.com&lt;/code&gt; directly to a shopping folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc17lalp1nc4981pk2ok.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc17lalp1nc4981pk2ok.gif" alt="Loop Cooking GIF" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Traceability of spam 🔎&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you sign up for an online service and later receive spam, you can trace exactly where this spam comes from. For example, &lt;code&gt;filename+newsletter@example.com&lt;/code&gt; could show that this service has passed on your email address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58t7lv0kmjvp29wvs3w0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58t7lv0kmjvp29wvs3w0.gif" alt="spam GIF" width="600" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Avoid sharing 🔒&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By using a specific sub-address, you can prevent your main address from ending up in the hands of data brokers. You can even decide to deactivate certain addresses or move them directly to the spam folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;No creating new email addresses ♥️&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With plus addressing, you no longer need to create a separate email address for each new service. You keep all registrations centrally in one inbox and can still easily distinguish between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should consider ☝🏼
&lt;/h2&gt;

&lt;p&gt;Although plus addressing is very useful, there are a few things you should consider:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Not all services accept plus addresses&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Some online services deliberately block email addresses with "+" signs because they believe them to be throwaway addresses. In such cases, you may have to fall back to the regular address.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Risk of abuse 🏏&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Although it is unlikely, a malicious service could detect that you are using plus addressing and use this information to disrupt your email communications. However, this risk is low and should not deter you from using plus addressing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎉
&lt;/h2&gt;

&lt;p&gt;Plus addressing is a simple and effective way to better organize your email traffic and keep track of where spam messages are coming from. You can use it to increase traceability without having to go to the trouble of constantly creating new email addresses. Try it out and discover how it can make your digital life easier.&lt;/p&gt;




&lt;p&gt;Have you tried this technique or do you have any other tips on how to organize your emails? Let us know in the comments!&lt;/p&gt;




&lt;p&gt;If you like my posts, it would be nice if you follow my &lt;a href="https://blog.disane.dev" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; for more tech stuff.&lt;/p&gt;

</description>
      <category>mailserver</category>
      <category>privacy</category>
      <category>productivity</category>
      <category>spam</category>
    </item>
  </channel>
</rss>
