<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Karsten Reincke, Author at FODINA 4 FOSS</title>
	<atom:link href="https://fodina.de/author/kreincke/feed/" rel="self" type="application/rss+xml" />
	<link>https://fodina.de/author/kreincke/</link>
	<description>a treasure trove for free software, techniques, and ideas</description>
	<lastBuildDate>Sat, 02 Aug 2025 21:54:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>Using a Dell laptop and an Ubuntu computer via the same Dell monitor</title>
		<link>https://fodina.de/dell-kvm-monitor/</link>
					<comments>https://fodina.de/dell-kvm-monitor/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Sat, 02 Aug 2025 20:58:17 +0000</pubDate>
				<category><![CDATA[Reminder]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7934</guid>

					<description><![CDATA[<p>Another question that I unfortunately had to answer myself several times because I am so forgetful: How do I connect my Dell laptop XPS 129240 (WIN11), an Ubuntu machine (24.04), and my Dell curved monitor S3423DWC in a way, that I can use both machines with the same keyboard and monitor via the KVM switch [&#8230;]</p>
<p>The post <a href="https://fodina.de/dell-kvm-monitor/">Using a Dell laptop and an Ubuntu computer via the same Dell monitor</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image"><figure class="alignleft size-medium is-resized is-style-default "><a href="https://fodina.de/wp-content/uploads/2025/08/bulb-pxh-779061-600x400-1.png" data-fancybox><img decoding="async" src="https://fodina.de/wp-content/uploads/2025/08/bulb-pxh-779061-600x400-1-300x200.png" alt="Riding a dead horse" width="100"></a></figure></div>



<p>Another question that I unfortunately had to answer myself several times because I am so forgetful: How do I connect my Dell laptop <em>XPS 129240</em> (WIN11), an Ubuntu machine (24.04), and my Dell curved monitor <em>S3423DWC</em> in a way, that I can use both machines with the same keyboard and monitor via the KVM switch integrated in the Dell monitor? <span id="more-7934"></span></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/dell-kvm-monitor">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li><strong>Preparing the WIN11 computer (Dell laptop)</strong>:
<ul class="wp-block-list">
<li>Connect the keyboard to the Dell monitor via USB‑2/Bluetooth.</li>



<li>Connect the Dell laptop to the Dell monitor via USB‑C cable and start it (<em>WIN11</em>).</li>



<li>Download the setup/installation file for the Dell Display Manager (<code>ddmsetup.exe</code>) from <a href="https://www.dell.com/support/home/de-de/drivers/driversdetails?driverid=g0v75" class="broken_link">https://www.dell.com/support/home/de-de/drivers/driversdetails?driverid=g0v75</a> (version 2.3) and run it as administrator (and save a link in the menu during installation).</li>
</ul>
</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong><a href="https://blog.rolandbaer.ch/2022/08/06/dell-display-manager-ersatz-unter-ubuntu-22-04/">Preparing the Ubuntu computer</a></strong>:
<ul class="wp-block-list">
<li>Connect the Ubuntu computer to the Dell monitor using a USB‑2 / HDMI cable.</li>



<li>Start the Ubuntu machine.</li>



<li><code>sudo apt-get install ddcutil ddcui</code></li>



<li>Start <em>ddui</em>, select <code>View/Capabilities</code> and select input source <code>VCP/Feature 0x60</code>.
<ul class="wp-block-list">
<li><a href="https://askubuntu.com/questions/860761/ubuntu-command-line-to-change-input-source-on-a-display-monitor">Verify</a> <em>0x1b: Unrecognized feature </em>= USB‑C port for the Dell laptop with WIN</li>



<li><a href="https://askubuntu.com/questions/860761/ubuntu-command-line-to-change-input-source-on-a-display-monitor">Verify</a> <em>0x11: HDMI 1</em> = HDMI port of the Ubuntu computer</li>



<li>Check <a href="https://www.dell.com/community/en/conversations/linux-general/dell-display-manager-keyboard-shortcuts-for-kvm-switch-on-linux-ubuntu-for-u3821dw-monitor/6698ead384a7860c8e48bca0" class="broken_link">Dell’s own manual</a></li>
</ul>
</li>



<li>Generate the following Bash script, save it as <code>~/bin/2dell.sh</code> and make it executable.</li>
</ul>
</li>
</ul>



<pre class="wp-block-code"><code>#!/bin/bash

sudo ddcutil setvcp 60 0x1b</code></pre>



<ul class="wp-block-list">
<li><strong>Switch from WIN11 to UBUNTU-24.04</strong>:
<ul class="wp-block-list">
<li>On the Dell-Laptop (WIN11), start <code>ddm</code>, click <em>Burger Menu/KVM-Rubrik</em></li>



<li>Define your own Hotkey and use it</li>



<li>Otherwise start the switch graphically.</li>
</ul>
</li>
</ul>



<p></p>



<ul class="wp-block-list">
<li><strong>Switch from UBUNTU-24.04 to WIN11</strong>:
<ul class="wp-block-list">
<li><code>&gt; ~/bin/2dell.sh</code></li>
</ul>
</li>
</ul>
<p>The post <a href="https://fodina.de/dell-kvm-monitor/">Using a Dell laptop and an Ubuntu computer via the same Dell monitor</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/dell-kvm-monitor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Supressing Suspend-Mode on Dell-Laptops with Ubuntu</title>
		<link>https://fodina.de/suppress-suspend/</link>
					<comments>https://fodina.de/suppress-suspend/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Sat, 02 Aug 2025 18:03:04 +0000</pubDate>
				<category><![CDATA[Reminder]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7917</guid>

					<description><![CDATA[<p>Another question that I unfortunately had to answer myself several times, because I am so forgetful: How can I reliably prevent my Dell Laptop with Ubuntu from going into suspend mode when the lid is closed? I need that feature because my devices use the same Dell screen with … Switching from one machine to [&#8230;]</p>
<p>The post <a href="https://fodina.de/suppress-suspend/">Supressing Suspend-Mode on Dell-Laptops with Ubuntu</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image"><figure class="alignleft size-medium is-resized is-style-default "><a href="https://fodina.de/wp-content/uploads/2025/08/bulb-pxh-779061-600x400-1.png" data-fancybox><img decoding="async" src="https://fodina.de/wp-content/uploads/2025/08/bulb-pxh-779061-600x400-1-300x200.png" alt="Riding a dead horse" width="100"></a></figure></div>



<p>Another question that I unfortunately had to answer myself several times, because I am so forgetful: How can I reliably prevent my Dell Laptop with Ubuntu from going into <em>suspend mode</em> when the lid is closed? I need that feature because my devices use the same Dell screen with  <span id="more-7917"></span> …</p>



<p>Switching from one machine to the other is done via a signal. But a computer in <em>suspend mode</em> would – surprise, surprise – not receive the “it’s your turn”-message. </p>



<p>To solve that issue, we traditionally would modify the GNOME settings under <code>Settings/Power</code> to</p>



<ul class="wp-block-list">
<li><code>Mode = Balanced</code></li>



<li><code>Power Saver = off</code></li>



<li><code>Screen Blank = Never</code></li>



<li><code>Automatic Suspend = off</code></li>
</ul>



<p>But — unfortunately — that does not work on DELL laptops with Ubuntu. Instead, we must use ‘the’ <a href="https://www.dell.com/support/kbdoc/de-de/000179566/anleitung-zur-deaktivierung-des-stand-by-modu-und-konfiguration-der-energieeinstellungen-des-deckels-fuer-ubuntu-oder-red-hat-linux-7-fuer-dell-laptops">Dell-specific method</a>:</p>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li><code>&gt; sudo systemctl restart systemd-logind</code> .</li>



<li><code>&gt; sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target</code></li>



<li><code>&gt; sudo vi /etc/systemd/logind.conf</code></li>



<li>Replace <code>#HandleLidSwitch=suspend</code> by <code>HandleLidSwitch=ignore to do nothing</code></li>



<li>Save the file</li>
</ul>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/suspend-verhindern">de</a> ]</div></div></div></div>
<p>The post <a href="https://fodina.de/suppress-suspend/">Supressing Suspend-Mode on Dell-Laptops with Ubuntu</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/suppress-suspend/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cloning an Ubuntu Instance</title>
		<link>https://fodina.de/cloning-ubuntu/</link>
					<comments>https://fodina.de/cloning-ubuntu/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Fri, 01 Aug 2025 20:57:56 +0000</pubDate>
				<category><![CDATA[Reminder]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7890</guid>

					<description><![CDATA[<p>Another question that I unfortunately had to answer myself several times because I am so forgetful: How do I quickly set up a functionally identical Ubuntu duplicate?1 In the past, we had to fiddle around with dpkg --get-selections and dpkg --set-selections. Today, it’s easier — with apt-clone: Solution</p>
<p>The post <a href="https://fodina.de/cloning-ubuntu/">Cloning an Ubuntu Instance</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image"><figure class="alignleft size-medium is-resized is-style-default "><a href="https://fodina.de/wp-content/uploads/2025/08/bulb-pxh-779061-600x400-1.png" data-fancybox><img decoding="async" src="https://fodina.de/wp-content/uploads/2025/08/bulb-pxh-779061-600x400-1-300x200.png" alt="Don't forget, you might need it later again" width="92"></a></figure></div>



<p>Another question that I unfortunately had to answer myself several times because I am so forgetful: How do I quickly set up a functionally identical Ubuntu duplicate?<sup>1</sup> <a href="https://superuser.com/questions/136498/ubuntu-list-of-packages-installed"><em>In the past</em></a>, we had to fiddle around with <code>dpkg --get-selections</code> and <code>dpkg --set-selections</code>. <em>Today</em>, it’s easier — <a href="https://wiki.ubuntuusers.de/apt-clone/">with <em>apt-clone</em></a>: <span id="more-7890"></span></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/cloning-ubuntu">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li><code>sudo apt-get install openssh-client openssh-sever apt-clone</code> (@Master)</li>



<li>Install the base version of the same Ubuntu Release (@Slave)</li>



<li><code>sudo apt-get install openssh-client openssh-sever apt-clone</code> (@Slave)</li>



<li><code>sudo apt-clone clone .</code> (@Master)</li>



<li><code>scp apt-clone-state-[Master].tar.gz [Slave]</code> (@Master)</li>



<li><code>sudo apt-clone restore apt-clone-state-[Master].tar.gz</code> (@Slave)</li>
</ul>
<p>The post <a href="https://fodina.de/cloning-ubuntu/">Cloning an Ubuntu Instance</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/cloning-ubuntu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Customized Colors With bootScore</title>
		<link>https://fodina.de/customized-colors/</link>
					<comments>https://fodina.de/customized-colors/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Wed, 08 May 2024 17:04:11 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7797</guid>

					<description><![CDATA[<p>As a “powerful, free Bootstrap starter theme for WordPress”, bootScore uses the color concept of Bootstrap by marking up its elements accordingly. Consequently, each bootScore instance initially starts with the same outfit. However, it also offers techniques to modify the default design so that a web designer can define and implement her customized colors in [&#8230;]</p>
<p>The post <a href="https://fodina.de/customized-colors/">Customized Colors With bootScore</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>As a “powerful, free Bootstrap starter theme for WordPress”, <a href="https://bootscore.me/">bootScore</a> uses <a href="https://getbootstrap.com/docs/5.0/utilities/colors/">the color concept of Bootstrap</a> by marking up its elements accordingly. Consequently, each bootScore instance initially starts with the same outfit. However, it also offers techniques to modify the default design so that a web designer can define and implement her customized colors in and with bootScore:<span id="more-7797"></span></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/farbkonzept">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li><strong>Define the appearance of your site</strong>.</li>



<li><strong>Select the appropriate Bootstrap color clusters</strong>.</li>



<li><strong>Rewrite the function colors accordingly</strong>.</li>



<li><strong>Define your own CSS classes according to our goals</strong>.</li>



<li><strong>Assign these classes to the intended elements of your site</strong>.</li>
</ul>



<h2 class="wp-block-heading"><i class=" fa-regular fa-lightbulb"></i> Background</h2>



<p><a href="https://getbootstrap.com/docs/5.1/customize/color/">Bootstrap has divided the RGB color space into 10 color clusters</a>: Blau (<code class="bsblue">blue</code>), Indigo (<code class="bsindigo">indigo</code>), Violett (<code class="bspurple">purple</code>), Rosa (<code class="bspink">pink</code>), Rot (<code class="bsred">red</code>), Orange (<code class="bsorange">orange</code>), Gelb (<code class="bsyellow">yellow</code>), Grün (<code class="bsgreen">green</code>), Petrol (<code class="bsteal">teal</code>), Cyan (<code class="bscyan">cyan</code>), Grau (<code class="bsgray">gray</code>).Blue (<code>blue</code>), Indigo (<code>indigo</code>), Violet (<code>purple</code>), Pink (<code>pink</code>), Red (<code>red</code>), Orange (<code>orange</code>), Yellow (<code>yellow</code>), Green (<code>green</code>), Petrol (<code>teal</code>), Cyan (<code>cyan</code>), Gray (<code>gray</code>). 

Each cluster starts with a corresponding light color and goes 9 steps up to a corresponding almost black color. The colors are defined as SASS variables, following the same pattern for each cluster. For example, we can access a 

<code class="cdg100">$green-100</code>, <code class="cdg200">$green-200</code>, <code class="cdg300">$green-300</code>, <code class="cdg400">$green-400</code>, <code class="cdg500">$green-500</code>, <code class="cdg600">$green-600</code>, <code class="cdg700">$green-700</code>, <code class="cdg800">$green-800</code>, <code class="cdg900">$green-900</code>, where <code class="cdg">$green</code> corresponds to the color <code class="cdg500">$green-500</code>.</p>



<p>If we want to use these colors in one of our elements, we define a CSS class like <code>.cdg600 { color: $green-600; }</code> in our child theme file <code>scss/bscore_custom.scss</code> and assign it to the intended HTML element as herein <code class="cdg600">&lt;code class="cdg600"&gt;$green-600&lt;/code&gt;</code>. Although this technique narrows the RGB color space, it makes it easier for us to create color-differentiated yet coordinated themes.</p>



<p>In addition to <a href="https://getbootstrap.com/docs/5.2/utilities/colors/">the purely technical color treatment</a>, Bootstrap also breaks new ground conceptually: There would be — so the idea — cross-site communicative tasks that are (can be) performed by different elements of a site. Bootstrap allows you to assign typical “functional colors” to these functional elements. Eventually, the web designer decides which elements of a site take on which function — and assigns them the corresponding “functional color”.</p>



<p>Specifically, Bootstrap assumes that there are typically (several) elements in sites that signal success, deter, warn, or inform. Or that there are primary, secondary, or tertiary elements<sup><a href="https://fodina.de/customized-colors/#footnote_0_7797" id="identifier_0_7797" class="footnote-link footnote-identifier-link" title="which probably refer to different degrees of importance">1</a></sup>, dark or light elements. Bootstrap defines ‘functional colors’ for these cross-page communicative functions. The corresponding <a href="https://getbootstrap.com/docs/5.1/customize/color/">Bootstrap-color-Howto</a> shows the default assignment of these ‘functional colors’.</p>



<p>Hence, a Bootstrap-based theme only needs to mark up its elements according to the intended functions with the associated CSS classes to implement a minimal consistent color concept. This is provided by <em>bootScore</em>. However, it uses the default function colors of <em>Bootstrap</em>. Ultimately, this results in a rather ‘colorful’ color concept. However, we can align the colors by overwriting CSS definitions of the ‘function classes’ and thus transferring the conceptually appropriate color to all correspondingly marked elements. Bootscore <a href="https://bootscore.me/documentation/theme/bootstrap-css-sass/">demonstrates this approach</a> by switching the primary color from <em>blue</em> to <em>red</em> — with the help of the ‘command’ <code>$primary:#FF0000;</code> in the file <code>bscore_variables.scss</code>.</p>



<p>However, we have to explicitly assign the value of the desired color instead of using one of the variables from the color clusters defined by Bootstrap. That’s not what we actually want. Intuitively we would write <code>$primaty:$red;</code>. Unfortunately, that is not possible because the bootScore file <code>bscore_variables.scss</code> is loaded before the corresponding Bootstrap file.<sup><a href="https://fodina.de/customized-colors/#footnote_1_7797" id="identifier_1_7797" class="footnote-link footnote-identifier-link" title="bootScore says that by doing so it follows the Bootstrap guideline.">2</a></sup> Thus, for customizing the functional colors defined by Bootstrap and used by bootScore, we need to overwrite the existing definitions where we explicitly use the values of the intended cluster colors. To do that, we use our file <em>bscore_variables.scss</em> in our child theme.</p>



<p>However, redefining a function color implicitly also adjusts the dependent colors: If we set the primary color to red, the links become red, the background color of the badges becomes a lighter red, and their link text a darker red. But, bootScore ‘only’ passes the decisions of Bootstrap through.<sup><a href="https://fodina.de/customized-colors/#footnote_2_7797" id="identifier_2_7797" class="footnote-link footnote-identifier-link" title="Moreover, asked which element has got which function, bootScore recommends trying it out.">3</a></sup></p>



<p>As compensation, we can then use all the predefined Bootstrap variables in our own CSS definitions we gather in our bootScore file <code>bscore_custom.scss</code>. Moreover: we can assign the CSS classes predefined by Bootstrap <code>(text|bg|...)-(primary|secondary|...|danger|...'</code> directly to our HTML elements for functionally coloring them according to our concept. And even further and finer: In our file <code>bscore_custom.scss</code>, we can also overwrite existing classes — such as the CSS class <code>card</code> by SASS-oriented definitions in the command <code>card { backgroundcolor: var(--#{$prefix}dark);</code> to get a black background.<sup><a href="https://fodina.de/customized-colors/#footnote_3_7797" id="identifier_3_7797" class="footnote-link footnote-identifier-link" title="or however we've defined the function color 'dark'">4</a></sup> This would ‘darken’ all the cards in our overview file.<sup><a href="https://fodina.de/customized-colors/#footnote_4_7797" id="identifier_4_7797" class="footnote-link footnote-identifier-link" title="Admittedly, this could also be done more simply, namely with the statement .card { backgroundcolor: $dark}">5</a></sup></p>



<p>However, because we often don’t want to change all the elements that are marked with predefined classes, we end up using the traditional method again: we define new classes, using colors from the bootstrap clusters, and then assign them to the elements we intend to use in the templates. And how do we find these? By studying the source code of our previous bootscore pages — and trying things out.</p>



<p>To make a long story short: For creating a unified color concept, we must</p>



<ol class="wp-block-list">
<li><strong>define our design goals</strong> — for example:
















<ul class="wp-block-list">
<li>The site should appear green-white-grey. =&gt; To get that, add to your file <code>bscore_custom.scss</code>
<ul class="wp-block-list">
<li><code>$primary: #146c43; // $green-600</code></li>



<li><code>$secondary: #6c757d; // predefined value of $gray-600</code></li>



<li><code>$info: #0d6efd; // predefined value of $blue-500</code></li>
</ul>
</li>



<li>Prominent elements should appear purple (or dark red). =&gt; To get that, add to your file <code>bscore_custom.scss</code>
<ul class="wp-block-list">
<li><code>$danger: #520dc2; // predefined value of $indigo-600</code></li>



<li><code>$warning: #8540f5; // predefined value of $indigo-400</code></li>



<li><code>$success: #20c997; // predefined value of $teal-500</code></li>
</ul>
</li>



<li>Secondary text should be legibly grayed out.</li>



<li>The white article teasers should have a faint green border. =&gt; To get that, add to your file <code>bscore_custom.scss</code>
<ul class="wp-block-list">
<li><code>.card { border-color: $green-600; }</code></li>
</ul>
</li>



<li>The teaser cards on our landing page should be presented on a slightly green background. =&gt; To get that, add to your file <code>bscore_custom.scss</code>

<ul class="wp-block-list">
<li><code>.page-template-mylap , .hfeed { background-color: $blue-100;}</code></li>
</ul>
</li>



<li>The header and footer should continue to be gray, as it is by default designed by bootScore</li>
</ul>



</li><li><strong>select the Bootstrap color clusters</strong> we want to use (here: the clusters blue, purple, and <em>grey</em>).</li>



<li><strong>rewrite the functional colors accordingly</strong> — in our <code>bscore_variables.scss</code> file.<sup><a href="https://fodina.de/customized-colors/#footnote_5_7797" id="identifier_5_7797" class="footnote-link footnote-identifier-link" title="as shown in the table">6</a></sup></li>



<li><strong>define your own CSS classes according to our goals</strong> — in our <code>bscore_custom.scss</code> file.</li>



<li><strong>assign these classes to the intended elements of your site</strong>.<sup><a href="https://fodina.de/customized-colors/#footnote_6_7797" id="identifier_6_7797" class="footnote-link footnote-identifier-link" title="as described above">7</a></sup></li>

</ol>



<figure class="wp-block-table" align="center"><table><tbody>
  <tr><td class="bg-primary"><span class="text-white">CSS-class: bg-primary</span></td>
  <td><span class="text-primary">CSS-class: text-primary</span></td>
</tr>
  <tr><td class="bg-secondary"><span class="text-white">CSS-class: bg-secondary</span></td>
<td><span class="text-secondary">CSS-class: text-secondary</span></td>
</tr>

  <tr><td class="bg-success"><span class="text-white">CSS-class: bg-success</span></td>
<td><span class="text-success">CSS-class: text-success</span></td>
</tr>
  <tr><td class="bg-info"><span class="text-white">CSS-class: bg-info</span></td>
<td><span class="text-info">CSS-class: text-info</span></td>
</tr>
  <tr><td class="bg-warning"><span class="text-white">CSS-class: bg-warning</span></td>
<td><span class="text-warning">CSS-class: text-warning</span></td>
</tr>
  <tr><td class="bg-danger"><span class="text-white">CSS-class: bg-danger</span></td>
<td><span class="text-danger">CSS-class: text-danger</span></td>
</tr>
  <tr><td class="bg-dark"><span class="text-white">CSS-class: bg-dark</span></td>
<td><span class="text-dark">CSS-class: text-dark</span></td>
</tr>
  <tr><td class="bg-light"><span class="text-black">CSS-class: bg-light</span></td>
<td class="bg-dark"><span class="text-light">CSS-class: text-light</span></td>
</tr>
</tbody></table></figure>


<hr class="wp-block-separator has-alpha-channel-opacity">
<h5 class="wp-block-heading"><i class="fa-solid fa-road"></i> And how does this …</h5>
  <p class="myPageContext">… support our 
  <a href="/bootscore-migration/">migration</a> to 
  <a href="https://bootscore.me/">bootScore</a>? Well,
  once started with <a href="/pimp-your-bootscore/">improving</a> the
  <a href="/speed-up-images">image handling</a>, a web designer will 
  also notice the <a href="/blurred-featured-images/">blurred ‘featured images’</a> 
  of bootScore. She will <a href="/larger-image-squares/">try</a> and 
  <a href="/less-blurred-images/">refine</a> solutions. And she may also tackle them 
  <a href="/without-any-blurred-images/">with new HTML‑5 techniques</a>. Because with 
  that, <a href="/image-databases/">a fancier image strategy</a> combined 
  with <a href="/picture-credit-page/">an integrated license fulfillment process</a>
  and its own <a href="/logos-and-favicons/">logo</a> will really make sense.
  However, pictures bring colors to reading. So they should be integrated into 
  <a href="}/color-concept">a customized color concept</a>. 
  This post also contributes something to this topic.
  </p><hr class="wp-block-separator has-alpha-channel-opacity">

<ol class="footnotes"><li id="footnote_0_7797" class="footnote">which probably refer to different degrees of importance</li><li id="footnote_1_7797" class="footnote">bootScore says that by doing so it follows the Bootstrap guideline.</li><li id="footnote_2_7797" class="footnote">Moreover, asked which element has got which function, bootScore recommends trying it out.</li><li id="footnote_3_7797" class="footnote">or however we’ve defined the function color ‘dark’</li><li id="footnote_4_7797" class="footnote">Admittedly, this could also be done more simply, namely with the statement <code>.card { backgroundcolor: $dark}</code></li><li id="footnote_5_7797" class="footnote">as shown in the table</li><li id="footnote_6_7797" class="footnote">as described above</li></ol><p>The post <a href="https://fodina.de/customized-colors/">Customized Colors With bootScore</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/customized-colors/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cookies — properly managed by bootScore</title>
		<link>https://fodina.de/properly-managed-cookies/</link>
					<comments>https://fodina.de/properly-managed-cookies/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Wed, 04 Oct 2023 19:01:35 +0000</pubDate>
				<category><![CDATA[Compliance]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[bootScore]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7709</guid>

					<description><![CDATA[<p>Displaying an appropriate cookie dialog is one thing. Giving it a real meaning is another. Because asking permission alone is not enough. We also need to evaluate the responses: We must only store those cookies on our reader’s computers they — or the law — have consented to. A JavaScript function that implements this requirement [&#8230;]</p>
<p>The post <a href="https://fodina.de/properly-managed-cookies/">Cookies — properly managed by bootScore</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Displaying an appropriate cookie dialog is one thing. Giving it a real meaning is another. Because asking permission alone is not enough. We also need to evaluate the responses: We must only store those cookies on our reader’s computers they — or the law — have consented to. A JavaScript function that implements this requirement sets the semantics of the cookie dialog. Based on such a function, we use properly managed cookies.<span id="more-7709"></span></p>



<p>The plugin <a href="https://bootscore.me/documentation/plugin/bs-cookie-settings/">bs-cookie-settings</a> itself only provides us with the cookie query. <a href="https://fodina.de/properly-used-cookies/">How to activate this</a>, I had already described in a previous post. However, the bootScore developers leave the implementation of the corresponding semantics to the <a href="https://github.com/orgs/bootscore/discussions/559">respective web designer</a>. Here is a variant that can be freely reused:</p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/sauberes-cookie-management">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li>Download the <a href="https://github.com/js-cookie/js-cookie">JS cookie library</a> from <a href="https://www.cdnpkg.com/js-cookie/file/js.cookie.min.js/" class="broken_link">cdnpkg.com</a> (or wherever) and place it (unpacked) under the name   <code>js/js.cookie.min.js</code>  into your child-theme folder.</li>



<li>In your file <code>functions.php</code> extend the function <code>bootscore_child_enqueue_styles()</code> by the line</li>
</ul>



<pre class="wp-block-code"><code>wp_enqueue_script('js-cookie',get_stylesheet_directory_uri().'/js/js-cookie-min.js', false, '', true););</code></pre>



<ul class="wp-block-list">
<li>Expand the file <code>js/custom.js</code> of your child theme in the following manner:</li>
</ul>



<pre class="wp-block-code"><code>jQuery(function ($) {

  $(document).ready(function(){
    const bsCookieSettings='bs_cookie_settings';
    const analytics = 'analytics';
    const advertising = 'advertising';
    const analyticDemoCookie='bsAnalyticCookie';
    const advertisingDemoCookie='bsAdvertisingCookie';
    const necessaryDemoCookie='bsNecessaryCookie';
    const demoCookieValue='demo-cookie';

    // alert("adding cookie writing algorithm");
    const bsv=Cookies.get(bsCookieSettings);
    if (bsv) {
      const allowedCookies=JSON.parse(bsv);
      // alert(allowedCookies.level);

      if (allowedCookies.level.includes(analytics)) {
        // alert("writing analytic cookies");
        if (!(Cookies.get(analyticDemoCookie))) { 
          Cookies.set(analyticDemoCookie, demoCookieValue, { expires: 100, path: '/' });
        };
      };
      if (allowedCookies.level.includes(advertising)) { 
        // alert("writing advertising cookies"); 
        if (!(Cookies.get(advertisingDemoCookie))) { 
          Cookies.set(advertisingDemoCookie, demoCookieValue, { expires: 10, path: '/' });
        };
      };
      // alert("writing necessary cookies"); 
      if (!(Cookies.get(necessaryDemoCookie))) { 
        Cookies.set(necessaryDemoCookie, demoCookieValue, { expires: 14, path: '/' });
      };
    };
  });

  // Do your other stuff here

}); // jQuery End</code></pre>



<h2 class="wp-block-heading"><i class=" fa-regular fa-lightbulb"></i> Background</h2>



<p>We could set and <a href="https://www.w3schools.com/js/js_cookies.asp">evaluate cookies with native JavaScript</a>. Nevertheless, it’s easier with ready-made libraries. WordPress already <a href="https://wpengine.com/resources/how-to-add-jquery-wordpress-theme/">brings jQuery with it</a>. For using that, bootScore offers us <a href="https://bootscore.me/documentation/bootscore-child/#JavaScript">a way to add custom JavaScript/jQuery functions</a> to our bootScore child theme.</p>



<p>There used to be a <a href="https://plugins.jquery.com/cookie">real jQuery-Cookie-Plugin</a> for cookie management. This has since been archived and migrated to <a href="https://github.com/js-cookie/js-cookie">an independent js-cookie-JavaScript</a> library. To use that, we must <a href="https://www.cdnpkg.com/js-cookie/file/js.cookie.min.js/" class="broken_link">download it</a> and place it into the JavaScript folder of our child theme — under the name <code>js/js.cookie.min.js</code>. As described above, we also must enforce the function <code>bootscore_child_enqueue_styles()</code> of our file <code>functions.php</code> to load that library.</p>



<p>Eventually, we should implement an algorithm for evaluating the cookie settings by expanding the file <code>js/custom.js</code>.  That algorithm should work like this:</p>



<ul class="wp-block-list">
<li>First, we try to read the cookie bootScore-Cookie-plugin stores under the name <code>bs_cookie_settings</code>.</li>



<li>If it doesn’t exist yet, our reader hasn’t agreed to use cookies. So we are not allowed to write any yet.<sup><a href="https://fodina.de/properly-managed-cookies/#footnote_0_7709" id="identifier_0_7709" class="footnote-link footnote-identifier-link" title="Yes, formally we may write the technically necessary cookies without our reader's consent. But before we do that, we must inform her that we are going to do so. And the only way to convince ourselves that she has indeed read it is to wait for the written cookie.">1</a></sup></li>



<li>Once our reader has ‘confirmed’ the cookie dialog to whatever extent, the bs cookie plugin stores the cookie <code>bs_cookie_settings</code>. Its value contains a JSON object:</li>
</ul>



<pre class="wp-block-code"><code>{  "level": 
    [   "necessary",
        "analytics",
        "advertising"
    ],
    "revision":0,
    "data":null,
    "rfc_cookie":false
}</code></pre>



<ul class="wp-block-list">
<li>Thus, we must parse that JSON object before we can — on the JavaScript level — access the list of allowed cookie groups via <code>allowedCookies.level</code> and use the method <code>includes</code> of a list object to query which of the cookie groups <em>necessary</em>, <em>analytics, </em>and /or <em>advertising </em>our reader has allowed us to write.</li>



<li>And for each allowed group we now may write the corresponding cookies.<sup><a href="https://fodina.de/properly-managed-cookies/#footnote_1_7709" id="identifier_1_7709" class="footnote-link footnote-identifier-link" title="whereby we refer to the legal permission for the technically necessary cookies">2</a></sup></li>
</ul>



<p>And a last hint: JavaScript modifies pages dynamically. But the cache stores the respective results. Thus, sometimes it’s helpful if we delete the cache for getting the results of our modifications run.</p>


<hr class="wp-block-separator has-alpha-channel-opacity">
<h5 class="wp-block-heading"><i class="fa-solid fa-road"></i> And how does this …</h5>
  <p class="myPageContext">… support our 
  <a href="http://fodina.de/bootscore-migration/">migration</a> to 
  <a href="https://bootscore.me/">bootScore</a>? Well,
  besides her <a href="http://fodina.de/pimp-your-bootscore/">normal design work</a>,
  the web-designer must deal with some legal requirements, as — for example — 
  those of the <a href="http://fodina.de/privacy-dsgvo/">DSGVO privacy</a>, of having a 
  <a href="http://fodina.de/properly-used-cookies/">cookie consent dialog</a> 
  and the respective <a href="http://fodina.de/properly-managed-cookies/">semantic</a>, 
  of having a <a href="http://fodina.de/ds-compliance/">data privacy page</a>,
  an <a href="http://fodina.de/imprint/">imprint</a>, 
  an <a href="http://fodina.de/picture-credits/">image reference page</a>, and
  a <a href="http://fodina.de/foss-compliance/">FOSS compliance page</a>.
  This post shall support you to manage your legal issues. 
  </p><hr class="wp-block-separator has-alpha-channel-opacity">

<ol class="footnotes"><li id="footnote_0_7709" class="footnote">Yes, formally we may write the technically necessary cookies without our reader’s consent. But before we do that, we must inform her that we are going to do so. And the only way to convince ourselves that she has indeed read it is to wait for the written cookie.</li><li id="footnote_1_7709" class="footnote">whereby we refer to the legal permission for the technically necessary cookies</li></ol><p>The post <a href="https://fodina.de/properly-managed-cookies/">Cookies — properly managed by bootScore</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/properly-managed-cookies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cookies — properly used in bootScore</title>
		<link>https://fodina.de/properly-used-cookies/</link>
					<comments>https://fodina.de/properly-used-cookies/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Fri, 15 Sep 2023 10:03:01 +0000</pubDate>
				<category><![CDATA[Compliance]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[bootScore]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7616</guid>

					<description><![CDATA[<p>Without permission, we may not write cookies to the hard disk of our reader. Because it belongs to her, not to us. By accessing our site, she has already implicitly given her consent to store our technically necessary cookies. Because they are technically necessary to read our post. But she must explicitly permit us to [&#8230;]</p>
<p>The post <a href="https://fodina.de/properly-used-cookies/">Cookies — properly used in bootScore</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.cookiebot.com/en/cookie-law/">Without permission, we may not write cookies to the hard disk of our reader</a>. Because it belongs to her, not to us. By accessing our site, she has already implicitly given her consent to store our technically necessary cookies. Because they are technically necessary to read our post. But she must explicitly permit us to save the other cookies on her computer before we are going to do so. Moreover, we must have enabled her to query what these cookies are for before we offer her to answer our request. That’s the meaning if we talk about properly used cookies.<span id="more-7616"></span></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/saubere-cookie-nutzung">de</a> ]</div></div></div></div>



<p>For this, <a href="https://bootscore.me/">bootScore</a> offers us a configurable <a href="https://bootscore.me/documentation/plugin/bs-cookie-settings/">cookie approval dialogue</a> evaluated by the <a href="https://bootscore.me/#download">bsCookie-plugin</a>:</p>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li>Download <a href="https://bootscore.me/#download">bsCookie</a>.</li>



<li>Install the zip file via the plugin management of your WordPress backend.</li>



<li>Determine the cookies you want to install on your reader’s computer.<sup><a href="https://fodina.de/properly-used-cookies/#footnote_0_7616" id="identifier_0_7616" class="footnote-link footnote-identifier-link" title="We have to keep in mind that our plugins can also try to store cookies. So it's not enough to just look for the corresponding JavaScript commands in our own posts and pages">1</a></sup></li>



<li>Assign each of these cookies to one of the groups ‘necessary’<sup><a href="https://fodina.de/properly-used-cookies/#footnote_1_7616" id="identifier_1_7616" class="footnote-link footnote-identifier-link" title="Cookies that we assign to this group will lastly be placed on our reader's hard drive even without explicit consent, precisely because they are technically necessary. So we must be able to prove if necessary that these cookies are indeed technically necessary.">2</a></sup>, ‘advertising’ or ‘analytics’.</li>



<li>In the dialog ‘Appearance/Widgets’ drag a widget ‘Customer HTML’ into the widget group <em>Footer‑4</em>.</li>



<li>Enter the script lines into that sub-widget as offered by <a href="https://bootscore.me/documentation/plugin/bs-cookie-settings/">bsCookie documentation</a>.</li>



<li>For each of your plugins add an entry into the corresponding section.</li>



<li>Link your privacy page into the dialog by replacing <em>#yourprivacypolicy</em> accordingly.</li>



<li>Translate the texts into the language of your site (or create an additional entry according to your multilingual strategy).</li>
</ul>



<h2 class="wp-block-heading"><i class=" fa-regular fa-lightbulb"></i> Background</h2>



<p>Asking for permission to write cookies via a dialogue is only one side of the coin. Cookies can also store (personal) (identification) data. So, the respective web server can ask for that information and hand it over to third parties. Hence, we must mention such cookies in our <a href="https://fodina.de/ds-compliance/">data protection concept</a> additionally. To enable our readers to call this page directly from the cookie consent dialogue, the <em>bsCookie</em> dialogue text contains a link whose value <em>#yourprivacypolice</em> we should aling accordingly.</p>



<p>It has become a good tradition to group cookies functionally and to ask once for the complete group whether we may file the respective cookies. That’s legally not necessary: We could also let the use of cookies agree or disagree quite generally.<sup><a href="https://fodina.de/properly-used-cookies/#footnote_2_7616" id="identifier_2_7616" class="footnote-link footnote-identifier-link" title="However, greater granularity is in our interest. Because if a reader doesn't want one thing - e.g. advertising - she could still allow the other - e.g. analytics. That way, we would still learn at least a part of what we hoped to learn overall.">3</a></sup> Or we could make every single cookie selectable or deselectable — which would overload the dialogue.</p>



<p>However, at first, we need to know which cookies our site writes and what the cookies actually do. Our browsers can support us. For example, by means of its ‘Privacy and Security’ dialog. Or with the help of a browser plugin<sup><a href="https://fodina.de/properly-used-cookies/#footnote_3_7616" id="identifier_3_7616" class="footnote-link footnote-identifier-link" title="e.g. with the Cookie Editor">4</a></sup>, which shows directly for each called site/page, which cookies have been written by it. But what our cookies do, we have to determine separately.</p>



<p>Once we have grouped our cookies functionally, we only need to create the appropriate groups as sections in the bsCookie dialog. Then we must insert for each cookie — associated with that group — an entry in the respective section. For the three common groups ‘necessary’, ‘advertising’, and ‘analytics’ <em>bsCookie</em> already provides the respective code. If these groups fit our needs, it is sufficient for us  to describe the cookies in and with the single entries. Assuming we wanted to get permission to write the three cookies <em>necessaryBsCookie</em>, <em>advertisingBsCookie</em>, and <em>analizingBsCookie</em>, the JavaScript code of the bsCookie consent dialogue should look like this:</p>



<pre class="wp-block-code"><code>&lt;script&gt;
  // Init
  window.addEventListener('load', function () {

    // obtain plugin
    var cc = initCookieConsent();

    // run plugin with your configuration
    cc.run({
      current_lang: 'en',
      autoclear_cookies: true,
      page_scripts: true,

      languages: {
        'en': {
          consent_modal: {
            title: 'Cookie Consent Request',
            description: 
'We use cookies to remember and reuse your preferences for future visits. By clicking “Accept all”, you permit us to use all cookies, technically necessary as well as functionally helpful. By clicking “necessary only”, you forbid us to use the functionally helpful, but technically not necessary cookies. For a more detailed consent, visit &lt;a data-bs-toggle="modal" href="#bs-cookie-modal"&gt;Cookie Settings&lt;/a&gt;.',
            primary_btn: {
              text: 'accept all',
              role: 'accept_all'
            },
            secondary_btn: {
              text: 'necessary only',
              role: 'accept_necessary'
            }
          },

          settings_modal: {
            title: 'Cookie settings',
            save_settings_btn: 'Save settings',
            accept_all_btn: 'accept all',
            reject_all_btn: 'necessary only',
            close_btn_label: 'close',
            cookie_table_headers: [
              { col1: 'Name' },
              { col2: 'Domain' },
              { col3: 'Expiration' },
              { col4: 'Description' }
            ],
            blocks: [
              {
                title: 'Cookie usage',
                description: 
'We use cookies to provide core website functions and to enhance your reading experience. For each category, you can choose to use them or not. For more details about cookies and other sensitive data, please read our &lt;a href="https://karsten-reincke.de/datenschutz"&gt;Privacy Policy&lt;/a&gt;.'
              }, {
                title: 'Necessary',
                description: 
'These cookies are essential for our website. Without them, the website would not work properly',
                toggle: {
                  value: 'necessary',
                  enabled: true,
                  readonly: true          // cookie categories with readonly=true are all treated as "necessary cookies"
                },
                cookie_table: [
                  {
                    col1: 'bs_cookie_settings',
                    col2: 'bootScore.me',
                    col3: 'deleted if your session becomes invalid',
                    col4: 
'cookie into which bootScore and the plugin bsCookies stores your cookie preferences',
                    is_regex: false
                  },
                  {
                    col1: 'nec­es­saryB­sCook­ie', 
                    col2: 'https://karsten-reincke.de',
                    col3: 'next 100 days',
                    col4: 'demo cookie of "pimp your BootScore"',
                    is_regex: false
                  },                 
                ]
              }, {
                title: 'Analytics',
                description: 
'These cookies allow the website to remember the choices you have made in the past',
                toggle: {
                  value: 'analytics',     // your cookie category
                  enabled: false,
                  readonly: false
                },
                cookie_table: [           // list of all expected cookies
                  {
                    col1: 'anal­iz­ing­B­sCook­ie',         
                    col2: 'https://karsten-reincke.de',
                    col3: 'next 10 Days',
                    col4: 'demo cookie of "pimp your BootScore"',
                    is_regex: false
                  }
                ]
              }, {
                title: 'Advertising',
                description: 
'These cookies collect information about how you use the website, which pages you visited and which links you clicked on. All data is anonymized and cannot be used to identify you',
                toggle: {
                  value: 'advertising',
                  enabled: false,
                  readonly: false
                },
                cookie_table: [             // list of all expected cookies
                  {
                    col1: 'adver­tis­ing­B­sCook­ie',
                    col2: 'https://karsten-reincke.de',
                    col3: '2 weeks',
                    col4: 'demo cookie of pimp your BootScore',
                    is_regex: false
                  }
                ]
              }, {
                title: 'More information',
                description: 
'For further questions concerning our data management, feel free to &lt;a href="https://karsten-reincke.de/impressum"&gt;contact us&lt;/a&gt;.',
              },

            ]
          }

        }
      }

    });
  });
&lt;/script&gt;</code></pre>



<p>Entering the information into the code of the cookie consent dialogue is one thing. Activating the code is another. To do that, we put the customized <em><a href="https://bootscore.me/documentation/plugin/bs-cookie-settings/">bs-cookie-settings</a></em> JavaScript code into a <em>Custom HTML element</em> that we added to the <em>Footer 4</em> widget. In principle, we could embed the <em>Custom HTML element</em> in other widgets as well. However, <em>bsCookie</em> suggests <em>Footer 4</em> because the JavaScript code should be embedded at the end of a page. Anyway, all pages using a template containing the  <em>Footer 4</em> widget will then display the cookie. That’s the method of how we solve the problem of ‘deep links’.<sup><a href="https://fodina.de/properly-used-cookies/#footnote_4_7616" id="identifier_4_7616" class="footnote-link footnote-identifier-link" title="We must keep in mind that our readers could directly call links to deeper embedded pages. Even in this case, we may only write cookies, if we are allowed to do so.">5</a></sup></p>



<p>That left us with three final tasks:</p>



<ul class="wp-block-list">
<li>First, we will often want to linguistically customize our consent dialogue as well. For that purpose, we can modify the JavaScript code mentioned above.</li>



<li>Secondly, the dialog color is determined by the definition of the <a href="https://fodina.de/customized-colors/">functional color</a> $warning. Those who nevertheless want to customize the dialog may use her file  &lt;code&gt;_bscore_custom.scss&lt;/code&gt;: <pre class="wp-block-code"><code><br>// design the bsCookie-Dialog<br>#c-inr {<br>  border-color: darkblue;<br>  border-width: 2px;<br>  border-style: solid;<br>  background-color: #eef;<br>  color: blue($color: #000000);<br>  padding: 5px;<br>}<br><br>#c-p-bn {<br>  border-color: darkblue;<br>}<br><br>#c-s-bn {<br>  border-color: darkblue;<br>}<br> <br></code></pre></li>



<li>Third, we need to implement the semantics of the cookie consent dialog. If we want to walk the talk, we need to implement our ‘storing the cookie JavaScript code’ in a way that it writes only the technically necessary cookies without consent, and that it otherwise stores only the cookies from the groups for which there is consent.</li>
</ul>



<p>I will take up this last point in a separate post …</p>


<hr class="wp-block-separator has-alpha-channel-opacity">
<h5 class="wp-block-heading"><i class="fa-solid fa-road"></i> And how does this …</h5>
  <p class="myPageContext">… support our 
  <a href="http://fodina.de/bootscore-migration/">migration</a> to 
  <a href="https://bootscore.me/">bootScore</a>? Well,
  besides her <a href="http://fodina.de/pimp-your-bootscore/">normal design work</a>,
  the web-designer must deal with some legal requirements, as — for example — 
  those of the <a href="http://fodina.de/privacy-dsgvo/">DSGVO privacy</a>, of having a 
  <a href="http://fodina.de/properly-used-cookies/">cookie consent dialog</a> 
  and the respective <a href="http://fodina.de/properly-managed-cookies/">semantic</a>, 
  of having a <a href="http://fodina.de/ds-compliance/">data privacy page</a>,
  an <a href="http://fodina.de/imprint/">imprint</a>, 
  an <a href="http://fodina.de/picture-credits/">image reference page</a>, and
  a <a href="http://fodina.de/foss-compliance/">FOSS compliance page</a>.
  This post shall support you to manage your legal issues. 
  </p><hr class="wp-block-separator has-alpha-channel-opacity">

<ol class="footnotes"><li id="footnote_0_7616" class="footnote">We have to keep in mind that our plugins can also try to store cookies. So it’s not enough to just look for the corresponding JavaScript commands in our own posts and pages</li><li id="footnote_1_7616" class="footnote">Cookies that we assign to this group will lastly be placed on our reader’s hard drive even without explicit consent, precisely because they are technically necessary. So we must be able to prove if necessary that these cookies are indeed technically necessary.</li><li id="footnote_2_7616" class="footnote">However, greater granularity is in our interest. Because if a reader doesn’t want one thing — e.g. advertising — she could still allow the other — e.g. analytics. That way, we would still learn at least a part of what we hoped to learn overall.</li><li id="footnote_3_7616" class="footnote">e.g. with the <a href="https://cookie-editor.cgagnier.ca/">Cookie Editor</a></li><li id="footnote_4_7616" class="footnote">We must keep in mind that our readers could directly call links to deeper embedded pages. Even in this case, we may only write cookies, if we are allowed to do so.</li></ol><p>The post <a href="https://fodina.de/properly-used-cookies/">Cookies — properly used in bootScore</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/properly-used-cookies/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>My Googlized Writing Style</title>
		<link>https://fodina.de/writing-style/</link>
					<comments>https://fodina.de/writing-style/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Sun, 27 Aug 2023 08:39:56 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[bootScore]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7563</guid>

					<description><![CDATA[<p>Last time it wasn’t hard anymore: Within two days my post about my ‘reset’ because of lacking an ‘inner linking’ and about the ‘right way to be crawled and indexed’ had been processed by Google. Like my revised posts, I had designed it in accordance with the recommendations of YOAST that take into account Google’s [&#8230;]</p>
<p>The post <a href="https://fodina.de/writing-style/">My Googlized Writing Style</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Last time it wasn’t hard anymore: Within two days my post about my ‘reset’ because of lacking an ‘<a href="https://backlinko.com/hub/seo/internal-links">inner linking’</a> and about the ‘right way to be crawled and indexed’ had been processed by Google. Like my revised posts, I had designed it in accordance with the recommendations of YOAST that take into account Google’s ‘unspoken’ specifications — as proclaimed by YOAST. However, by following these rules, I had also given in to the stylistic superiority of Google and YOAST:<span id="more-7563"></span></p>



<p>To clarify the consequences of their force, let me first summarize the eleven commandments that I had taken from YOAST and with the implementation of which I have so far always been able to get green YOAST ‘traffic’-lights — one for “SEO” and one for readability. Just for the sake of completeness, let me second note that I could successfully apply for indexing at Google for the pages prepared accordingly.<sup><a href="https://fodina.de/writing-style/#footnote_0_7563" id="identifier_0_7563" class="footnote-link footnote-identifier-link" title="by using the option of the search console to hand over a URL manually.">1</a></sup></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/schreibstil">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li>Define a key phrase that reflects the subject<sup><a href="https://fodina.de/writing-style/#footnote_1_7563" id="identifier_1_7563" class="footnote-link footnote-identifier-link" title="The wolf of seo says that the keyword phrase should not capture what your post is about, but what your post is perfect for. But if you apply the rules 2 and 3, the difference between these viewpoints shrinks considerably.">2</a></sup> of your page.<sup><a href="https://fodina.de/writing-style/#footnote_2_7563" id="identifier_2_7563" class="footnote-link footnote-identifier-link" title="Keep in mind: Use only 2 words, at most 3. Because in that form, the key phrase must be placed at the beginning of the title and integrated into the body text. Do not trust YOAST to be able to understand syntactic variants - even if it promises to do so">3</a></sup></li>



<li>Just as defined, put that key phrase at the beginning of your page title.<sup><a href="https://fodina.de/writing-style/#footnote_3_7563" id="identifier_3_7563" class="footnote-link footnote-identifier-link" title="If you shorten the resulting slug of your page, use at least speaking syntagms in your URL.">4</a></sup></li>



<li>Just as defined, integrate that key phrase somewhere into the first paragraph of your page, too.</li>



<li>Include that key phrase in the meta description of your page, which must have at least 120 and no more than 156 characters</li>



<li>Link your post to other pages on your blog about the respective topic.</li>



<li>Link your post to external pages about that topic.</li>



<li>Write only a few sentences with more than 25 words.</li>



<li>Link your (short) (main) sentences by (logical) conjunctions.</li>



<li>Do not let your paragraphs ‘swell’ over 150 words, or at least stay under 200.</li>



<li>Use only a few passive constructions, and make active statements.</li>



<li>Explicitly request Google to index your new page in the Search Console.<sup><a href="https://fodina.de/writing-style/#footnote_4_7563" id="identifier_4_7563" class="footnote-link footnote-identifier-link" title="Don't rely only on your updated sitmap.">5</a></sup></li>
</ul>



<h2 class="wp-block-heading"><i class=" fa-regular fa-lightbulb"></i> Background</h2>



<p>One thing in advance: If you already think that this post does not follow these rules, let me tell you: Yes, it doesn’t. Intentionally. Let us test by this article what happens if we don’t submit our posts to the unifying dictates of Google and YOAST.</p>



<p>The result of these ‘recommendations’ is a different writing style than you and I (occasionally) prefer. It’s known that passive sentence constructions are more difficult to understand and thus require more reading work.<sup><a href="https://fodina.de/writing-style/#footnote_5_7563" id="identifier_5_7563" class="footnote-link footnote-identifier-link" title="If you don't believe that, you may deliberately 'torture' yourself through this intentionally passivated paragraph">6</a></sup> And it’s known, that our reading life is made easier by short sentences. If we are forced by search engines to write this way, they are doing our readers some good. Even if we are ‘gently’ moved away from the academic writing style via the threat that our texts will not be indexed.</p>



<p>Hence, this does not annoy me. The thing with the key phrase, however, does. Because it prevents me from arousing a desire to read the following article by a merely suggestive title, and from letting concrete meaning and context of the headline grow out of the first sentences. Free associations — that’s what I like to work with. Actually. But I can’t, if I want to obey the commandments. An example: In my first run, I had titled my article ‘Clouds and Lists — 2 on 1 Stroke’ as ‘2 in 1 Stroke’ by which I hoped to open a little associative space linking my post to the fairy tale <em><a href="https://en.wikipedia.org/wiki/The_Brave_Little_Tailor">brave little tailor</a></em>.<sup><a href="https://fodina.de/writing-style/#footnote_6_7563" id="identifier_6_7563" class="footnote-link footnote-identifier-link" title="Unfortunately - after having read story again in its entirety - it makes me a little uncomfortable myself. It is already a bad dazzler, that brave little tailor, not only a sly one. So, the story does not open an associative space into which I would like to blow myself">7</a></sup> ‘2 in 1 Stroke’ — that is an elegant title. Prefixing it with the key phrase ‘Clouds and Lists’ takes the point out of the title and makes it unwieldy. Additionally, repeating the key phrase in the first paragraph turns us into pushy babblers — just to get our green YOAST traffic lights and become part of the Google index.</p>



<p>A good example — from a SEO point of view — is the page <a href="https://wolf-of-seo.de/was-ist/fokus-keyphrase/">https://wolf-of-seo.de/was-ist/fokus-keyphrase/</a>. Here, the key phrase <em>focus keyword</em> is placed at the beginning of the title and immediately repeated in the first, very short paragraph — together with its twin focus <em>key phrase</em>. And in the first six sentences<sup><a href="https://fodina.de/writing-style/#footnote_7_7563" id="identifier_7_7563" class="footnote-link footnote-identifier-link" title="which - in this case - is equivalent to: in the first 6 paragraphs">8</a></sup>, these phrases occur more than 10 times. The ‘wolf of seo’ should not have any problems getting his page indexed. And even more: the content of his article is very informative! Only stylistically — stylistically it is grotty. If you read the post slowly, you will surely notice its redundant verbiage. The annoying thing about the dictates of good SEOcity is that we obviously have to write like this if we want to be indexed. Because only what is indexed can be found and ranked at all.</p>



<p>If you’ve read the wolf-of-seo’s article slowly, read my article in the same way. And you will notice that it is even more grotty than his! Because I have intentionally violated the above commandments:</p>



<ul class="wp-block-list">
<li>My key phrase ‘styleXpolice’ does not appear in the title, in the first paragraph, or anywhere else, hence not even in the slug.<sup><a href="https://fodina.de/writing-style/#footnote_8_7563" id="identifier_8_7563" class="footnote-link footnote-identifier-link" title="Inside of the post, I can not write this word as I've really used it (without an X), because otherwise, YOAST says &quot;The keyphrase was found 1 time. That's less than the recommended minimum of 5 times for a text of this length.&quot;">9</a></sup></li>



<li>I’ve included a ‘meta description’ that is intentionally too short and misses the topic.</li>



<li>This post uses links to external sites, but internal links to other pages on my site.</li>



<li>My text uses too many passive constructions<sup><a href="https://fodina.de/writing-style/#footnote_9_7563" id="identifier_9_7563" class="footnote-link footnote-identifier-link" title="&quot;17% of the sentences contain passive voice&quot;">10</a></sup>, has one too-long paragraph<sup><a href="https://fodina.de/writing-style/#footnote_10_7563" id="identifier_10_7563" class="footnote-link footnote-identifier-link" title="&quot;1 of the paragraphs contains more than the recommended maximum of 150 words.&quot;">11</a></sup>, and uses too long sentences<sup><a href="https://fodina.de/writing-style/#footnote_11_7563" id="identifier_11_7563" class="footnote-link footnote-identifier-link" title="&quot;31.9% of the sentences contain more than 20 words, which is more than the recommended maximum of 25%&quot;">12</a></sup>.</li>
</ul>



<p>Because of these deviations from the rules, I got an orange YOAST traffic light for this post in terms of SEO and a red one in terms of readability.</p>



<p>Thus, we can now test, how long Google takes to index this article.<sup><a href="https://fodina.de/writing-style/#footnote_12_7563" id="identifier_12_7563" class="footnote-link footnote-identifier-link" title="In order not to compare pears with apples, I will first inform Google about this new post only by an update of my sitemap. Some months later, I will also request Google manually to index this post.">13</a></sup> As soon as it has been indexed, I will let you know. But you can also try it by yourself. Just ‘google’ for ‘SEOcity’. This word exists as a noun (so far) only in this article.</p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<ul class="wp-block-list">
<li>Sitemap updated: 2023-08-27 / evaluated: 2023-08-27 (maybe earlier than updated)</li>



<li>Post found: ????-??-?? / crawled: ????-??-??  / indexed: ????-??-?? </li>



<li>Indexing manually ordered: ????-??-?? </li>



<li>Post found: ????-??-?? / crawled: ????-??-?? / indexed: ????-??-??</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity">
<ol class="footnotes"><li id="footnote_0_7563" class="footnote">by using the option of the search console to hand over a URL manually.</li><li id="footnote_1_7563" class="footnote">The <em><a href="https://wolf-of-seo.de/was-ist/fokus-keyphrase/">wolf of seo</a></em> says that the keyword phrase should not capture what your post is about, but what your post is perfect for. But if you apply the rules 2 and 3, the difference between these viewpoints shrinks considerably.</li><li id="footnote_2_7563" class="footnote">Keep in mind: Use only 2 words, at most 3. Because in that form, the key phrase must be placed at the beginning of the title and integrated into the body text. Do not trust YOAST to be able to understand syntactic variants — even if it promises to do so</li><li id="footnote_3_7563" class="footnote">If you shorten the resulting slug of your page, use at least speaking syntagms in your URL.</li><li id="footnote_4_7563" class="footnote">Don’t rely only on your updated sitmap.</li><li id="footnote_5_7563" class="footnote">If you don’t believe that, you may deliberately ‘torture’ yourself through this intentionally passivated paragraph</li><li id="footnote_6_7563" class="footnote">Unfortunately — after having read story again in its entirety — it makes me a little uncomfortable myself. It is already a bad dazzler, that brave little tailor, not only a sly one. So, the story does not open an associative space into which I would like to blow myself</li><li id="footnote_7_7563" class="footnote">which — in this case — is equivalent to: in the first 6 paragraphs</li><li id="footnote_8_7563" class="footnote">Inside of the post, I can not write this word as I’ve really used it (without an X), because otherwise, YOAST says “The keyphrase was found 1 time. That’s less than the recommended minimum of 5 times for a text of this length.”</li><li id="footnote_9_7563" class="footnote">“17% of the sentences contain passive voice”</li><li id="footnote_10_7563" class="footnote">“1 of the paragraphs contains more than the recommended maximum of 150 words.”</li><li id="footnote_11_7563" class="footnote">“31.9% of the sentences contain more than 20 words, which is more than the recommended maximum of 25%”</li><li id="footnote_12_7563" class="footnote">In order not to compare pears with apples, I will first inform Google about this new post only by an update of my sitemap. Some months later, I will also request Google manually to index this post.</li></ol><p>The post <a href="https://fodina.de/writing-style/">My Googlized Writing Style</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/writing-style/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Internal Linking — a Reset</title>
		<link>https://fodina.de/internal-linking/</link>
					<comments>https://fodina.de/internal-linking/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Wed, 23 Aug 2023 11:54:25 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[bootScore]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=7526</guid>

					<description><![CDATA[<p>It’s a while ago, that I wrote about SEO. That should not be a big deal, I thought at that time. In its templates, bootScore thankfully uses semantic HTML tags by default. Thus, it should be sufficient to submit one’s own sitemap to Google &#38; Co. Enriching the pages themselves with additional keywords should be [&#8230;]</p>
<p>The post <a href="https://fodina.de/internal-linking/">Internal Linking — a Reset</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>It’s a while ago, that I wrote about SEO. That should not be a big deal, I thought at that time. In its templates, <a href="https://bootscore.me/">bootScore</a> thankfully <a href="https://fodina.de/bootscore-plus-seo/">uses semantic HTML tags by default</a>. Thus, it should be sufficient to submit one’s own sitemap to Google &amp; Co. Enriching the pages themselves with additional keywords should be superfluous. A good primary content would be enough. No need for a second text behind the actual one. That’s the way, I thought. Moreover, I saw no reason to talk about internal linking. Rarely has <em>Google</em> so embarrassingly proven me wrong:<span id="more-7526"></span></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/innere-verlinkung">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li>Replace all schematic slugs with talking ones.</li>



<li>Link every post and page to all other internal, related posts or pages.</li>



<li>Install <a href="https://yoast.com/wordpress/plugins/seo/">YoastSEO</a>.</li>



<li>Implement so many improvements suggested by YoastSEO that its traffic lights turn green.</li>



<li>For every single page and post, explicitly ask Google via the <a href="https://search.google.com/search-console">Google Search Console</a> to index that text.</li>
</ul>



<h2 class="wp-block-heading"><i class=" fa-regular fa-lightbulb"></i> Background</h2>


<div class="wp-block-image"><figure class="alignleft size-medium is-resized is-style-default "><a href="https://fodina.de/wp-content/uploads/2023/08/search-console-problem-900x1100-1.png" data-fancybox><img decoding="async" src="https://fodina.de/wp-content/uploads/2023/08/search-console-problem-900x1100-1-245x300.png" alt="Google Search Console Problem" width="300"></a></figure></div>



<p>What has happened, that I changed my mind? After submitting my sitemap sometime in April, Google had indexed only 6 of my 109 pages over 3 months. It did not grumble about the quality. It simply announced that it had found 81 pages or posts and had crawled 17, but had not indexed any of them. Google did not consider my texts worthy of indexing. Despite my interesting topic, ‘bootScore’. And in spite of the articles being so relevant, they could inspire the project ‘bootScore’. In this situation, trying to improve my ranking was nonsense: what’s not indexed, is not found at all.</p>



<p>It took me a while to understand what had happened. And it took me even more time to fix that:</p>



<p>While migrating to bootScore, I wanted to condense my site. It should become more reader-friendly with less redundancy. Fewer bells and whistles. That’s why I mapped my thematic clusters onto categories and tags and properly assigned my texts to them. I wanted to take advantage of what bootScore brings to the table on its own. On each page, our readers can call the related posts by clicking on the assigned keywords. So why should I additionally link a post to related ones manually? Why should I hook individual pages or posts into my menu? A clever guiding system of categories without any additional inner linking should be enough.</p>



<p>But that’s exactly what Google sees differently! Pages that are not linked to other pages on the same site are not important — apparently, even in the eyes of the author. Otherwise, she would want to lead her readers there. So why should Google index them? My textbooks((Pars pro toto: cf. Czysch, Stephan: SEO mit Google Search Console, 2. Ed., Heidelberg 2017, pp. 168ff))  had always pointed out that! It was my fault to ignore that.</p>



<p>Just, as my fault for grouping my posts with nonspeaking ‘slugs’: If I — for example — used a cluster ‘image’, I thought I could name my posts ‘image‑a’ , … ‘image‑i’. So, I had the same page names on the German and the English sites. Also, a bad idea that causes Google to take the posts as unimportant.((pars pro toto: cf. Dziki, Julian: Suchmaschinenoptomierung für dummies, 2. Ed., Weinheim 2021, p. 62)</p>



<p>After having understood these side effects, I reworked everything. I replaced the symbolic page names with speaking ones. I installed YoastSeo and implemented so many of its measures concerning the topics ‘SEO’ and ‘readability’ that the respective traffic lights switched from red to green. Or at least to yellow. All in all a very time-consuming work.</p>



<p>Nevertheless, there was still no inner linking with it. That’s why I wrote a summary for each of my thematic clusters and linked its words to the intended ‘siblings’ of posts and pages. Moreover, because — in the Future — I would have to update these summaries often, I reduced my typing work by implementing these summaries as ShortCodes. So, a simple string at the end of each post and page would integrate the respective internal linking.</p>


<div class="wp-block-image"><figure class="alignright size-medium is-resized is-style-default "><a href="https://fodina.de/wp-content/uploads/2023/08/search-console-success-900x1100-1.png" data-fancybox><img decoding="async" src="https://fodina.de/wp-content/uploads/2023/08/search-console-success-900x1100-1-245x300.png" alt="Google Search Console Success" width="300"></a></figure></div>



<p>Nevertheless, the real indexing breakthrough came only after I had submitted each post and page individually and manually to Google Search Console for indexing — including the time-consuming indexability checks for each text. Now Google has indexed 84 of my 74 articles and 18 pages of my German site. What still is not indexed is indeed less important, like my privacy page or the image proof. And on my English site it looks even better: of the currently offered 53 posts and 15 pages, 114 are indexed — from which we may derive that the Google index still contains outdated links. For those, however, I preferred to follow the recommendations of the textbooks right away. I implemented respective redirects with the plugin ‘<a href="https://wordpress.org/plugins/quick-301-redirects/">Quick 301 Redirects</a>’.</p>



<p>So what was the decisive measure for success? I’m afraid it takes all of them. Even if I had to change my writing style to do it. Especially in the implementation of YoastSEO recommendations. But more about that later. As soon as Google has indexed this post. Always first things first.</p>


<hr class="wp-block-separator has-alpha-channel-opacity">
<h5 class="wp-block-heading"><i class="fa-solid fa-road"></i> And how does this …</h5>
  <p class="myPageContext">… support our 
  <a href="http://fodina.de/bootscore-migration/">migration</a> to 
  <a href="https://bootscore.me/">bootScore</a>?  Well,
  if a web designer must <a href="http://fodina.de/yaml-css/">abandon her current WordPress theme</a>, 
  she needs a replacement. A <a href="https://github.com/bootscore">free ‘off-the-shelf’ theme</a>, 
  she probably wants to <a href="http://fodina.de/pimp-your-bootscore/">personalize</a>. 
  First <a href="http://fodina.de/bootscore-font-awesome-shortcode/">a bit</a> 
  <a href="http://fodina.de/font-awesome-checklist/">cosmetically</a>, then in 
  terms of <a href="http://fodina.de/hyphenation/">the gray value of her pages</a>, 
  <a href="http://fodina.de/bilingualism/">multilingualism</a> and internal
  <a href="http://fodina.de/footnotes/">reference techniques</a> and
  <a href="http://fodina.de/internal-linking/">linking</a>. Finally, 
  she perhaps enables  <a href="http://fodina.de/minor-footer-stuff/">special footers</a>, 
  <a href="http://fodina.de/subordinated-menu/">a secondary menu</a> or 
  a <a href="http://fodina.de/copyright-line/">copyright notice</a> before 
  <a href="http://fodina.de/no-broken-links-please/">checking</a>
  the <a href="http://fodina.de/bootscore-plus-seo/">SEO</a> features 
  of the selected theme. This is a way that this post supports too.
  </p><hr class="wp-block-separator has-alpha-channel-opacity">

<p>The post <a href="https://fodina.de/internal-linking/">Internal Linking — a Reset</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/internal-linking/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Using JavaScript Compliantly</title>
		<link>https://fodina.de/license-compliant-javascript/</link>
					<comments>https://fodina.de/license-compliant-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Karsten Reincke]]></dc:creator>
		<pubDate>Wed, 17 May 2023 08:26:57 +0000</pubDate>
				<category><![CDATA[Compliance]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Licensing]]></category>
		<guid isPermaLink="false">http://127.0.0.1/wpd.fd/?p=6204</guid>

					<description><![CDATA[<p>To speed up deliverability, the developers mostly distribute compressed JavaScript libraries that do not contain any whitespaces, line feeds, and comments. They have minified the libs. As a result, they usually contain only very rudimentary license information — at least not the license text itself. But all FOSS licenses require us to ship some compliance [&#8230;]</p>
<p>The post <a href="https://fodina.de/license-compliant-javascript/">Using JavaScript Compliantly</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>To speed up deliverability, the developers mostly distribute compressed JavaScript libraries that do not contain any whitespaces, line feeds, and comments. They have <a href="https://kinsta.com/blog/minify-javascript/">minified</a> the libs. As a result, they usually contain only very rudimentary license information — at least not the license text itself. But all FOSS licenses require us to ship some compliance artifacts with the code — especially the license text. This is the challenge for using JavaScript compliantly — in <em>bootScore</em> and elsewhere:<span id="more-6204"></span></p>



<p class="has-text-align-right"></p><div class="container"><div class="d-flex justify-content-end sample-row"><div class="col-xs"><div class="text-right">[ en | <a href="https://karsten-reincke.de/lizenzkonformes-javascript">de</a> ]</div></div></div></div>



<h2 class="wp-block-heading"><i class=" fa-regular fa-face-smile"></i> Solution</h2>



<ul class="wp-block-list">
<li>Use the <em>Bootstrap</em> JavaScript library as delivered by <em>bootScore</em></li>



<li>Use the JavaScript libraries as delivered by <em>WordPress</em></li>



<li>Create a table containing the JavaScript compliance information</li>



<li>For each JavaScript library delivered by <em>bootScore</em> or <em>WordPress</em> create a respective row in your JS table.</li>



<li>Embed this table into your <em>Open Source Compliance Page</em></li>



<li>Make this <em>Open Source Compliance Page</em> accessible by the footer of your pages</li>
</ul>



<h2 class="wp-block-heading"><i class=" fa-regular fa-lightbulb"></i> Background</h2>



<p><a href="https://github.com/bootscore/bootscore">bootSCore</a> contains some JS components. For example, its own unfolded JavaScript libraries<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_0_6204" id="identifier_0_6204" class="footnote-link footnote-identifier-link" title="cf. ./bootscore/js/theme.js">1</a></sup> — implicitly licensed under the MIT license but without any explicit licensing statement — and the minified Bootstrap JavaScript library<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_1_6204" id="identifier_1_6204" class="footnote-link footnote-identifier-link" title="cf. ./bootscore/js/lib/bootstrap.bundle.min.js">2</a></sup> — explicitly licensed under the MIT by a respective licensing statement. But none of them contain the license text itself. </p>



<p>Also, WordPress brings with it some own and some minified 3rd party JavaScript libraries<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_2_6204" id="identifier_2_6204" class="footnote-link footnote-identifier-link" title="cf. https://codex.wordpress.org/Javascript_Reference respectively ./wp-includes/js">3</a></sup>, like the jQuery library<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_3_6204" id="identifier_3_6204" class="footnote-link footnote-identifier-link" title="cf. wp-includes/js/jquery/">4</a></sup> that is licensed under the MIT and contains a respective licensing statement, but does not cover the license text itself. Regardless, of whom the site owner has got these libs — from bootScore or WordPress -, eventually it is she who has to fulfill the license requirements because it is her system that distributes the JavaScript libraries to her readers.</p>



<p>But what is actually the challenge?</p>


<div class="wp-block-image"><figure class="alignright size-medium is-resized is-style-default "><a href="https://fodina.de/wp-content/uploads/2023/05/js.jpg" data-fancybox><img decoding="async" src="https://fodina.de/wp-content/uploads/2023/05/js-300x300.jpg" alt="Riding a dead horse" width="240"></a></figure></div>



<p>Like the JavaScript libraries of <em>Bootstrap</em> and <em>jQuery</em>, most JS libraries are MIT licensed. It requires that the copyright line and the license text are distributed together with the open-source program. “The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.“<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_4_6204" id="identifier_4_6204" class="footnote-link footnote-identifier-link" title="cf. MIT License">5</a></sup></p>



<p>For (L|A)GPL-licensed JavaScript libraries it is nearly the same. These licenses permit the distribution of the source code “provided that one conspicuously and appropriately publishes on each copy an appropriate copyright notice and disclaimer of warranty […] and gives any other recipients of the Program a copy of this License along with the Program”.<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_5_6204" id="identifier_5_6204" class="footnote-link footnote-identifier-link" title="pars pro toto cf. GPL-2.0. Additionally, the (A)GPL requires that we license our code that uses the (A)GPL-licensed library, etc. also under the (A)GPL (copyleft effect). But that's not the point in this context.">6</a></sup></p>



<p>So, we see a contradiction between the claim of the licenses and the everyday practice. On the one side, a browser not only loads down the page text (HTML) but also the JavaScript library. This download distributes the code and hence triggers the necessity to fulfill the open-source license requirements. On the other side, usually, the compressed libraries — although as a package often offered by the authors — no longer contain the required license information: the smaller the libs, the faster the machine can display the site using that libs.</p>



<p>As site owners, we have two options to deal with this challenge. Either we subsequently (and (semi) manually) heal the packages we implicitly have taken over by using WordPress and <em>bootScore</em>. Or we use them as we’ve got them. It’s clear: Healing would imply that we redo that job whenever we update WordPress or bootScore. So, we tend to go the other way.</p>



<p>The solution is this:</p>



<p>Whenever developers decide to distribute minified JavaScript libraries, they also assume that their ‘customers’ use their work in that version. That is a reasonable assumption. So, we may derive that they implicitly permit that kind of use even if it violated the license they’ve chosen. Nevertheless, we should offer our users another option to get the required information. A substitute for bundling the license text, the copyright information, etc. with the JavaScript libraries themselves. However, we must take care only to include the minified JavaScript libraries the developers themselves have provided. In the case of the <em>Bootstrap</em>-JS-Lib in <em>bootScore</em> and the <em>Jquery</em>-JS-Lib etc. in <em>WordPress,</em> we may assume that they did so.</p>



<p>If we apply this process to our 3rd. party JS libraries, we have a strong argument for our position in case of a legal dispute — I’ve never heard of one — and we’re in good company: Even the FSF is proposing to do so.<sup><a href="https://fodina.de/license-compliant-javascript/#footnote_6_6204" id="identifier_6_6204" class="footnote-link footnote-identifier-link" title="cf. https://www.gnu.org/licenses/javascript-labels.html, https://www.gnu.org/licenses/javascript-labels-rationale.html, and https://www.iusmentis.com/computerprograms/opensourcesoftware/license-notices-web-applications">7</a></sup> And the FSF really doesn’t have a reputation for taking license compliance lightly.</p>


  <hr class="wp-block-separator has-alpha-channel-opacity">
<h5 class="wp-block-heading"><i class="fa-solid fa-link"></i> And in what way is this …</h5>
  <p class="myPageContext">… part of the overarching topic <i class="fa-brands fa-linux"></i> 
  FOSS <i class="fa-brands fa-osi"></i> Compliance? 
  For fulfilling the requirements of <a href="https://opensource.org/licenses/">FOSS licenses</a>, 
  we have to consider <a href="http://fodina.de/jniz/">specific</a> individual 
  <a href="http://fodina.de/yocto-iot-gplv3/">cases</a> as well as 
  <a href="http://fodina.de/lilypond-gpl/">side effects</a> — for 
  <a href="http://fodina.de/license-compliant-javascript/">software</a>, 
  <a href="http://fodina.de/image-databases/">pictures</a>, or documents. 
  We should unhide <a href="http://fodina.de/cc-by-trolls/">trends</a> and write 
  <a href="http://fodina.de/bosl-3-0/">guidelines</a>. Above all, however, we must 
  drive forward the <a href="http://fodina.de/tdosca/">automation of license fulfillment</a>, 
  make our <a href="http://fodina.de/oslic/">licensing knowledge</a> freely available, 
  cast it into <a href="http://fodina.de/oscad/">smaller tools</a>, and 
  <a href="http://fodina.de/oscake/">bring it into larger systems</a>: Because FOSS 
  thrives on freedom through license fulfillment, large and small. 
  That’s what also this article is about.</p>
  <hr class="wp-block-separator has-alpha-channel-opacity">
<ol class="footnotes"><li id="footnote_0_6204" class="footnote">cf. <code>./bootscore/js/theme.js</code></li><li id="footnote_1_6204" class="footnote">cf. <code>./bootscore/js/lib/bootstrap.bundle.min.js</code></li><li id="footnote_2_6204" class="footnote">cf. <a href="https://codex.wordpress.org/Javascript_Reference">https://codex.wordpress.org/Javascript_Reference</a> respectively <code>./wp-includes/js</code></li><li id="footnote_3_6204" class="footnote">cf. <code>wp-includes/js/jquery/</code></li><li id="footnote_4_6204" class="footnote">cf. <a href="https://opensource.org/license/mit/">MIT License</a></li><li id="footnote_5_6204" class="footnote">pars pro toto cf. <a href="https://opensource.org/license/gpl-2-0/">GPL‑2.0</a>. Additionally, the (A)GPL requires that we license our code that uses the (A)GPL-licensed library, etc. also under the (A)GPL (copyleft effect). But that’s not the point in this context.</li><li id="footnote_6_6204" class="footnote">cf. <a href="https://www.gnu.org/licenses/javascript-labels.html">https://www.gnu.org/licenses/javascript-labels.html</a>, <a href="https://www.gnu.org/licenses/javascript-labels-rationale.html">https://www.gnu.org/licenses/javascript-labels-rationale.html</a>, and <a href="https://www.iusmentis.com/computerprograms/opensourcesoftware/license-notices-web-applications">https://www.iusmentis.com/computerprograms/opensourcesoftware/license-notices-web-applications</a></li></ol><p>The post <a href="https://fodina.de/license-compliant-javascript/">Using JavaScript Compliantly</a> appeared first on <a href="https://fodina.de">FODINA 4 FOSS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://fodina.de/license-compliant-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
